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