Merge "Fixed northbound references to SAL"
[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         return it.build();
133
134     }
135     
136     public static def Instructions toApplyInstruction(ArrayList<Action> actions) {
137         val it = new InstructionsBuilder;
138         val applyActions = new InstructionBuilder;
139         applyActions.instruction = new ApplyActionsCaseBuilder().setApplyActions(new ApplyActionsBuilder().setAction(actions).build()).build()
140         instruction = Collections.<Instruction>singletonList(applyActions.build)
141         return it.build;
142     }
143
144     public static def removeFlowInput(Node sourceNode, Flow sourceFlow) {
145         val source = flowAdded(sourceFlow);
146         val it = new RemoveFlowInputBuilder(source as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
147         return it.build();
148     }
149
150     public static def addFlowInput(Node sourceNode, Flow sourceFlow) {
151         val source = flowAdded(sourceFlow);
152         val it = new AddFlowInputBuilder(source as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
153         return it.build();
154     }
155
156     public static def updateFlowInput(Node sourceNode, Flow oldFlow, Flow newFlow) {
157         val it = new UpdateFlowInputBuilder();
158         val sourceOld = flowAdded(newFlow);
159
160         val original = new OriginalFlowBuilder(sourceOld as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
161         val sourceNew = flowAdded(newFlow);
162         val updated = new UpdatedFlowBuilder(sourceNew as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
163         originalFlow = original.build()
164         updatedFlow = updated.build();
165         node = sourceNode.toNodeRef()
166         return it.build();
167     }
168
169     public static dispatch def toAction(Controller sourceAction) {
170         val actionBuilder = new ActionBuilder();
171         actionBuilder.action = new ControllerActionCaseBuilder().setControllerAction(new ControllerActionBuilder().build()).build();
172         return actionBuilder.build();
173     }
174
175     public static dispatch def toAction(Drop sourceAction) {
176         val actionBuilder = new ActionBuilder();
177         actionBuilder.action = new DropActionCaseBuilder().setDropAction(new DropActionBuilder().build()).build();
178         return actionBuilder.build();
179     }
180
181     public static dispatch def toAction(Flood sourceAction) {
182         val actionBuilder = new ActionBuilder();
183         actionBuilder.action = new FloodActionCaseBuilder().setFloodAction(new FloodActionBuilder().build).build();
184         return actionBuilder.build();
185     }
186
187     public static dispatch def toAction(FloodAll sourceAction) {
188         val actionBuilder = new ActionBuilder();
189         actionBuilder.action = new FloodAllActionCaseBuilder().setFloodAllAction(new FloodAllActionBuilder().build()).build();
190         return actionBuilder.build();
191     }
192
193     public static dispatch def toAction(HwPath sourceAction) {
194         val actionBuilder = new ActionBuilder();
195         actionBuilder.action = new HwPathActionCaseBuilder().setHwPathAction(new HwPathActionBuilder().build()).build();
196         return actionBuilder.build();
197     }
198
199     public static dispatch def toAction(Loopback sourceAction) {
200         val actionBuilder = new ActionBuilder();
201         actionBuilder.action = new LoopbackActionCaseBuilder().setLoopbackAction(new LoopbackActionBuilder().build()).build();
202         return actionBuilder.build();
203     }
204
205     public static dispatch def toAction(Output sourceAction) {
206         val actionBuilder = new ActionBuilder();
207         val it = new OutputActionBuilder();
208         outputNodeConnector = sourceAction.port.toUri;
209         actionBuilder.action = new OutputActionCaseBuilder().setOutputAction(it.build()).build();
210         return actionBuilder.build();
211
212     }
213
214     public static dispatch def toAction(PopVlan sourceAction) {
215         val actionBuilder = new ActionBuilder();
216         actionBuilder.action = new PopVlanActionCaseBuilder().build();
217         return actionBuilder.build();
218     }
219
220     public static dispatch def toAction(PushVlan sourceAction) {
221         val actionBuilder = new ActionBuilder();
222         val it = new PushVlanActionBuilder();
223         cfi = new VlanCfi(sourceAction.cfi);
224         vlanId = new VlanId(sourceAction.vlanId);
225         pcp = sourceAction.pcp;
226         tag = sourceAction.tag;
227         actionBuilder.action = new PushVlanActionCaseBuilder().setPushVlanAction(it.build()).build();
228         return actionBuilder.build();
229     }
230
231     public static dispatch def toAction(SetDlDst sourceAction) {
232         val actionBuilder = new ActionBuilder();
233         val it = new SetDlDstActionBuilder();
234         address = sourceAction.dlAddress.toMacAddress();
235         actionBuilder.action = new SetDlDstActionCaseBuilder().setSetDlDstAction(it.build()).build;
236         return actionBuilder.build();
237     }
238
239     public static dispatch def toAction(SetDlSrc sourceAction) {
240         val actionBuilder = new ActionBuilder();
241         val it = new SetDlSrcActionBuilder();
242         address = sourceAction.dlAddress.toMacAddress;
243         actionBuilder.action = new SetDlSrcActionCaseBuilder().setSetDlSrcAction(it.build()).build;
244         return actionBuilder.build();
245     }
246
247     public static dispatch def toAction(SetDlType sourceAction) {
248         val actionBuilder = new ActionBuilder();
249         val it = new SetDlTypeActionBuilder();
250         dlType = new EtherType(sourceAction.dlType as long);
251         actionBuilder.action = new SetDlTypeActionCaseBuilder().setSetDlTypeAction(it.build()).build();
252         return actionBuilder.build();
253     }
254
255     public static dispatch def toAction(SetNextHop sourceAction) {
256         val actionBuilder = new ActionBuilder();
257         val it = new SetNextHopActionBuilder();
258         val inetAddress = sourceAction.address;
259         address = inetAddress.toInetAddress;
260         actionBuilder.action = new SetNextHopActionCaseBuilder().setSetNextHopAction(it.build).build();
261         return actionBuilder.build();
262     }
263
264     public static dispatch def toAction(SetNwDst sourceAction) {
265         val actionBuilder = new ActionBuilder();
266         val it = new SetNwDstActionBuilder();
267         val inetAddress = sourceAction.address;
268         address = inetAddress.toInetAddress;
269         actionBuilder.action = new SetNwDstActionCaseBuilder().setSetNwDstAction(it.build()).build();
270         return actionBuilder.build();
271     }
272
273     public static dispatch def toAction(SetNwSrc sourceAction) {
274         val actionBuilder = new ActionBuilder();
275         val it = new SetNwSrcActionBuilder();
276         val inetAddress = sourceAction.address;
277         address = inetAddress.toInetAddress;
278         actionBuilder.action = new SetNwSrcActionCaseBuilder().setSetNwSrcAction(it.build()).build();
279         return actionBuilder.build();
280     }
281
282     public static dispatch def toAction(SetNwTos sourceAction) {
283         val actionBuilder = new ActionBuilder();
284         val it = new SetNwTosActionBuilder();
285         tos = sourceAction.nwTos;
286         actionBuilder.action = new SetNwTosActionCaseBuilder().setSetNwTosAction(it.build).build;
287         return actionBuilder.build();
288     }
289
290     public static dispatch def toAction(SetTpDst sourceAction) {
291         val actionBuilder = new ActionBuilder();
292         val it = new SetTpDstActionBuilder();
293         port = new PortNumber(sourceAction.port);
294         actionBuilder.action = new SetTpDstActionCaseBuilder().setSetTpDstAction(it.build()).build();
295         return actionBuilder.build();
296     }
297
298     public static dispatch def toAction(SetTpSrc sourceAction) {
299         val actionBuilder = new ActionBuilder();
300         val it = new SetTpSrcActionBuilder();
301         port = new PortNumber(sourceAction.port);
302         actionBuilder.action = new SetTpSrcActionCaseBuilder().setSetTpSrcAction(it.build()).build();
303         return actionBuilder.build();
304     }
305
306     public static dispatch def toAction(SetVlanCfi sourceAction) {
307         val actionBuilder = new ActionBuilder();
308         val it = new SetVlanCfiActionBuilder();
309         vlanCfi = new VlanCfi(sourceAction.cfi);
310         actionBuilder.action = new SetVlanCfiActionCaseBuilder().setSetVlanCfiAction(it.build()).build();
311         return actionBuilder.build();
312     }
313
314     public static dispatch def toAction(SetVlanId sourceAction) {
315         val actionBuilder = new ActionBuilder();
316
317         val it = new SetVlanIdActionBuilder();
318         vlanId = new VlanId(sourceAction.vlanId);
319         actionBuilder.action = new SetVlanIdActionCaseBuilder().setSetVlanIdAction(it.build()).build();
320         return actionBuilder.build();
321     }
322
323     public static dispatch def toAction(SetVlanPcp sourceAction) {
324         val actionBuilder = new ActionBuilder();
325         val it = new SetVlanPcpActionBuilder();
326         vlanPcp = new VlanPcp(sourceAction.pcp as short);
327         actionBuilder.action = new SetVlanPcpActionCaseBuilder().setSetVlanPcpAction(it.build).build;
328         return actionBuilder.build();
329     }
330
331     public static dispatch def toAction(SwPath sourceAction) {
332         val actionBuilder = new ActionBuilder();
333         actionBuilder.action = new SwPathActionCaseBuilder().setSwPathAction(new SwPathActionBuilder().build()).build();
334         return actionBuilder.build();
335     }
336
337     public static def dispatch Address toInetAddress(Inet4Address address) {
338         val it = new Ipv4Builder
339         ipv4Address = new Ipv4Prefix(InetAddresses.toAddrString(address))
340         return it.build()
341     }
342
343     public static def dispatch Address toInetAddress(Inet6Address address) {
344         val it = new Ipv6Builder
345         ipv6Address = new Ipv6Prefix(InetAddresses.toAddrString(address))
346         return it.build()
347     }
348
349     public static def Uri toUri(NodeConnector connector) {
350         return new NodeConnectorId(connector.ID as String);
351     }
352
353     public static def MacAddress toMacAddress(byte[] bytes) {
354         val sb = new StringBuilder(18);
355         for (byte b : bytes) {
356             if (sb.length() > 0)
357                 sb.append(':');
358             sb.append(String.format("%02x", b));
359         }
360         return new MacAddress(sb.toString());
361     }
362         
363         public static def toMDSalflow(Flow sourceFlow) {
364         if (sourceFlow == null)
365             throw new IllegalArgumentException();
366         val it = new FlowBuilder();
367
368         hardTimeout = sourceFlow.hardTimeout as int
369         idleTimeout = sourceFlow.idleTimeout as int
370         cookie = BigInteger.valueOf(sourceFlow.id)
371         priority = sourceFlow.priority as int
372
373         val sourceActions = sourceFlow.actions;
374         val targetActions = new ArrayList<Action>();
375         for (sourceAction : sourceActions) {
376             targetActions.add(sourceAction.toAction());
377         }
378         instructions = targetActions.toApplyInstruction();
379         match = sourceFlow.match.toMatch();
380         return it.build();
381         }
382         
383 }