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
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
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
111 public class MDFlowMapping {
114 throw new UnsupportedOperationException()
117 public static def flowAdded(Flow sourceFlow) {
118 if (sourceFlow == null)
119 throw new IllegalArgumentException();
120 val it = new FlowAddedBuilder();
122 hardTimeout = sourceFlow.hardTimeout as int
123 idleTimeout = sourceFlow.idleTimeout as int
124 cookie = BigInteger.valueOf(sourceFlow.id)
125 priority = sourceFlow.priority as int
127 val sourceActions = sourceFlow.actions;
128 val targetActions = new ArrayList<Action>();
129 for (sourceAction : sourceActions) {
130 targetActions.add(sourceAction.toAction());
132 instructions = targetActions.toApplyInstruction();
133 match = sourceFlow.match.toMatch();
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)
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();
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);
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);
165 public static def updateFlowInput(Node sourceNode, Flow oldFlow, Flow newFlow) {
166 val it = new UpdateFlowInputBuilder();
167 val sourceOld = flowAdded(newFlow);
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()
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();
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();
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();
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();
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();
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();
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();
223 public static dispatch def toAction(PopVlan sourceAction) {
224 val actionBuilder = new ActionBuilder();
225 actionBuilder.action = new PopVlanActionCaseBuilder().build();
226 return actionBuilder.build();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
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();
323 public static dispatch def toAction(SetVlanId sourceAction) {
324 val actionBuilder = new ActionBuilder();
326 val it = new SetVlanIdActionBuilder();
327 vlanId = new VlanId(sourceAction.vlanId);
328 actionBuilder.action = new SetVlanIdActionCaseBuilder().setSetVlanIdAction(it.build()).build();
329 return actionBuilder.build();
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();
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();
346 public static def dispatch Address toInetAddress(Inet4Address address) {
347 val it = new Ipv4Builder
348 ipv4Address = new Ipv4Prefix(InetAddresses.toAddrString(address))
352 public static def dispatch Address toInetAddress(Inet6Address address) {
353 val it = new Ipv6Builder
354 ipv6Address = new Ipv6Prefix(InetAddresses.toAddrString(address))
358 public static def Uri toUri(NodeConnector connector) {
359 return new NodeConnectorId(connector.ID as String);
362 public static def MacAddress toMacAddress(byte[] bytes) {
363 val sb = new StringBuilder(18);
364 for (byte b : bytes) {
367 sb.append(String.format("%02x", b));
369 return new MacAddress(sb.toString());