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