2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.controller.sal.compatibility;
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
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
117 public class MDFlowMapping {
120 throw new UnsupportedOperationException()
123 public static def flowAdded(Flow sourceFlow) {
124 if (sourceFlow == null)
125 throw new IllegalArgumentException();
126 val it = new FlowAddedBuilder();
128 hardTimeout = sourceFlow.hardTimeout as int
129 idleTimeout = sourceFlow.idleTimeout as int
130 cookie = BigInteger.valueOf(sourceFlow.id)
131 priority = sourceFlow.priority as int
133 val sourceActions = sourceFlow.actions;
134 val targetActions = new ArrayList<Action>();
135 for (sourceAction : sourceActions) {
136 targetActions.add(sourceAction.toAction());
138 instructions = targetActions.toApplyInstruction();
139 match = sourceFlow.match.toMatch();
140 tableId = new Integer(0).shortValue
145 public static def toMDFlow(Flow sourceFlow, String flowId) {
146 if (sourceFlow == null)
147 throw new IllegalArgumentException();
148 val it = new FlowBuilder();
149 hardTimeout = sourceFlow.hardTimeout as int
150 idleTimeout = sourceFlow.idleTimeout as int
151 cookie = BigInteger.valueOf(sourceFlow.id)
152 priority = sourceFlow.priority as int
153 id = new FlowId(flowId)
155 val sourceActions = sourceFlow.actions;
156 val targetActions = new ArrayList<Action>();
157 for (sourceAction : sourceActions) {
158 targetActions.add(sourceAction.toAction());
160 instructions = targetActions.toApplyInstruction();
161 match = sourceFlow.match.toMatch();
162 tableId = new Integer(0).shortValue
166 public static def Instructions toApplyInstruction(ArrayList<Action> actions) {
167 val it = new InstructionsBuilder;
168 val applyActions = new InstructionBuilder;
169 applyActions.instruction = new ApplyActionsCaseBuilder().setApplyActions(new ApplyActionsBuilder().setAction(actions).build()).build()
170 applyActions.setOrder(new Integer(0))
171 instruction = Collections.<Instruction>singletonList(applyActions.build)
175 public static def removeFlowInput(Node sourceNode, Flow sourceFlow) {
176 val source = flowAdded(sourceFlow);
177 val it = new RemoveFlowInputBuilder(source as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
178 node = sourceNode.toNodeRef()
182 public static def addFlowInput(Node sourceNode, Flow sourceFlow) {
183 val source = flowAdded(sourceFlow);
184 val it = new AddFlowInputBuilder(source as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
185 it.setNode(sourceNode.toNodeRef)
189 public static def updateFlowInput(Node sourceNode, Flow oldFlow, Flow newFlow) {
190 val it = new UpdateFlowInputBuilder();
191 val sourceOld = flowAdded(newFlow);
193 val original = new OriginalFlowBuilder(sourceOld as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
194 val sourceNew = flowAdded(newFlow);
195 val updated = new UpdatedFlowBuilder(sourceNew as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
196 originalFlow = original.build()
197 updatedFlow = updated.build();
198 node = sourceNode.toNodeRef()
202 public static dispatch def toAction(Controller sourceAction) {
203 val actionBuilder = new ActionBuilder();
204 actionBuilder.action = new ControllerActionCaseBuilder().setControllerAction(new ControllerActionBuilder().build()).build();
205 return actionBuilder.build();
208 public static dispatch def toAction(Drop sourceAction) {
209 val actionBuilder = new ActionBuilder();
210 actionBuilder.action = new DropActionCaseBuilder().setDropAction(new DropActionBuilder().build()).build();
211 return actionBuilder.build();
214 public static dispatch def toAction(Flood sourceAction) {
215 val actionBuilder = new ActionBuilder();
216 actionBuilder.action = new FloodActionCaseBuilder().setFloodAction(new FloodActionBuilder().build).build();
217 return actionBuilder.build();
220 public static dispatch def toAction(FloodAll sourceAction) {
221 val actionBuilder = new ActionBuilder();
222 actionBuilder.action = new FloodAllActionCaseBuilder().setFloodAllAction(new FloodAllActionBuilder().build()).build();
223 return actionBuilder.build();
226 public static dispatch def toAction(HwPath sourceAction) {
227 val actionBuilder = new ActionBuilder();
228 actionBuilder.action = new HwPathActionCaseBuilder().setHwPathAction(new HwPathActionBuilder().build()).build();
229 return actionBuilder.build();
232 public static dispatch def toAction(Loopback sourceAction) {
233 val actionBuilder = new ActionBuilder();
234 actionBuilder.action = new LoopbackActionCaseBuilder().setLoopbackAction(new LoopbackActionBuilder().build()).build();
235 return actionBuilder.build();
238 public static dispatch def toAction(Output sourceAction) {
239 val actionBuilder = new ActionBuilder();
240 val it = new OutputActionBuilder();
241 outputNodeConnector = sourceAction.port.toUri;
242 actionBuilder.action = new OutputActionCaseBuilder().setOutputAction(it.build()).build();
243 return actionBuilder.build();
247 public static dispatch def toAction(PopVlan sourceAction) {
248 val actionBuilder = new ActionBuilder();
249 actionBuilder.action = new PopVlanActionCaseBuilder().build();
250 return actionBuilder.build();
253 public static dispatch def toAction(PushVlan sourceAction) {
254 val actionBuilder = new ActionBuilder();
255 val it = new PushVlanActionBuilder();
256 cfi = new VlanCfi(sourceAction.cfi);
257 vlanId = new VlanId(sourceAction.vlanId);
258 pcp = sourceAction.pcp;
259 tag = sourceAction.tag;
260 actionBuilder.action = new PushVlanActionCaseBuilder().setPushVlanAction(it.build()).build();
261 return actionBuilder.build();
264 public static dispatch def toAction(SetDlDst sourceAction) {
265 val actionBuilder = new ActionBuilder();
266 val it = new SetDlDstActionBuilder();
267 address = sourceAction.dlAddress.toMacAddress();
268 actionBuilder.action = new SetDlDstActionCaseBuilder().setSetDlDstAction(it.build()).build;
269 return actionBuilder.build();
272 public static dispatch def toAction(SetDlSrc sourceAction) {
273 val actionBuilder = new ActionBuilder();
274 val it = new SetDlSrcActionBuilder();
275 address = sourceAction.dlAddress.toMacAddress;
276 actionBuilder.action = new SetDlSrcActionCaseBuilder().setSetDlSrcAction(it.build()).build;
277 return actionBuilder.build();
280 public static dispatch def toAction(SetDlType sourceAction) {
281 val actionBuilder = new ActionBuilder();
282 val it = new SetDlTypeActionBuilder();
283 dlType = new EtherType(sourceAction.dlType as long);
284 actionBuilder.action = new SetDlTypeActionCaseBuilder().setSetDlTypeAction(it.build()).build();
285 return actionBuilder.build();
288 public static dispatch def toAction(SetNextHop sourceAction) {
289 val actionBuilder = new ActionBuilder();
290 val it = new SetNextHopActionBuilder();
291 val inetAddress = sourceAction.address;
292 address = inetAddress.toInetAddress;
293 actionBuilder.action = new SetNextHopActionCaseBuilder().setSetNextHopAction(it.build).build();
294 return actionBuilder.build();
297 public static dispatch def toAction(SetNwDst sourceAction) {
298 val actionBuilder = new ActionBuilder();
299 val it = new SetNwDstActionBuilder();
300 val inetAddress = sourceAction.address;
301 address = inetAddress.toInetAddress;
302 actionBuilder.action = new SetNwDstActionCaseBuilder().setSetNwDstAction(it.build()).build();
303 return actionBuilder.build();
306 public static dispatch def toAction(SetNwSrc sourceAction) {
307 val actionBuilder = new ActionBuilder();
308 val it = new SetNwSrcActionBuilder();
309 val inetAddress = sourceAction.address;
310 address = inetAddress.toInetAddress;
311 actionBuilder.action = new SetNwSrcActionCaseBuilder().setSetNwSrcAction(it.build()).build();
312 return actionBuilder.build();
315 public static dispatch def toAction(SetNwTos sourceAction) {
316 val actionBuilder = new ActionBuilder();
317 val it = new SetNwTosActionBuilder();
318 tos = sourceAction.nwTos;
319 actionBuilder.action = new SetNwTosActionCaseBuilder().setSetNwTosAction(it.build).build;
320 return actionBuilder.build();
323 public static dispatch def toAction(SetTpDst sourceAction) {
324 val actionBuilder = new ActionBuilder();
325 val it = new SetTpDstActionBuilder();
326 port = new PortNumber(sourceAction.port);
327 actionBuilder.action = new SetTpDstActionCaseBuilder().setSetTpDstAction(it.build()).build();
328 return actionBuilder.build();
331 public static dispatch def toAction(SetTpSrc sourceAction) {
332 val actionBuilder = new ActionBuilder();
333 val it = new SetTpSrcActionBuilder();
334 port = new PortNumber(sourceAction.port);
335 actionBuilder.action = new SetTpSrcActionCaseBuilder().setSetTpSrcAction(it.build()).build();
336 return actionBuilder.build();
339 public static dispatch def toAction(SetVlanCfi sourceAction) {
340 val actionBuilder = new ActionBuilder();
341 val it = new SetVlanCfiActionBuilder();
342 vlanCfi = new VlanCfi(sourceAction.cfi);
343 actionBuilder.action = new SetVlanCfiActionCaseBuilder().setSetVlanCfiAction(it.build()).build();
344 return actionBuilder.build();
347 public static dispatch def toAction(SetVlanId sourceAction) {
348 val actionBuilder = new ActionBuilder();
350 val it = new SetVlanIdActionBuilder();
351 vlanId = new VlanId(sourceAction.vlanId);
352 actionBuilder.action = new SetVlanIdActionCaseBuilder().setSetVlanIdAction(it.build()).build();
353 return actionBuilder.build();
356 public static dispatch def toAction(SetVlanPcp sourceAction) {
357 val actionBuilder = new ActionBuilder();
358 val it = new SetVlanPcpActionBuilder();
359 vlanPcp = new VlanPcp(sourceAction.pcp as short);
360 actionBuilder.action = new SetVlanPcpActionCaseBuilder().setSetVlanPcpAction(it.build).build;
361 return actionBuilder.build();
364 public static dispatch def toAction(SwPath sourceAction) {
365 val actionBuilder = new ActionBuilder();
366 actionBuilder.action = new SwPathActionCaseBuilder().setSwPathAction(new SwPathActionBuilder().build()).build();
367 return actionBuilder.build();
370 public static def dispatch Address toInetAddress(Inet4Address address) {
371 val it = new Ipv4Builder
372 ipv4Address = new Ipv4Prefix(InetAddresses.toAddrString(address))
376 public static def dispatch Address toInetAddress(Inet6Address address) {
377 val it = new Ipv6Builder
378 ipv6Address = new Ipv6Prefix(InetAddresses.toAddrString(address))
382 public static def Uri toUri(NodeConnector connector) {
383 return new NodeConnectorId(connector.ID as String);
386 public static def MacAddress toMacAddress(byte[] bytes) {
387 val sb = new StringBuilder(18);
388 for (byte b : bytes) {
391 sb.append(String.format("%02x", b));
393 return new MacAddress(sb.toString());
396 public static def toMDSalflow(Flow sourceFlow) {
397 if (sourceFlow == null)
398 throw new IllegalArgumentException();
399 val it = new FlowBuilder();
401 hardTimeout = sourceFlow.hardTimeout as int
402 idleTimeout = sourceFlow.idleTimeout as int
403 cookie = BigInteger.valueOf(sourceFlow.id)
404 priority = sourceFlow.priority as int
406 val sourceActions = sourceFlow.actions;
407 val targetActions = new ArrayList<Action>();
408 for (sourceAction : sourceActions) {
409 targetActions.add(sourceAction.toAction());
411 instructions = targetActions.toApplyInstruction();
412 match = sourceFlow.match.toMatch();