Merge "BUG 652 leafref CCE & BUG 720 colons problem"
[controller.git] / opendaylight / md-sal / compatibility / sal-compatibility / src / main / java / org / opendaylight / controller / sal / compatibility / MDFlowMapping.xtend
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.net.InetAddresses
11 import java.math.BigInteger
12 import java.net.Inet4Address
13 import java.net.Inet6Address
14 import java.util.ArrayList
15 import org.opendaylight.controller.sal.action.Controller
16 import org.opendaylight.controller.sal.action.Drop
17 import org.opendaylight.controller.sal.action.Flood
18 import org.opendaylight.controller.sal.action.FloodAll
19 import org.opendaylight.controller.sal.action.HwPath
20 import org.opendaylight.controller.sal.action.Loopback
21 import org.opendaylight.controller.sal.action.Output
22 import org.opendaylight.controller.sal.action.PopVlan
23 import org.opendaylight.controller.sal.action.PushVlan
24 import org.opendaylight.controller.sal.action.SetDlDst
25 import org.opendaylight.controller.sal.action.SetDlSrc
26 import org.opendaylight.controller.sal.action.SetDlType
27 import org.opendaylight.controller.sal.action.SetNextHop
28 import org.opendaylight.controller.sal.action.SetNwDst
29 import org.opendaylight.controller.sal.action.SetNwSrc
30 import org.opendaylight.controller.sal.action.SetNwTos
31 import org.opendaylight.controller.sal.action.SetTpDst
32 import org.opendaylight.controller.sal.action.SetTpSrc
33 import org.opendaylight.controller.sal.action.SetVlanCfi
34 import org.opendaylight.controller.sal.action.SetVlanId
35 import org.opendaylight.controller.sal.action.SetVlanPcp
36 import org.opendaylight.controller.sal.action.SwPath
37 import org.opendaylight.controller.sal.core.Node
38 import org.opendaylight.controller.sal.core.NodeConnector
39 import org.opendaylight.controller.sal.flowprogrammer.Flow
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber
43 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri
44 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.FlowAddedBuilder
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder
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.address.Address
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv4Builder
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.address.address.Ipv6Builder
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp
58
59 import static extension org.opendaylight.controller.sal.compatibility.FromSalConversionsUtils.*
60 import static extension org.opendaylight.controller.sal.compatibility.NodeMapping.*
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Instructions
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.InstructionsBuilder
65 import java.util.Collections
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.controller.action._case.ControllerActionBuilder
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.flood.action._case.FloodActionBuilder
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.flood.all.action._case.FloodAllActionBuilder
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.hw.path.action._case.HwPathActionBuilder
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.loopback.action._case.LoopbackActionBuilder
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstActionBuilder
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcActionBuilder
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.type.action._case.SetDlTypeActionBuilder
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.next.hop.action._case.SetNextHopActionBuilder
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstActionBuilder
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.src.action._case.SetNwSrcActionBuilder
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.tos.action._case.SetNwTosActionBuilder
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.dst.action._case.SetTpDstActionBuilder
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.src.action._case.SetTpSrcActionBuilder
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.cfi.action._case.SetVlanCfiActionBuilder
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdActionBuilder
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpActionBuilder
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.sw.path.action._case.SwPathActionBuilder
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCaseBuilder
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCaseBuilder
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTosActionCaseBuilder
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCaseBuilder
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCaseBuilder
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNextHopActionCaseBuilder
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlTypeActionCaseBuilder
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCaseBuilder
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.ControllerActionCaseBuilder
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodActionCaseBuilder
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.FloodAllActionCaseBuilder
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.HwPathActionCaseBuilder
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.LoopbackActionCaseBuilder
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCaseBuilder
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanCfiActionCaseBuilder
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCaseBuilder
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCaseBuilder
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SwPathActionCaseBuilder
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie
117
118 public class MDFlowMapping {
119
120     private new() {
121         throw new UnsupportedOperationException()
122     }
123
124     public static def flowAdded(Flow sourceFlow) {
125         if (sourceFlow == null)
126             throw new IllegalArgumentException();
127         val it = new FlowAddedBuilder();
128
129         hardTimeout = sourceFlow.hardTimeout as int
130         idleTimeout = sourceFlow.idleTimeout as int
131         cookie = new FlowCookie(BigInteger.valueOf(sourceFlow.id))
132         priority = sourceFlow.priority as int
133
134         val sourceActions = sourceFlow.actions;
135         val targetActions = new ArrayList<Action>();
136         var int action = 0;
137         for (sourceAction : sourceActions) {
138             targetActions.add(sourceAction.toAction(action));
139             action = action + 1;
140         }
141         instructions = targetActions.toApplyInstruction();
142         match = sourceFlow.match.toMatch();
143         tableId = new Integer(0).shortValue
144         return it.build();
145
146     }
147     
148     public static def toMDFlow(Flow sourceFlow, String flowId) {
149        if (sourceFlow == null)
150             throw new IllegalArgumentException();
151        val it = new FlowBuilder();
152        hardTimeout = sourceFlow.hardTimeout as int
153        idleTimeout = sourceFlow.idleTimeout as int
154        cookie = new FlowCookie(BigInteger.valueOf(sourceFlow.id))
155        priority = sourceFlow.priority as int
156        id = new FlowId(flowId)
157     
158        val sourceActions = sourceFlow.actions;
159        val targetActions = new ArrayList<Action>();
160        var int action = 0;
161        for (sourceAction : sourceActions) {
162            targetActions.add(sourceAction.toAction(action));
163            action = action+ 1;
164        }
165        instructions = targetActions.toApplyInstruction();
166        match = sourceFlow.match.toMatch();
167        tableId = new Integer(0).shortValue
168        return it.build();
169     }
170     
171     public static def Instructions toApplyInstruction(ArrayList<Action> actions) {
172         val it = new InstructionsBuilder;
173         val applyActions = new InstructionBuilder;
174         applyActions.instruction = new ApplyActionsCaseBuilder().setApplyActions(new ApplyActionsBuilder().setAction(actions).build()).build()
175         applyActions.setOrder(new Integer(0))
176         instruction = Collections.<Instruction>singletonList(applyActions.build)
177         return it.build;
178     }
179
180     public static def removeFlowInput(Node sourceNode, Flow sourceFlow) {
181         val source = flowAdded(sourceFlow);
182         val it = new RemoveFlowInputBuilder(source as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
183         node = sourceNode.toNodeRef()
184         return it.build();
185     }
186
187     public static def addFlowInput(Node sourceNode, Flow sourceFlow) {
188         val source = flowAdded(sourceFlow);
189         val it = new AddFlowInputBuilder(source as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
190         it.setNode(sourceNode.toNodeRef)
191         return it.build();
192     }
193
194     public static def updateFlowInput(Node sourceNode, Flow oldFlow, Flow newFlow) {
195         val it = new UpdateFlowInputBuilder();
196         val sourceOld = flowAdded(newFlow);
197
198         val original = new OriginalFlowBuilder(sourceOld as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
199         val sourceNew = flowAdded(newFlow);
200         val updated = new UpdatedFlowBuilder(sourceNew as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
201         originalFlow = original.build()
202         updatedFlow = updated.build();
203         node = sourceNode.toNodeRef()
204         return it.build();
205     }
206
207     public static dispatch def toAction(Controller sourceAction, int order) {
208         val actionBuilder = new ActionBuilder().setOrder(order);
209         actionBuilder.action = new ControllerActionCaseBuilder().setControllerAction(new ControllerActionBuilder().build()).build();
210         return actionBuilder.build();
211     }
212
213     public static dispatch def toAction(Drop sourceAction, int order) {
214         val actionBuilder = new ActionBuilder().setOrder(order);
215         actionBuilder.action = new DropActionCaseBuilder().setDropAction(new DropActionBuilder().build()).build();
216         return actionBuilder.build();
217     }
218
219     public static dispatch def toAction(Flood sourceAction, int order) {
220         val actionBuilder = new ActionBuilder().setOrder(order);
221         actionBuilder.action = new FloodActionCaseBuilder().setFloodAction(new FloodActionBuilder().build).build();
222         return actionBuilder.build();
223     }
224
225     public static dispatch def toAction(FloodAll sourceAction, int order) {
226         val actionBuilder = new ActionBuilder().setOrder(order);
227         actionBuilder.action = new FloodAllActionCaseBuilder().setFloodAllAction(new FloodAllActionBuilder().build()).build();
228         return actionBuilder.build();
229     }
230
231     public static dispatch def toAction(HwPath sourceAction, int order) {
232         val actionBuilder = new ActionBuilder().setOrder(order);
233         actionBuilder.action = new HwPathActionCaseBuilder().setHwPathAction(new HwPathActionBuilder().build()).build();
234         return actionBuilder.build();
235     }
236
237     public static dispatch def toAction(Loopback sourceAction, int order) {
238         val actionBuilder = new ActionBuilder().setOrder(order);
239         actionBuilder.action = new LoopbackActionCaseBuilder().setLoopbackAction(new LoopbackActionBuilder().build()).build();
240         return actionBuilder.build();
241     }
242
243     public static dispatch def toAction(Output sourceAction, int order) {
244         val actionBuilder = new ActionBuilder().setOrder(order);
245         val it = new OutputActionBuilder();
246         outputNodeConnector = sourceAction.port.toUri;
247         actionBuilder.action = new OutputActionCaseBuilder().setOutputAction(it.build()).build();
248         return actionBuilder.build();
249
250     }
251
252     public static dispatch def toAction(PopVlan sourceAction, int order) {
253         val actionBuilder = new ActionBuilder().setOrder(order);
254         actionBuilder.action = new PopVlanActionCaseBuilder().build();
255         return actionBuilder.build();
256     }
257
258     public static dispatch def toAction(PushVlan sourceAction, int order) {
259         val actionBuilder = new ActionBuilder().setOrder(order);
260         val it = new PushVlanActionBuilder();
261         cfi = new VlanCfi(sourceAction.cfi);
262         vlanId = new VlanId(sourceAction.vlanId);
263         pcp = sourceAction.pcp;
264         tag = sourceAction.tag;
265         actionBuilder.action = new PushVlanActionCaseBuilder().setPushVlanAction(it.build()).build();
266         return actionBuilder.build();
267     }
268
269     public static dispatch def toAction(SetDlDst sourceAction, int order) {
270         val actionBuilder = new ActionBuilder().setOrder(order);
271         val it = new SetDlDstActionBuilder();
272         address = sourceAction.dlAddress.toMacAddress();
273         actionBuilder.action = new SetDlDstActionCaseBuilder().setSetDlDstAction(it.build()).build;
274         return actionBuilder.build();
275     }
276
277     public static dispatch def toAction(SetDlSrc sourceAction, int order) {
278         val actionBuilder = new ActionBuilder().setOrder(order);
279         val it = new SetDlSrcActionBuilder();
280         address = sourceAction.dlAddress.toMacAddress;
281         actionBuilder.action = new SetDlSrcActionCaseBuilder().setSetDlSrcAction(it.build()).build;
282         return actionBuilder.build();
283     }
284
285     public static dispatch def toAction(SetDlType sourceAction, int order) {
286         val actionBuilder = new ActionBuilder().setOrder(order);
287         val it = new SetDlTypeActionBuilder();
288         dlType = new EtherType(sourceAction.dlType as long);
289         actionBuilder.action = new SetDlTypeActionCaseBuilder().setSetDlTypeAction(it.build()).build();
290         return actionBuilder.build();
291     }
292
293     public static dispatch def toAction(SetNextHop sourceAction, int order) {
294         val actionBuilder = new ActionBuilder().setOrder(order);
295         val it = new SetNextHopActionBuilder();
296         val inetAddress = sourceAction.address;
297         address = inetAddress.toInetAddress;
298         actionBuilder.action = new SetNextHopActionCaseBuilder().setSetNextHopAction(it.build).build();
299         return actionBuilder.build();
300     }
301
302     public static dispatch def toAction(SetNwDst sourceAction, int order) {
303         val actionBuilder = new ActionBuilder().setOrder(order);
304         val it = new SetNwDstActionBuilder();
305         val inetAddress = sourceAction.address;
306         address = inetAddress.toInetAddress;
307         actionBuilder.action = new SetNwDstActionCaseBuilder().setSetNwDstAction(it.build()).build();
308         return actionBuilder.build();
309     }
310
311     public static dispatch def toAction(SetNwSrc sourceAction, int order) {
312         val actionBuilder = new ActionBuilder().setOrder(order);
313         val it = new SetNwSrcActionBuilder();
314         val inetAddress = sourceAction.address;
315         address = inetAddress.toInetAddress;
316         actionBuilder.action = new SetNwSrcActionCaseBuilder().setSetNwSrcAction(it.build()).build();
317         return actionBuilder.build();
318     }
319
320     public static dispatch def toAction(SetNwTos sourceAction, int order) {
321         val actionBuilder = new ActionBuilder().setOrder(order);
322         val it = new SetNwTosActionBuilder();
323         tos = sourceAction.nwTos;
324         actionBuilder.action = new SetNwTosActionCaseBuilder().setSetNwTosAction(it.build).build;
325         return actionBuilder.build();
326     }
327
328     public static dispatch def toAction(SetTpDst sourceAction, int order) {
329         val actionBuilder = new ActionBuilder().setOrder(order);
330         val it = new SetTpDstActionBuilder();
331         port = new PortNumber(sourceAction.port);
332         actionBuilder.action = new SetTpDstActionCaseBuilder().setSetTpDstAction(it.build()).build();
333         return actionBuilder.build();
334     }
335
336     public static dispatch def toAction(SetTpSrc sourceAction, int order) {
337         val actionBuilder = new ActionBuilder().setOrder(order);
338         val it = new SetTpSrcActionBuilder();
339         port = new PortNumber(sourceAction.port);
340         actionBuilder.action = new SetTpSrcActionCaseBuilder().setSetTpSrcAction(it.build()).build();
341         return actionBuilder.build();
342     }
343
344     public static dispatch def toAction(SetVlanCfi sourceAction, int order) {
345         val actionBuilder = new ActionBuilder().setOrder(order);
346         val it = new SetVlanCfiActionBuilder();
347         vlanCfi = new VlanCfi(sourceAction.cfi);
348         actionBuilder.action = new SetVlanCfiActionCaseBuilder().setSetVlanCfiAction(it.build()).build();
349         return actionBuilder.build();
350     }
351
352     public static dispatch def toAction(SetVlanId sourceAction, int order) {
353         val actionBuilder = new ActionBuilder().setOrder(order);
354
355         val it = new SetVlanIdActionBuilder();
356         vlanId = new VlanId(sourceAction.vlanId);
357         actionBuilder.action = new SetVlanIdActionCaseBuilder().setSetVlanIdAction(it.build()).build();
358         return actionBuilder.build();
359     }
360
361     public static dispatch def toAction(SetVlanPcp sourceAction, int order) {
362         val actionBuilder = new ActionBuilder().setOrder(order);
363         val it = new SetVlanPcpActionBuilder();
364         vlanPcp = new VlanPcp(sourceAction.pcp as short);
365         actionBuilder.action = new SetVlanPcpActionCaseBuilder().setSetVlanPcpAction(it.build).build;
366         return actionBuilder.build();
367     }
368
369     public static dispatch def toAction(SwPath sourceAction, int order) {
370         val actionBuilder = new ActionBuilder().setOrder(order);
371         actionBuilder.action = new SwPathActionCaseBuilder().setSwPathAction(new SwPathActionBuilder().build()).build();
372         return actionBuilder.build();
373     }
374
375     public static def dispatch Address toInetAddress(Inet4Address address) {
376         val it = new Ipv4Builder
377         ipv4Address = new Ipv4Prefix(InetAddresses.toAddrString(address))
378         return it.build()
379     }
380
381     public static def dispatch Address toInetAddress(Inet6Address address) {
382         val it = new Ipv6Builder
383         ipv6Address = new Ipv6Prefix(InetAddresses.toAddrString(address))
384         return it.build()
385     }
386
387     public static def Uri toUri(NodeConnector connector) {
388         return new NodeConnectorId(connector.ID as String);
389     }
390
391     public static def MacAddress toMacAddress(byte[] bytes) {
392         val sb = new StringBuilder(18);
393         for (byte b : bytes) {
394             if (sb.length() > 0)
395                 sb.append(':');
396             sb.append(String.format("%02x", b));
397         }
398         return new MacAddress(sb.toString());
399     }
400         
401         public static def toMDSalflow(Flow sourceFlow) {
402         if (sourceFlow == null)
403             throw new IllegalArgumentException();
404         val it = new FlowBuilder();
405
406         hardTimeout = sourceFlow.hardTimeout as int
407         idleTimeout = sourceFlow.idleTimeout as int
408         cookie = new FlowCookie(BigInteger.valueOf(sourceFlow.id))
409         priority = sourceFlow.priority as int
410
411         val sourceActions = sourceFlow.actions;
412         val targetActions = new ArrayList<Action>();
413         var int action = 0;
414         for (sourceAction : sourceActions) {
415             targetActions.add(sourceAction.toAction(action));
416             action = action + 1;
417         }
418         instructions = targetActions.toApplyInstruction();
419         match = sourceFlow.match.toMatch();
420         return it.build();
421         }
422         
423 }