BUG-625: migrate MDFlowMapping
[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 java.math.BigInteger;
11 import java.net.Inet4Address;
12 import java.net.Inet6Address;
13 import java.net.InetAddress;
14 import java.util.ArrayList;
15 import java.util.Collections;
16 import java.util.List;
17
18 import org.opendaylight.controller.sal.action.Action;
19 import org.opendaylight.controller.sal.action.Controller;
20 import org.opendaylight.controller.sal.action.Drop;
21 import org.opendaylight.controller.sal.action.Flood;
22 import org.opendaylight.controller.sal.action.FloodAll;
23 import org.opendaylight.controller.sal.action.HwPath;
24 import org.opendaylight.controller.sal.action.Loopback;
25 import org.opendaylight.controller.sal.action.Output;
26 import org.opendaylight.controller.sal.action.PopVlan;
27 import org.opendaylight.controller.sal.action.PushVlan;
28 import org.opendaylight.controller.sal.action.SetDlDst;
29 import org.opendaylight.controller.sal.action.SetDlSrc;
30 import org.opendaylight.controller.sal.action.SetDlType;
31 import org.opendaylight.controller.sal.action.SetNextHop;
32 import org.opendaylight.controller.sal.action.SetNwDst;
33 import org.opendaylight.controller.sal.action.SetNwSrc;
34 import org.opendaylight.controller.sal.action.SetNwTos;
35 import org.opendaylight.controller.sal.action.SetTpDst;
36 import org.opendaylight.controller.sal.action.SetTpSrc;
37 import org.opendaylight.controller.sal.action.SetVlanCfi;
38 import org.opendaylight.controller.sal.action.SetVlanId;
39 import org.opendaylight.controller.sal.action.SetVlanPcp;
40 import org.opendaylight.controller.sal.action.SwPath;
41 import org.opendaylight.controller.sal.core.Node;
42 import org.opendaylight.controller.sal.core.NodeConnector;
43 import org.opendaylight.controller.sal.flowprogrammer.Flow;
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
47 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.VlanCfi;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.ControllerActionCase;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.ControllerActionCaseBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCase;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodActionCase;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodActionCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodAllActionCase;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodAllActionCaseBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.HwPathActionCase;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.HwPathActionCaseBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.LoopbackActionCase;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.LoopbackActionCaseBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCase;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCase;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCaseBuilder;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCase;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCaseBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlTypeActionCase;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlTypeActionCaseBuilder;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNextHopActionCase;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNextHopActionCaseBuilder;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCase;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCaseBuilder;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCase;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCaseBuilder;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionCase;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionCaseBuilder;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCase;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCaseBuilder;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCase;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCaseBuilder;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanCfiActionCase;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanCfiActionCaseBuilder;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCase;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCase;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCaseBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SwPathActionCase;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SwPathActionCaseBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.controller.action._case.ControllerActionBuilder;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.flood.action._case.FloodActionBuilder;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.flood.all.action._case.FloodAllActionBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.hw.path.action._case.HwPathActionBuilder;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.loopback.action._case.LoopbackActionBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstActionBuilder;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcActionBuilder;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.type.action._case.SetDlTypeActionBuilder;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.next.hop.action._case.SetNextHopActionBuilder;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstActionBuilder;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.src.action._case.SetNwSrcActionBuilder;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.tos.action._case.SetNwTosActionBuilder;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.dst.action._case.SetTpDstActionBuilder;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.src.action._case.SetTpSrcActionBuilder;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.cfi.action._case.SetVlanCfiActionBuilder;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpActionBuilder;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.sw.path.action._case.SwPathActionBuilder;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.Address;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4Builder;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv6Builder;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAdded;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAddedBuilder;
125 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput;
126 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
127 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput;
128 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder;
129 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder;
130 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
131 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
132 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions;
133 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder;
134 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
135 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
136 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
137 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
138 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
139 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
140 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
141
142 import com.google.common.base.Preconditions;
143 import com.google.common.net.InetAddresses;
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         return new PopVlanActionCaseBuilder().build();
268     }
269
270     private static PushVlanActionCase _toAction(final PushVlan sourceAction) {
271         return new PushVlanActionCaseBuilder()
272         .setPushVlanAction(
273                 new PushVlanActionBuilder()
274                 .setCfi(new VlanCfi(sourceAction.getCfi()))
275                 .setPcp(sourceAction.getPcp())
276                 .setTag(sourceAction.getTag())
277                 .setVlanId(new VlanId(sourceAction.getVlanId()))
278                 .build()
279                 ).build();
280     }
281
282     private static SetDlDstActionCase _toAction(final SetDlDst sourceAction) {
283         return new SetDlDstActionCaseBuilder()
284         .setSetDlDstAction(new SetDlDstActionBuilder().setAddress(MDFlowMapping.toMacAddress(sourceAction.getDlAddress())).build())
285         .build();
286     }
287
288     private static SetDlSrcActionCase _toAction(final SetDlSrc sourceAction) {
289         return new SetDlSrcActionCaseBuilder()
290         .setSetDlSrcAction(new SetDlSrcActionBuilder().setAddress(MDFlowMapping.toMacAddress(sourceAction.getDlAddress())).build())
291         .build();
292     }
293
294     private static SetDlTypeActionCase _toAction(final SetDlType sourceAction) {
295         return new SetDlTypeActionCaseBuilder()
296         .setSetDlTypeAction(new SetDlTypeActionBuilder().setDlType(new EtherType(Long.valueOf(sourceAction.getDlType()))).build())
297         .build();
298     }
299
300     private static SetNextHopActionCase _toAction(final SetNextHop sourceAction) {
301         return new SetNextHopActionCaseBuilder()
302         .setSetNextHopAction(new SetNextHopActionBuilder().setAddress(MDFlowMapping.toInetAddress(sourceAction.getAddress())).build())
303         .build();
304     }
305
306     private static SetNwDstActionCase _toAction(final SetNwDst sourceAction) {
307         return new SetNwDstActionCaseBuilder()
308         .setSetNwDstAction(new SetNwDstActionBuilder().setAddress(MDFlowMapping.toInetAddress(sourceAction.getAddress())).build())
309         .build();
310     }
311
312     private static SetNwSrcActionCase _toAction(final SetNwSrc sourceAction) {
313         return new SetNwSrcActionCaseBuilder()
314         .setSetNwSrcAction(new SetNwSrcActionBuilder().setAddress(MDFlowMapping.toInetAddress(sourceAction.getAddress())).build())
315         .build();
316     }
317
318     private static SetNwTosActionCase _toAction(final SetNwTos sourceAction) {
319         return new SetNwTosActionCaseBuilder()
320         .setSetNwTosAction(new SetNwTosActionBuilder().setTos(sourceAction.getNwTos()).build())
321         .build();
322     }
323
324     private static SetTpDstActionCase _toAction(final SetTpDst sourceAction) {
325         return new SetTpDstActionCaseBuilder()
326         .setSetTpDstAction(new SetTpDstActionBuilder().setPort(new PortNumber(sourceAction.getPort())).build())
327         .build();
328     }
329
330     private static SetTpSrcActionCase _toAction(final SetTpSrc sourceAction) {
331         return new SetTpSrcActionCaseBuilder()
332         .setSetTpSrcAction(new SetTpSrcActionBuilder().setPort(new PortNumber(sourceAction.getPort())).build())
333         .build();
334     }
335
336     private static SetVlanCfiActionCase _toAction(final SetVlanCfi sourceAction) {
337         return new SetVlanCfiActionCaseBuilder()
338         .setSetVlanCfiAction(new SetVlanCfiActionBuilder().setVlanCfi(new VlanCfi(sourceAction.getCfi())).build())
339         .build();
340     }
341
342     private static SetVlanIdActionCase _toAction(final SetVlanId sourceAction) {
343         return new SetVlanIdActionCaseBuilder()
344         .setSetVlanIdAction(new SetVlanIdActionBuilder().setVlanId(new VlanId(sourceAction.getVlanId())).build())
345         .build();
346     }
347
348     private static SetVlanPcpActionCase _toAction(final SetVlanPcp sourceAction) {
349         return new SetVlanPcpActionCaseBuilder()
350         .setSetVlanPcpAction(new SetVlanPcpActionBuilder().setVlanPcp(new VlanPcp((short) sourceAction.getPcp())).build())
351         .build();
352     }
353
354     private static SwPathActionCase _toAction(final SwPath sourceAction) {
355         return new SwPathActionCaseBuilder().setSwPathAction(new SwPathActionBuilder().build()).build();
356     }
357
358     public static Uri toUri(final NodeConnector connector) {
359         return new NodeConnectorId(((String) connector.getID()));
360     }
361
362     public static MacAddress toMacAddress(final byte[] bytes) {
363         final StringBuilder sb = new StringBuilder(18);
364         boolean first = true;
365
366         for (final byte b : bytes) {
367             if (first) {
368                 first = false;
369             } else {
370                 sb.append(':');
371             }
372             sb.append(String.format("%02x", Byte.valueOf(b)));
373         }
374         return new MacAddress(sb.toString());
375     }
376
377     public static org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action toAction(final Action sourceAction, final int order) {
378         final ActionBuilder ret = new ActionBuilder().setOrder(order);
379
380         if (sourceAction instanceof Controller) {
381             ret.setAction(_toAction((Controller)sourceAction));
382         } else if (sourceAction instanceof Drop) {
383             ret.setAction(_toAction((Drop)sourceAction));
384         } else if (sourceAction instanceof Flood) {
385             ret.setAction(_toAction((Flood)sourceAction));
386         } else if (sourceAction instanceof FloodAll) {
387             ret.setAction(_toAction((FloodAll)sourceAction));
388         } else if (sourceAction instanceof HwPath) {
389             ret.setAction(_toAction((HwPath)sourceAction));
390         } else if (sourceAction instanceof Loopback) {
391             ret.setAction(_toAction((Loopback)sourceAction));
392         } else if (sourceAction instanceof Output) {
393             ret.setAction(_toAction((Output)sourceAction));
394         } else if (sourceAction instanceof PopVlan) {
395             ret.setAction(_toAction((PopVlan)sourceAction));
396         } else if (sourceAction instanceof PushVlan) {
397             ret.setAction(_toAction((PushVlan)sourceAction));
398         } else if (sourceAction instanceof SetDlDst) {
399             ret.setAction(_toAction((SetDlDst)sourceAction));
400         } else if (sourceAction instanceof SetDlSrc) {
401             ret.setAction(_toAction((SetDlSrc)sourceAction));
402         } else if (sourceAction instanceof SetDlType) {
403             ret.setAction(_toAction((SetDlType)sourceAction));
404         } else if (sourceAction instanceof SetNextHop) {
405             ret.setAction(_toAction((SetNextHop)sourceAction));
406         } else if (sourceAction instanceof SetNwDst) {
407             ret.setAction(_toAction((SetNwDst)sourceAction));
408         } else if (sourceAction instanceof SetNwSrc) {
409             ret.setAction(_toAction((SetNwSrc)sourceAction));
410         } else if (sourceAction instanceof SetNwTos) {
411             ret.setAction(_toAction((SetNwTos)sourceAction));
412         } else if (sourceAction instanceof SetTpDst) {
413             ret.setAction(_toAction((SetTpDst)sourceAction));
414         } else if (sourceAction instanceof SetTpSrc) {
415             ret.setAction(_toAction((SetTpSrc)sourceAction));
416         } else if (sourceAction instanceof SetVlanCfi) {
417             ret.setAction(_toAction((SetVlanCfi)sourceAction));
418         } else if (sourceAction instanceof SetVlanId) {
419             ret.setAction(_toAction((SetVlanId)sourceAction));
420         } else if (sourceAction instanceof SetVlanPcp) {
421             ret.setAction(_toAction((SetVlanPcp)sourceAction));
422         } else if (sourceAction instanceof SwPath) {
423             ret.setAction(_toAction((SwPath)sourceAction));
424         } else {
425             throw new IllegalArgumentException(String.format("Unhandled action class %s", sourceAction.getClass()));
426         }
427
428         return ret.build();
429     }
430
431     public static Address toInetAddress(final InetAddress address) {
432         if (address instanceof Inet4Address) {
433             return new Ipv4Builder()
434             .setIpv4Address(new Ipv4Prefix(InetAddresses.toAddrString(address)))
435             .build();
436         }
437         if (address instanceof Inet6Address) {
438             return new Ipv6Builder()
439             .setIpv6Address(new Ipv6Prefix(InetAddresses.toAddrString(address)))
440             .build();
441         }
442
443         throw new IllegalArgumentException(String.format("Unhandled address class %s", address.getClass()));
444     }
445 }