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