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