ac4d99f10fcd9f3d34e4a1caabdcfca202b0c5ef
[controller.git] / opendaylight / md-sal / sal-compability / src / main / java / org / opendaylight / controller / sal / compability / MDFlowMapping.xtend
1 package org.opendaylight.controller.sal.compability;
2
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 java.util.List
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.flow.types.rev130819.VlanCfi
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.ControllerActionBuilder
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.DropActionBuilder
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.FloodActionBuilder
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.FloodAllActionBuilder
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.HwPathActionBuilder
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.LoopbackActionBuilder
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.OutputActionBuilder
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.PopVlanActionBuilder
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.PushVlanActionBuilder
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetDlDstActionBuilder
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetDlSrcActionBuilder
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetDlTypeActionBuilder
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNextHopActionBuilder
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNwDstActionBuilder
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNwSrcActionBuilder
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetNwTosActionBuilder
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetTpDstActionBuilder
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetTpSrcActionBuilder
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetVlanCfiActionBuilder
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetVlanIdActionBuilder
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SetVlanPcpActionBuilder
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.action.action.SwPathActionBuilder
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.Address
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv4Builder
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.address.address.Ipv6Builder
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.Action
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev130819.flow.ActionBuilder
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp
75
76 import static extension org.opendaylight.controller.sal.compability.FromSalConversionsUtils.*
77 import static extension org.opendaylight.controller.sal.compability.NodeMapping.*
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder
80
81 public class MDFlowMapping {
82
83     private new() {
84         throw new UnsupportedOperationException()
85     }
86
87     public static def flowAdded(Flow sourceFlow) {
88         if (sourceFlow == null)
89             throw new IllegalArgumentException();
90         val it = new FlowAddedBuilder();
91
92         hardTimeout = sourceFlow.hardTimeout as int
93         idleTimeout = sourceFlow.idleTimeout as int
94         cookie = BigInteger.valueOf(sourceFlow.id)
95         priority = sourceFlow.priority as int
96
97         val sourceActions = sourceFlow.actions;
98         val targetActions = new ArrayList<Action>();
99         for (sourceAction : sourceActions) {
100             targetActions.add(sourceAction.toAction());
101         }
102         action = targetActions;
103         match = sourceFlow.match.toMatch();
104         return it.build();
105
106     }
107
108     public static def flowStatisticsInput(Node sourceNode, Flow sourceFlow) {
109         val it = new GetFlowStatisticsInputBuilder();
110         val source = flowAdded(sourceFlow);
111         action = (source.getAction());
112         cookie = (source.getCookie());
113         hardTimeout = (source.getHardTimeout());
114         match = (source.getMatch());
115         priority = (source.getPriority());
116         node = sourceNode.toNodeRef();
117         return it.build();
118     }
119
120     public static def removeFlowInput(Node sourceNode, Flow sourceFlow) {
121         val it = new RemoveFlowInputBuilder();
122         val source = flowAdded(sourceFlow);
123         action = (source.getAction());
124         cookie = (source.getCookie());
125         hardTimeout = (source.getHardTimeout());
126         match = (source.getMatch());
127         priority = (source.getPriority());
128         node = sourceNode.toNodeRef();
129         return it.build();
130     }
131
132     public static def addFlowInput(Node sourceNode, Flow sourceFlow) {
133         val it = new AddFlowInputBuilder();
134         val source = flowAdded(sourceFlow);
135         action = (source.getAction());
136         cookie = (source.getCookie());
137         hardTimeout = (source.getHardTimeout());
138         match = (source.getMatch());
139         priority = (source.getPriority());
140         node = sourceNode.toNodeRef()
141         return it.build();
142     }
143
144     public static def updateFlowInput(Node sourceNode, Flow oldFlow, Flow newFlow) {
145         val it = new UpdateFlowInputBuilder();
146
147         val original = new OriginalFlowBuilder();
148
149         val sourceOld = flowAdded(newFlow);
150
151         original.action = (sourceOld.getAction());
152         original.cookie = (sourceOld.getCookie());
153         original.hardTimeout = (sourceOld.getHardTimeout());
154         original.match = (sourceOld.getMatch());
155         original.priority = (sourceOld.getPriority());
156
157         val updated = new UpdatedFlowBuilder();
158         val sourceNew = flowAdded(newFlow);
159
160         updated.action = (sourceNew.getAction());
161         updated.cookie = (sourceNew.getCookie());
162         updated.hardTimeout = (sourceNew.getHardTimeout());
163         updated.match = (sourceNew.getMatch());
164         updated.priority = (sourceNew.getPriority());
165
166         originalFlow = original.build()
167         updatedFlow = updated.build();
168         node = sourceNode.toNodeRef()
169         return it.build();
170     }
171
172     public static dispatch def toAction(Controller sourceAction) {
173         val actionBuilder = new ActionBuilder();
174         actionBuilder.action = new ControllerActionBuilder().build();
175         return actionBuilder.build();
176     }
177
178     public static dispatch def toAction(Drop sourceAction) {
179         val actionBuilder = new ActionBuilder();
180         actionBuilder.action = new DropActionBuilder().build();
181         return actionBuilder.build();
182     }
183
184     public static dispatch def toAction(Flood sourceAction) {
185         val actionBuilder = new ActionBuilder();
186         actionBuilder.action = new FloodActionBuilder().build();
187         return actionBuilder.build();
188     }
189
190     public static dispatch def toAction(FloodAll sourceAction) {
191         val actionBuilder = new ActionBuilder();
192         actionBuilder.action = new FloodAllActionBuilder().build();
193         return actionBuilder.build();
194     }
195
196     public static dispatch def toAction(HwPath sourceAction) {
197         val actionBuilder = new ActionBuilder();
198         actionBuilder.action = new HwPathActionBuilder().build();
199         return actionBuilder.build();
200     }
201
202     public static dispatch def toAction(Loopback sourceAction) {
203         val actionBuilder = new ActionBuilder();
204         actionBuilder.action = new LoopbackActionBuilder().build();
205         return actionBuilder.build();
206     }
207
208     public static dispatch def toAction(Output sourceAction) {
209         val actionBuilder = new ActionBuilder();
210         val it = new OutputActionBuilder();
211         outputNodeConnector = sourceAction.port.toUriList;
212         actionBuilder.action = it.build();
213         return actionBuilder.build();
214
215     }
216
217     public static dispatch def toAction(PopVlan sourceAction) {
218         val actionBuilder = new ActionBuilder();
219         actionBuilder.action = new PopVlanActionBuilder().build();
220         return actionBuilder.build();
221     }
222
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 = it.build();
231         return actionBuilder.build();
232     }
233
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 = it.build();
239         return actionBuilder.build();
240     }
241
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 = it.build();
247         return actionBuilder.build();
248     }
249
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 = it.build();
255         return actionBuilder.build();
256     }
257
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 = it.build();
264         return actionBuilder.build();
265     }
266
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 = it.build();
273         return actionBuilder.build();
274     }
275
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 = it.build();
282         return actionBuilder.build();
283     }
284
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 = it.build();
290         return actionBuilder.build();
291     }
292
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 = it.build();
298         return actionBuilder.build();
299     }
300
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 = it.build();
306         return actionBuilder.build();
307     }
308
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 = it.build();
314         return actionBuilder.build();
315     }
316
317     public static dispatch def toAction(SetVlanId sourceAction) {
318         val actionBuilder = new ActionBuilder();
319
320         val it = new SetVlanIdActionBuilder();
321         vlanId = new VlanId(sourceAction.vlanId);
322         actionBuilder.action = it.build();
323         return actionBuilder.build();
324     }
325
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 = it.build();
331         return actionBuilder.build();
332     }
333
334     public static dispatch def toAction(SwPath sourceAction) {
335         val actionBuilder = new ActionBuilder();
336         actionBuilder.action = new SwPathActionBuilder().build();
337         return actionBuilder.build();
338     }
339
340     public static def dispatch Address toInetAddress(Inet4Address address) {
341         val it = new Ipv4Builder
342         ipv4Address = new Ipv4Prefix(InetAddresses.toAddrString(address))
343         return it.build()
344     }
345
346     public static def dispatch Address toInetAddress(Inet6Address address) {
347         val it = new Ipv6Builder
348         ipv6Address = new Ipv6Prefix(InetAddresses.toAddrString(address))
349         return it.build()
350     }
351
352     public static def List<Uri> toUriList(NodeConnector connector) {
353         throw new UnsupportedOperationException("TODO: auto-generated method stub")
354     }
355
356     public static def MacAddress toMacAddress(byte[] bytes) {
357         val sb = new StringBuilder(18);
358         for (byte b : bytes) {
359             if (sb.length() > 0)
360                 sb.append(':');
361             sb.append(String.format("%02x", b));
362         }
363         return new MacAddress(sb.toString());
364     }
365 }