2 * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.
\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
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
\r
11 import java.math.BigInteger;
\r
12 import java.util.ArrayList;
\r
13 import java.util.List;
\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
113 * @author michal.polkorab
\r
116 public class ActionConvertorV13Test {
\r
119 * Test {@link ActionConvertor#toMDSalActions(List, OpenflowVersion, ActionPath)}
\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
128 Assert.assertEquals("Wrong number of output actions", 0, mdSalActions.size());
\r
132 * Test {@link ActionConvertor#toMDSalActions(List, OpenflowVersion, ActionPath)}
\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
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
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
306 * Test {@link ActionConvertor#getActions(List, short, BigInteger)}
\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
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
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
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
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