Updated Flow Capable Models & AD SAL Compatibility mapping
[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
79 public class MDFlowMapping {
80
81     private new() {
82         throw new UnsupportedOperationException()
83     }
84
85     public static def flowAdded(Flow sourceFlow) {
86         if (sourceFlow == null)
87             throw new IllegalArgumentException();
88         val it = new FlowAddedBuilder();
89
90         hardTimeout = sourceFlow.hardTimeout as int
91         idleTimeout = sourceFlow.idleTimeout as int
92         cookie = BigInteger.valueOf(sourceFlow.id)
93         priority = sourceFlow.priority as int
94
95         val sourceActions = sourceFlow.actions;
96         val targetActions = new ArrayList<Action>();
97         for (sourceAction : sourceActions) {
98             targetActions.add(sourceAction.toAction());
99         }
100         action = targetActions;
101         match = sourceFlow.match.toMatch();
102         return it.build();
103
104     }
105
106     public static def flowStatisticsInput(Node sourceNode, Flow sourceFlow) {
107         val it = new GetFlowStatisticsInputBuilder();
108         val source = flowAdded(sourceFlow);
109         cookie = (source.getCookie());
110         action = (source.getAction());
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         action = (source.getAction());
126         cookie = (source.getCookie());
127         hardTimeout = (source.getHardTimeout());
128         match = (source.getMatch());
129         priority = (source.getPriority());
130         node = sourceNode.toNodeRef();
131         return it.build();
132     }
133
134     public static def addFlowInput(Node sourceNode, Flow sourceFlow) {
135         val it = new AddFlowInputBuilder();
136         val source = flowAdded(sourceFlow);
137         action = (source.getAction());
138         cookie = (source.getCookie());
139         action = (source.getAction());
140         cookie = (source.getCookie());
141         hardTimeout = (source.getHardTimeout());
142         match = (source.getMatch());
143         priority = (source.getPriority());
144         node = sourceNode.toNodeRef()
145         return it.build();
146     }
147
148     public static def updateFlowInput(Node sourceNode, Flow oldFlow, Flow newFlow) {
149         val it = new UpdateFlowInputBuilder();
150         val source = flowAdded(newFlow);
151         action = (source.getAction());
152         cookie = (source.getCookie());
153         action = (source.getAction());
154         cookie = (source.getCookie());
155         hardTimeout = (source.getHardTimeout());
156         match = (source.getMatch());
157         priority = (source.getPriority());
158         node = sourceNode.toNodeRef()
159         return it.build();
160     }
161
162     public static dispatch def toAction(Controller sourceAction) {
163         val actionBuilder = new ActionBuilder();
164         actionBuilder.action = new ControllerActionBuilder().build();
165         return actionBuilder.build();
166     }
167
168     public static dispatch def toAction(Drop sourceAction) {
169         val actionBuilder = new ActionBuilder();
170         actionBuilder.action = new DropActionBuilder().build();
171         return actionBuilder.build();
172     }
173
174     public static dispatch def toAction(Flood sourceAction) {
175         val actionBuilder = new ActionBuilder();
176         actionBuilder.action = new FloodActionBuilder().build();
177         return actionBuilder.build();
178     }
179
180     public static dispatch def toAction(FloodAll sourceAction) {
181         val actionBuilder = new ActionBuilder();
182         actionBuilder.action = new FloodAllActionBuilder().build();
183         return actionBuilder.build();
184     }
185
186     public static dispatch def toAction(HwPath sourceAction) {
187         val actionBuilder = new ActionBuilder();
188         actionBuilder.action = new HwPathActionBuilder().build();
189         return actionBuilder.build();
190     }
191
192     public static dispatch def toAction(Loopback sourceAction) {
193         val actionBuilder = new ActionBuilder();
194         actionBuilder.action = new LoopbackActionBuilder().build();
195         return actionBuilder.build();
196     }
197
198     public static dispatch def toAction(Output sourceAction) {
199         val actionBuilder = new ActionBuilder();
200         val it = new OutputActionBuilder();
201         outputNodeConnector = sourceAction.port.toUriList;
202         actionBuilder.action = it.build();
203         return actionBuilder.build();
204
205     }
206     
207
208
209     public static dispatch def toAction(PopVlan sourceAction) {
210         val actionBuilder = new ActionBuilder();
211         actionBuilder.action = new PopVlanActionBuilder().build();
212         return actionBuilder.build();
213     }
214
215     public static dispatch def toAction(PushVlan sourceAction) {
216         val actionBuilder = new ActionBuilder();
217         val it = new PushVlanActionBuilder();
218         cfi = new VlanCfi(sourceAction.cfi);
219         vlanId = new VlanId(sourceAction.vlanId);
220         pcp = sourceAction.pcp;
221         tag = sourceAction.tag;
222         actionBuilder.action = it.build();
223         return actionBuilder.build();
224     }
225
226     public static dispatch def toAction(SetDlDst sourceAction) {
227         val actionBuilder = new ActionBuilder();
228         val it = new SetDlDstActionBuilder();
229         address = sourceAction.dlAddress.toMacAddress();
230         actionBuilder.action = it.build();
231         return actionBuilder.build();
232     }
233
234     public static dispatch def toAction(SetDlSrc sourceAction) {
235         val actionBuilder = new ActionBuilder();
236         val it = new SetDlSrcActionBuilder();
237         address = sourceAction.dlAddress.toMacAddress;
238         actionBuilder.action = it.build();
239         return actionBuilder.build();
240     }
241
242     public static dispatch def toAction(SetDlType sourceAction) {
243         val actionBuilder = new ActionBuilder();
244         val it = new SetDlTypeActionBuilder();
245         dlType = new EtherType(sourceAction.dlType as long);
246         actionBuilder.action = it.build();
247         return actionBuilder.build();
248     }
249
250     public static dispatch def toAction(SetNextHop sourceAction) {
251         val actionBuilder = new ActionBuilder();
252         val it = new SetNextHopActionBuilder();
253         val inetAddress = sourceAction.address;
254         address = inetAddress.toInetAddress;
255         actionBuilder.action = it.build();
256         return actionBuilder.build();
257     }
258
259     public static dispatch def toAction(SetNwDst sourceAction) {
260         val actionBuilder = new ActionBuilder();
261         val it = new SetNwDstActionBuilder();
262         val inetAddress = sourceAction.address;
263         address = inetAddress.toInetAddress;
264         actionBuilder.action = it.build();
265         return actionBuilder.build();
266     }
267
268     public static dispatch def toAction(SetNwSrc sourceAction) {
269         val actionBuilder = new ActionBuilder();
270         val it = new SetNwSrcActionBuilder();
271         val inetAddress = sourceAction.address;
272         address = inetAddress.toInetAddress;
273         actionBuilder.action = it.build();
274         return actionBuilder.build();
275     }
276
277     public static dispatch def toAction(SetNwTos sourceAction) {
278         val actionBuilder = new ActionBuilder();
279         val it = new SetNwTosActionBuilder();
280         tos = sourceAction.nwTos;
281         actionBuilder.action = it.build();
282         return actionBuilder.build();
283     }
284
285     public static dispatch def toAction(SetTpDst sourceAction) {
286         val actionBuilder = new ActionBuilder();
287         val it = new SetTpDstActionBuilder();
288         port = new PortNumber(sourceAction.port);
289         actionBuilder.action = it.build();
290         return actionBuilder.build();
291     }
292
293     public static dispatch def toAction(SetTpSrc sourceAction) {
294         val actionBuilder = new ActionBuilder();
295         val it = new SetTpSrcActionBuilder();
296         port = new PortNumber(sourceAction.port);
297         actionBuilder.action = it.build();
298         return actionBuilder.build();
299     }
300
301     public static dispatch def toAction(SetVlanCfi sourceAction) {
302         val actionBuilder = new ActionBuilder();
303         val it = new SetVlanCfiActionBuilder();
304         vlanCfi = new VlanCfi(sourceAction.cfi);
305         actionBuilder.action = it.build();
306         return actionBuilder.build();
307     }
308
309     public static dispatch def toAction(SetVlanId sourceAction) {
310         val actionBuilder = new ActionBuilder();
311
312         val it = new SetVlanIdActionBuilder();
313         vlanId = new VlanId(sourceAction.vlanId);
314         actionBuilder.action = it.build();
315         return actionBuilder.build();
316     }
317
318     public static dispatch def toAction(SetVlanPcp sourceAction) {
319         val actionBuilder = new ActionBuilder();
320         val it = new SetVlanPcpActionBuilder();
321         vlanPcp = new VlanPcp(sourceAction.pcp as short);
322         actionBuilder.action = it.build();
323         return actionBuilder.build();
324     }
325
326     public static dispatch def toAction(SwPath sourceAction) {
327         val actionBuilder = new ActionBuilder();
328         actionBuilder.action = new SwPathActionBuilder().build();
329         return actionBuilder.build();
330     }
331     
332     public static def dispatch Address toInetAddress(Inet4Address address) {
333         val it = new Ipv4Builder
334         ipv4Address = new Ipv4Prefix(InetAddresses.toAddrString(address))
335         return it.build()
336     }
337     
338     public static def dispatch Address toInetAddress(Inet6Address address) {
339         val it = new Ipv6Builder
340         ipv6Address = new Ipv6Prefix(InetAddresses.toAddrString(address))
341         return it.build()
342     }
343
344     public static def List<Uri> toUriList(NodeConnector connector) {
345         throw new UnsupportedOperationException("TODO: auto-generated method stub")
346     }
347     
348     public static def MacAddress toMacAddress(byte[] bytes) {
349         val sb = new StringBuilder(18);
350         for (byte b : bytes) {
351             if (sb.length() > 0)
352                 sb.append(':');
353             sb.append(String.format("%02x", b));
354         }
355         return new MacAddress(sb.toString());
356     }
357 }