1 package org.opendaylight.controller.sal.compability;
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertTrue;
6 import java.math.BigInteger;
7 import java.net.Inet4Address;
8 import java.net.Inet6Address;
9 import java.net.InetAddress;
10 import java.util.ArrayList;
11 import java.util.List;
13 import org.junit.Test;
14 import org.opendaylight.controller.sal.action.*;
15 import org.opendaylight.controller.sal.flowprogrammer.Flow;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAddedBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.VlanCfi;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.*;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.Address;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv4Builder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv6Builder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.ActionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Match;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.MatchBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.EthernetMatchBuilder;
37 import com.google.common.net.InetAddresses;
39 public class TestToSalConversionsUtils {
41 // od|Od = Open Daylight
44 public void testToSalConversion() {
45 Flow salFlow = ToSalConversionsUtils.flowFrom(prepareOdFlow());
46 checkSalFlow(salFlow);
49 private void checkSalFlow(Flow salFlow) {
50 assertTrue("Id value is incorrect.", salFlow.getId() == 9223372036854775807L);
51 assertTrue("Hard timeout is incorrect.", salFlow.getHardTimeout() == 32767);
52 assertTrue("Iddle timeout is incorrect.", salFlow.getIdleTimeout() == 32767);
53 assertTrue("Priority value is incorrect.", salFlow.getPriority() == 32767);
55 checkSalActions(salFlow.getActions());
58 private void checkSalActions(List<org.opendaylight.controller.sal.action.Action> actions) {
59 checkSalAction(actions, Flood.class, 1);
60 checkSalAction(actions, FloodAll.class, 1);
61 checkSalAction(actions, HwPath.class, 1);
62 checkSalAction(actions, Loopback.class, 1);
63 checkSalAction(actions, Output.class, 2, true);
64 checkSalAction(actions, PopVlan.class, 1);
65 checkSalAction(actions, PushVlan.class, 1, true);
66 checkSalAction(actions, SetDlDst.class, 1, true);
67 checkSalAction(actions, SetDlSrc.class, 1, true);
68 checkSalAction(actions, SetDlType.class, 1, true);
69 checkSalAction(actions, SetNextHop.class, 2, true);
70 checkSalAction(actions, SetNwDst.class, 2, true);
71 checkSalAction(actions, SetNwSrc.class, 2, true);
72 checkSalAction(actions, SetNwTos.class, 1, true);
73 checkSalAction(actions, SetTpDst.class, 1, true);
74 checkSalAction(actions, SetTpSrc.class, 1, true);
75 checkSalAction(actions, SetVlanCfi.class, 1, true);
76 checkSalAction(actions, SetVlanId.class, 1, true);
77 checkSalAction(actions, SetVlanPcp.class, 1, true);
78 checkSalAction(actions, SwPath.class, 1);
81 private void checkSalAction(List<org.opendaylight.controller.sal.action.Action> actions, Class<?> cls,
83 checkSalAction(actions, cls, numOfActions, false);
86 private void checkSalAction(List<org.opendaylight.controller.sal.action.Action> actions, Class<?> cls,
87 int numOfActions, boolean additionalCheck) {
88 int numOfEqualClass = 0;
89 for (org.opendaylight.controller.sal.action.Action action : actions) {
90 if (action.getClass().equals(cls)) {
91 if (additionalCheck) {
92 additionalActionCheck(action);
97 assertEquals("Incorrect number of actions of type " + cls.getName() + " was found.", numOfActions,
101 // implement special checks
102 private void additionalActionCheck(org.opendaylight.controller.sal.action.Action action) {
103 if (action instanceof Output) {
104 // ((Output)action).getPort() //TODO finish check when mapping will
106 } else if (action instanceof PushVlan) {
107 assertEquals("Wrong value for action PushVlan for tag.", 0x8100, ((PushVlan) action).getTag());
108 assertEquals("Wrong value for action PushVlan for pcp.", 7, ((PushVlan) action).getPcp());
109 assertEquals("Wrong value for action PushVlan for cfi.", 1, ((PushVlan) action).getCfi());
110 assertEquals("Wrong value for action PushVlan for vlanID.", 4095, ((PushVlan) action).getVlanId());
111 } else if (action instanceof SetDlDst) {
112 assertEquals("Wrong value for action SetDlDst for MAC address.", "3C:A9:F4:00:E0:C8", new String(
113 ((SetDlDst) action).getDlAddress()));
114 } else if (action instanceof SetDlSrc) {
115 assertEquals("Wrong value for action SetDlSrc for MAC address.", "24:77:03:7C:C5:F1", new String(
116 ((SetDlSrc) action).getDlAddress()));
117 } else if (action instanceof SetDlType) {
118 assertEquals("Wrong value for action SetDlType for.", 513l, ((SetDlType) action).getDlType());
119 } else if (action instanceof SetNextHop) {
120 InetAddress inetAddress = ((SetNextHop) action).getAddress();
121 checkIpAddresses(inetAddress, "192.168.100.100", "2001:db8:85a3::8a2e:370:7334");
122 } else if (action instanceof SetNwDst) {
123 InetAddress inetAddress = ((SetNwDst) action).getAddress();
124 checkIpAddresses(inetAddress, "192.168.100.101", "2001:db8:85a3::8a2e:370:7335");
125 } else if (action instanceof SetNwSrc) {
126 InetAddress inetAddress = ((SetNwSrc) action).getAddress();
127 checkIpAddresses(inetAddress, "192.168.100.102", "2001:db8:85a3::8a2e:370:7336");
128 } else if (action instanceof SetNwTos) {
129 assertEquals("Wrong value for action SetNwTos for tos.", 63, ((SetNwTos) action).getNwTos());
130 } else if (action instanceof SetTpDst) {
131 assertEquals("Wrong value for action SetTpDst for port.", 65535, ((SetTpDst) action).getPort());
132 } else if (action instanceof SetTpSrc) {
133 assertEquals("Wrong value for action SetTpSrc for port.", 65535, ((SetTpSrc) action).getPort());
134 } else if (action instanceof SetVlanCfi) {
135 assertEquals("Wrong value for action SetVlanCfi for port.", 1, ((SetVlanCfi) action).getCfi());
136 } else if (action instanceof SetVlanId) {
137 assertEquals("Wrong value for action SetVlanId for vlan ID.", 4095, ((SetVlanId) action).getVlanId());
138 } else if (action instanceof SetVlanPcp) {
139 assertEquals("Wrong value for action SetVlanPcp for vlan ID.", 7, ((SetVlanPcp) action).getPcp());
143 private void checkIpAddresses(InetAddress inetAddress, String ipv4, String ipv6) {
144 if (inetAddress instanceof Inet4Address) {
145 assertEquals("Wrong value for IP address.", ipv4, InetAddresses.toAddrString(inetAddress));
146 } else if (inetAddress instanceof Inet6Address) {
147 assertEquals("Wrong value for IP address.", ipv6, InetAddresses.toAddrString(inetAddress));
151 private NodeFlow prepareOdFlow() {
152 FlowAddedBuilder odNodeFlowBuilder = new FlowAddedBuilder();
153 odNodeFlowBuilder.setCookie(new BigInteger("9223372036854775807"));
154 odNodeFlowBuilder.setHardTimeout(32767);
155 odNodeFlowBuilder.setIdleTimeout(32767);
156 odNodeFlowBuilder.setPriority(32767);
157 odNodeFlowBuilder.setAction(prepareOdActions());
158 odNodeFlowBuilder.setMatch(prepareOdMatch());
160 return odNodeFlowBuilder.build();
163 private List<Action> prepareOdActions() {
164 List<Action> odActions = new ArrayList<>();
166 ControllerActionBuilder controllerActionBuilder = new ControllerActionBuilder();
167 DropActionBuilder dropActionBuilder = new DropActionBuilder();
168 FloodActionBuilder floodActionBuilder = new FloodActionBuilder();
169 FloodAllActionBuilder floodAllActionBuilder = new FloodAllActionBuilder();
170 HwPathActionBuilder hwPathActionBuilder = new HwPathActionBuilder();
171 LoopbackActionBuilder loopbackActionBuilder = new LoopbackActionBuilder();
172 OutputActionBuilder outputActionBuilder = new OutputActionBuilder();
173 PopMplsActionBuilder popMplsActionBuilder = new PopMplsActionBuilder();
174 PopVlanActionBuilder popVlanActionBuilder = new PopVlanActionBuilder();
175 PushMplsActionBuilder pushMplsActionBuilder = new PushMplsActionBuilder();
176 PushPbbActionBuilder pushPbbActionBuilder = new PushPbbActionBuilder();
177 PushVlanActionBuilder pushVlanActionBuilder = new PushVlanActionBuilder();
178 SetDlDstActionBuilder setDlDstActionBuilder = new SetDlDstActionBuilder();
179 SetDlSrcActionBuilder setDlSrcActionBuilder = new SetDlSrcActionBuilder();
180 SetDlTypeActionBuilder setDlTypeActionBuilder = new SetDlTypeActionBuilder();
181 SetMplsTtlActionBuilder setMplsTtlActionBuilder = new SetMplsTtlActionBuilder();
182 SetNwTosActionBuilder setNwTosActionBuilder = new SetNwTosActionBuilder();
183 SetNwTtlActionBuilder setNwTtlActionBuilder = new SetNwTtlActionBuilder();
184 SetQueueActionBuilder setQueueActionBuilder = new SetQueueActionBuilder();
185 SetTpDstActionBuilder setTpDstActionBuilder = new SetTpDstActionBuilder();
186 SetTpSrcActionBuilder setTpSrcActionBuilder = new SetTpSrcActionBuilder();
187 SetVlanCfiActionBuilder setVlanCfiActionBuilder = new SetVlanCfiActionBuilder();
188 SetVlanIdActionBuilder setVlanIdActionBuilder = new SetVlanIdActionBuilder();
189 SetVlanPcpActionBuilder setVlanPcpActionBuilder = new SetVlanPcpActionBuilder();
190 SwPathActionBuilder swPathActionBuilder = new SwPathActionBuilder();
192 prepareActionOutput(outputActionBuilder);
193 prepareActionPushVlan(pushVlanActionBuilder);
194 prepareActionSetDlDst(setDlDstActionBuilder);
195 prepareActionSetDlSrc(setDlSrcActionBuilder);
196 prepareActionSetDlType(setDlTypeActionBuilder);
197 prepareActionNextHop(odActions);
198 prepareActionSetNwDst(odActions);
199 prepareActionSetNwSrc(odActions);
200 prepareActionSetNwTos(setNwTosActionBuilder);
201 prepareActionSetTpDst(setTpDstActionBuilder);
202 prepareActionSetTpSrc(setTpSrcActionBuilder);
203 prepareActionSetVlanCfi(setVlanCfiActionBuilder);
204 prepareActionSetVladId(setVlanIdActionBuilder);
205 prepareActionSetVlanPcp(setVlanPcpActionBuilder);
207 odActions.add(new ActionBuilder().setAction(controllerActionBuilder.build()).build());
208 odActions.add(new ActionBuilder().setAction(dropActionBuilder.build()).build());
209 odActions.add(new ActionBuilder().setAction(floodActionBuilder.build()).build());
210 odActions.add(new ActionBuilder().setAction(floodAllActionBuilder.build()).build());
211 odActions.add(new ActionBuilder().setAction(hwPathActionBuilder.build()).build());
212 odActions.add(new ActionBuilder().setAction(loopbackActionBuilder.build()).build());
213 odActions.add(new ActionBuilder().setAction(outputActionBuilder.build()).build());
214 odActions.add(new ActionBuilder().setAction(popMplsActionBuilder.build()).build());
215 odActions.add(new ActionBuilder().setAction(popVlanActionBuilder.build()).build());
216 odActions.add(new ActionBuilder().setAction(pushMplsActionBuilder.build()).build());
217 odActions.add(new ActionBuilder().setAction(pushPbbActionBuilder.build()).build());
218 odActions.add(new ActionBuilder().setAction(pushVlanActionBuilder.build()).build());
219 odActions.add(new ActionBuilder().setAction(setDlDstActionBuilder.build()).build());
220 odActions.add(new ActionBuilder().setAction(setDlSrcActionBuilder.build()).build());
221 odActions.add(new ActionBuilder().setAction(setDlTypeActionBuilder.build()).build());
222 odActions.add(new ActionBuilder().setAction(setMplsTtlActionBuilder.build()).build());
223 odActions.add(new ActionBuilder().setAction(setNwTosActionBuilder.build()).build());
224 odActions.add(new ActionBuilder().setAction(setNwTtlActionBuilder.build()).build());
225 odActions.add(new ActionBuilder().setAction(setQueueActionBuilder.build()).build());
226 odActions.add(new ActionBuilder().setAction(setTpDstActionBuilder.build()).build());
227 odActions.add(new ActionBuilder().setAction(setTpSrcActionBuilder.build()).build());
228 odActions.add(new ActionBuilder().setAction(setVlanCfiActionBuilder.build()).build());
229 odActions.add(new ActionBuilder().setAction(setVlanIdActionBuilder.build()).build());
230 odActions.add(new ActionBuilder().setAction(setVlanPcpActionBuilder.build()).build());
231 odActions.add(new ActionBuilder().setAction(swPathActionBuilder.build()).build());
236 private void prepareActionSetVlanPcp(SetVlanPcpActionBuilder setVlanPcpActionBuilder) {
237 setVlanPcpActionBuilder.setVlanPcp(new VlanPcp((short) 7));
240 private void prepareActionSetVladId(SetVlanIdActionBuilder setVlanIdActionBuilder) {
241 setVlanIdActionBuilder.setVlanId(new VlanId(4095));
244 private void prepareActionSetVlanCfi(SetVlanCfiActionBuilder setVlanCfiActionBuilder) {
245 setVlanCfiActionBuilder.setVlanCfi(new VlanCfi(1));
248 private void prepareActionSetTpDst(SetTpDstActionBuilder setTpDstActionBuilder) {
249 setTpDstActionBuilder.setPort(new PortNumber(65535));
252 private void prepareActionSetTpSrc(SetTpSrcActionBuilder setTpSrcActionBuilder) {
253 setTpSrcActionBuilder.setPort(new PortNumber(65535));
256 private void prepareActionSetNwTos(SetNwTosActionBuilder setNwTosActionBuilder) {
257 setNwTosActionBuilder.setTos(63);
260 private void prepareActionSetNwSrc(List<Action> odActions) {
261 // test case for IPv4
262 SetNwSrcActionBuilder setNwSrcActionBuilderIpv4 = new SetNwSrcActionBuilder();
263 setNwSrcActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.102"));
264 odActions.add(new ActionBuilder().setAction(setNwSrcActionBuilderIpv4.build()).build());
266 // test case for IPv6
267 SetNwSrcActionBuilder setNwSrcActionBuilderIpv6 = new SetNwSrcActionBuilder();
268 setNwSrcActionBuilderIpv6.setAddress(prapareIpv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7336"));
269 odActions.add(new ActionBuilder().setAction(setNwSrcActionBuilderIpv6.build()).build());
272 private void prepareActionSetNwDst(List<Action> odActions) {
273 // test case for IPv4
274 SetNwDstActionBuilder setNwDstActionBuilderIpv4 = new SetNwDstActionBuilder();
275 setNwDstActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.101"));
276 odActions.add(new ActionBuilder().setAction(setNwDstActionBuilderIpv4.build()).build());
278 // test case for IPv6
279 SetNwDstActionBuilder setNwDstActionBuilderIpv6 = new SetNwDstActionBuilder();
280 setNwDstActionBuilderIpv6.setAddress(prapareIpv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7335"));
281 odActions.add(new ActionBuilder().setAction(setNwDstActionBuilderIpv6.build()).build());
284 private void prepareActionNextHop(List<Action> odActions) {
285 // test case for IPv4
286 SetNextHopActionBuilder setNextHopActionBuilderIpv4 = new SetNextHopActionBuilder();
287 setNextHopActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.100"));
288 odActions.add(new ActionBuilder().setAction(setNextHopActionBuilderIpv4.build()).build());
290 // test case for IPv6
291 SetNextHopActionBuilder setNextHopActionBuilderIpv6 = new SetNextHopActionBuilder();
292 setNextHopActionBuilderIpv6.setAddress(prapareIpv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7334"));
293 odActions.add(new ActionBuilder().setAction(setNextHopActionBuilderIpv6.build()).build());
296 private Address prapareIpv4Address(String ipv4Address) {
297 Ipv4Builder ipv4Builder = new Ipv4Builder();
298 ipv4Builder.setIpv4Address(new Ipv4Prefix(ipv4Address));
299 return ipv4Builder.build();
302 private Address prapareIpv6Address(String ipv6Address) {
303 Ipv6Builder ipv6Builder = new Ipv6Builder();
304 ipv6Builder.setIpv6Address(new Ipv6Prefix(ipv6Address));
305 return ipv6Builder.build();
308 private void prepareActionSetDlType(SetDlTypeActionBuilder setDlTypeActionBuilder) {
309 setDlTypeActionBuilder.setDlType(new EtherType(513l));
312 private void prepareActionSetDlSrc(SetDlSrcActionBuilder setDlSrcActionBuilder) {
313 setDlSrcActionBuilder.setAddress(new MacAddress("24:77:03:7C:C5:F1"));
316 private void prepareActionSetDlDst(SetDlDstActionBuilder setDlDstActionBuilder) {
317 setDlDstActionBuilder.setAddress(new MacAddress("3C:A9:F4:00:E0:C8"));
320 private void prepareActionPushVlan(PushVlanActionBuilder pushVlanActionBuilder) {
321 pushVlanActionBuilder.setPcp(7); // 3 bits
322 pushVlanActionBuilder.setCfi(new VlanCfi(1)); // 1 bit
323 pushVlanActionBuilder.setVlanId(new VlanId(4095));
324 pushVlanActionBuilder.setTag(0x8100); // 12 bit
327 private void prepareActionOutput(OutputActionBuilder outputActionBuilder) {
328 List<Uri> uris = new ArrayList<>();
329 uris.add(new Uri("uri1"));
330 uris.add(new Uri("uri2"));
331 outputActionBuilder.setOutputNodeConnector(uris);
334 private Match prepareOdMatch() {
335 MatchBuilder odMatchBuilder = new MatchBuilder();
336 EthernetMatchBuilder odEthernetMatchBuilder = new EthernetMatchBuilder();
337 odMatchBuilder.setEthernetMatch(odEthernetMatchBuilder.build());
339 return odMatchBuilder.build();