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();
132 tableId = new Integer(0).shortValue
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 applyActions.setOrder(new Integer(0))
142 instruction = Collections.<Instruction>singletonList(applyActions.build)
146 public static def removeFlowInput(Node sourceNode, Flow sourceFlow) {
147 val source = flowAdded(sourceFlow);
148 val it = new RemoveFlowInputBuilder(source as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
152 public static def addFlowInput(Node sourceNode, Flow sourceFlow) {
153 val source = flowAdded(sourceFlow);
154 val it = new AddFlowInputBuilder(source as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
155 it.setNode(sourceNode.toNodeRef)
159 public static def updateFlowInput(Node sourceNode, Flow oldFlow, Flow newFlow) {
160 val it = new UpdateFlowInputBuilder();
161 val sourceOld = flowAdded(newFlow);
163 val original = new OriginalFlowBuilder(sourceOld as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
164 val sourceNew = flowAdded(newFlow);
165 val updated = new UpdatedFlowBuilder(sourceNew as org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.Flow);
166 originalFlow = original.build()
167 updatedFlow = updated.build();
168 node = sourceNode.toNodeRef()
172 public static dispatch def toAction(Controller sourceAction) {
173 val actionBuilder = new ActionBuilder();
174 actionBuilder.action = new ControllerActionCaseBuilder().setControllerAction(new ControllerActionBuilder().build()).build();
175 return actionBuilder.build();
178 public static dispatch def toAction(Drop sourceAction) {
179 val actionBuilder = new ActionBuilder();
180 actionBuilder.action = new DropActionCaseBuilder().setDropAction(new DropActionBuilder().build()).build();
181 return actionBuilder.build();
184 public static dispatch def toAction(Flood sourceAction) {
185 val actionBuilder = new ActionBuilder();
186 actionBuilder.action = new FloodActionCaseBuilder().setFloodAction(new FloodActionBuilder().build).build();
187 return actionBuilder.build();
190 public static dispatch def toAction(FloodAll sourceAction) {
191 val actionBuilder = new ActionBuilder();
192 actionBuilder.action = new FloodAllActionCaseBuilder().setFloodAllAction(new FloodAllActionBuilder().build()).build();
193 return actionBuilder.build();
196 public static dispatch def toAction(HwPath sourceAction) {
197 val actionBuilder = new ActionBuilder();
198 actionBuilder.action = new HwPathActionCaseBuilder().setHwPathAction(new HwPathActionBuilder().build()).build();
199 return actionBuilder.build();
202 public static dispatch def toAction(Loopback sourceAction) {
203 val actionBuilder = new ActionBuilder();
204 actionBuilder.action = new LoopbackActionCaseBuilder().setLoopbackAction(new LoopbackActionBuilder().build()).build();
205 return actionBuilder.build();
208 public static dispatch def toAction(Output sourceAction) {
209 val actionBuilder = new ActionBuilder();
210 val it = new OutputActionBuilder();
211 outputNodeConnector = sourceAction.port.toUri;
212 actionBuilder.action = new OutputActionCaseBuilder().setOutputAction(it.build()).build();
213 return actionBuilder.build();
217 public static dispatch def toAction(PopVlan sourceAction) {
218 val actionBuilder = new ActionBuilder();
219 actionBuilder.action = new PopVlanActionCaseBuilder().build();
220 return actionBuilder.build();
223 public static dispatch def toAction(PushVlan sourceAction) {
224 val actionBuilder = new ActionBuilder();
225 val it = new PushVlanActionBuilder();
226 cfi = new VlanCfi(sourceAction.cfi);
227 vlanId = new VlanId(sourceAction.vlanId);
228 pcp = sourceAction.pcp;
229 tag = sourceAction.tag;
230 actionBuilder.action = new PushVlanActionCaseBuilder().setPushVlanAction(it.build()).build();
231 return actionBuilder.build();
234 public static dispatch def toAction(SetDlDst sourceAction) {
235 val actionBuilder = new ActionBuilder();
236 val it = new SetDlDstActionBuilder();
237 address = sourceAction.dlAddress.toMacAddress();
238 actionBuilder.action = new SetDlDstActionCaseBuilder().setSetDlDstAction(it.build()).build;
239 return actionBuilder.build();
242 public static dispatch def toAction(SetDlSrc sourceAction) {
243 val actionBuilder = new ActionBuilder();
244 val it = new SetDlSrcActionBuilder();
245 address = sourceAction.dlAddress.toMacAddress;
246 actionBuilder.action = new SetDlSrcActionCaseBuilder().setSetDlSrcAction(it.build()).build;
247 return actionBuilder.build();
250 public static dispatch def toAction(SetDlType sourceAction) {
251 val actionBuilder = new ActionBuilder();
252 val it = new SetDlTypeActionBuilder();
253 dlType = new EtherType(sourceAction.dlType as long);
254 actionBuilder.action = new SetDlTypeActionCaseBuilder().setSetDlTypeAction(it.build()).build();
255 return actionBuilder.build();
258 public static dispatch def toAction(SetNextHop sourceAction) {
259 val actionBuilder = new ActionBuilder();
260 val it = new SetNextHopActionBuilder();
261 val inetAddress = sourceAction.address;
262 address = inetAddress.toInetAddress;
263 actionBuilder.action = new SetNextHopActionCaseBuilder().setSetNextHopAction(it.build).build();
264 return actionBuilder.build();
267 public static dispatch def toAction(SetNwDst sourceAction) {
268 val actionBuilder = new ActionBuilder();
269 val it = new SetNwDstActionBuilder();
270 val inetAddress = sourceAction.address;
271 address = inetAddress.toInetAddress;
272 actionBuilder.action = new SetNwDstActionCaseBuilder().setSetNwDstAction(it.build()).build();
273 return actionBuilder.build();
276 public static dispatch def toAction(SetNwSrc sourceAction) {
277 val actionBuilder = new ActionBuilder();
278 val it = new SetNwSrcActionBuilder();
279 val inetAddress = sourceAction.address;
280 address = inetAddress.toInetAddress;
281 actionBuilder.action = new SetNwSrcActionCaseBuilder().setSetNwSrcAction(it.build()).build();
282 return actionBuilder.build();
285 public static dispatch def toAction(SetNwTos sourceAction) {
286 val actionBuilder = new ActionBuilder();
287 val it = new SetNwTosActionBuilder();
288 tos = sourceAction.nwTos;
289 actionBuilder.action = new SetNwTosActionCaseBuilder().setSetNwTosAction(it.build).build;
290 return actionBuilder.build();
293 public static dispatch def toAction(SetTpDst sourceAction) {
294 val actionBuilder = new ActionBuilder();
295 val it = new SetTpDstActionBuilder();
296 port = new PortNumber(sourceAction.port);
297 actionBuilder.action = new SetTpDstActionCaseBuilder().setSetTpDstAction(it.build()).build();
298 return actionBuilder.build();
301 public static dispatch def toAction(SetTpSrc sourceAction) {
302 val actionBuilder = new ActionBuilder();
303 val it = new SetTpSrcActionBuilder();
304 port = new PortNumber(sourceAction.port);
305 actionBuilder.action = new SetTpSrcActionCaseBuilder().setSetTpSrcAction(it.build()).build();
306 return actionBuilder.build();
309 public static dispatch def toAction(SetVlanCfi sourceAction) {
310 val actionBuilder = new ActionBuilder();
311 val it = new SetVlanCfiActionBuilder();
312 vlanCfi = new VlanCfi(sourceAction.cfi);
313 actionBuilder.action = new SetVlanCfiActionCaseBuilder().setSetVlanCfiAction(it.build()).build();
314 return actionBuilder.build();
317 public static dispatch def toAction(SetVlanId sourceAction) {
318 val actionBuilder = new ActionBuilder();
320 val it = new SetVlanIdActionBuilder();
321 vlanId = new VlanId(sourceAction.vlanId);
322 actionBuilder.action = new SetVlanIdActionCaseBuilder().setSetVlanIdAction(it.build()).build();
323 return actionBuilder.build();
326 public static dispatch def toAction(SetVlanPcp sourceAction) {
327 val actionBuilder = new ActionBuilder();
328 val it = new SetVlanPcpActionBuilder();
329 vlanPcp = new VlanPcp(sourceAction.pcp as short);
330 actionBuilder.action = new SetVlanPcpActionCaseBuilder().setSetVlanPcpAction(it.build).build;
331 return actionBuilder.build();
334 public static dispatch def toAction(SwPath sourceAction) {
335 val actionBuilder = new ActionBuilder();
336 actionBuilder.action = new SwPathActionCaseBuilder().setSwPathAction(new SwPathActionBuilder().build()).build();
337 return actionBuilder.build();
340 public static def dispatch Address toInetAddress(Inet4Address address) {
341 val it = new Ipv4Builder
342 ipv4Address = new Ipv4Prefix(InetAddresses.toAddrString(address))
346 public static def dispatch Address toInetAddress(Inet6Address address) {
347 val it = new Ipv6Builder
348 ipv6Address = new Ipv6Prefix(InetAddresses.toAddrString(address))
352 public static def Uri toUri(NodeConnector connector) {
353 return new NodeConnectorId(connector.ID as String);
356 public static def MacAddress toMacAddress(byte[] bytes) {
357 val sb = new StringBuilder(18);
358 for (byte b : bytes) {
361 sb.append(String.format("%02x", b));
363 return new MacAddress(sb.toString());
366 public static def toMDSalflow(Flow sourceFlow) {
367 if (sourceFlow == null)
368 throw new IllegalArgumentException();
369 val it = new FlowBuilder();
371 hardTimeout = sourceFlow.hardTimeout as int
372 idleTimeout = sourceFlow.idleTimeout as int
373 cookie = BigInteger.valueOf(sourceFlow.id)
374 priority = sourceFlow.priority as int
376 val sourceActions = sourceFlow.actions;
377 val targetActions = new ArrayList<Action>();
378 for (sourceAction : sourceActions) {
379 targetActions.add(sourceAction.toAction());
381 instructions = targetActions.toApplyInstruction();
382 match = sourceFlow.match.toMatch();