For OutputAction:PortNumber size is different for OF versions.
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / ActionConvertor.java
1 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType;
7 import org.opendaylight.openflowjava.protocol.api.util.BinContent;
8 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlIn;
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInBuilder;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOut;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutBuilder;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtl;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlBuilder;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupAction;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputAction;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsAction;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbAction;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanAction;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsAction;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbAction;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanAction;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlAction;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlAction;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueAction;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdActionBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlAction;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsActionBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValues;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValuesV10;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.MatchEntries;
77 import org.opendaylight.yangtools.yang.binding.Augmentation;
78 import org.slf4j.Logger;
79 import org.slf4j.LoggerFactory;
80
81 /**
82  * @author usha@ericsson Action List:This class takes data from SAL layer and
83  *         converts into OF Data
84  * @author avishnoi@in.ibm.com Added convertor for OF bucket actions to SAL
85  *         actions
86  *
87  */
88 public final class ActionConvertor {
89     private static final Logger logger = LoggerFactory.getLogger(ActionConvertor.class);
90     private static final String PREFIX_SEPARATOR = "/";
91     final private static short OF10 = 1;
92     final private static short OF13 = 4;
93
94     private ActionConvertor() {
95         // NOOP
96     }
97
98     public static List<ActionsList> getActionList(
99             List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions,
100             short version)
101
102     {
103         ActionBuilder actionBuilder = new ActionBuilder();
104         ActionsListBuilder actionsListBuilder = new ActionsListBuilder();
105         List<ActionsList> actionsList = new ArrayList<ActionsList>();
106
107         for (int actionItem = 0; actionItem < actions.size(); actionItem++) {
108
109             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = actions.get(
110                     actionItem).getAction();
111
112             if (action instanceof OutputAction)
113                 actionsList.add(salToOFOutputAction(action, actionBuilder, actionsListBuilder, version));
114             else if (action instanceof GroupAction)
115                 actionsList.add(SalToOFGroupAction(action, actionBuilder, actionsListBuilder));
116             else if (action instanceof CopyTtlOut)
117                 actionsList.add(SalToOFCopyTTLIOut(actionBuilder, actionsListBuilder));
118             else if (action instanceof CopyTtlIn)
119                 actionsList.add(SalToOFCopyTTLIIn(actionBuilder, actionsListBuilder));
120             else if (action instanceof SetMplsTtlAction)
121                 actionsList.add(SalToOFSetMplsTtl(action, actionBuilder, actionsListBuilder));
122             else if (action instanceof DecMplsTtl)
123                 actionsList.add(SalToOFDecMplsTtl(actionBuilder, actionsListBuilder));
124             else if (action instanceof PushVlanAction)
125                 actionsList.add(SalToOFPushVlanAction(action, actionBuilder, actionsListBuilder));
126             else if (action instanceof PopVlanAction)
127                 actionsList.add(SalToOFPopVlan(action, actionBuilder, actionsListBuilder));
128             else if (action instanceof PushMplsAction)
129                 actionsList.add(SalToOFPushMplsAction(action, actionBuilder, actionsListBuilder));
130             else if (action instanceof PopMplsAction)
131                 actionsList.add(SalToOFPopMpls(action, actionBuilder, actionsListBuilder));
132             else if (action instanceof SetQueueAction)
133                 actionsList.add(SalToOFSetQueue(action, actionBuilder, actionsListBuilder));
134
135             else if (action instanceof SetNwTtlAction)
136                 actionsList.add(SalToOFSetNwTtl(action, actionBuilder, actionsListBuilder));
137             else if (action instanceof DecNwTtl)
138                 actionsList.add(SalToOFDecNwTtl(action, actionBuilder, actionsListBuilder));
139             else if (action instanceof SetField)
140                 actionsList.add(SalToOFSetField(action, actionBuilder, actionsListBuilder));
141
142             else if (action instanceof PushPbbAction)
143                 actionsList.add(SalToOFPushPbbAction(action, actionBuilder, actionsListBuilder));
144             else if (action instanceof PopPbbAction)
145                 actionsList.add(SalToOFPopPBB(action, actionBuilder, actionsListBuilder));
146             else if (action instanceof ExperimenterAction)
147                 actionsList.add(SalToOFExperimenter(action, actionBuilder, actionsListBuilder));
148
149         }
150         return actionsList;
151
152     }
153
154     private static ActionsList SalToOFSetField(
155             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
156             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
157
158         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField setField = (org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetField) action;
159         org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match = setField.getMatch();
160
161         List<MatchEntries> matchEntries = FlowConvertor.toMatch(match);
162
163         OxmFieldsActionBuilder oxmFieldsActionBuilder = new OxmFieldsActionBuilder();
164
165         oxmFieldsActionBuilder.setMatchEntries(matchEntries);
166
167         actionBuilder
168                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class);
169
170         actionBuilder.addAugmentation(OxmFieldsAction.class, oxmFieldsActionBuilder.build());
171         actionsListBuilder.setAction(actionBuilder.build());
172         return actionsListBuilder.build();
173
174     }
175
176     private static ActionsList SalToOFDecNwTtl(
177             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
178             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
179         actionBuilder.setType(DecNwTtl.class);
180
181         return emtpyAction(actionBuilder, actionsListBuilder);
182     }
183
184     private static ActionsList SalToOFPushMplsAction(
185             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
186             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
187
188         actionBuilder.setType(PushMpls.class);
189
190         return SalToOFPushAction(((PushMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
191
192     }
193
194     private static ActionsList SalToOFPushPbbAction(
195             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
196             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
197         actionBuilder.setType(PushPbb.class);
198
199         return SalToOFPushAction(((PushPbbAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
200     }
201
202     private static ActionsList SalToOFPushVlanAction(
203             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
204             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
205
206         PushVlanAction pushVlanAction = (PushVlanAction) action;
207         VlanId vlanId = new VlanId(pushVlanAction.getVlanId());
208         Integer etherType = vlanId.getValue();
209         actionBuilder.setType(PushVlan.class);
210
211         return SalToOFPushAction(etherType, actionBuilder, actionsListBuilder);
212
213     }
214
215     private static ActionsList SalToOFSetNwTtl(
216             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
217             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
218
219         NwTtlActionBuilder nwTtlActionBuilder = new NwTtlActionBuilder();
220         nwTtlActionBuilder.setNwTtl(((SetNwTtlAction) action).getNwTtl());
221
222         actionBuilder.setType(SetNwTtl.class);
223         actionBuilder.addAugmentation(NwTtlAction.class, nwTtlActionBuilder.build());
224         actionsListBuilder.setAction(actionBuilder.build());
225         return actionsListBuilder.build();
226
227     }
228
229     private static ActionsList SalToOFSetQueue(
230             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
231             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
232
233         SetQueueAction setQueueAction = (SetQueueAction) action;
234
235         QueueIdActionBuilder queueIdActionBuilder = new QueueIdActionBuilder();
236         queueIdActionBuilder.setQueueId(Long.getLong(setQueueAction.getQueue()));
237         actionBuilder.setType(SetQueue.class);
238         actionBuilder.addAugmentation(QueueIdAction.class, queueIdActionBuilder.build());
239
240         actionsListBuilder.setAction(actionBuilder.build());
241         return actionsListBuilder.build();
242     }
243
244     private static ActionsList SalToOFPopMpls(
245             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
246             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
247
248         actionBuilder.setType(PopMpls.class);
249
250         return SalToOFPushAction(((PopMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
251     }
252
253     private static ActionsList SalToOFPopVlan(
254             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
255             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
256
257         actionBuilder.setType(PushMpls.class);
258
259         return emtpyAction(actionBuilder, actionsListBuilder);
260     }
261
262     private static ActionsList SalToOFPopPBB(
263             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
264             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
265         actionBuilder.setType(PopPbb.class);
266         return emtpyAction(actionBuilder, actionsListBuilder);
267     }
268
269     private static ActionsList SalToOFExperimenter(
270             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
271             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
272
273         ExperimenterActionBuilder experimenterActionBuilder = new ExperimenterActionBuilder();
274         experimenterActionBuilder.setExperimenter(((ExperimenterAction) action).getExperimenter());
275         actionBuilder.setType(Experimenter.class);
276         actionBuilder
277                 .addAugmentation(
278                         ExperimenterAction.class,
279                         (Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action>) experimenterActionBuilder);
280         actionsListBuilder.setAction(actionBuilder.build());
281         return actionsListBuilder.build();
282
283     }
284
285     private static ActionsList SalToOFGroupAction(
286             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
287             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
288
289         GroupAction groupAction = (GroupAction) action;
290
291         GroupIdActionBuilder groupIdBuilder = new GroupIdActionBuilder();
292         groupIdBuilder.setGroupId(Long.getLong(groupAction.getGroup()));
293         actionBuilder.setType(Group.class);
294         actionBuilder.addAugmentation(GroupIdAction.class, groupIdBuilder.build());
295         actionsListBuilder.setAction(actionBuilder.build());
296         return actionsListBuilder.build();
297     }
298
299     private static ActionsList SalToOFPushAction(Integer ethernetType, ActionBuilder actionBuilder,
300             ActionsListBuilder actionsListBuilder) {
301
302         EthertypeActionBuilder ethertypeActionBuilder = new EthertypeActionBuilder();
303         ethertypeActionBuilder.setEthertype(new EtherType(ethernetType));
304
305         /* OF */
306         actionBuilder.addAugmentation(EthertypeAction.class, ethertypeActionBuilder.build());
307         actionsListBuilder.setAction(actionBuilder.build());
308         return actionsListBuilder.build();
309     }
310
311     private static ActionsList SalToOFDecMplsTtl(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
312         actionBuilder
313                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class);
314         return emtpyAction(actionBuilder, actionsListBuilder);
315     }
316
317     private static ActionsList SalToOFSetMplsTtl(
318             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
319             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
320
321         SetMplsTtlAction mplsTtlAction = (SetMplsTtlAction) action;
322
323         MplsTtlActionBuilder mplsTtlActionBuilder = new MplsTtlActionBuilder();
324         mplsTtlActionBuilder.setMplsTtl(mplsTtlAction.getMplsTtl()/* SAL */);
325         /* OF */
326         actionBuilder.setType(SetMplsTtl.class);
327         actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtlActionBuilder.build());
328         actionsListBuilder.setAction(actionBuilder.build());
329         return actionsListBuilder.build();
330     }
331
332     private static ActionsList SalToOFCopyTTLIIn(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
333         actionBuilder
334                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class);
335         return emtpyAction(actionBuilder, actionsListBuilder);
336     }
337
338     private static ActionsList SalToOFCopyTTLIOut(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
339         actionBuilder
340                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class);
341         return emtpyAction(actionBuilder, actionsListBuilder);
342
343     }
344
345     private static ActionsList emtpyAction(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
346
347         actionsListBuilder.setAction(actionBuilder.build());
348         return actionsListBuilder.build();
349     }
350
351     private static ActionsList salToOFOutputAction(
352             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
353             ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder, short version) {
354
355         OutputAction outputAction = ((OutputAction) action);
356         PortActionBuilder portAction = new PortActionBuilder();
357         MaxLengthActionBuilder maxLenActionBuilder = new MaxLengthActionBuilder();
358         maxLenActionBuilder.setMaxLength(outputAction.getMaxLength());
359
360         actionBuilder.addAugmentation(MaxLengthAction.class, maxLenActionBuilder.build());
361
362         Uri uri = outputAction.getOutputNodeConnector();
363         if (uri.getValue() == NodeConnectorIDType.ALL) {
364             if (version >= OF13) {
365                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.ALL.getIntValue())));
366
367             } else if (version == OF10) {
368                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.ALL.getIntValue()));
369
370             }
371         }
372         if (uri.getValue() == NodeConnectorIDType.SWSTACK) {
373             if (version >= OF13) {
374                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.LOCAL.getIntValue())));
375
376             } else if (version == OF10) {
377                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.LOCAL.getIntValue()));
378
379             }
380         }
381
382         if ((uri.getValue() == NodeConnectorIDType.HWPATH) || (uri.getValue() == NodeConnectorIDType.ONEPK)
383                 || (uri.getValue() == NodeConnectorIDType.ONEPK2OPENFLOW)
384                 || (uri.getValue() == NodeConnectorIDType.ONEPK2PCEP)
385                 || (uri.getValue() == NodeConnectorIDType.OPENFLOW)
386                 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2ONEPK)
387                 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2PCEP)
388                 || (uri.getValue() == NodeConnectorIDType.PCEP) || (uri.getValue() == NodeConnectorIDType.PCEP2ONEPK)
389                 || (uri.getValue() == NodeConnectorIDType.PCEP2OPENFLOW)
390                 || (uri.getValue() == NodeConnectorIDType.PRODUCTION)) {
391             if (version >= OF13) {
392                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.NORMAL.getIntValue()));
393
394             } else if (version == OF10) {
395                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.NORMAL.getIntValue()));
396             }
397         }
398
399         if (uri.getValue() == NodeConnectorIDType.CONTROLLER) {
400
401             if (version >= OF13) {
402                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.CONTROLLER
403                         .getIntValue())));
404
405             } else if (version == OF10) {
406                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.CONTROLLER.getIntValue()));
407
408             }
409         }
410
411         actionBuilder
412                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
413         actionBuilder.addAugmentation(PortAction.class, portAction.build());
414         actionsListBuilder.setAction(actionBuilder.build());
415         return actionsListBuilder.build();
416     }
417
418     /**
419      * Method to convert OF actions associated with bucket to SAL Actions.
420      *
421      * @param actionList
422      * @return List of converted SAL Actions.
423      */
424     public static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> toSALBucketActions(
425             List<ActionsList> actionList) {
426
427         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> bucketActions = new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action>();
428
429         for (ActionsList actionDesc : actionList) {
430
431             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action = actionDesc
432                     .getAction();
433
434             if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output)
435                 bucketActions.add(ofToSALOutputAction(action));
436             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group)
437                 bucketActions.add(ofToSALGroupAction(action));
438             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut) {
439                 CopyTtlOutBuilder copyTtlOutaction = new CopyTtlOutBuilder();
440                 bucketActions.add(copyTtlOutaction.build());
441             } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn) {
442                 CopyTtlInBuilder copyTtlInaction = new CopyTtlInBuilder();
443                 bucketActions.add(copyTtlInaction.build());
444             } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl)
445                 bucketActions.add(ofToSALSetMplsTtl(action));
446             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl) {
447                 DecMplsTtlBuilder decMplsTtl = new DecMplsTtlBuilder();
448                 bucketActions.add(decMplsTtl.build());
449             } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan)
450                 bucketActions.add(ofToSALPushVlanAction(action));
451             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan) {
452                 PopVlanActionBuilder popVlan = new PopVlanActionBuilder();
453                 bucketActions.add(popVlan.build());
454             } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls) {
455                 PushMplsActionBuilder pushMpls = new PushMplsActionBuilder();
456                 bucketActions.add(pushMpls.build());
457             } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls) {
458                 PopMplsActionBuilder popMpls = new PopMplsActionBuilder();
459                 bucketActions.add(popMpls.build());
460             } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue)
461                 bucketActions.add(ofToSALSetQueue(action));
462
463             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl)
464                 bucketActions.add(ofToSALSetNwTtl(action));
465             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl) {
466                 DecNwTtlBuilder decNwTtl = new DecNwTtlBuilder();
467                 bucketActions.add(decNwTtl.build());
468             } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField)
469                 bucketActions.add(FlowConvertor.ofToSALSetField(action));
470
471             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb)
472                 bucketActions.add(ofToSALPushPbbAction(action));
473             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb) {
474                 PopPbbActionBuilder popPbb = new PopPbbActionBuilder();
475                 bucketActions.add(popPbb.build());
476             } else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter) {
477                 // bucketActions.add(ofToSALExperimenter(action));
478                 // TODO: Need to explore/discuss on how to handle experimenter
479                 // case.
480             }
481
482         }
483         return bucketActions;
484     }
485
486     /**
487      * Method converts OF Output action object to SAL Output action object.
488      *
489      * @param action
490      *            org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.
491      *            action.rev130731.actions.actions.list.Action
492      * @return OutputAction
493      */
494     public static OutputAction ofToSALOutputAction(
495             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
496
497         OutputActionBuilder outputAction = new OutputActionBuilder();
498         PortAction port = action.getAugmentation(PortAction.class);
499         if (port != null) {
500             outputAction.setOutputNodeConnector(new Uri(port.getPort().getValue().toString()));
501         } else {
502             logger.error("Provided action is not OF Output action, no associated port found!");
503         }
504
505         MaxLengthAction length = action.getAugmentation(MaxLengthAction.class);
506         if (length != null) {
507             outputAction.setMaxLength(length.getMaxLength());
508         } else {
509             logger.error("Provided action is not OF Output action, no associated length found!");
510         }
511
512         return outputAction.build();
513     }
514
515     /**
516      * Method converts OF GroupAction object to SAL GroupAction object
517      *
518      * @param action
519      * @return GroupAction
520      */
521     public static GroupAction ofToSALGroupAction(
522             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
523
524         GroupActionBuilder groupAction = new GroupActionBuilder();
525
526         GroupIdAction groupId = action.getAugmentation(GroupIdAction.class);
527         groupAction.setGroupId(groupId.getGroupId());
528
529         return groupAction.build();
530     }
531
532     /**
533      * Method converts OF SetMplsTTL action object to SAL SetMplsTTL action
534      * object.
535      *
536      * @param action
537      * @return
538      */
539     public static SetMplsTtlAction ofToSALSetMplsTtl(
540             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
541
542         SetMplsTtlActionBuilder mplsTtlAction = new SetMplsTtlActionBuilder();
543         MplsTtlAction mplsTtl = action.getAugmentation(MplsTtlAction.class);
544         mplsTtlAction.setMplsTtl(mplsTtl.getMplsTtl());
545         return mplsTtlAction.build();
546     }
547
548     /**
549      * Method converts OF Pushvlan action to SAL PushVlan action.
550      *
551      * @param action
552      * @return PushVlanAction
553      */
554     public static PushVlanAction ofToSALPushVlanAction(
555             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
556
557         PushVlanActionBuilder pushVlanAction = new PushVlanActionBuilder();
558
559         EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
560         pushVlanAction.setVlanId(new VlanId(etherType.getEthertype().getValue()));
561
562         return pushVlanAction.build();
563     }
564
565     /**
566      * Method converts OF SetQueue action to SAL SetQueue action.
567      *
568      * @param action
569      * @return SetQueueAction
570      */
571     public static SetQueueAction ofToSALSetQueue(
572             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
573
574         SetQueueActionBuilder setQueueAction = new SetQueueActionBuilder();
575
576         QueueIdAction queueId = action.getAugmentation(QueueIdAction.class);
577         setQueueAction.setQueueId(queueId.getQueueId());
578
579         return setQueueAction.build();
580     }
581
582     /**
583      * Method converts OF SetNwTtl action to SAL SetNwTtl action.
584      *
585      * @param action
586      * @return SetNwTtlAction
587      */
588     public static SetNwTtlAction ofToSALSetNwTtl(
589             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
590
591         SetNwTtlActionBuilder setNwTtl = new SetNwTtlActionBuilder();
592         NwTtlAction nwTtl = action.getAugmentation(NwTtlAction.class);
593         setNwTtl.setNwTtl(nwTtl.getNwTtl());
594
595         return setNwTtl.build();
596     }
597
598     /**
599      * Method converts OF Pushvlan action to SAL PushVlan action.
600      *
601      * @param action
602      * @return PushVlanAction
603      */
604     public static PushPbbAction ofToSALPushPbbAction(
605             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
606
607         PushPbbActionBuilder pushPbbAction = new PushPbbActionBuilder();
608
609         EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
610         pushPbbAction.setEthernetType(etherType.getEthertype().getValue());
611
612         return pushPbbAction.build();
613     }
614
615     public static Object ofToSALExperimenter(
616             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
617
618         ExperimenterAction ExperimenterAction = action.getAugmentation(ExperimenterAction.class);
619
620         return null;
621         /*
622          * TODO: Need to explore/discuss about how to handle experimenter
623          */
624
625     }
626 }