1 package org.opendaylight.controller.sal.compatibility;
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
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
109 public class MDFlowMapping {
112 throw new UnsupportedOperationException()
115 public static def flowAdded(Flow sourceFlow) {
116 if (sourceFlow == null)
117 throw new IllegalArgumentException();
118 val it = new FlowAddedBuilder();
120 hardTimeout = sourceFlow.hardTimeout as int
121 idleTimeout = sourceFlow.idleTimeout as int
122 cookie = BigInteger.valueOf(sourceFlow.id)
123 priority = sourceFlow.priority as int
125 val sourceActions = sourceFlow.actions;
126 val targetActions = new ArrayList<Action>();
127 for (sourceAction : sourceActions) {
128 targetActions.add(sourceAction.toAction());
130 instructions = targetActions.toApplyInstruction();
131 match = sourceFlow.match.toMatch();
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)
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);
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);
156 public static def updateFlowInput(Node sourceNode, Flow oldFlow, Flow newFlow) {
157 val it = new UpdateFlowInputBuilder();
158 val sourceOld = flowAdded(newFlow);
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()
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();
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();
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();
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();
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();
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();
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();
214 public static dispatch def toAction(PopVlan sourceAction) {
215 val actionBuilder = new ActionBuilder();
216 actionBuilder.action = new PopVlanActionCaseBuilder().build();
217 return actionBuilder.build();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
314 public static dispatch def toAction(SetVlanId sourceAction) {
315 val actionBuilder = new ActionBuilder();
317 val it = new SetVlanIdActionBuilder();
318 vlanId = new VlanId(sourceAction.vlanId);
319 actionBuilder.action = new SetVlanIdActionCaseBuilder().setSetVlanIdAction(it.build()).build();
320 return actionBuilder.build();
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();
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();
337 public static def dispatch Address toInetAddress(Inet4Address address) {
338 val it = new Ipv4Builder
339 ipv4Address = new Ipv4Prefix(InetAddresses.toAddrString(address))
343 public static def dispatch Address toInetAddress(Inet6Address address) {
344 val it = new Ipv6Builder
345 ipv6Address = new Ipv6Prefix(InetAddresses.toAddrString(address))
349 public static def Uri toUri(NodeConnector connector) {
350 return new NodeConnectorId(connector.ID as String);
353 public static def MacAddress toMacAddress(byte[] bytes) {
354 val sb = new StringBuilder(18);
355 for (byte b : bytes) {
358 sb.append(String.format("%02x", b));
360 return new MacAddress(sb.toString());
363 public static def toMDSalflow(Flow sourceFlow) {
364 if (sourceFlow == null)
365 throw new IllegalArgumentException();
366 val it = new FlowBuilder();
368 hardTimeout = sourceFlow.hardTimeout as int
369 idleTimeout = sourceFlow.idleTimeout as int
370 cookie = BigInteger.valueOf(sourceFlow.id)
371 priority = sourceFlow.priority as int
373 val sourceActions = sourceFlow.actions;
374 val targetActions = new ArrayList<Action>();
375 for (sourceAction : sourceActions) {
376 targetActions.add(sourceAction.toAction());
378 instructions = targetActions.toApplyInstruction();
379 match = sourceFlow.match.toMatch();