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
110 public class MDFlowMapping {
113 throw new UnsupportedOperationException()
116 public static def flowAdded(Flow sourceFlow) {
117 if (sourceFlow == null)
118 throw new IllegalArgumentException();
119 val it = new FlowAddedBuilder();
121 hardTimeout = sourceFlow.hardTimeout as int
122 idleTimeout = sourceFlow.idleTimeout as int
123 cookie = BigInteger.valueOf(sourceFlow.id)
124 priority = sourceFlow.priority as int
126 val sourceActions = sourceFlow.actions;
127 val targetActions = new ArrayList<Action>();
128 for (sourceAction : sourceActions) {
129 targetActions.add(sourceAction.toAction());
131 instructions = targetActions.toApplyInstruction();
132 match = sourceFlow.match.toMatch();
137 public static def Instructions toApplyInstruction(ArrayList<Action> actions) {
138 val it = new InstructionsBuilder;
139 val applyActions = new InstructionBuilder;
140 applyActions.instruction = new ApplyActionsCaseBuilder().setApplyActions(new ApplyActionsBuilder().setAction(actions).build()).build()
141 instruction = Collections.<Instruction>singletonList(applyActions.build)
145 public static def flowStatisticsInput(Node sourceNode, Flow sourceFlow) {
146 val source = flowAdded(sourceFlow);
147 val it = new GetFlowStatisticsInputBuilder(source as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
148 node = sourceNode.toNodeRef();
152 public static def removeFlowInput(Node sourceNode, Flow sourceFlow) {
153 val source = flowAdded(sourceFlow);
154 val it = new RemoveFlowInputBuilder(source as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
158 public static def addFlowInput(Node sourceNode, Flow sourceFlow) {
159 val source = flowAdded(sourceFlow);
160 val it = new AddFlowInputBuilder(source as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
164 public static def updateFlowInput(Node sourceNode, Flow oldFlow, Flow newFlow) {
165 val it = new UpdateFlowInputBuilder();
166 val sourceOld = flowAdded(newFlow);
168 val original = new OriginalFlowBuilder(sourceOld as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
169 val sourceNew = flowAdded(newFlow);
170 val updated = new UpdatedFlowBuilder(sourceNew as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
171 originalFlow = original.build()
172 updatedFlow = updated.build();
173 node = sourceNode.toNodeRef()
177 public static dispatch def toAction(Controller sourceAction) {
178 val actionBuilder = new ActionBuilder();
179 actionBuilder.action = new ControllerActionCaseBuilder().setControllerAction(new ControllerActionBuilder().build()).build();
180 return actionBuilder.build();
183 public static dispatch def toAction(Drop sourceAction) {
184 val actionBuilder = new ActionBuilder();
185 actionBuilder.action = new DropActionCaseBuilder().setDropAction(new DropActionBuilder().build()).build();
186 return actionBuilder.build();
189 public static dispatch def toAction(Flood sourceAction) {
190 val actionBuilder = new ActionBuilder();
191 actionBuilder.action = new FloodActionCaseBuilder().setFloodAction(new FloodActionBuilder().build).build();
192 return actionBuilder.build();
195 public static dispatch def toAction(FloodAll sourceAction) {
196 val actionBuilder = new ActionBuilder();
197 actionBuilder.action = new FloodAllActionCaseBuilder().setFloodAllAction(new FloodAllActionBuilder().build()).build();
198 return actionBuilder.build();
201 public static dispatch def toAction(HwPath sourceAction) {
202 val actionBuilder = new ActionBuilder();
203 actionBuilder.action = new HwPathActionCaseBuilder().setHwPathAction(new HwPathActionBuilder().build()).build();
204 return actionBuilder.build();
207 public static dispatch def toAction(Loopback sourceAction) {
208 val actionBuilder = new ActionBuilder();
209 actionBuilder.action = new LoopbackActionCaseBuilder().setLoopbackAction(new LoopbackActionBuilder().build()).build();
210 return actionBuilder.build();
213 public static dispatch def toAction(Output sourceAction) {
214 val actionBuilder = new ActionBuilder();
215 val it = new OutputActionBuilder();
216 outputNodeConnector = sourceAction.port.toUri;
217 actionBuilder.action = new OutputActionCaseBuilder().setOutputAction(it.build()).build();
218 return actionBuilder.build();
222 public static dispatch def toAction(PopVlan sourceAction) {
223 val actionBuilder = new ActionBuilder();
224 actionBuilder.action = new PopVlanActionCaseBuilder().build();
225 return actionBuilder.build();
228 public static dispatch def toAction(PushVlan sourceAction) {
229 val actionBuilder = new ActionBuilder();
230 val it = new PushVlanActionBuilder();
231 cfi = new VlanCfi(sourceAction.cfi);
232 vlanId = new VlanId(sourceAction.vlanId);
233 pcp = sourceAction.pcp;
234 tag = sourceAction.tag;
235 actionBuilder.action = new PushVlanActionCaseBuilder().setPushVlanAction(it.build()).build();
236 return actionBuilder.build();
239 public static dispatch def toAction(SetDlDst sourceAction) {
240 val actionBuilder = new ActionBuilder();
241 val it = new SetDlDstActionBuilder();
242 address = sourceAction.dlAddress.toMacAddress();
243 actionBuilder.action = new SetDlDstActionCaseBuilder().setSetDlDstAction(it.build()).build;
244 return actionBuilder.build();
247 public static dispatch def toAction(SetDlSrc sourceAction) {
248 val actionBuilder = new ActionBuilder();
249 val it = new SetDlSrcActionBuilder();
250 address = sourceAction.dlAddress.toMacAddress;
251 actionBuilder.action = new SetDlSrcActionCaseBuilder().setSetDlSrcAction(it.build()).build;
252 return actionBuilder.build();
255 public static dispatch def toAction(SetDlType sourceAction) {
256 val actionBuilder = new ActionBuilder();
257 val it = new SetDlTypeActionBuilder();
258 dlType = new EtherType(sourceAction.dlType as long);
259 actionBuilder.action = new SetDlTypeActionCaseBuilder().setSetDlTypeAction(it.build()).build();
260 return actionBuilder.build();
263 public static dispatch def toAction(SetNextHop sourceAction) {
264 val actionBuilder = new ActionBuilder();
265 val it = new SetNextHopActionBuilder();
266 val inetAddress = sourceAction.address;
267 address = inetAddress.toInetAddress;
268 actionBuilder.action = new SetNextHopActionCaseBuilder().setSetNextHopAction(it.build).build();
269 return actionBuilder.build();
272 public static dispatch def toAction(SetNwDst sourceAction) {
273 val actionBuilder = new ActionBuilder();
274 val it = new SetNwDstActionBuilder();
275 val inetAddress = sourceAction.address;
276 address = inetAddress.toInetAddress;
277 actionBuilder.action = new SetNwDstActionCaseBuilder().setSetNwDstAction(it.build()).build();
278 return actionBuilder.build();
281 public static dispatch def toAction(SetNwSrc sourceAction) {
282 val actionBuilder = new ActionBuilder();
283 val it = new SetNwSrcActionBuilder();
284 val inetAddress = sourceAction.address;
285 address = inetAddress.toInetAddress;
286 actionBuilder.action = new SetNwSrcActionCaseBuilder().setSetNwSrcAction(it.build()).build();
287 return actionBuilder.build();
290 public static dispatch def toAction(SetNwTos sourceAction) {
291 val actionBuilder = new ActionBuilder();
292 val it = new SetNwTosActionBuilder();
293 tos = sourceAction.nwTos;
294 actionBuilder.action = new SetNwTosActionCaseBuilder().setSetNwTosAction(it.build).build;
295 return actionBuilder.build();
298 public static dispatch def toAction(SetTpDst sourceAction) {
299 val actionBuilder = new ActionBuilder();
300 val it = new SetTpDstActionBuilder();
301 port = new PortNumber(sourceAction.port);
302 actionBuilder.action = new SetTpDstActionCaseBuilder().setSetTpDstAction(it.build()).build();
303 return actionBuilder.build();
306 public static dispatch def toAction(SetTpSrc sourceAction) {
307 val actionBuilder = new ActionBuilder();
308 val it = new SetTpSrcActionBuilder();
309 port = new PortNumber(sourceAction.port);
310 actionBuilder.action = new SetTpSrcActionCaseBuilder().setSetTpSrcAction(it.build()).build();
311 return actionBuilder.build();
314 public static dispatch def toAction(SetVlanCfi sourceAction) {
315 val actionBuilder = new ActionBuilder();
316 val it = new SetVlanCfiActionBuilder();
317 vlanCfi = new VlanCfi(sourceAction.cfi);
318 actionBuilder.action = new SetVlanCfiActionCaseBuilder().setSetVlanCfiAction(it.build()).build();
319 return actionBuilder.build();
322 public static dispatch def toAction(SetVlanId sourceAction) {
323 val actionBuilder = new ActionBuilder();
325 val it = new SetVlanIdActionBuilder();
326 vlanId = new VlanId(sourceAction.vlanId);
327 actionBuilder.action = new SetVlanIdActionCaseBuilder().setSetVlanIdAction(it.build()).build();
328 return actionBuilder.build();
331 public static dispatch def toAction(SetVlanPcp sourceAction) {
332 val actionBuilder = new ActionBuilder();
333 val it = new SetVlanPcpActionBuilder();
334 vlanPcp = new VlanPcp(sourceAction.pcp as short);
335 actionBuilder.action = new SetVlanPcpActionCaseBuilder().setSetVlanPcpAction(it.build).build;
336 return actionBuilder.build();
339 public static dispatch def toAction(SwPath sourceAction) {
340 val actionBuilder = new ActionBuilder();
341 actionBuilder.action = new SwPathActionCaseBuilder().setSwPathAction(new SwPathActionBuilder().build()).build();
342 return actionBuilder.build();
345 public static def dispatch Address toInetAddress(Inet4Address address) {
346 val it = new Ipv4Builder
347 ipv4Address = new Ipv4Prefix(InetAddresses.toAddrString(address))
351 public static def dispatch Address toInetAddress(Inet6Address address) {
352 val it = new Ipv6Builder
353 ipv6Address = new Ipv6Prefix(InetAddresses.toAddrString(address))
357 public static def Uri toUri(NodeConnector connector) {
358 throw new UnsupportedOperationException("TODO: auto-generated method stub")
361 public static def MacAddress toMacAddress(byte[] bytes) {
362 val sb = new StringBuilder(18);
363 for (byte b : bytes) {
366 sb.append(String.format("%02x", b));
368 return new MacAddress(sb.toString());