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.IpVersion;
\r
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
\r
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
\r
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.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.augments.rev131002.DlAddressAction;
\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosAction;
\r
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
\r
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpAction;
\r
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;
\r
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;
\r
65 * @author michal.polkorab
\r
68 public class ActionConvertorV10Test {
\r
71 * Test {@link ActionConvertor#getActions(List, short, BigInteger)}
\r
74 public void testGetActions() {
\r
75 List<Action> salActions = new ArrayList<>();
\r
76 ActionBuilder actionBuilder = new ActionBuilder();
\r
77 SetVlanPcpActionCaseBuilder vlanPcpCaseBuilder = new SetVlanPcpActionCaseBuilder();
\r
78 SetVlanPcpActionBuilder pcpBuilder = new SetVlanPcpActionBuilder();
\r
79 pcpBuilder.setVlanPcp(new VlanPcp((short) 7));
\r
80 vlanPcpCaseBuilder.setSetVlanPcpAction(pcpBuilder.build());
\r
81 actionBuilder.setAction(vlanPcpCaseBuilder.build());
\r
82 actionBuilder.setOrder(0);
\r
83 salActions.add(actionBuilder.build());
\r
84 actionBuilder = new ActionBuilder();
\r
85 StripVlanActionCaseBuilder stripCaseBuilder = new StripVlanActionCaseBuilder();
\r
86 StripVlanActionBuilder stripBuilder = new StripVlanActionBuilder();
\r
87 stripCaseBuilder.setStripVlanAction(stripBuilder.build());
\r
88 actionBuilder.setAction(stripCaseBuilder.build());
\r
89 actionBuilder.setOrder(1);
\r
90 salActions.add(actionBuilder.build());
\r
91 actionBuilder = new ActionBuilder();
\r
92 SetDlDstActionCaseBuilder dlDstCaseBuilder = new SetDlDstActionCaseBuilder();
\r
93 SetDlDstActionBuilder dlDstBuilder = new SetDlDstActionBuilder();
\r
94 dlDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
\r
95 dlDstCaseBuilder.setSetDlDstAction(dlDstBuilder.build());
\r
96 actionBuilder.setAction(dlDstCaseBuilder.build());
\r
97 actionBuilder.setOrder(2);
\r
98 salActions.add(actionBuilder.build());
\r
99 actionBuilder = new ActionBuilder();
\r
100 SetDlSrcActionCaseBuilder dlSrcCaseBuilder = new SetDlSrcActionCaseBuilder();
\r
101 SetDlSrcActionBuilder dlSrcBuilder = new SetDlSrcActionBuilder();
\r
102 dlSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
\r
103 dlSrcCaseBuilder.setSetDlSrcAction(dlSrcBuilder.build());
\r
104 actionBuilder.setAction(dlSrcCaseBuilder.build());
\r
105 actionBuilder.setOrder(3);
\r
106 salActions.add(actionBuilder.build());
\r
107 actionBuilder = new ActionBuilder();
\r
108 SetNwSrcActionCaseBuilder nwSrcCaseBuilder = new SetNwSrcActionCaseBuilder();
\r
109 SetNwSrcActionBuilder nwSrcBuilder = new SetNwSrcActionBuilder();
\r
110 Ipv4Builder ipv4Builder = new Ipv4Builder();
\r
111 ipv4Builder.setIpv4Address(new Ipv4Prefix("10.0.0.1/24"));
\r
112 nwSrcBuilder.setAddress(ipv4Builder.build());
\r
113 nwSrcCaseBuilder.setSetNwSrcAction(nwSrcBuilder.build());
\r
114 actionBuilder.setAction(nwSrcCaseBuilder.build());
\r
115 actionBuilder.setOrder(4);
\r
116 salActions.add(actionBuilder.build());
\r
117 actionBuilder = new ActionBuilder();
\r
118 SetNwDstActionCaseBuilder nwDstCaseBuilder = new SetNwDstActionCaseBuilder();
\r
119 SetNwDstActionBuilder nwDstBuilder = new SetNwDstActionBuilder();
\r
120 ipv4Builder = new Ipv4Builder();
\r
121 ipv4Builder.setIpv4Address(new Ipv4Prefix("10.0.0.2/32"));
\r
122 nwDstBuilder.setAddress(ipv4Builder.build());
\r
123 nwDstCaseBuilder.setSetNwDstAction(nwDstBuilder.build());
\r
124 actionBuilder.setAction(nwDstCaseBuilder.build());
\r
125 actionBuilder.setOrder(5);
\r
126 salActions.add(actionBuilder.build());
\r
127 actionBuilder = new ActionBuilder();
\r
128 SetTpSrcActionCaseBuilder tpSrcCaseBuilder = new SetTpSrcActionCaseBuilder();
\r
129 SetTpSrcActionBuilder tpSrcBuilder = new SetTpSrcActionBuilder();
\r
130 tpSrcBuilder.setPort(new PortNumber(54));
\r
131 tpSrcCaseBuilder.setSetTpSrcAction(tpSrcBuilder.build());
\r
132 actionBuilder.setAction(tpSrcCaseBuilder.build());
\r
133 actionBuilder.setOrder(6);
\r
134 salActions.add(actionBuilder.build());
\r
135 actionBuilder = new ActionBuilder();
\r
136 SetTpDstActionCaseBuilder tpDstCaseBuilder = new SetTpDstActionCaseBuilder();
\r
137 SetTpDstActionBuilder tpDstBuilder = new SetTpDstActionBuilder();
\r
138 tpDstBuilder.setPort(new PortNumber(45));
\r
139 tpDstCaseBuilder.setSetTpDstAction(tpDstBuilder.build());
\r
140 actionBuilder.setAction(tpDstCaseBuilder.build());
\r
141 actionBuilder.setOrder(7);
\r
142 salActions.add(actionBuilder.build());
\r
143 actionBuilder = new ActionBuilder();
\r
144 SetNwTosActionCaseBuilder tosCaseBuilder = new SetNwTosActionCaseBuilder();
\r
145 SetNwTosActionBuilder tosBuilder = new SetNwTosActionBuilder();
\r
146 tosBuilder.setTos(18);
\r
147 tosCaseBuilder.setSetNwTosAction(tosBuilder.build());
\r
148 actionBuilder.setAction(tosCaseBuilder.build());
\r
149 actionBuilder.setOrder(8);
\r
150 salActions.add(actionBuilder.build());
\r
151 actionBuilder = new ActionBuilder();
\r
152 SetVlanIdActionCaseBuilder vlanIdCaseBuilder = new SetVlanIdActionCaseBuilder();
\r
153 SetVlanIdActionBuilder vlanIdBuilder = new SetVlanIdActionBuilder();
\r
154 vlanIdBuilder.setVlanId(new VlanId(22));
\r
155 vlanIdCaseBuilder.setSetVlanIdAction(vlanIdBuilder.build());
\r
156 actionBuilder.setAction(vlanIdCaseBuilder.build());
\r
157 actionBuilder.setOrder(9);
\r
158 salActions.add(actionBuilder.build());
\r
160 IpMatchBuilder ipMatchBld = new IpMatchBuilder().setIpProto(IpVersion.Ipv4);
\r
161 MatchBuilder matchBld = new MatchBuilder().setIpMatch(ipMatchBld.build());
\r
162 FlowBuilder flowBld = new FlowBuilder().setMatch(matchBld.build());
\r
163 List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping
\r
164 .Action> actions = ActionConvertor.getActions(salActions, EncodeConstants.OF10_VERSION_ID, new BigInteger("42"), flowBld.build());
\r
166 Assert.assertEquals("Wrong number of actions", 10, actions.size());
\r
167 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping
\r
168 .Action action = actions.get(0);
\r
169 Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
170 + ".action.rev130731.SetVlanPcp", action.getType().getName());
\r
171 Assert.assertEquals("Wrong vlan pcp", 7, action.getAugmentation(VlanPcpAction.class).getVlanPcp().intValue());
\r
172 action = actions.get(1);
\r
173 Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
174 + ".action.rev130731.StripVlan", action.getType().getName());
\r
175 action = actions.get(2);
\r
176 Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
177 + ".action.rev130731.SetDlDst", action.getType().getName());
\r
178 Assert.assertEquals("Wrong dl dst", "00:00:00:00:00:06", action.getAugmentation(DlAddressAction.class)
\r
179 .getDlAddress().getValue());
\r
180 action = actions.get(3);
\r
181 Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
182 + ".action.rev130731.SetDlSrc", action.getType().getName());
\r
183 Assert.assertEquals("Wrong dl dst", "00:00:00:00:00:05", action.getAugmentation(DlAddressAction.class)
\r
184 .getDlAddress().getValue());
\r
185 action = actions.get(4);
\r
186 Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
187 + ".action.rev130731.SetNwSrc", action.getType().getName());
\r
188 // FIXME - fix ipv4 address translation - cut off network mask
\r
189 // Assert.assertEquals("Wrong nw src", "10.0.0.1", action.getAugmentation(IpAddressAction.class)
\r
190 // .getIpAddress().getValue());
\r
191 action = actions.get(5);
\r
192 Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
193 + ".action.rev130731.SetNwDst", action.getType().getName());
\r
194 // FIXME - fix ipv4 address translation - cut off network mask
\r
195 // Assert.assertEquals("Wrong nw dst", "10.0.0.2", action.getAugmentation(IpAddressAction.class)
\r
196 // .getIpAddress().getValue());
\r
197 action = actions.get(6);
\r
198 Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
199 + ".action.rev130731.SetTpSrc", action.getType().getName());
\r
200 Assert.assertEquals("Wrong tp src", 54, action.getAugmentation(PortAction.class)
\r
201 .getPort().getValue().intValue());
\r
202 action = actions.get(7);
\r
203 Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
204 + ".action.rev130731.SetTpDst", action.getType().getName());
\r
205 Assert.assertEquals("Wrong tp dst", 45, action.getAugmentation(PortAction.class)
\r
206 .getPort().getValue().intValue());
\r
207 action = actions.get(8);
\r
208 Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
209 + ".action.rev130731.SetNwTos", action.getType().getName());
\r
210 Assert.assertEquals("Wrong nw tos", 18, action.getAugmentation(NwTosAction.class)
\r
211 .getNwTos().intValue());
\r
212 action = actions.get(9);
\r
213 Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common"
\r
214 + ".action.rev130731.SetVlanVid", action.getType().getName());
\r
215 Assert.assertEquals("Wrong vlan id", 22, action.getAugmentation(VlanVidAction.class)
\r
216 .getVlanVid().intValue());
\r
220 * Test {@link ActionConvertor#toMDSalActions(List, OpenflowVersion, ActionPath)}
\r
223 public void testToMDSalActions() {
\r
224 OpenflowPortsUtil.init();
\r
226 List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping
\r
227 .Action> actions = new ArrayList<>();
\r
228 org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping
\r
229 .ActionBuilder actionbuilder = new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common
\r
230 .action.rev130731.actions.grouping.ActionBuilder();
\r
231 actionbuilder.setType(Output.class);
\r
232 PortActionBuilder portBuilder = new PortActionBuilder();
\r
233 portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber(14L));
\r
234 actionbuilder.addAugmentation(PortAction.class, portBuilder.build());
\r
235 MaxLengthActionBuilder lengthBuilder = new MaxLengthActionBuilder();
\r
236 lengthBuilder.setMaxLength(555);
\r
237 actionbuilder.addAugmentation(MaxLengthAction.class, lengthBuilder.build());
\r
238 actions.add(actionbuilder.build());
\r
240 List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action
\r
241 .Action> mdSalActions = ActionConvertor.toMDSalActions(actions, OpenflowVersion.OF10,
\r
242 ActionPath.FLOWSSTATISTICSUPDATE_FLOWANDSTATISTICSMAPLIST_INSTRUCTIONS_INSTRUCTION_INSTRUCTION_APPLYACTIONSCASE_APPLYACTIONS_ACTION_ACTION);
\r
244 Assert.assertEquals("Wrong number of output actions", 1, mdSalActions.size());
\r
245 org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = mdSalActions.get(0);
\r
246 Assert.assertEquals("Wrong action type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types"
\r
247 + ".rev131112.action.action.OutputActionCase", action.getImplementedInterface().getName());
\r
248 OutputActionCase outputAction = (OutputActionCase) action;
\r
249 Assert.assertEquals("Wrong output port", "14", outputAction.getOutputAction().getOutputNodeConnector().getValue());
\r
250 Assert.assertEquals("Wrong max length", 555, outputAction.getOutputAction().getMaxLength().intValue());
\r