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