BUG-1491: handle SET_TP_SRC/SET_TP_DST actions
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / ActionConvertorV13Test.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.rev100924.Ipv4Prefix;\r
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;\r
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase;\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.PopMplsActionCase;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCase;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCase;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCaseBuilder;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCaseBuilder;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCase;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCase;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCaseBuilder;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCaseBuilder;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionCaseBuilder;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCase;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCase;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCaseBuilder;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCaseBuilder;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCaseBuilder;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.StripVlanActionCaseBuilder;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstActionBuilder;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcActionBuilder;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstActionBuilder;\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.src.action._case.SetNwSrcActionBuilder;\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.tos.action._case.SetNwTosActionBuilder;\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.dst.action._case.SetTpDstActionBuilder;\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.src.action._case.SetTpSrcActionBuilder;\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpActionBuilder;\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.strip.vlan.action._case.StripVlanActionBuilder;\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4Builder;\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv6Builder;\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;\r
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;\r
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;\r
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntry;\r
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;\r
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;\r
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;\r
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdActionBuilder;\r
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntry;\r
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntry;\r
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntry;\r
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;\r
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;\r
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlAction;\r
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;\r
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;\r
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;\r
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction;\r
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsActionBuilder;\r
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;\r
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;\r
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntry;\r
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntry;\r
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntryBuilder;\r
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;\r
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;\r
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntry;\r
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry;\r
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn;\r
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut;\r
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl;\r
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl;\r
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;\r
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;\r
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls;\r
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;\r
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan;\r
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls;\r
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;\r
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;\r
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField;\r
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;\r
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;\r
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;\r
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;\r
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder;\r
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;\r
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;\r
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField;\r
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder;\r
111 \r
112 /**\r
113  * @author michal.polkorab\r
114  *\r
115  */\r
116 public class ActionConvertorV13Test {\r
117 \r
118     /**\r
119      * Test {@link ActionConvertor#toMDSalActions(List, OpenflowVersion, ActionPath)}\r
120      */\r
121     @Test\r
122     public void testToMDSalActions() {\r
123         List<Action> actions = new ArrayList<>();\r
124         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action\r
125         .Action> mdSalActions = ActionConvertor.toMDSalActions(actions, OpenflowVersion.OF13,\r
126                 ActionPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_APPLYACTIONSCASE_APPLYACTIONS_ACTION_ACTION);\r
127 \r
128         Assert.assertEquals("Wrong number of output actions", 0, mdSalActions.size());\r
129     }\r
130 \r
131     /**\r
132      * Test {@link ActionConvertor#toMDSalActions(List, OpenflowVersion, ActionPath)}\r
133      */\r
134     @Test\r
135     public void testToMDSalActions2() {\r
136         OpenflowPortsUtil.init();\r
137         List<Action> actions = new ArrayList<>();\r
138         ActionBuilder actionBuilder = new ActionBuilder();\r
139         actionBuilder.setType(Output.class);\r
140         PortActionBuilder port = new PortActionBuilder();\r
141         port.setPort(new PortNumber(42L));\r
142         actionBuilder.addAugmentation(PortAction.class, port.build());\r
143         MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();\r
144         maxLen.setMaxLength(52);\r
145         actionBuilder.addAugmentation(MaxLengthAction.class, maxLen.build());\r
146         actions.add(actionBuilder.build());\r
147         actionBuilder = new ActionBuilder();\r
148         actionBuilder.setType(CopyTtlOut.class);\r
149         actions.add(actionBuilder.build());\r
150         actionBuilder = new ActionBuilder();\r
151         actionBuilder.setType(CopyTtlIn.class);\r
152         actions.add(actionBuilder.build());\r
153         actionBuilder = new ActionBuilder();\r
154         actionBuilder.setType(SetMplsTtl.class);\r
155         MplsTtlActionBuilder mplsTtl = new MplsTtlActionBuilder();\r
156         mplsTtl.setMplsTtl((short) 4);\r
157         actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtl.build());\r
158         actions.add(actionBuilder.build());\r
159         actionBuilder = new ActionBuilder();\r
160         actionBuilder.setType(DecMplsTtl.class);\r
161         actions.add(actionBuilder.build());\r
162         actionBuilder = new ActionBuilder();\r
163         actionBuilder.setType(PushVlan.class);\r
164         EthertypeActionBuilder etherType = new EthertypeActionBuilder();\r
165         etherType.setEthertype(new EtherType(16));\r
166         actionBuilder.addAugmentation(EthertypeAction.class, etherType.build());\r
167         actions.add(actionBuilder.build());\r
168         actionBuilder = new ActionBuilder();\r
169         actionBuilder.setType(PopVlan.class);\r
170         actions.add(actionBuilder.build());\r
171         actionBuilder = new ActionBuilder();\r
172         actionBuilder.setType(PushMpls.class);\r
173         etherType = new EthertypeActionBuilder();\r
174         etherType.setEthertype(new EtherType(17));\r
175         actionBuilder.addAugmentation(EthertypeAction.class, etherType.build());\r
176         actions.add(actionBuilder.build());\r
177         actionBuilder = new ActionBuilder();\r
178         actionBuilder.setType(PopMpls.class);\r
179         etherType = new EthertypeActionBuilder();\r
180         etherType.setEthertype(new EtherType(18));\r
181         actionBuilder.addAugmentation(EthertypeAction.class, etherType.build());\r
182         actions.add(actionBuilder.build());\r
183         actionBuilder = new ActionBuilder();\r
184         actionBuilder.setType(SetQueue.class);\r
185         QueueIdActionBuilder queueId = new QueueIdActionBuilder();\r
186         queueId.setQueueId(1234L);\r
187         actionBuilder.addAugmentation(QueueIdAction.class, queueId.build());\r
188         actions.add(actionBuilder.build());\r
189         actionBuilder = new ActionBuilder();\r
190         actionBuilder.setType(Group.class);\r
191         GroupIdActionBuilder group = new GroupIdActionBuilder();\r
192         group.setGroupId(555L);\r
193         actionBuilder.addAugmentation(GroupIdAction.class, group.build());\r
194         actions.add(actionBuilder.build());\r
195         actionBuilder = new ActionBuilder();\r
196         actionBuilder.setType(SetNwTtl.class);\r
197         NwTtlActionBuilder nwTtl = new NwTtlActionBuilder();\r
198         nwTtl.setNwTtl((short) 8);\r
199         actionBuilder.addAugmentation(NwTtlAction.class, nwTtl.build());\r
200         actions.add(actionBuilder.build());\r
201         actionBuilder = new ActionBuilder();\r
202         actionBuilder.setType(DecNwTtl.class);\r
203         actions.add(actionBuilder.build());\r
204         actionBuilder = new ActionBuilder();\r
205         actionBuilder.setType(SetField.class);\r
206         OxmFieldsActionBuilder matchEntries = new OxmFieldsActionBuilder();\r
207         List<MatchEntries> entries = new ArrayList<>();\r
208         MatchEntriesBuilder matchBuilder = new MatchEntriesBuilder();\r
209         matchBuilder.setOxmClass(OpenflowBasicClass.class);\r
210         matchBuilder.setOxmMatchField(InPort.class);\r
211         matchBuilder.setHasMask(false);\r
212         PortNumberMatchEntryBuilder portBuilder = new PortNumberMatchEntryBuilder();\r
213         portBuilder.setPortNumber(new PortNumber(1L));\r
214         matchBuilder.addAugmentation(PortNumberMatchEntry.class, portBuilder.build());\r
215         entries.add(matchBuilder.build());\r
216         matchEntries.setMatchEntries(entries);\r
217         actionBuilder.addAugmentation(OxmFieldsAction.class, matchEntries.build());\r
218         actions.add(actionBuilder.build());\r
219         actionBuilder = new ActionBuilder();\r
220         actionBuilder.setType(PushPbb.class);\r
221         etherType = new EthertypeActionBuilder();\r
222         etherType.setEthertype(new EtherType(19));\r
223         actionBuilder.addAugmentation(EthertypeAction.class, etherType.build());\r
224         actions.add(actionBuilder.build());\r
225         actionBuilder = new ActionBuilder();\r
226         actionBuilder.setType(PopPbb.class);\r
227         actions.add(actionBuilder.build());\r
228 \r
229         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action\r
230         .Action> mdSalActions = ActionConvertor.toMDSalActions(actions, OpenflowVersion.OF13,\r
231                 ActionPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_APPLYACTIONSCASE_APPLYACTIONS_ACTION_ACTION);\r
232 \r
233         Assert.assertEquals("Wrong number of output actions", 16, mdSalActions.size());\r
234         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = mdSalActions.get(0);\r
235         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
236                 + ".rev131112.action.action.OutputActionCase", action.getImplementedInterface().getName());\r
237         OutputActionCase output = (OutputActionCase) action;\r
238         Assert.assertEquals("Wrong output port", "42", output.getOutputAction().getOutputNodeConnector().getValue());\r
239         Assert.assertEquals("Wrong max length", 52, output.getOutputAction().getMaxLength().intValue());\r
240         action = mdSalActions.get(1);\r
241         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
242                 + ".rev131112.action.action.CopyTtlOutCase", action.getImplementedInterface().getName());\r
243         action = mdSalActions.get(2);\r
244         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
245                 + ".rev131112.action.action.CopyTtlInCase", action.getImplementedInterface().getName());\r
246         action = mdSalActions.get(3);\r
247         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
248                 + ".rev131112.action.action.SetMplsTtlActionCase", action.getImplementedInterface().getName());\r
249         SetMplsTtlActionCase setMplsTtl = (SetMplsTtlActionCase) action;\r
250         Assert.assertEquals("Wrong mpls ttl", 4, setMplsTtl.getSetMplsTtlAction().getMplsTtl().intValue());\r
251         action = mdSalActions.get(4);\r
252         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
253                 + ".rev131112.action.action.DecMplsTtlCase", action.getImplementedInterface().getName());\r
254         action = mdSalActions.get(5);\r
255         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
256                 + ".rev131112.action.action.PushVlanActionCase", action.getImplementedInterface().getName());\r
257         PushVlanActionCase pushVlan = (PushVlanActionCase) action;\r
258         Assert.assertEquals("Wrong ethertype", 16, pushVlan.getPushVlanAction().getEthernetType().intValue());\r
259         action = mdSalActions.get(6);\r
260         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
261                 + ".rev131112.action.action.PopVlanActionCase", action.getImplementedInterface().getName());\r
262         action = mdSalActions.get(7);\r
263         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
264                 + ".rev131112.action.action.PushMplsActionCase", action.getImplementedInterface().getName());\r
265         PushMplsActionCase pushMpls = (PushMplsActionCase) action;\r
266         Assert.assertEquals("Wrong ethertype", 17, pushMpls.getPushMplsAction().getEthernetType().intValue());\r
267         action = mdSalActions.get(8);\r
268         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
269                 + ".rev131112.action.action.PopMplsActionCase", action.getImplementedInterface().getName());\r
270         PopMplsActionCase popMpls = (PopMplsActionCase) action;\r
271         Assert.assertEquals("Wrong ethertype", 18, popMpls.getPopMplsAction().getEthernetType().intValue());\r
272         action = mdSalActions.get(9);\r
273         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
274                 + ".rev131112.action.action.SetQueueActionCase", action.getImplementedInterface().getName());\r
275         SetQueueActionCase setQueue = (SetQueueActionCase) action;\r
276         Assert.assertEquals("Wrong queue-id", 1234, setQueue.getSetQueueAction().getQueueId().intValue());\r
277         action = mdSalActions.get(10);\r
278         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
279                 + ".rev131112.action.action.GroupActionCase", action.getImplementedInterface().getName());\r
280         GroupActionCase groupAction = (GroupActionCase) action;\r
281         Assert.assertEquals("Wrong group-id", 555, groupAction.getGroupAction().getGroupId().intValue());\r
282         action = mdSalActions.get(11);\r
283         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
284                 + ".rev131112.action.action.SetNwTtlActionCase", action.getImplementedInterface().getName());\r
285         SetNwTtlActionCase setNwTtl = (SetNwTtlActionCase) action;\r
286         Assert.assertEquals("Wrong nw ttl", 8, setNwTtl.getSetNwTtlAction().getNwTtl().intValue());\r
287         action = mdSalActions.get(12);\r
288         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
289                 + ".rev131112.action.action.DecNwTtlCase", action.getImplementedInterface().getName());\r
290         action = mdSalActions.get(13);\r
291         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
292                 + ".rev131112.action.action.SetFieldCase", action.getImplementedInterface().getName());\r
293         SetFieldCase setField = (SetFieldCase) action;\r
294         Assert.assertEquals("Wrong in port", "openflow:null:1", setField.getSetField().getInPort().getValue());\r
295         action = mdSalActions.get(14);\r
296         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
297                 + ".rev131112.action.action.PushPbbActionCase", action.getImplementedInterface().getName());\r
298         PushPbbActionCase pushPbb = (PushPbbActionCase) action;\r
299         Assert.assertEquals("Wrong ethertype", 19, pushPbb.getPushPbbAction().getEthernetType().intValue());\r
300         action = mdSalActions.get(15);\r
301         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"\r
302                 + ".rev131112.action.action.PopPbbActionCase", action.getImplementedInterface().getName());\r
303     }\r
304 \r
305     /**\r
306      * Test {@link ActionConvertor#getActions(List, short, BigInteger)}\r
307      */\r
308     @Test\r
309     public void testGetActions() {\r
310         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list\r
311         .Action> salActions = new ArrayList<>();\r
312         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list\r
313         .ActionBuilder actionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112\r
314         .action.list.ActionBuilder();\r
315         SetVlanPcpActionCaseBuilder vlanPcpCaseBuilder = new SetVlanPcpActionCaseBuilder();\r
316         SetVlanPcpActionBuilder pcpBuilder = new SetVlanPcpActionBuilder();\r
317         pcpBuilder.setVlanPcp(new VlanPcp((short) 7));\r
318         vlanPcpCaseBuilder.setSetVlanPcpAction(pcpBuilder.build());\r
319         actionBuilder.setAction(vlanPcpCaseBuilder.build());\r
320         actionBuilder.setOrder(0);\r
321         salActions.add(actionBuilder.build());\r
322         actionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112\r
323                 .action.list.ActionBuilder();\r
324         StripVlanActionCaseBuilder stripCaseBuilder = new StripVlanActionCaseBuilder();\r
325         StripVlanActionBuilder stripBuilder = new StripVlanActionBuilder();\r
326         stripCaseBuilder.setStripVlanAction(stripBuilder.build());\r
327         actionBuilder.setAction(stripCaseBuilder.build());\r
328         actionBuilder.setOrder(1);\r
329         salActions.add(actionBuilder.build());\r
330         actionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112\r
331                 .action.list.ActionBuilder();\r
332         SetDlDstActionCaseBuilder dlDstCaseBuilder = new SetDlDstActionCaseBuilder();\r
333         SetDlDstActionBuilder dlDstBuilder = new SetDlDstActionBuilder();\r
334         dlDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
335         dlDstCaseBuilder.setSetDlDstAction(dlDstBuilder.build());\r
336         actionBuilder.setAction(dlDstCaseBuilder.build());\r
337         actionBuilder.setOrder(2);\r
338         salActions.add(actionBuilder.build());\r
339         actionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112\r
340                 .action.list.ActionBuilder();\r
341         SetDlSrcActionCaseBuilder dlSrcCaseBuilder = new SetDlSrcActionCaseBuilder();\r
342         SetDlSrcActionBuilder dlSrcBuilder = new SetDlSrcActionBuilder();\r
343         dlSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
344         dlSrcCaseBuilder.setSetDlSrcAction(dlSrcBuilder.build());\r
345         actionBuilder.setAction(dlSrcCaseBuilder.build());\r
346         actionBuilder.setOrder(3);\r
347         salActions.add(actionBuilder.build());\r
348         actionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112\r
349                 .action.list.ActionBuilder();\r
350         SetNwSrcActionCaseBuilder nwSrcCaseBuilder = new SetNwSrcActionCaseBuilder();\r
351         SetNwSrcActionBuilder nwSrcBuilder = new SetNwSrcActionBuilder();\r
352         Ipv4Builder ipv4Builder = new Ipv4Builder();\r
353         ipv4Builder.setIpv4Address(new Ipv4Prefix("10.0.0.1/24"));\r
354         nwSrcBuilder.setAddress(ipv4Builder.build());\r
355         nwSrcCaseBuilder.setSetNwSrcAction(nwSrcBuilder.build());\r
356         actionBuilder.setAction(nwSrcCaseBuilder.build());\r
357         actionBuilder.setOrder(4);\r
358         salActions.add(actionBuilder.build());\r
359         actionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112\r
360                 .action.list.ActionBuilder();\r
361         SetNwDstActionCaseBuilder nwDstCaseBuilder = new SetNwDstActionCaseBuilder();\r
362         SetNwDstActionBuilder nwDstBuilder = new SetNwDstActionBuilder();\r
363         ipv4Builder = new Ipv4Builder();\r
364         ipv4Builder.setIpv4Address(new Ipv4Prefix("10.0.0.2/32"));\r
365         nwDstBuilder.setAddress(ipv4Builder.build());\r
366         nwDstCaseBuilder.setSetNwDstAction(nwDstBuilder.build());\r
367         actionBuilder.setAction(nwDstCaseBuilder.build());\r
368         actionBuilder.setOrder(5);\r
369         salActions.add(actionBuilder.build());\r
370         actionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112\r
371                 .action.list.ActionBuilder();\r
372         SetTpSrcActionCaseBuilder tpSrcCaseBuilder = new SetTpSrcActionCaseBuilder();\r
373         SetTpSrcActionBuilder tpSrcBuilder = new SetTpSrcActionBuilder();\r
374         tpSrcBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types\r
375                 .rev100924.PortNumber(54));\r
376         tpSrcCaseBuilder.setSetTpSrcAction(tpSrcBuilder.build());\r
377         actionBuilder.setAction(tpSrcCaseBuilder.build());\r
378         actionBuilder.setOrder(6);\r
379         salActions.add(actionBuilder.build());\r
380         actionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112\r
381                 .action.list.ActionBuilder();\r
382         SetTpDstActionCaseBuilder tpDstCaseBuilder = new SetTpDstActionCaseBuilder();\r
383         SetTpDstActionBuilder tpDstBuilder = new SetTpDstActionBuilder();\r
384         tpDstBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types\r
385                 .rev100924.PortNumber(45));\r
386         tpDstCaseBuilder.setSetTpDstAction(tpDstBuilder.build());\r
387         actionBuilder.setAction(tpDstCaseBuilder.build());\r
388         actionBuilder.setOrder(7);\r
389         salActions.add(actionBuilder.build());\r
390         actionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112\r
391                 .action.list.ActionBuilder();\r
392         SetNwTosActionCaseBuilder tosCaseBuilder = new SetNwTosActionCaseBuilder();\r
393         SetNwTosActionBuilder tosBuilder = new SetNwTosActionBuilder();\r
394         tosBuilder.setTos(16);\r
395         tosCaseBuilder.setSetNwTosAction(tosBuilder.build());\r
396         actionBuilder.setAction(tosCaseBuilder.build());\r
397         actionBuilder.setOrder(8);\r
398         salActions.add(actionBuilder.build());\r
399         actionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112\r
400                 .action.list.ActionBuilder();\r
401         SetVlanIdActionCaseBuilder vlanIdCaseBuilder = new SetVlanIdActionCaseBuilder();\r
402         SetVlanIdActionBuilder vlanIdBuilder = new SetVlanIdActionBuilder();\r
403         vlanIdBuilder.setVlanId(new VlanId(22));\r
404         vlanIdCaseBuilder.setSetVlanIdAction(vlanIdBuilder.build());\r
405         actionBuilder.setAction(vlanIdCaseBuilder.build());\r
406         actionBuilder.setOrder(9);\r
407         salActions.add(actionBuilder.build());\r
408         actionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112\r
409                 .action.list.ActionBuilder();\r
410         nwSrcCaseBuilder = new SetNwSrcActionCaseBuilder();\r
411         nwSrcBuilder = new SetNwSrcActionBuilder();\r
412         Ipv6Builder ipv6Builder = new Ipv6Builder();\r
413         ipv6Builder.setIpv6Address(new Ipv6Prefix("0000:0000:0000:0000:0000:0000:0000:0005/128"));\r
414         nwSrcBuilder.setAddress(ipv6Builder.build());\r
415         nwSrcCaseBuilder.setSetNwSrcAction(nwSrcBuilder.build());\r
416         actionBuilder.setAction(nwSrcCaseBuilder.build());\r
417         actionBuilder.setOrder(10);\r
418         salActions.add(actionBuilder.build());\r
419         actionBuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112\r
420                 .action.list.ActionBuilder();\r
421         nwDstCaseBuilder = new SetNwDstActionCaseBuilder();\r
422         nwDstBuilder = new SetNwDstActionBuilder();\r
423         ipv6Builder = new Ipv6Builder();\r
424         ipv6Builder.setIpv6Address(new Ipv6Prefix("0000:0000:0000:0000:0000:0000:0000:0008/64"));\r
425         nwDstBuilder.setAddress(ipv6Builder.build());\r
426         nwDstCaseBuilder.setSetNwDstAction(nwDstBuilder.build());\r
427         actionBuilder.setAction(nwDstCaseBuilder.build());\r
428         actionBuilder.setOrder(11);\r
429         salActions.add(actionBuilder.build());\r
430         \r
431         IpMatchBuilder ipMatchBld = new IpMatchBuilder().setIpProtocol((short) 6);\r
432         MatchBuilder matchBld = new MatchBuilder().setIpMatch(ipMatchBld.build());\r
433         FlowBuilder flowBld = new FlowBuilder().setMatch(matchBld.build());\r
434         List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping\r
435         .Action> actions = ActionConvertor.getActions(salActions, EncodeConstants.OF13_VERSION_ID, new BigInteger("42"), flowBld.build());\r
436         \r
437         Assert.assertEquals("Wrong number of actions", 12, actions.size());\r
438         org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping\r
439         .Action action = actions.get(0);\r
440         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
441                 + ".action.rev130731.SetField", action.getType().getName());\r
442         MatchEntries entry = action.getAugmentation(OxmFieldsAction.class).getMatchEntries().get(0);\r
443         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp.class, false);\r
444         Assert.assertEquals("Wrong vlan pcp", 7, entry.getAugmentation(VlanPcpMatchEntry.class).getVlanPcp().intValue());\r
445         action = actions.get(1);\r
446         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
447                 + ".action.rev130731.SetField", action.getType().getName());\r
448         entry = action.getAugmentation(OxmFieldsAction.class).getMatchEntries().get(0);\r
449         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid.class, false);\r
450         Assert.assertEquals("Wrong vlan vid", 0, entry.getAugmentation(VlanVidMatchEntry.class).getVlanVid().intValue());\r
451         Assert.assertEquals("Wrong cfi bit", true, entry.getAugmentation(VlanVidMatchEntry.class).isCfiBit());\r
452         action = actions.get(2);\r
453         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
454                 + ".action.rev130731.SetField", action.getType().getName());\r
455         entry = action.getAugmentation(OxmFieldsAction.class).getMatchEntries().get(0);\r
456         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst.class, false);\r
457         Assert.assertEquals("Wrong dl dst", "00:00:00:00:00:06", entry.getAugmentation(MacAddressMatchEntry.class)\r
458                 .getMacAddress().getValue());\r
459         action = actions.get(3);\r
460         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
461                 + ".action.rev130731.SetField", action.getType().getName());\r
462         entry = action.getAugmentation(OxmFieldsAction.class).getMatchEntries().get(0);\r
463         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc.class, false);\r
464         Assert.assertEquals("Wrong dl src", "00:00:00:00:00:05", entry.getAugmentation(MacAddressMatchEntry.class)\r
465                 .getMacAddress().getValue());\r
466         action = actions.get(4);\r
467         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
468                 + ".action.rev130731.SetField", action.getType().getName());\r
469         entry = action.getAugmentation(OxmFieldsAction.class).getMatchEntries().get(0);\r
470         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src.class, false);\r
471         Assert.assertEquals("Wrong ipv4 src", "10.0.0.1", entry.getAugmentation(Ipv4AddressMatchEntry.class)\r
472                 .getIpv4Address().getValue());\r
473         action = actions.get(5);\r
474         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
475                 + ".action.rev130731.SetField", action.getType().getName());\r
476         entry = action.getAugmentation(OxmFieldsAction.class).getMatchEntries().get(0);\r
477         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst.class, false);\r
478         Assert.assertEquals("Wrong ipv4 dst", "10.0.0.2", entry.getAugmentation(Ipv4AddressMatchEntry.class)\r
479                 .getIpv4Address().getValue());\r
480         action = actions.get(6);\r
481         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
482                 + ".action.rev130731.SetField", action.getType().getName());\r
483         entry = action.getAugmentation(OxmFieldsAction.class).getMatchEntries().get(0);\r
484         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc.class, false);\r
485         Assert.assertEquals("Wrong tcp src", 54, entry.getAugmentation(PortMatchEntry.class)\r
486                 .getPort().getValue().intValue());\r
487         action = actions.get(7);\r
488         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
489                 + ".action.rev130731.SetField", action.getType().getName());\r
490         entry = action.getAugmentation(OxmFieldsAction.class).getMatchEntries().get(0);\r
491         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst.class, false);\r
492         Assert.assertEquals("Wrong tcp dst", 45, entry.getAugmentation(PortMatchEntry.class)\r
493                 .getPort().getValue().intValue());\r
494         action = actions.get(8);\r
495         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
496                 + ".action.rev130731.SetField", action.getType().getName());\r
497         entry = action.getAugmentation(OxmFieldsAction.class).getMatchEntries().get(0);\r
498         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp.class, false);\r
499         Assert.assertEquals("Wrong ip dscp", 4, entry.getAugmentation(DscpMatchEntry.class)\r
500                 .getDscp().getValue().intValue());\r
501         action = actions.get(9);\r
502         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
503                 + ".action.rev130731.SetField", action.getType().getName());\r
504         entry = action.getAugmentation(OxmFieldsAction.class).getMatchEntries().get(0);\r
505         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid.class, false);\r
506         Assert.assertEquals("Wrong vlan id", 22, entry.getAugmentation(VlanVidMatchEntry.class)\r
507                 .getVlanVid().intValue());\r
508         Assert.assertEquals("Wrong cfi bit", true, entry.getAugmentation(VlanVidMatchEntry.class)\r
509                 .isCfiBit());\r
510         action = actions.get(10);\r
511         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
512                 + ".action.rev130731.SetField", action.getType().getName());\r
513         entry = action.getAugmentation(OxmFieldsAction.class).getMatchEntries().get(0);\r
514         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src.class, false);\r
515         Assert.assertEquals("Wrong ipv4 src", "0000:0000:0000:0000:0000:0000:0000:0005",\r
516                 entry.getAugmentation(Ipv6AddressMatchEntry.class).getIpv6Address().getValue());\r
517         action = actions.get(11);\r
518         Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"\r
519                 + ".action.rev130731.SetField", action.getType().getName());\r
520         entry = action.getAugmentation(OxmFieldsAction.class).getMatchEntries().get(0);\r
521         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Dst.class, false);\r
522         Assert.assertEquals("Wrong ipv4 dst", "0000:0000:0000:0000:0000:0000:0000:0008",\r
523                 entry.getAugmentation(Ipv6AddressMatchEntry.class).getIpv6Address().getValue());\r
524     }\r
525 \r
526     private static void checkEntryHeader(MatchEntries entry, Class<? extends MatchField> field, boolean hasMask) {\r
527         Assert.assertEquals("Wrong oxm class", OpenflowBasicClass.class, entry.getOxmClass());\r
528         Assert.assertEquals("Wrong oxm field", field, entry.getOxmMatchField());\r
529         Assert.assertEquals("Wrong hasMask", hasMask, entry.isHasMask());\r
530     }\r
531 }