BUG-2637: migration consequence - fix unit test
[controller.git] / opendaylight / md-sal / compatibility / sal-compatibility / src / main / java / org / opendaylight / controller / sal / compatibility / MDFlowMapping.java
1 /*
2  * Copyright (c) 2014 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;
9
10 import com.google.common.base.Preconditions;
11 import com.google.common.net.InetAddresses;
12 import org.opendaylight.controller.sal.action.Action;
13 import org.opendaylight.controller.sal.action.Controller;
14 import org.opendaylight.controller.sal.action.Drop;
15 import org.opendaylight.controller.sal.action.Flood;
16 import org.opendaylight.controller.sal.action.FloodAll;
17 import org.opendaylight.controller.sal.action.HwPath;
18 import org.opendaylight.controller.sal.action.Loopback;
19 import org.opendaylight.controller.sal.action.Output;
20 import org.opendaylight.controller.sal.action.PopVlan;
21 import org.opendaylight.controller.sal.action.PushVlan;
22 import org.opendaylight.controller.sal.action.SetDlDst;
23 import org.opendaylight.controller.sal.action.SetDlSrc;
24 import org.opendaylight.controller.sal.action.SetDlType;
25 import org.opendaylight.controller.sal.action.SetNextHop;
26 import org.opendaylight.controller.sal.action.SetNwDst;
27 import org.opendaylight.controller.sal.action.SetNwSrc;
28 import org.opendaylight.controller.sal.action.SetNwTos;
29 import org.opendaylight.controller.sal.action.SetTpDst;
30 import org.opendaylight.controller.sal.action.SetTpSrc;
31 import org.opendaylight.controller.sal.action.SetVlanCfi;
32 import org.opendaylight.controller.sal.action.SetVlanId;
33 import org.opendaylight.controller.sal.action.SetVlanPcp;
34 import org.opendaylight.controller.sal.action.SwPath;
35 import org.opendaylight.controller.sal.core.Node;
36 import org.opendaylight.controller.sal.core.NodeConnector;
37 import org.opendaylight.controller.sal.flowprogrammer.Flow;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.VlanCfi;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.ControllerActionCase;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.ControllerActionCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCase;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodActionCase;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodActionCaseBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodAllActionCase;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodAllActionCaseBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.HwPathActionCase;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.HwPathActionCaseBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.LoopbackActionCase;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.LoopbackActionCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCase;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCase;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCaseBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCase;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlTypeActionCase;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlTypeActionCaseBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNextHopActionCase;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNextHopActionCaseBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCase;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCaseBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCase;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCaseBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionCase;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionCaseBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCase;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCaseBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCase;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCaseBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanCfiActionCase;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanCfiActionCaseBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCase;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCase;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCaseBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SwPathActionCase;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SwPathActionCaseBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.controller.action._case.ControllerActionBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.flood.action._case.FloodActionBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.flood.all.action._case.FloodAllActionBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.hw.path.action._case.HwPathActionBuilder;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.loopback.action._case.LoopbackActionBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstActionBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcActionBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.type.action._case.SetDlTypeActionBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.next.hop.action._case.SetNextHopActionBuilder;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstActionBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.src.action._case.SetNwSrcActionBuilder;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.tos.action._case.SetNwTosActionBuilder;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.dst.action._case.SetTpDstActionBuilder;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.src.action._case.SetTpSrcActionBuilder;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.cfi.action._case.SetVlanCfiActionBuilder;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpActionBuilder;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.sw.path.action._case.SwPathActionBuilder;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.Address;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4Builder;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv6Builder;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAdded;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAddedBuilder;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder;
125 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
126 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
127 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
128 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
129 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
130 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
131 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
132 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
133 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
134 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
135 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
136
137 import java.math.BigInteger;
138 import java.net.Inet4Address;
139 import java.net.Inet6Address;
140 import java.net.InetAddress;
141 import java.util.ArrayList;
142 import java.util.Collections;
143 import java.util.List;
144
145 public final class MDFlowMapping {
146     private MDFlowMapping() {
147         throw new UnsupportedOperationException("Utility class");
148     }
149
150     private static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> toMDActions(final List<Action> actions) {
151         final ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> ret =
152                 new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action>(actions.size());
153         int action = 0;
154         for (final Action sourceAction : actions) {
155             ret.add(toAction(sourceAction, action));
156             action++;
157         }
158
159         return ret;
160     }
161
162     public static FlowAdded flowAdded(final Flow sourceFlow) {
163         Preconditions.checkArgument(sourceFlow != null);
164
165         return new FlowAddedBuilder()
166         .setHardTimeout(Integer.valueOf(sourceFlow.getHardTimeout()))
167         .setIdleTimeout(Integer.valueOf(sourceFlow.getIdleTimeout()))
168         .setCookie(new FlowCookie(BigInteger.valueOf(sourceFlow.getId())))
169         .setPriority(Integer.valueOf(sourceFlow.getPriority()))
170         .setInstructions(MDFlowMapping.toApplyInstruction(toMDActions(sourceFlow.getActions())))
171         .setMatch(FromSalConversionsUtils.toMatch(sourceFlow.getMatch()))
172         .setTableId((short)0)
173         .build();
174     }
175
176     private static FlowBuilder internalToMDFlow(final Flow sourceFlow) {
177         Preconditions.checkArgument(sourceFlow != null);
178
179         return new FlowBuilder()
180         .setHardTimeout(Integer.valueOf(sourceFlow.getHardTimeout()))
181         .setIdleTimeout(Integer.valueOf(sourceFlow.getIdleTimeout()))
182         .setCookie(new FlowCookie(BigInteger.valueOf(sourceFlow.getId())))
183         .setPriority(Integer.valueOf((sourceFlow.getPriority())))
184         .setInstructions(MDFlowMapping.toApplyInstruction(toMDActions(sourceFlow.getActions())))
185         .setMatch(FromSalConversionsUtils.toMatch(sourceFlow.getMatch()));
186     }
187
188     public static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow toMDFlow(final Flow sourceFlow, final String flowId) {
189         return internalToMDFlow(sourceFlow)
190                 .setTableId((short)0)
191                 .setId(new FlowId(flowId))
192                 .build();
193     }
194
195     public static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow toMDSalflow(final Flow sourceFlow) {
196         return internalToMDFlow(sourceFlow).build();
197     }
198
199     public static Instructions toApplyInstruction(final List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions) {
200         return new InstructionsBuilder()
201         .setInstruction(
202                 Collections.singletonList(
203                         new InstructionBuilder()
204                         .setOrder(0)
205                         .setInstruction(
206                                 new ApplyActionsCaseBuilder()
207                                 .setApplyActions(new ApplyActionsBuilder().setAction(actions).build())
208                                 .build()
209                                 ).build())
210                 ).build();
211     }
212
213     public static RemoveFlowInput removeFlowInput(final Node sourceNode, final Flow sourceFlow) {
214         final FlowAdded source = MDFlowMapping.flowAdded(sourceFlow);
215         return new RemoveFlowInputBuilder((org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow) source)
216         .setNode(NodeMapping.toNodeRef(sourceNode))
217         .build();
218     }
219
220     public static AddFlowInput addFlowInput(final Node sourceNode, final Flow sourceFlow) {
221         final FlowAdded source = MDFlowMapping.flowAdded(sourceFlow);
222         return new AddFlowInputBuilder(((org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow) source))
223         .setNode(NodeMapping.toNodeRef(sourceNode))
224         .build();
225     }
226
227     public static UpdateFlowInput updateFlowInput(final Node sourceNode, final Flow oldFlow, final Flow newFlow) {
228         return new UpdateFlowInputBuilder()
229         .setOriginalFlow(new OriginalFlowBuilder(MDFlowMapping.flowAdded(newFlow)).build())
230         .setUpdatedFlow(new UpdatedFlowBuilder(MDFlowMapping.flowAdded(newFlow)).build())
231         .setNode(NodeMapping.toNodeRef(sourceNode))
232         .build();
233     }
234
235     private static ControllerActionCase _toAction(final Controller sourceAction) {
236         return new ControllerActionCaseBuilder().setControllerAction(new ControllerActionBuilder().build()).build();
237     }
238
239     private static DropActionCase _toAction(final Drop sourceAction) {
240         return new DropActionCaseBuilder().setDropAction(new DropActionBuilder().build()).build();
241     }
242
243     private static FloodActionCase _toAction(final Flood sourceAction) {
244         return new FloodActionCaseBuilder().setFloodAction(new FloodActionBuilder().build()).build();
245     }
246
247     private static FloodAllActionCase _toAction(final FloodAll sourceAction) {
248         return new FloodAllActionCaseBuilder().setFloodAllAction(new FloodAllActionBuilder().build()).build();
249     }
250
251     private static HwPathActionCase _toAction(final HwPath sourceAction) {
252         return new HwPathActionCaseBuilder().setHwPathAction(new HwPathActionBuilder().build()).build();
253     }
254
255     private static LoopbackActionCase _toAction(final Loopback sourceAction) {
256         return new LoopbackActionCaseBuilder().setLoopbackAction( new LoopbackActionBuilder().build()).build();
257     }
258
259     private static OutputActionCase _toAction(final Output sourceAction) {
260         return new OutputActionCaseBuilder()
261         .setOutputAction(
262                 new OutputActionBuilder().setOutputNodeConnector(MDFlowMapping.toUri(sourceAction.getPort())).build()
263                 ).build();
264     }
265
266     private static PopVlanActionCase _toAction(final PopVlan sourceAction) {
267         PopVlanActionBuilder popVlanActionBuilder = new PopVlanActionBuilder();
268         return new PopVlanActionCaseBuilder().setPopVlanAction(popVlanActionBuilder.build()).build();
269     }
270
271     private static PushVlanActionCase _toAction(final PushVlan sourceAction) {
272         return new PushVlanActionCaseBuilder()
273         .setPushVlanAction(
274                 new PushVlanActionBuilder()
275                 .setEthernetType(Integer.valueOf(sourceAction.getTag()))
276                 .build()
277                 ).build();
278     }
279
280     private static SetDlDstActionCase _toAction(final SetDlDst sourceAction) {
281         return new SetDlDstActionCaseBuilder()
282         .setSetDlDstAction(new SetDlDstActionBuilder().setAddress(MDFlowMapping.toMacAddress(sourceAction.getDlAddress())).build())
283         .build();
284     }
285
286     private static SetDlSrcActionCase _toAction(final SetDlSrc sourceAction) {
287         return new SetDlSrcActionCaseBuilder()
288         .setSetDlSrcAction(new SetDlSrcActionBuilder().setAddress(MDFlowMapping.toMacAddress(sourceAction.getDlAddress())).build())
289         .build();
290     }
291
292     private static SetDlTypeActionCase _toAction(final SetDlType sourceAction) {
293         return new SetDlTypeActionCaseBuilder()
294         .setSetDlTypeAction(new SetDlTypeActionBuilder().setDlType(new EtherType(Long.valueOf(sourceAction.getDlType()))).build())
295         .build();
296     }
297
298     private static SetNextHopActionCase _toAction(final SetNextHop sourceAction) {
299         return new SetNextHopActionCaseBuilder()
300         .setSetNextHopAction(new SetNextHopActionBuilder().setAddress(MDFlowMapping.toInetAddress(sourceAction.getAddress())).build())
301         .build();
302     }
303
304     private static SetNwDstActionCase _toAction(final SetNwDst sourceAction) {
305         return new SetNwDstActionCaseBuilder()
306         .setSetNwDstAction(new SetNwDstActionBuilder().setAddress(MDFlowMapping.toInetAddress(sourceAction.getAddress())).build())
307         .build();
308     }
309
310     private static SetNwSrcActionCase _toAction(final SetNwSrc sourceAction) {
311         return new SetNwSrcActionCaseBuilder()
312         .setSetNwSrcAction(new SetNwSrcActionBuilder().setAddress(MDFlowMapping.toInetAddress(sourceAction.getAddress())).build())
313         .build();
314     }
315
316     private static SetNwTosActionCase _toAction(final SetNwTos sourceAction) {
317         return new SetNwTosActionCaseBuilder()
318         .setSetNwTosAction(new SetNwTosActionBuilder().setTos(FromSalConversionsUtils.dscpToTos(sourceAction.getNwTos())).build())
319         .build();
320     }
321
322     private static SetTpDstActionCase _toAction(final SetTpDst sourceAction) {
323         return new SetTpDstActionCaseBuilder()
324         .setSetTpDstAction(new SetTpDstActionBuilder().setPort(new PortNumber(sourceAction.getPort())).build())
325         .build();
326     }
327
328     private static SetTpSrcActionCase _toAction(final SetTpSrc sourceAction) {
329         return new SetTpSrcActionCaseBuilder()
330         .setSetTpSrcAction(new SetTpSrcActionBuilder().setPort(new PortNumber(sourceAction.getPort())).build())
331         .build();
332     }
333
334     private static SetVlanCfiActionCase _toAction(final SetVlanCfi sourceAction) {
335         return new SetVlanCfiActionCaseBuilder()
336         .setSetVlanCfiAction(new SetVlanCfiActionBuilder().setVlanCfi(new VlanCfi(sourceAction.getCfi())).build())
337         .build();
338     }
339
340     private static SetVlanIdActionCase _toAction(final SetVlanId sourceAction) {
341         return new SetVlanIdActionCaseBuilder()
342         .setSetVlanIdAction(new SetVlanIdActionBuilder().setVlanId(new VlanId(sourceAction.getVlanId())).build())
343         .build();
344     }
345
346     private static SetVlanPcpActionCase _toAction(final SetVlanPcp sourceAction) {
347         return new SetVlanPcpActionCaseBuilder()
348         .setSetVlanPcpAction(new SetVlanPcpActionBuilder().setVlanPcp(new VlanPcp((short) sourceAction.getPcp())).build())
349         .build();
350     }
351
352     private static SwPathActionCase _toAction(final SwPath sourceAction) {
353         return new SwPathActionCaseBuilder().setSwPathAction(new SwPathActionBuilder().build()).build();
354     }
355
356     public static Uri toUri(final NodeConnector connector) {
357         return new NodeConnectorId(NodeMapping.OPENFLOW_ID_PREFIX + connector.getNode().getID() + ":" + (connector.getID()));
358     }
359
360     public static MacAddress toMacAddress(final byte[] bytes) {
361         final StringBuilder sb = new StringBuilder(18);
362         boolean first = true;
363
364         for (final byte b : bytes) {
365             if (first) {
366                 first = false;
367             } else {
368                 sb.append(':');
369             }
370             sb.append(String.format("%02x", Byte.valueOf(b)));
371         }
372         return new MacAddress(sb.toString());
373     }
374
375     public static org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action toAction(final Action sourceAction, final int order) {
376         final ActionBuilder ret = new ActionBuilder().setOrder(order);
377
378         if (sourceAction instanceof Controller) {
379             ret.setAction(_toAction((Controller)sourceAction));
380         } else if (sourceAction instanceof Drop) {
381             ret.setAction(_toAction((Drop)sourceAction));
382         } else if (sourceAction instanceof Flood) {
383             ret.setAction(_toAction((Flood)sourceAction));
384         } else if (sourceAction instanceof FloodAll) {
385             ret.setAction(_toAction((FloodAll)sourceAction));
386         } else if (sourceAction instanceof HwPath) {
387             ret.setAction(_toAction((HwPath)sourceAction));
388         } else if (sourceAction instanceof Loopback) {
389             ret.setAction(_toAction((Loopback)sourceAction));
390         } else if (sourceAction instanceof Output) {
391             ret.setAction(_toAction((Output)sourceAction));
392         } else if (sourceAction instanceof PopVlan) {
393             ret.setAction(_toAction((PopVlan)sourceAction));
394         } else if (sourceAction instanceof PushVlan) {
395             ret.setAction(_toAction((PushVlan)sourceAction));
396         } else if (sourceAction instanceof SetDlDst) {
397             ret.setAction(_toAction((SetDlDst)sourceAction));
398         } else if (sourceAction instanceof SetDlSrc) {
399             ret.setAction(_toAction((SetDlSrc)sourceAction));
400         } else if (sourceAction instanceof SetDlType) {
401             ret.setAction(_toAction((SetDlType)sourceAction));
402         } else if (sourceAction instanceof SetNextHop) {
403             ret.setAction(_toAction((SetNextHop)sourceAction));
404         } else if (sourceAction instanceof SetNwDst) {
405             ret.setAction(_toAction((SetNwDst)sourceAction));
406         } else if (sourceAction instanceof SetNwSrc) {
407             ret.setAction(_toAction((SetNwSrc)sourceAction));
408         } else if (sourceAction instanceof SetNwTos) {
409             ret.setAction(_toAction((SetNwTos)sourceAction));
410         } else if (sourceAction instanceof SetTpDst) {
411             ret.setAction(_toAction((SetTpDst)sourceAction));
412         } else if (sourceAction instanceof SetTpSrc) {
413             ret.setAction(_toAction((SetTpSrc)sourceAction));
414         } else if (sourceAction instanceof SetVlanCfi) {
415             ret.setAction(_toAction((SetVlanCfi)sourceAction));
416         } else if (sourceAction instanceof SetVlanId) {
417             ret.setAction(_toAction((SetVlanId)sourceAction));
418         } else if (sourceAction instanceof SetVlanPcp) {
419             ret.setAction(_toAction((SetVlanPcp)sourceAction));
420         } else if (sourceAction instanceof SwPath) {
421             ret.setAction(_toAction((SwPath)sourceAction));
422         } else {
423             throw new IllegalArgumentException(String.format("Unhandled action class %s", sourceAction.getClass()));
424         }
425
426         return ret.build();
427     }
428
429     public static Address toInetAddress(final InetAddress address) {
430         if (address instanceof Inet4Address) {
431             return new Ipv4Builder()
432             .setIpv4Address(new Ipv4Prefix(InetAddresses.toAddrString(address) + "/32"))
433             .build();
434         }
435         if (address instanceof Inet6Address) {
436             return new Ipv6Builder()
437             .setIpv6Address(new Ipv6Prefix(InetAddresses.toAddrString(address) + "/128"))
438             .build();
439         }
440
441         throw new IllegalArgumentException(String.format("Unhandled address class %s", address.getClass()));
442     }
443 }