Removed old legacy code and moved parent pom.xml to root
[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.openflowplugin.openflow.md.OFConstants;
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;
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlIn;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInBuilder;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOut;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutBuilder;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtl;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlBuilder;
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.DecNwTtl;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;
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 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     private ActionConvertor() {
92         // NOOP
93     }
94
95     public static List<ActionsList> getActionList(
96             List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions,
97             short version)
98
99     {
100         ActionBuilder  actionBuilder = new ActionBuilder();
101         ActionsListBuilder actionsListBuilder = new ActionsListBuilder();
102       List<ActionsList> actionsList = new ArrayList<ActionsList>();
103
104         for (int actionItem = 0; actionItem < actions.size(); actionItem++)
105       {
106
107             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = actions.get(
108                     actionItem).getAction();
109
110             if (action instanceof OutputAction)
111                 actionsList.add(salToOFOutputAction(action, actionBuilder, actionsListBuilder, version));
112             else if (action instanceof GroupAction)
113                 actionsList.add(SalToOFGroupAction(action, actionBuilder, actionsListBuilder));
114             else if (action instanceof CopyTtlOut)
115                 actionsList.add(SalToOFCopyTTLIOut(actionBuilder, actionsListBuilder));
116             else if (action instanceof CopyTtlIn)
117                 actionsList.add(SalToOFCopyTTLIIn(actionBuilder, actionsListBuilder));
118             else if (action instanceof SetMplsTtlAction)
119                 actionsList.add(SalToOFSetMplsTtl(action, actionBuilder, actionsListBuilder));
120             else if (action instanceof DecMplsTtl)
121                 actionsList.add(SalToOFDecMplsTtl(actionBuilder, actionsListBuilder));
122             else if (action instanceof PushVlanAction)
123                 actionsList.add(SalToOFPushVlanAction(action, actionBuilder, actionsListBuilder));
124             else if (action instanceof PopVlanAction)
125                 actionsList.add(SalToOFPopVlan(action, actionBuilder, actionsListBuilder));
126             else if (action instanceof PushMplsAction)
127                 actionsList.add(SalToOFPushMplsAction(action, actionBuilder, actionsListBuilder));
128             else if (action instanceof PopMplsAction)
129                 actionsList.add(SalToOFPopMpls(action, actionBuilder, actionsListBuilder));
130             else if (action instanceof SetQueueAction)
131                 actionsList.add(SalToOFSetQueue(action, actionBuilder, actionsListBuilder));
132
133             else if (action instanceof SetNwTtlAction)
134                 actionsList.add(SalToOFSetNwTtl(action, actionBuilder, actionsListBuilder));
135             else if (action instanceof DecNwTtl)
136                 actionsList.add(SalToOFDecNwTtl(action, actionBuilder, actionsListBuilder));
137             else if (action instanceof SetField)
138                 actionsList.add(SalToOFSetField(action, actionBuilder, actionsListBuilder));
139
140             else if (action instanceof PushPbbAction)
141                 actionsList.add(SalToOFPushPbbAction(action, actionBuilder, actionsListBuilder));
142             else if (action instanceof PopPbbAction)
143                 actionsList.add(SalToOFPopPBB(action, actionBuilder, actionsListBuilder));
144             else if (action instanceof ExperimenterAction)
145                 actionsList.add(SalToOFExperimenter(action, actionBuilder, actionsListBuilder));
146
147         }
148         return actionsList;
149
150
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,
157             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 = FlowConvertor.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,
180             ActionsListBuilder actionsListBuilder) {
181         actionBuilder.setType(DecNwTtl.class);
182
183         return emtpyAction(actionBuilder, actionsListBuilder);
184     }
185
186     private static ActionsList SalToOFPushMplsAction(
187             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
188             ActionBuilder actionBuilder,
189             ActionsListBuilder actionsListBuilder) {
190
191         actionBuilder.setType(PushMpls.class);
192
193         return SalToOFPushAction(((PushMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
194
195     }
196
197     private static ActionsList SalToOFPushPbbAction(
198             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
199             ActionBuilder actionBuilder,
200             ActionsListBuilder actionsListBuilder) {
201         actionBuilder.setType(PushPbb.class);
202
203         return SalToOFPushAction(((PushPbbAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
204     }
205
206     private static ActionsList SalToOFPushVlanAction(
207             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
208             ActionBuilder actionBuilder,
209             ActionsListBuilder actionsListBuilder) {
210
211         PushVlanAction pushVlanAction = (PushVlanAction) action;
212         VlanId vlanId = new VlanId(pushVlanAction.getVlanId());
213         Integer etherType = vlanId.getValue();
214         actionBuilder.setType(PushVlan.class);
215
216         return SalToOFPushAction(etherType, actionBuilder, actionsListBuilder);
217
218     }
219
220     private static ActionsList SalToOFSetNwTtl(
221             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
222             ActionBuilder actionBuilder,
223             ActionsListBuilder actionsListBuilder) {
224
225         NwTtlActionBuilder nwTtlActionBuilder = new NwTtlActionBuilder();
226         nwTtlActionBuilder.setNwTtl(((SetNwTtlAction) action).getNwTtl());
227
228
229         actionBuilder.setType(SetNwTtl.class);
230         actionBuilder.addAugmentation(NwTtlAction.class, nwTtlActionBuilder.build());
231         actionsListBuilder.setAction(actionBuilder.build());
232         return actionsListBuilder.build();
233
234     }
235
236     private static ActionsList SalToOFSetQueue(
237             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
238             ActionBuilder actionBuilder,
239             ActionsListBuilder actionsListBuilder) {
240
241         SetQueueAction setQueueAction = (SetQueueAction) action;
242
243         QueueIdActionBuilder queueIdActionBuilder = new QueueIdActionBuilder();
244         queueIdActionBuilder.setQueueId(Long.getLong(setQueueAction.getQueue()));
245         actionBuilder.setType(SetQueue.class);
246         actionBuilder.addAugmentation(QueueIdAction.class, queueIdActionBuilder.build());
247
248         actionsListBuilder.setAction(actionBuilder.build());
249         return actionsListBuilder.build();
250     }
251
252     private static ActionsList SalToOFPopMpls(
253             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
254             ActionBuilder actionBuilder,
255             ActionsListBuilder actionsListBuilder) {
256
257         actionBuilder.setType(PopMpls.class);
258
259         return SalToOFPushAction(((PopMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
260     }
261
262     private static ActionsList SalToOFPopVlan(
263             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
264             ActionBuilder actionBuilder,
265             ActionsListBuilder actionsListBuilder) {
266
267         actionBuilder.setType(PushMpls.class);
268
269         return emtpyAction(actionBuilder, actionsListBuilder);
270     }
271
272     private static ActionsList SalToOFPopPBB(
273             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
274             ActionBuilder actionBuilder,
275             ActionsListBuilder actionsListBuilder) {
276         actionBuilder.setType(PopPbb.class);
277         return emtpyAction(actionBuilder, actionsListBuilder);
278     }
279
280     private static ActionsList SalToOFExperimenter(
281             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
282             ActionBuilder actionBuilder,
283             ActionsListBuilder actionsListBuilder) {
284
285         ExperimenterActionBuilder experimenterActionBuilder = new ExperimenterActionBuilder();
286         experimenterActionBuilder.setExperimenter(((ExperimenterAction) action).getExperimenter());
287         actionBuilder.setType(Experimenter.class);
288         actionBuilder
289                 .addAugmentation(
290                         ExperimenterAction.class,
291                         (Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action>) experimenterActionBuilder);
292         actionsListBuilder.setAction(actionBuilder.build());
293         return actionsListBuilder.build();
294
295     }
296
297     private static ActionsList SalToOFGroupAction(
298             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
299             ActionBuilder actionBuilder,
300             ActionsListBuilder actionsListBuilder) {
301
302         GroupAction groupAction = (GroupAction) action;
303
304         GroupIdActionBuilder groupIdBuilder = new GroupIdActionBuilder();
305         groupIdBuilder.setGroupId(Long.getLong(groupAction.getGroup()));
306         actionBuilder.setType(Group.class);
307         actionBuilder.addAugmentation(GroupIdAction.class, groupIdBuilder.build());
308         actionsListBuilder.setAction(actionBuilder.build());
309         return actionsListBuilder.build();
310     }
311
312     private static ActionsList SalToOFPushAction(Integer ethernetType, ActionBuilder actionBuilder,
313             ActionsListBuilder actionsListBuilder) {
314
315         EthertypeActionBuilder ethertypeActionBuilder = new EthertypeActionBuilder();
316         ethertypeActionBuilder.setEthertype(new EtherType(ethernetType));
317
318         /* OF */
319         actionBuilder.addAugmentation(EthertypeAction.class, ethertypeActionBuilder.build());
320         actionsListBuilder.setAction(actionBuilder.build());
321         return actionsListBuilder.build();
322     }
323
324     private static ActionsList SalToOFDecMplsTtl(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
325         actionBuilder
326                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class);
327         return emtpyAction(actionBuilder, actionsListBuilder);
328     }
329
330     private static ActionsList SalToOFSetMplsTtl(
331             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
332             ActionBuilder actionBuilder,
333             ActionsListBuilder actionsListBuilder) {
334
335         SetMplsTtlAction mplsTtlAction = (SetMplsTtlAction) action;
336
337         MplsTtlActionBuilder mplsTtlActionBuilder = new MplsTtlActionBuilder();
338         mplsTtlActionBuilder.setMplsTtl(mplsTtlAction.getMplsTtl()/* SAL */);
339         /* OF */
340         actionBuilder.setType(SetMplsTtl.class);
341         actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtlActionBuilder.build());
342         actionsListBuilder.setAction(actionBuilder.build());
343         return actionsListBuilder.build();
344     }
345
346     private static ActionsList SalToOFCopyTTLIIn(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
347         actionBuilder
348                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class);
349         return emtpyAction(actionBuilder, actionsListBuilder);
350     }
351
352     private static ActionsList SalToOFCopyTTLIOut(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
353         actionBuilder
354                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class);
355         return emtpyAction(actionBuilder, actionsListBuilder);
356
357     }
358
359     private static ActionsList emtpyAction(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
360
361         actionsListBuilder.setAction(actionBuilder.build());
362         return actionsListBuilder.build();
363     }
364
365     private static ActionsList salToOFOutputAction(
366             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
367             ActionBuilder actionBuilder,
368  ActionsListBuilder actionsListBuilder, short version) {
369
370
371         OutputAction outputAction = ((OutputAction) action);
372         PortActionBuilder portAction = new PortActionBuilder();
373         MaxLengthActionBuilder maxLenActionBuilder = new MaxLengthActionBuilder();
374         maxLenActionBuilder.setMaxLength(outputAction.getMaxLength());
375
376         actionBuilder.addAugmentation(MaxLengthAction.class, maxLenActionBuilder.build());
377
378         Uri uri = outputAction.getOutputNodeConnector();
379             if (uri.getValue() == NodeConnectorIDType.ALL)
380                 portAction.setPort(new PortNumber((long) OFConstants.OFPP_ALL));
381
382             if (uri.getValue() == NodeConnectorIDType.SWSTACK)
383                 portAction.setPort(new PortNumber((long) OFConstants.OFPP_LOCAL));
384
385             if ((uri.getValue() == NodeConnectorIDType.HWPATH)
386  || (uri.getValue() == NodeConnectorIDType.ONEPK)
387                     || (uri.getValue() == NodeConnectorIDType.ONEPK2OPENFLOW)
388                     || (uri.getValue() == NodeConnectorIDType.ONEPK2PCEP)
389                     || (uri.getValue() == NodeConnectorIDType.OPENFLOW)
390                     || (uri.getValue() == NodeConnectorIDType.OPENFLOW2ONEPK)
391                     || (uri.getValue() == NodeConnectorIDType.OPENFLOW2PCEP)
392                     || (uri.getValue() == NodeConnectorIDType.PCEP)
393                     || (uri.getValue() == NodeConnectorIDType.PCEP2ONEPK)
394                     || (uri.getValue() == NodeConnectorIDType.PCEP2OPENFLOW)
395                 || (uri.getValue() == NodeConnectorIDType.PRODUCTION)) {
396                 portAction.setPort(new PortNumber((long) OFConstants.OFPP_NORMAL));
397             }
398
399             if (uri.getValue() == NodeConnectorIDType.CONTROLLER) {
400
401             if (version == 0X4) {
402                 // TODO:To remove the and operation once the BitContent is in
403                 // place in OF Plugin .
404                 portAction.setPort(new PortNumber(PortNumberValues.CONTROLLER.getIntValue() & 0x00000000ffffffffL));
405             } else {
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      * @param actionList
421      * @return List of converted SAL Actions.
422      */
423     public static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> toSALBucketActions(List<ActionsList> actionList){
424         
425         List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> bucketActions = 
426                 new ArrayList<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action>();
427         
428         for(ActionsList actionDesc : actionList){
429             
430             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action 
431             = actionDesc.getAction();
432
433             if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output)
434                 bucketActions.add(ofToSALOutputAction(action));
435             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group)
436                 bucketActions.add(ofToSALGroupAction(action));
437             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut){
438                 CopyTtlOutBuilder copyTtlOutaction = new CopyTtlOutBuilder();
439                 bucketActions.add(copyTtlOutaction.build());
440             }
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             }
445             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl)
446                 bucketActions.add(ofToSALSetMplsTtl(action));
447             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl){
448                 DecMplsTtlBuilder decMplsTtl = new DecMplsTtlBuilder(); 
449                 bucketActions.add(decMplsTtl.build());
450             }
451             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan)
452                 bucketActions.add(ofToSALPushVlanAction(action));
453             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan){
454                 PopVlanActionBuilder popVlan = new PopVlanActionBuilder();
455                 bucketActions.add(popVlan.build());
456             }
457             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls){
458                 PushMplsActionBuilder pushMpls = new PushMplsActionBuilder(); 
459                 bucketActions.add(pushMpls.build());
460             }
461             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls){
462                 PopMplsActionBuilder popMpls = new PopMplsActionBuilder(); 
463                 bucketActions.add(popMpls.build());
464             }
465             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue)
466                 bucketActions.add(ofToSALSetQueue(action));
467
468             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl)
469                 bucketActions.add(ofToSALSetNwTtl(action));
470             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl){
471                 DecNwTtlBuilder decNwTtl = new DecNwTtlBuilder();
472                 bucketActions.add(decNwTtl.build());
473             }
474             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField)
475                 bucketActions.add(FlowConvertor.ofToSALSetField(action));
476
477             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb)
478                 bucketActions.add(ofToSALPushPbbAction(action));
479             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb){
480                 PopPbbActionBuilder popPbb = new PopPbbActionBuilder(); 
481                 bucketActions.add(popPbb.build());
482             }
483             else if (action instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter){
484                 //bucketActions.add(ofToSALExperimenter(action));
485                 // TODO: Need to explore/discuss on how to handle experimenter case.
486             }
487
488         }
489         return bucketActions;
490     }
491     
492     /**
493      * Method converts OF Output action object to SAL Output action object. 
494      * @param action org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action
495      * @return OutputAction
496      */
497     public static OutputAction ofToSALOutputAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
498
499         OutputActionBuilder outputAction = new OutputActionBuilder();
500         PortAction port = action.getAugmentation(PortAction.class);
501         if(port != null){
502             outputAction.setOutputNodeConnector(new Uri(port.getPort().getValue().toString()));
503         }else {
504             logger.error("Provided action is not OF Output action, no associated port found!" );
505         }
506         
507         MaxLengthAction length = action.getAugmentation(MaxLengthAction.class);
508         if(length != null){
509             outputAction.setMaxLength(length.getMaxLength());
510         }else{
511             logger.error("Provided action is not OF Output action, no associated length found!");
512         }
513
514         return outputAction.build();
515     }
516
517     /**
518      * Method converts OF GroupAction object to SAL GroupAction object
519      * @param action
520      * @return GroupAction
521      */
522     public static GroupAction ofToSALGroupAction(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 object.
534      * @param action
535      * @return
536      */
537     public static SetMplsTtlAction ofToSALSetMplsTtl(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action){
538
539         SetMplsTtlActionBuilder mplsTtlAction = new SetMplsTtlActionBuilder();
540         MplsTtlAction mplsTtl = action.getAugmentation(MplsTtlAction.class);
541         mplsTtlAction.setMplsTtl(mplsTtl.getMplsTtl());
542         return mplsTtlAction.build();
543     }
544     
545     /**
546      * Method converts OF Pushvlan action to SAL PushVlan action.
547      * @param action
548      * @return PushVlanAction
549      */
550     public static PushVlanAction ofToSALPushVlanAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
551
552         PushVlanActionBuilder pushVlanAction = new PushVlanActionBuilder();
553         
554         EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
555         pushVlanAction.setVlanId(new VlanId(etherType.getEthertype().getValue()));
556         
557         return pushVlanAction.build();
558     }
559     
560     /**
561      * Method converts OF SetQueue action to SAL SetQueue action.
562      * @param action
563      * @return SetQueueAction
564      */
565     public static SetQueueAction ofToSALSetQueue(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
566
567         SetQueueActionBuilder setQueueAction = new SetQueueActionBuilder();
568         
569         QueueIdAction queueId = action.getAugmentation(QueueIdAction.class);
570         setQueueAction.setQueueId(queueId.getQueueId());
571         
572         return setQueueAction.build();
573     }
574
575     /**
576      * Method converts OF SetNwTtl action to SAL SetNwTtl action.
577      * @param action
578      * @return SetNwTtlAction
579      */
580     public static SetNwTtlAction ofToSALSetNwTtl(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
581
582         SetNwTtlActionBuilder setNwTtl = new SetNwTtlActionBuilder();
583         NwTtlAction nwTtl = action.getAugmentation(NwTtlAction.class);
584         setNwTtl.setNwTtl(nwTtl.getNwTtl());
585         
586         return setNwTtl.build();
587     }
588
589     /**
590      * Method converts OF Pushvlan action to SAL PushVlan action.
591      * @param action
592      * @return PushVlanAction
593      */
594     public static PushPbbAction ofToSALPushPbbAction(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
595
596         PushPbbActionBuilder pushPbbAction = new PushPbbActionBuilder();
597         
598         EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
599         pushPbbAction.setEthernetType(etherType.getEthertype().getValue());
600         
601         return pushPbbAction.build();
602     }
603     
604     public static Object ofToSALExperimenter(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action){
605
606         ExperimenterAction ExperimenterAction = action.getAugmentation(ExperimenterAction.class);
607         
608         return null;
609         /*
610          * TODO: Need to explore/discuss about how to handle experimenter
611          * 
612          */
613
614     }
615 }