Updated Flow Capable Models & AD SAL Compatibility mapping
[controller.git] / opendaylight / md-sal / sal-compability / src / test / java / org / opendaylight / controller / sal / compability / TestToSalConversionsUtils.java
1 package org.opendaylight.controller.sal.compability;
2
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertTrue;
5
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;
12
13 import org.junit.Test;
14 import org.opendaylight.controller.sal.action.*;
15 import org.opendaylight.controller.sal.flowprogrammer.Flow;
16 import org.opendaylight.controller.sal.match.MatchType;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.*;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAddedBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.NodeFlow;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.VlanCfi;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.*;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.Address;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv4Builder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv6Builder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.ActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Match;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.MatchBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.arp.match.fields.ArpSourceHardwareAddressBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.arp.match.fields.ArpTargetHardwareAddressBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.ethernet.match.fields.*;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.*;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.ArpMatchBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv4MatchBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._3.match.Ipv6MatchBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.SctpMatchBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.TcpMatchBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.match.layer._4.match.UdpMatchBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev130819.vlan.match.fields.VlanIdBuilder;
44
45 import com.google.common.net.InetAddresses;
46 import static org.opendaylight.controller.sal.compability.ProtocolConstants.ETHERNET_ARP;
47 import static org.opendaylight.controller.sal.compability.ProtocolConstants.SCTP;
48 import static org.opendaylight.controller.sal.compability.ProtocolConstants.TCP;
49 import static org.opendaylight.controller.sal.compability.ProtocolConstants.UDP;
50
51 public class TestToSalConversionsUtils {
52     // prefix:
53     // od|Od = Open Daylight
54     private enum MtchType {
55         other, ipv4, ipv6, arp, sctp, tcp, udp
56     }
57
58     @Test
59     public void testToSalConversion() {
60         FlowAddedBuilder odNodeFlowBuilder = new FlowAddedBuilder();
61         odNodeFlowBuilder = prepareOdFlowCommon();
62
63         Flow salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.other));
64         checkSalMatch(salFlow.getMatch(), MtchType.other);
65
66         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.ipv4));
67         checkSalMatch(salFlow.getMatch(), MtchType.ipv4);
68
69         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.ipv6));
70         checkSalMatch(salFlow.getMatch(), MtchType.ipv6);
71
72         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.arp));
73         checkSalMatch(salFlow.getMatch(), MtchType.arp);
74
75         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.sctp));
76         checkSalMatch(salFlow.getMatch(), MtchType.sctp);
77
78         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.tcp));
79         checkSalMatch(salFlow.getMatch(), MtchType.tcp);
80
81         salFlow = ToSalConversionsUtils.toFlow(prepareOdFlow(odNodeFlowBuilder, MtchType.udp));
82         checkSalMatch(salFlow.getMatch(), MtchType.udp);
83
84         checkSalFlow(salFlow);
85     }
86
87     private void checkSalMatch(org.opendaylight.controller.sal.match.Match match, MtchType mt) {
88         switch (mt) {
89         case other:
90             /*assertNotNull("DL_DST isn't equal.", "3C:A9:F4:00:E0:C8", 
91                     new String((byte[]) match.getField(MatchType.DL_DST).getValue()));
92             assertEquals("DL_SRC isn't equal.", "24:77:03:7C:C5:F1",
93                     new String((byte[]) match.getField(MatchType.DL_SRC).getValue()));
94             */
95             assertEquals("DL_TYPE isn't equal.", (short) 0xffff, (short) match.getField(MatchType.DL_TYPE).getValue());
96             assertEquals("NW_TOS isn't equal.", (byte) 0x33, (byte) match.getField(MatchType.NW_TOS).getValue());
97             assertEquals("NW_PROTO isn't equal.", (byte) 0x3f, (byte) match.getField(MatchType.NW_PROTO).getValue());
98             assertEquals("DL_VLAN isn't equal.", (short) 0xfff, (short) match.getField(MatchType.DL_VLAN).getValue());
99             assertEquals("DL_VLAN_PR isn't equal.", (byte) 0x7, (byte) match.getField(MatchType.DL_VLAN_PR).getValue());
100             break;
101         case arp:
102             /*
103             assertEquals("DL_SRC isn't equal.", "22:44:66:88:AA:CC",
104                     new String((byte[]) match.getField(MatchType.DL_SRC).getValue()));
105             assertEquals("DL_DST isn't equal.", "11:33:55:77:BB:DD",
106                     new String((byte[]) match.getField(MatchType.DL_DST).getValue()));
107             */
108             assertEquals("NW_SRC isn't equal.", "192.168.1.101",
109                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_SRC).getValue()));
110             assertEquals("NW_DST isn't equal.", "192.168.1.102",
111                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_DST).getValue()));
112             assertEquals("DL_TYPE isn't equal.", ETHERNET_ARP, match.getField(MatchType.DL_TYPE).getValue());
113             break;
114         case ipv4:
115             assertEquals("NW_SRC isn't equal.", "192.168.1.104",
116                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_SRC).getValue()));
117             assertEquals("NW_DST isn't equal.", "192.168.1.105",
118                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_DST).getValue()));
119             break;
120         case ipv6:
121             assertEquals("NW_SRC isn't equal.", "3001:db8:85a3::8a2e:370:7334",
122                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_SRC).getValue()));
123             assertEquals("NW_DST isn't equal.", "3001:db8:85a3::8a2e:370:7335",
124                     InetAddresses.toAddrString((InetAddress) match.getField(MatchType.NW_DST).getValue()));
125             break;
126         case sctp:
127             assertEquals("TP_SRC isn't equal.", 31, (short) match.getField(MatchType.TP_SRC).getValue());
128             assertEquals("TP_DST isn't equal.", 32, (short) match.getField(MatchType.TP_DST).getValue());
129             assertEquals("NW_PROTO isn't equal.", SCTP, (byte) match.getField(MatchType.NW_PROTO).getValue());
130             break;
131         case tcp:
132             assertEquals("TP_SRC isn't equal.", 21, (short) match.getField(MatchType.TP_SRC).getValue());
133             assertEquals("TP_DST isn't equal.", 22, (short) match.getField(MatchType.TP_DST).getValue());
134             assertEquals("NW_PROTO isn't equal.", TCP, (byte) match.getField(MatchType.NW_PROTO).getValue());
135             break;
136         case udp:
137             assertEquals("TP_SRC isn't equal.", 11, (short) match.getField(MatchType.TP_SRC).getValue());
138             assertEquals("TP_DST isn't equal.", 12, (short) match.getField(MatchType.TP_DST).getValue());
139             assertEquals("NW_PROTO isn't equal.", UDP, (byte) match.getField(MatchType.NW_PROTO).getValue());
140             break;
141         default:
142             break;
143
144         }
145
146     }
147
148     private void checkSalFlow(Flow salFlow) {
149         assertTrue("Id value is incorrect.", salFlow.getId() == 9223372036854775807L);
150         assertTrue("Hard timeout is incorrect.", salFlow.getHardTimeout() == 32767);
151         assertTrue("Iddle timeout is incorrect.", salFlow.getIdleTimeout() == 32767);
152         assertTrue("Priority value is incorrect.", salFlow.getPriority() == 32767);
153
154         checkSalActions(salFlow.getActions());
155     }
156
157     private void checkSalActions(List<org.opendaylight.controller.sal.action.Action> actions) {
158         checkSalAction(actions, Flood.class, 1);
159         checkSalAction(actions, FloodAll.class, 1);
160         checkSalAction(actions, HwPath.class, 1);
161         checkSalAction(actions, Loopback.class, 1);
162         checkSalAction(actions, Output.class, 2, true);
163         checkSalAction(actions, PopVlan.class, 1);
164         checkSalAction(actions, PushVlan.class, 1, true);
165         checkSalAction(actions, SetDlDst.class, 1, true);
166         checkSalAction(actions, SetDlSrc.class, 1, true);
167         checkSalAction(actions, SetDlType.class, 1, true);
168         checkSalAction(actions, SetNextHop.class, 2, true);
169         checkSalAction(actions, SetNwDst.class, 2, true);
170         checkSalAction(actions, SetNwSrc.class, 2, true);
171         checkSalAction(actions, SetNwTos.class, 1, true);
172         checkSalAction(actions, SetTpDst.class, 1, true);
173         checkSalAction(actions, SetTpSrc.class, 1, true);
174         checkSalAction(actions, SetVlanCfi.class, 1, true);
175         checkSalAction(actions, SetVlanId.class, 1, true);
176         checkSalAction(actions, SetVlanPcp.class, 1, true);
177         checkSalAction(actions, SwPath.class, 1);
178     }
179
180     private void checkSalAction(List<org.opendaylight.controller.sal.action.Action> actions, Class<?> cls,
181             int numOfActions) {
182         checkSalAction(actions, cls, numOfActions, false);
183     }
184
185     private void checkSalAction(List<org.opendaylight.controller.sal.action.Action> actions, Class<?> cls,
186             int numOfActions, boolean additionalCheck) {
187         int numOfEqualClass = 0;
188         for (org.opendaylight.controller.sal.action.Action action : actions) {
189             if (action.getClass().equals(cls)) {
190                 if (additionalCheck) {
191                     additionalActionCheck(action);
192                 }
193                 numOfEqualClass++;
194             }
195         }
196         assertEquals("Incorrect number of actions of type " + cls.getName() + " was found.", numOfActions,
197                 numOfEqualClass);
198     }
199
200     // implement special checks
201     private void additionalActionCheck(org.opendaylight.controller.sal.action.Action action) {
202         if (action instanceof Output) {
203             // ((Output)action).getPort() //TODO finish check when mapping will
204             // be defined
205         } else if (action instanceof PushVlan) {
206             assertEquals("Wrong value for action PushVlan for tag.", 0x8100, ((PushVlan) action).getTag());
207             assertEquals("Wrong value for action PushVlan for pcp.", 7, ((PushVlan) action).getPcp());
208             assertEquals("Wrong value for action PushVlan for cfi.", 1, ((PushVlan) action).getCfi());
209             assertEquals("Wrong value for action PushVlan for vlanID.", 4095, ((PushVlan) action).getVlanId());
210         } else if (action instanceof SetDlDst) {
211             //assertEquals("Wrong value for action SetDlDst for MAC address.", "3C:A9:F4:00:E0:C8", new String(
212             //        ((SetDlDst) action).getDlAddress()));
213         } else if (action instanceof SetDlSrc) {
214             //assertEquals("Wrong value for action SetDlSrc for MAC address.", "24:77:03:7C:C5:F1", new String(
215             //      ((SetDlSrc) action).getDlAddress()));
216         } else if (action instanceof SetDlType) {
217             assertEquals("Wrong value for action SetDlType for.", 513l, ((SetDlType) action).getDlType());
218         } else if (action instanceof SetNextHop) {
219             InetAddress inetAddress = ((SetNextHop) action).getAddress();
220             checkIpAddresses(inetAddress, "192.168.100.100", "2001:db8:85a3::8a2e:370:7334");
221         } else if (action instanceof SetNwDst) {
222             InetAddress inetAddress = ((SetNwDst) action).getAddress();
223             checkIpAddresses(inetAddress, "192.168.100.101", "2001:db8:85a3::8a2e:370:7335");
224         } else if (action instanceof SetNwSrc) {
225             InetAddress inetAddress = ((SetNwSrc) action).getAddress();
226             checkIpAddresses(inetAddress, "192.168.100.102", "2001:db8:85a3::8a2e:370:7336");
227         } else if (action instanceof SetNwTos) {
228             assertEquals("Wrong value for action SetNwTos for tos.", 63, ((SetNwTos) action).getNwTos());
229         } else if (action instanceof SetTpDst) {
230             assertEquals("Wrong value for action SetTpDst for port.", 65535, ((SetTpDst) action).getPort());
231         } else if (action instanceof SetTpSrc) {
232             assertEquals("Wrong value for action SetTpSrc for port.", 65535, ((SetTpSrc) action).getPort());
233         } else if (action instanceof SetVlanCfi) {
234             assertEquals("Wrong value for action SetVlanCfi for port.", 1, ((SetVlanCfi) action).getCfi());
235         } else if (action instanceof SetVlanId) {
236             assertEquals("Wrong value for action SetVlanId for vlan ID.", 4095, ((SetVlanId) action).getVlanId());
237         } else if (action instanceof SetVlanPcp) {
238             assertEquals("Wrong value for action SetVlanPcp for vlan ID.", 7, ((SetVlanPcp) action).getPcp());
239         }
240     }
241
242     private void checkIpAddresses(InetAddress inetAddress, String ipv4, String ipv6) {
243         if (inetAddress instanceof Inet4Address) {
244             assertEquals("Wrong value for IP address.", ipv4, InetAddresses.toAddrString(inetAddress));
245         } else if (inetAddress instanceof Inet6Address) {
246             assertEquals("Wrong value for IP address.", ipv6, InetAddresses.toAddrString(inetAddress));
247         }
248     }
249
250     private FlowAddedBuilder prepareOdFlowCommon() {
251         FlowAddedBuilder odNodeFlowBuilder = new FlowAddedBuilder();
252
253         odNodeFlowBuilder.setCookie(new BigInteger("9223372036854775807"));
254         odNodeFlowBuilder.setHardTimeout(32767);
255         odNodeFlowBuilder.setIdleTimeout(32767);
256         odNodeFlowBuilder.setPriority(32767);
257         odNodeFlowBuilder.setAction(prepareOdActions());
258         return odNodeFlowBuilder;
259     }
260
261     private NodeFlow prepareOdFlow(FlowAddedBuilder odNodeFlowBuilder, MtchType mt) {
262         odNodeFlowBuilder.setMatch(prepOdMatch(mt));
263         return odNodeFlowBuilder.build();
264     }
265
266     private List<Action> prepareOdActions() {
267         List<Action> odActions = new ArrayList<>();
268
269         ControllerActionBuilder controllerActionBuilder = new ControllerActionBuilder();
270         DropActionBuilder dropActionBuilder = new DropActionBuilder();
271         FloodActionBuilder floodActionBuilder = new FloodActionBuilder();
272         FloodAllActionBuilder floodAllActionBuilder = new FloodAllActionBuilder();
273         HwPathActionBuilder hwPathActionBuilder = new HwPathActionBuilder();
274         LoopbackActionBuilder loopbackActionBuilder = new LoopbackActionBuilder();
275         OutputActionBuilder outputActionBuilder = new OutputActionBuilder();
276         PopMplsActionBuilder popMplsActionBuilder = new PopMplsActionBuilder();
277         PopVlanActionBuilder popVlanActionBuilder = new PopVlanActionBuilder();
278         PushMplsActionBuilder pushMplsActionBuilder = new PushMplsActionBuilder();
279         PushPbbActionBuilder pushPbbActionBuilder = new PushPbbActionBuilder();
280         PushVlanActionBuilder pushVlanActionBuilder = new PushVlanActionBuilder();
281         SetDlDstActionBuilder setDlDstActionBuilder = new SetDlDstActionBuilder();
282         SetDlSrcActionBuilder setDlSrcActionBuilder = new SetDlSrcActionBuilder();
283         SetDlTypeActionBuilder setDlTypeActionBuilder = new SetDlTypeActionBuilder();
284         SetMplsTtlActionBuilder setMplsTtlActionBuilder = new SetMplsTtlActionBuilder();
285         SetNwTosActionBuilder setNwTosActionBuilder = new SetNwTosActionBuilder();
286         SetNwTtlActionBuilder setNwTtlActionBuilder = new SetNwTtlActionBuilder();
287         SetQueueActionBuilder setQueueActionBuilder = new SetQueueActionBuilder();
288         SetTpDstActionBuilder setTpDstActionBuilder = new SetTpDstActionBuilder();
289         SetTpSrcActionBuilder setTpSrcActionBuilder = new SetTpSrcActionBuilder();
290         SetVlanCfiActionBuilder setVlanCfiActionBuilder = new SetVlanCfiActionBuilder();
291         SetVlanIdActionBuilder setVlanIdActionBuilder = new SetVlanIdActionBuilder();
292         SetVlanPcpActionBuilder setVlanPcpActionBuilder = new SetVlanPcpActionBuilder();
293         SwPathActionBuilder swPathActionBuilder = new SwPathActionBuilder();
294
295         prepareActionOutput(outputActionBuilder);
296         prepareActionPushVlan(pushVlanActionBuilder);
297         prepareActionSetDlDst(setDlDstActionBuilder);
298         prepareActionSetDlSrc(setDlSrcActionBuilder);
299         prepareActionSetDlType(setDlTypeActionBuilder);
300         prepareActionNextHop(odActions);
301         prepareActionSetNwDst(odActions);
302         prepareActionSetNwSrc(odActions);
303         prepareActionSetNwTos(setNwTosActionBuilder);
304         prepareActionSetTpDst(setTpDstActionBuilder);
305         prepareActionSetTpSrc(setTpSrcActionBuilder);
306         prepareActionSetVlanCfi(setVlanCfiActionBuilder);
307         prepareActionSetVladId(setVlanIdActionBuilder);
308         prepareActionSetVlanPcp(setVlanPcpActionBuilder);
309
310         odActions.add(new ActionBuilder().setAction(controllerActionBuilder.build()).build());
311         odActions.add(new ActionBuilder().setAction(dropActionBuilder.build()).build());
312         odActions.add(new ActionBuilder().setAction(floodActionBuilder.build()).build());
313         odActions.add(new ActionBuilder().setAction(floodAllActionBuilder.build()).build());
314         odActions.add(new ActionBuilder().setAction(hwPathActionBuilder.build()).build());
315         odActions.add(new ActionBuilder().setAction(loopbackActionBuilder.build()).build());
316         odActions.add(new ActionBuilder().setAction(outputActionBuilder.build()).build());
317         odActions.add(new ActionBuilder().setAction(popMplsActionBuilder.build()).build());
318         odActions.add(new ActionBuilder().setAction(popVlanActionBuilder.build()).build());
319         odActions.add(new ActionBuilder().setAction(pushMplsActionBuilder.build()).build());
320         odActions.add(new ActionBuilder().setAction(pushPbbActionBuilder.build()).build());
321         odActions.add(new ActionBuilder().setAction(pushVlanActionBuilder.build()).build());
322         odActions.add(new ActionBuilder().setAction(setDlDstActionBuilder.build()).build());
323         odActions.add(new ActionBuilder().setAction(setDlSrcActionBuilder.build()).build());
324         odActions.add(new ActionBuilder().setAction(setDlTypeActionBuilder.build()).build());
325         odActions.add(new ActionBuilder().setAction(setMplsTtlActionBuilder.build()).build());
326         odActions.add(new ActionBuilder().setAction(setNwTosActionBuilder.build()).build());
327         odActions.add(new ActionBuilder().setAction(setNwTtlActionBuilder.build()).build());
328         odActions.add(new ActionBuilder().setAction(setQueueActionBuilder.build()).build());
329         odActions.add(new ActionBuilder().setAction(setTpDstActionBuilder.build()).build());
330         odActions.add(new ActionBuilder().setAction(setTpSrcActionBuilder.build()).build());
331         odActions.add(new ActionBuilder().setAction(setVlanCfiActionBuilder.build()).build());
332         odActions.add(new ActionBuilder().setAction(setVlanIdActionBuilder.build()).build());
333         odActions.add(new ActionBuilder().setAction(setVlanPcpActionBuilder.build()).build());
334         odActions.add(new ActionBuilder().setAction(swPathActionBuilder.build()).build());
335
336         return odActions;
337     }
338
339     private void prepareActionSetVlanPcp(SetVlanPcpActionBuilder setVlanPcpActionBuilder) {
340         setVlanPcpActionBuilder.setVlanPcp(new VlanPcp((short) 7));
341     }
342
343     private void prepareActionSetVladId(SetVlanIdActionBuilder setVlanIdActionBuilder) {
344         setVlanIdActionBuilder.setVlanId(new VlanId(4095));
345     }
346
347     private void prepareActionSetVlanCfi(SetVlanCfiActionBuilder setVlanCfiActionBuilder) {
348         setVlanCfiActionBuilder.setVlanCfi(new VlanCfi(1));
349     }
350
351     private void prepareActionSetTpDst(SetTpDstActionBuilder setTpDstActionBuilder) {
352         setTpDstActionBuilder.setPort(new PortNumber(65535));
353     }
354
355     private void prepareActionSetTpSrc(SetTpSrcActionBuilder setTpSrcActionBuilder) {
356         setTpSrcActionBuilder.setPort(new PortNumber(65535));
357     }
358
359     private void prepareActionSetNwTos(SetNwTosActionBuilder setNwTosActionBuilder) {
360         setNwTosActionBuilder.setTos(63);
361     }
362
363     private void prepareActionSetNwSrc(List<Action> odActions) {
364         // test case for IPv4
365         SetNwSrcActionBuilder setNwSrcActionBuilderIpv4 = new SetNwSrcActionBuilder();
366         setNwSrcActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.102"));
367         odActions.add(new ActionBuilder().setAction(setNwSrcActionBuilderIpv4.build()).build());
368
369         // test case for IPv6
370         SetNwSrcActionBuilder setNwSrcActionBuilderIpv6 = new SetNwSrcActionBuilder();
371         setNwSrcActionBuilderIpv6.setAddress(prapareIpv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7336"));
372         odActions.add(new ActionBuilder().setAction(setNwSrcActionBuilderIpv6.build()).build());
373     }
374
375     private void prepareActionSetNwDst(List<Action> odActions) {
376         // test case for IPv4
377         SetNwDstActionBuilder setNwDstActionBuilderIpv4 = new SetNwDstActionBuilder();
378         setNwDstActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.101"));
379         odActions.add(new ActionBuilder().setAction(setNwDstActionBuilderIpv4.build()).build());
380
381         // test case for IPv6
382         SetNwDstActionBuilder setNwDstActionBuilderIpv6 = new SetNwDstActionBuilder();
383         setNwDstActionBuilderIpv6.setAddress(prapareIpv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7335"));
384         odActions.add(new ActionBuilder().setAction(setNwDstActionBuilderIpv6.build()).build());
385     }
386
387     private void prepareActionNextHop(List<Action> odActions) {
388         // test case for IPv4
389         SetNextHopActionBuilder setNextHopActionBuilderIpv4 = new SetNextHopActionBuilder();
390         setNextHopActionBuilderIpv4.setAddress(prapareIpv4Address("192.168.100.100"));
391         odActions.add(new ActionBuilder().setAction(setNextHopActionBuilderIpv4.build()).build());
392
393         // test case for IPv6
394         SetNextHopActionBuilder setNextHopActionBuilderIpv6 = new SetNextHopActionBuilder();
395         setNextHopActionBuilderIpv6.setAddress(prapareIpv6Address("2001:0db8:85a3:0000:0000:8a2e:0370:7334"));
396         odActions.add(new ActionBuilder().setAction(setNextHopActionBuilderIpv6.build()).build());
397     }
398
399     private Address prapareIpv4Address(String ipv4Address) {
400         Ipv4Builder ipv4Builder = new Ipv4Builder();
401         ipv4Builder.setIpv4Address(new Ipv4Prefix(ipv4Address));
402         return ipv4Builder.build();
403     }
404
405     private Address prapareIpv6Address(String ipv6Address) {
406         Ipv6Builder ipv6Builder = new Ipv6Builder();
407         ipv6Builder.setIpv6Address(new Ipv6Prefix(ipv6Address));
408         return ipv6Builder.build();
409     }
410
411     private void prepareActionSetDlType(SetDlTypeActionBuilder setDlTypeActionBuilder) {
412         setDlTypeActionBuilder.setDlType(new EtherType(513l));
413     }
414
415     private void prepareActionSetDlSrc(SetDlSrcActionBuilder setDlSrcActionBuilder) {
416         setDlSrcActionBuilder.setAddress(new MacAddress("24:77:03:7C:C5:F1"));
417     }
418
419     private void prepareActionSetDlDst(SetDlDstActionBuilder setDlDstActionBuilder) {
420         setDlDstActionBuilder.setAddress(new MacAddress("3C:A9:F4:00:E0:C8"));
421     }
422
423     private void prepareActionPushVlan(PushVlanActionBuilder pushVlanActionBuilder) {
424         pushVlanActionBuilder.setPcp(7); // 3 bits
425         pushVlanActionBuilder.setCfi(new VlanCfi(1)); // 1 bit
426         pushVlanActionBuilder.setVlanId(new VlanId(4095));
427         pushVlanActionBuilder.setTag(0x8100); // 12 bit
428     }
429
430     private void prepareActionOutput(OutputActionBuilder outputActionBuilder) {
431         List<Uri> uris = new ArrayList<>();
432         uris.add(new Uri("uri1"));
433         uris.add(new Uri("uri2"));
434         outputActionBuilder.setOutputNodeConnector(uris);
435     }
436
437     private Match prepOdMatch(MtchType mt) {
438         MatchBuilder odMatchBuilder = new MatchBuilder();
439         switch (mt) {
440         case other:
441             odMatchBuilder.setEthernetMatch(prepEthernetMatch());
442             odMatchBuilder.setIpMatch(prepIpMatch());
443             odMatchBuilder.setVlanMatch(prepVlanMatch());
444             break;
445         case ipv4:
446             odMatchBuilder.setLayer3Match(prepLayer3MatchIpv4());
447             break;
448         case ipv6:
449             odMatchBuilder.setLayer3Match(prepLayer3MatchIpv6());
450             break;
451         case arp:
452             odMatchBuilder.setLayer3Match(prepLayer3MatchArp());
453             break;
454         case sctp:
455             odMatchBuilder.setLayer4Match(prepLayer4MatchSctp());
456             break;
457         case tcp:
458             odMatchBuilder.setLayer4Match(prepLayer4MatchTcp());
459             break;
460         case udp:
461             odMatchBuilder.setLayer4Match(prepLayer4MatchUdp());
462             break;
463         }
464         return odMatchBuilder.build();
465     }
466
467     private Layer4Match prepLayer4MatchUdp() {
468         UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
469
470         udpMatchBuilder.setUdpSourcePort(new PortNumber(11));
471         udpMatchBuilder.setUdpDestinationPort(new PortNumber(12));
472
473         return udpMatchBuilder.build();
474     }
475
476     private Layer4Match prepLayer4MatchTcp() {
477         TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
478
479         tcpMatchBuilder.setTcpSourcePort(new PortNumber(21));
480         tcpMatchBuilder.setTcpDestinationPort(new PortNumber(22));
481
482         return tcpMatchBuilder.build();
483     }
484
485     private Layer4Match prepLayer4MatchSctp() {
486         SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
487
488         sctpMatchBuilder.setSctpSourcePort(new PortNumber(31));
489         sctpMatchBuilder.setSctpDestinationPort(new PortNumber(32));
490
491         return sctpMatchBuilder.build();
492     }
493
494     private Layer3Match prepLayer3MatchIpv4() {
495         Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
496         ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("192.168.1.104"));
497         ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("192.168.1.105"));
498         return ipv4MatchBuilder.build();
499     }
500
501     private Layer3Match prepLayer3MatchIpv6() {
502         Ipv6MatchBuilder ipv6MatchBuilder = new Ipv6MatchBuilder();
503         ipv6MatchBuilder.setIpv6Source(new Ipv6Prefix("3001:0db8:85a3:0000:0000:8a2e:0370:7334"));
504         ipv6MatchBuilder.setIpv6Destination(new Ipv6Prefix("3001:0db8:85a3:0000:0000:8a2e:0370:7335"));
505         return ipv6MatchBuilder.build();
506     }
507
508     private Layer3Match prepLayer3MatchArp() {
509         ArpMatchBuilder arpMatchBuilder = new ArpMatchBuilder();
510         arpMatchBuilder.setArpSourceTransportAddress(new Ipv4Prefix("192.168.1.101"));
511         arpMatchBuilder.setArpTargetTransportAddress(new Ipv4Prefix("192.168.1.102"));
512
513         ArpSourceHardwareAddressBuilder arpSourAddressBuild = new ArpSourceHardwareAddressBuilder();
514         arpSourAddressBuild.setAddress(new MacAddress("22:44:66:88:AA:CC"));
515         arpMatchBuilder.setArpSourceHardwareAddress(arpSourAddressBuild.build());
516
517         ArpTargetHardwareAddressBuilder arpTarAddressBuild = new ArpTargetHardwareAddressBuilder();
518         arpTarAddressBuild.setAddress(new MacAddress("11:33:55:77:BB:DD"));
519         arpMatchBuilder.setArpTargetHardwareAddress(arpTarAddressBuild.build());
520         return arpMatchBuilder.build();
521     }
522
523     private VlanMatch prepVlanMatch() {
524         VlanMatchBuilder vlanMatchBuilder = new VlanMatchBuilder();
525
526         VlanIdBuilder vlanIdBuilder = new VlanIdBuilder().setVlanId(new VlanId(0xfff));
527         vlanMatchBuilder.setVlanId(vlanIdBuilder.build());
528         vlanMatchBuilder.setVlanPcp(new VlanPcp((short) 0x7));
529
530         return vlanMatchBuilder.build();
531
532     }
533
534     private IpMatch prepIpMatch() {
535         IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();
536         ipMatchBuilder.setIpDscp(new Dscp((short) 0x33));
537         ipMatchBuilder.setIpProtocol((short) 0x3f);
538         return ipMatchBuilder.build();
539     }
540
541     private EthernetMatch prepEthernetMatch() {
542         EthernetMatchBuilder odEthernetMatchBuilder = new EthernetMatchBuilder();
543         odEthernetMatchBuilder.setEthernetDestination(prepEthDest());
544         odEthernetMatchBuilder.setEthernetSource(prepEthSour());
545         odEthernetMatchBuilder.setEthernetType(prepEthType());
546         return odEthernetMatchBuilder.build();
547     }
548
549     private EthernetType prepEthType() {
550         EthernetTypeBuilder ethTypeBuild = new EthernetTypeBuilder();
551         ethTypeBuild.setType(new EtherType(0xffffl));
552         return ethTypeBuild.build();
553     }
554
555     private EthernetSource prepEthSour() {
556         EthernetSourceBuilder ethSourBuild = new EthernetSourceBuilder();
557         ethSourBuild.setAddress(new MacAddress("24:77:03:7C:C5:F1"));
558         return ethSourBuild.build();
559     }
560
561     private EthernetDestination prepEthDest() {
562         EthernetDestinationBuilder ethDestBuild = new EthernetDestinationBuilder();
563         ethDestBuild.setAddress(new MacAddress("3C:A9:F4:00:E0:C8"));
564         return ethDestBuild.build();
565     }
566 }