Bug 5540 - PortConvertor, MatchConvertor
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / ActionConvertorV10Test.java
1 /*\r
2  * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 \r
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;\r
10 \r
11 import java.math.BigInteger;\r
12 import java.util.ArrayList;\r
13 import java.util.List;\r
14 \r
15 import org.junit.Assert;\r
16 import org.junit.Test;\r
17 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
18 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;\r
19 import org.opendaylight.openflowplugin.extension.api.path.ActionPath;\r
20 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;\r
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpVersion;\r
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;\r
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;\r
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCaseBuilder;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCaseBuilder;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCaseBuilder;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCaseBuilder;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionCaseBuilder;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCaseBuilder;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCaseBuilder;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCaseBuilder;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.StripVlanActionCaseBuilder;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstActionBuilder;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcActionBuilder;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstActionBuilder;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.src.action._case.SetNwSrcActionBuilder;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.tos.action._case.SetNwTosActionBuilder;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.dst.action._case.SetTpDstActionBuilder;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.src.action._case.SetTpSrcActionBuilder;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpActionBuilder;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.strip.vlan.action._case.StripVlanActionBuilder;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4Builder;\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.OutputActionCaseBuilder;\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetDlDstCase;\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetDlSrcCase;\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwDstCase;\r
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwSrcCase;\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetNwTosCase;\r
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetTpDstCase;\r
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetTpSrcCase;\r
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetVlanPcpCase;\r
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.SetVlanVidCase;\r
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.output.action._case.OutputActionBuilder;\r
65 \r
66 /**\r
67  * @author michal.polkorab\r
68  *\r
69  */\r
70 public class ActionConvertorV10Test {\r
71 \r
72     /**\r
73      * Test {@link ActionConvertor#getActions(List, short, BigInteger)}\r
74      */\r
75     @Test\r
76     public void testGetActions() {\r
77         List<Action> salActions = new ArrayList<>();\r
78         ActionBuilder actionBuilder = new ActionBuilder();\r
79         SetVlanPcpActionCaseBuilder vlanPcpCaseBuilder = new SetVlanPcpActionCaseBuilder();\r
80         SetVlanPcpActionBuilder pcpBuilder = new SetVlanPcpActionBuilder();\r
81         pcpBuilder.setVlanPcp(new VlanPcp((short) 7));\r
82         vlanPcpCaseBuilder.setSetVlanPcpAction(pcpBuilder.build());\r
83         actionBuilder.setAction(vlanPcpCaseBuilder.build());\r
84         actionBuilder.setOrder(0);\r
85         salActions.add(actionBuilder.build());\r
86         actionBuilder = new ActionBuilder();\r
87         StripVlanActionCaseBuilder stripCaseBuilder = new StripVlanActionCaseBuilder();\r
88         StripVlanActionBuilder stripBuilder = new StripVlanActionBuilder();\r
89         stripCaseBuilder.setStripVlanAction(stripBuilder.build());\r
90         actionBuilder.setAction(stripCaseBuilder.build());\r
91         actionBuilder.setOrder(1);\r
92         salActions.add(actionBuilder.build());\r
93         actionBuilder = new ActionBuilder();\r
94         SetDlDstActionCaseBuilder dlDstCaseBuilder = new SetDlDstActionCaseBuilder();\r
95         SetDlDstActionBuilder dlDstBuilder = new SetDlDstActionBuilder();\r
96         dlDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
97         dlDstCaseBuilder.setSetDlDstAction(dlDstBuilder.build());\r
98         actionBuilder.setAction(dlDstCaseBuilder.build());\r
99         actionBuilder.setOrder(2);\r
100         salActions.add(actionBuilder.build());\r
101         actionBuilder = new ActionBuilder();\r
102         SetDlSrcActionCaseBuilder dlSrcCaseBuilder = new SetDlSrcActionCaseBuilder();\r
103         SetDlSrcActionBuilder dlSrcBuilder = new SetDlSrcActionBuilder();\r
104         dlSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
105         dlSrcCaseBuilder.setSetDlSrcAction(dlSrcBuilder.build());\r
106         actionBuilder.setAction(dlSrcCaseBuilder.build());\r
107         actionBuilder.setOrder(3);\r
108         salActions.add(actionBuilder.build());\r
109        \r
110         actionBuilder = new ActionBuilder();\r
111         SetNwSrcActionCaseBuilder nwSrcCaseBuilder = new SetNwSrcActionCaseBuilder();\r
112         SetNwSrcActionBuilder nwSrcBuilder = new SetNwSrcActionBuilder();\r
113         Ipv4Builder ipv4Builder = new Ipv4Builder();\r
114         /* Use prefix which is correct in canonical representation in test */\r
115         ipv4Builder.setIpv4Address(new Ipv4Prefix("10.0.0.0/24"));\r
116         nwSrcBuilder.setAddress(ipv4Builder.build());\r
117         nwSrcCaseBuilder.setSetNwSrcAction(nwSrcBuilder.build());\r
118         actionBuilder.setAction(nwSrcCaseBuilder.build());\r
119         actionBuilder.setOrder(4);\r
120         salActions.add(actionBuilder.build());\r
121         \r
122         actionBuilder = new ActionBuilder();\r
123         SetNwDstActionCaseBuilder nwDstCaseBuilder = new SetNwDstActionCaseBuilder();\r
124         SetNwDstActionBuilder nwDstBuilder = new SetNwDstActionBuilder();\r
125         ipv4Builder = new Ipv4Builder();\r
126         ipv4Builder.setIpv4Address(new Ipv4Prefix("10.0.0.2/32"));\r
127         nwDstBuilder.setAddress(ipv4Builder.build());\r
128         nwDstCaseBuilder.setSetNwDstAction(nwDstBuilder.build());\r
129         actionBuilder.setAction(nwDstCaseBuilder.build());\r
130         actionBuilder.setOrder(5);\r
131         salActions.add(actionBuilder.build());\r
132         actionBuilder = new ActionBuilder();\r
133         SetTpSrcActionCaseBuilder tpSrcCaseBuilder = new SetTpSrcActionCaseBuilder();\r
134         SetTpSrcActionBuilder tpSrcBuilder = new SetTpSrcActionBuilder();\r
135         tpSrcBuilder.setPort(new PortNumber(54));\r
136         tpSrcCaseBuilder.setSetTpSrcAction(tpSrcBuilder.build());\r
137         actionBuilder.setAction(tpSrcCaseBuilder.build());\r
138         actionBuilder.setOrder(6);\r
139         salActions.add(actionBuilder.build());\r
140         actionBuilder = new ActionBuilder();\r
141         SetTpDstActionCaseBuilder tpDstCaseBuilder = new SetTpDstActionCaseBuilder();\r
142         SetTpDstActionBuilder tpDstBuilder = new SetTpDstActionBuilder();\r
143         tpDstBuilder.setPort(new PortNumber(45));\r
144         tpDstCaseBuilder.setSetTpDstAction(tpDstBuilder.build());\r
145         actionBuilder.setAction(tpDstCaseBuilder.build());\r
146         actionBuilder.setOrder(7);\r
147         salActions.add(actionBuilder.build());\r
148         actionBuilder = new ActionBuilder();\r
149         SetNwTosActionCaseBuilder tosCaseBuilder = new SetNwTosActionCaseBuilder();\r
150         SetNwTosActionBuilder tosBuilder = new SetNwTosActionBuilder();\r
151         tosBuilder.setTos(18);\r
152         tosCaseBuilder.setSetNwTosAction(tosBuilder.build());\r
153         actionBuilder.setAction(tosCaseBuilder.build());\r
154         actionBuilder.setOrder(8);\r
155         salActions.add(actionBuilder.build());\r
156         actionBuilder = new ActionBuilder();\r
157         SetVlanIdActionCaseBuilder vlanIdCaseBuilder = new SetVlanIdActionCaseBuilder();\r
158         SetVlanIdActionBuilder vlanIdBuilder = new SetVlanIdActionBuilder();\r
159         vlanIdBuilder.setVlanId(new VlanId(22));\r
160         vlanIdCaseBuilder.setSetVlanIdAction(vlanIdBuilder.build());\r
161         actionBuilder.setAction(vlanIdCaseBuilder.build());\r
162         actionBuilder.setOrder(9);\r
163         salActions.add(actionBuilder.build());\r
164         \r
165         IpMatchBuilder ipMatchBld = new IpMatchBuilder().setIpProto(IpVersion.Ipv4);\r
166         MatchBuilder matchBld = new MatchBuilder().setIpMatch(ipMatchBld.build());\r
167         FlowBuilder flowBld = new FlowBuilder().setMatch(matchBld.build());\r
168         List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action> actions = ActionConvertor.getActions(salActions, EncodeConstants.OF10_VERSION_ID, new BigInteger("42"), flowBld.build());\r
169         \r
170         Assert.assertEquals("Wrong number of actions", 10, actions.size());\r
171         \r
172         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action action = actions.get(0);\r
173         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
174                 + ".action.rev150203.action.grouping.action.choice.SetVlanPcpCase", action.getActionChoice().getImplementedInterface().getName());\r
175         SetVlanPcpCase setVlanPcpCase = (SetVlanPcpCase) action.getActionChoice();\r
176         Assert.assertEquals("Wrong vlan pcp", 7, setVlanPcpCase.getSetVlanPcpAction().getVlanPcp().intValue());\r
177         \r
178         action = actions.get(1);\r
179         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
180                 + ".action.rev150203.action.grouping.action.choice.StripVlanCase", action.getActionChoice().getImplementedInterface().getName());\r
181         \r
182         action = actions.get(2);\r
183         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
184                 + ".action.rev150203.action.grouping.action.choice.SetDlDstCase", action.getActionChoice().getImplementedInterface().getName());\r
185         SetDlDstCase setDlDstCase = (SetDlDstCase) action.getActionChoice();\r
186         Assert.assertEquals("Wrong dl dst", "00:00:00:00:00:06", setDlDstCase.getSetDlDstAction().getDlDstAddress().getValue());\r
187         \r
188         action = actions.get(3);\r
189         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
190                 + ".action.rev150203.action.grouping.action.choice.SetDlSrcCase", action.getActionChoice().getImplementedInterface().getName());\r
191         SetDlSrcCase setDlSrcCase = (SetDlSrcCase) action.getActionChoice();\r
192         Assert.assertEquals("Wrong dl src", "00:00:00:00:00:05", setDlSrcCase.getSetDlSrcAction().getDlSrcAddress().getValue());\r
193         \r
194         action = actions.get(4);\r
195         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
196                 + ".action.rev150203.action.grouping.action.choice.SetNwSrcCase", action.getActionChoice().getImplementedInterface().getName());\r
197         SetNwSrcCase setNwSrcCase = (SetNwSrcCase) action.getActionChoice();\r
198         Assert.assertEquals("Wrong nw src", "10.0.0.0", setNwSrcCase.getSetNwSrcAction().getIpAddress().getValue());\r
199         \r
200         action = actions.get(5);\r
201         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
202                 + ".action.rev150203.action.grouping.action.choice.SetNwDstCase", action.getActionChoice().getImplementedInterface().getName());\r
203         SetNwDstCase setNwDstCase = (SetNwDstCase) action.getActionChoice();\r
204         Assert.assertEquals("Wrong nw dst", "10.0.0.2", setNwDstCase.getSetNwDstAction().getIpAddress().getValue());\r
205         \r
206         action = actions.get(6);\r
207         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
208                 + ".action.rev150203.action.grouping.action.choice.SetTpSrcCase", action.getActionChoice().getImplementedInterface().getName());\r
209         SetTpSrcCase setTpSrcCase = (SetTpSrcCase) action.getActionChoice();\r
210         Assert.assertEquals("Wrong tp src", 54, setTpSrcCase.getSetTpSrcAction().getPort().getValue().intValue());\r
211         \r
212         action = actions.get(7);\r
213         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
214                 + ".action.rev150203.action.grouping.action.choice.SetTpDstCase", action.getActionChoice().getImplementedInterface().getName());\r
215         SetTpDstCase setTpDstCase = (SetTpDstCase) action.getActionChoice();\r
216         Assert.assertEquals("Wrong tp dst", 45, setTpDstCase.getSetTpDstAction().getPort().getValue().intValue());\r
217         \r
218         action = actions.get(8);\r
219         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
220                 + ".action.rev150203.action.grouping.action.choice.SetNwTosCase", action.getActionChoice().getImplementedInterface().getName());\r
221         SetNwTosCase setNwTosCase = (SetNwTosCase) action.getActionChoice();\r
222         Assert.assertEquals("Wrong nw tos", 18, setNwTosCase.getSetNwTosAction().getNwTos().intValue());\r
223         \r
224         action = actions.get(9);\r
225         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
226                 + ".action.rev150203.action.grouping.action.choice.SetVlanVidCase", action.getActionChoice().getImplementedInterface().getName());\r
227         SetVlanVidCase setVlanVidCase = (SetVlanVidCase) action.getActionChoice();\r
228         Assert.assertEquals("Wrong vlan id", 22, setVlanVidCase.getSetVlanVidAction().getVlanVid().intValue());\r
229     }\r
230 \r
231     /**\r
232      * Test {@link ActionConvertor#toMDSalActions(List, OpenflowVersion, ActionPath)}\r
233      */\r
234     @Test\r
235     public void testToMDSalActions() {\r
236         OpenflowPortsUtil.init();\r
237 \r
238         List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action> actions = new ArrayList<>();\r
239         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder actionbuilder = \r
240                 new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder();\r
241         \r
242         OutputActionCaseBuilder caseBuilder = new OutputActionCaseBuilder();\r
243         OutputActionBuilder outputBuilder = new OutputActionBuilder();\r
244         outputBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber(14L));\r
245         outputBuilder.setMaxLength(555);\r
246         caseBuilder.setOutputAction(outputBuilder.build());\r
247         actionbuilder.setActionChoice(caseBuilder.build());\r
248         \r
249 //        actionbuilder.setType(Output.class);\r
250 //        PortActionBuilder portBuilder = new PortActionBuilder();\r
251 //        portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber(14L));\r
252 //        actionbuilder.addAugmentation(PortAction.class, portBuilder.build());\r
253 //        MaxLengthActionBuilder lengthBuilder = new MaxLengthActionBuilder();\r
254 //        lengthBuilder.setMaxLength(555);\r
255 //        actionbuilder.addAugmentation(MaxLengthAction.class, lengthBuilder.build());\r
256         actions.add(actionbuilder.build());\r
257 \r
258         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action\r
259         .Action> mdSalActions = ActionConvertor.toMDSalActions(actions, OpenflowVersion.OF10,\r
260                 ActionPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_APPLYACTIONSCASE_APPLYACTIONS_ACTION_ACTION);\r
261 \r
262         Assert.assertEquals("Wrong number of output actions", 1, mdSalActions.size());\r
263         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = mdSalActions.get(0);\r
264         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
265                 + ".rev131112.action.action.OutputActionCase", action.getImplementedInterface().getName());\r
266         OutputActionCase outputAction = (OutputActionCase) action;\r
267         Assert.assertEquals("Wrong output port", "14", outputAction.getOutputAction().getOutputNodeConnector().getValue());\r
268         Assert.assertEquals("Wrong max length", 555, outputAction.getOutputAction().getMaxLength().intValue());\r
269     }\r
270 }\r