SetQueueId SetGroupId not proper: ActionConverter
[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.openflowjava.protocol.api.util.BinContent;
7 import org.opendaylight.openflowplugin.openflow.md.OFConstants;
8 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchConvertorImpl;
9 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
10 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
11 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCase;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCase;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCaseBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCase;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCaseBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCase;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecNwTtlCaseBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCase;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCase;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCase;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCase;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlDstActionCase;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetDlSrcActionCase;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCase;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCase;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCaseBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwDstActionCase;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwSrcActionCase;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCase;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCaseBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCase;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueActionCaseBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpDstActionCase;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetTpSrcActionCase;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanIdActionCase;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetVlanPcpActionCase;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.StripVlanActionCase;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.in._case.CopyTtlInBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.copy.ttl.out._case.CopyTtlOutBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.mpls.ttl._case.DecMplsTtlBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.dec.nw.ttl._case.DecNwTtlBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupAction;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputAction;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanAction;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.dst.action._case.SetDlDstAction;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.dl.src.action._case.SetDlSrcAction;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlAction;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.mpls.ttl.action._case.SetMplsTtlActionBuilder;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.dst.action._case.SetNwDstAction;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.src.action._case.SetNwSrcAction;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.nw.ttl.action._case.SetNwTtlActionBuilder;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.queue.action._case.SetQueueAction;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.queue.action._case.SetQueueActionBuilder;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.dst.action._case.SetTpDstAction;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.tp.src.action._case.SetTpSrcAction;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.id.action._case.SetVlanIdAction;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.vlan.pcp.action._case.SetVlanPcpAction;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressActionBuilder;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdActionBuilder;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressActionBuilder;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlAction;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsActionBuilder;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpAction;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpActionBuilder;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidActionBuilder;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValues;
125 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValuesV10;
126 import org.opendaylight.yangtools.yang.binding.Augmentation;
127 import org.slf4j.Logger;
128 import org.slf4j.LoggerFactory;
129
130 /**
131  * @author usha@ericsson Action List:This class takes data from SAL layer and
132  *         converts into OF Data
133  * @author avishnoi@in.ibm.com Added convertor for OF bucket actions to SAL
134  *         actions
135  *
136  */
137 public final class ActionConvertor {
138     private static final Logger logger = LoggerFactory.getLogger(ActionConvertor.class);
139     private static final String PREFIX_SEPARATOR = "/";
140
141     private ActionConvertor() {
142         // NOOP
143     }
144
145     public static List<ActionsList> getActionList(
146             List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions,
147             short version)
148
149     {
150         ActionsListBuilder actionsListBuilder = new ActionsListBuilder();
151         List<ActionsList> actionsList = new ArrayList<ActionsList>();
152
153         for (int actionItem = 0; actionItem < actions.size(); actionItem++) {
154
155             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action = actions.get(
156                     actionItem).getAction();
157
158             if (action instanceof OutputActionCase)
159                 actionsList.add(salToOFOutputAction(action, actionsListBuilder, version));
160             else if (action instanceof GroupActionCase)
161                 actionsList.add(SalToOFGroupAction(action, actionsListBuilder));
162             else if (action instanceof CopyTtlOutCase)
163                 actionsList.add(SalToOFCopyTTLIOut(actionsListBuilder));
164             else if (action instanceof CopyTtlInCase)
165                 actionsList.add(SalToOFCopyTTLIIn(actionsListBuilder));
166             else if (action instanceof SetMplsTtlActionCase)
167                 actionsList.add(SalToOFSetMplsTtl(action, actionsListBuilder));
168             else if (action instanceof DecMplsTtlCase)
169                 actionsList.add(SalToOFDecMplsTtl(actionsListBuilder));
170             else if (action instanceof PushVlanActionCase)
171                 actionsList.add(SalToOFPushVlanAction(action, actionsListBuilder));
172             else if (action instanceof PopVlanActionCase)
173                 actionsList.add(SalToOFPopVlan(action, actionsListBuilder));
174             else if (action instanceof PushMplsActionCase)
175                 actionsList.add(SalToOFPushMplsAction(action, actionsListBuilder));
176             else if (action instanceof PopMplsActionCase)
177                 actionsList.add(SalToOFPopMpls(action, actionsListBuilder));
178             else if (action instanceof SetQueueActionCase)
179                 actionsList.add(SalToOFSetQueue(action, actionsListBuilder));
180             else if (action instanceof SetNwTtlActionCase)
181                 actionsList.add(SalToOFSetNwTtl(action, actionsListBuilder));
182             else if (action instanceof DecNwTtlCase)
183                 actionsList.add(SalToOFDecNwTtl(action, actionsListBuilder));
184             else if (action instanceof SetFieldCase)
185                 actionsList.add(SalToOFSetField(action, actionsListBuilder, version));
186             else if (action instanceof PushPbbActionCase)
187                 actionsList.add(SalToOFPushPbbAction(action, actionsListBuilder));
188             else if (action instanceof PopPbbActionCase)
189                 actionsList.add(SalToOFPopPBB(action, actionsListBuilder));
190             else if (action instanceof ExperimenterAction)
191                 actionsList.add(SalToOFExperimenter(action, actionsListBuilder));
192
193             // 1.0 Actions
194             else if (action instanceof SetVlanIdActionCase)
195                 actionsList.add(SalToOFSetVlanId(action, actionsListBuilder, version));
196             else if (action instanceof SetVlanPcpActionCase)
197                 actionsList.add(SalToOFSetVlanpcp(action, actionsListBuilder, version));
198             else if (action instanceof StripVlanActionCase)
199                 actionsList.add(SalToOFStripVlan(action, actionsListBuilder, version));
200             else if (action instanceof SetDlSrcActionCase)
201                 actionsList.add(SalToOFSetDlSrc(action, actionsListBuilder, version));
202             else if (action instanceof SetDlDstActionCase)
203                 actionsList.add(SalToOFSetDlDst(action, actionsListBuilder, version));
204             else if (action instanceof SetNwSrcActionCase)
205                 actionsList.add(SalToOFSetNwSrc(action, actionsListBuilder, version));
206             else if (action instanceof SetNwDstActionCase)
207                 actionsList.add(SalToOFSetNwDst(action, actionsListBuilder, version));
208             else if (action instanceof SetTpSrcActionCase)
209                 actionsList.add(SalToOFSetTpSrc(action, actionsListBuilder, version));
210             else if (action instanceof SetTpDstActionCase)
211                 actionsList.add(SalToOFSetTpDst(action, actionsListBuilder, version));
212
213         }
214         return actionsList;
215
216     }
217
218     private static ActionsList SalToOFSetField(
219             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
220             ActionsListBuilder actionsListBuilder, short version) {
221
222         SetFieldCase setFieldCase = (SetFieldCase) action;
223         org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.Match match = setFieldCase
224                 .getSetField();
225
226         OxmFieldsActionBuilder oxmFieldsActionBuilder = new OxmFieldsActionBuilder();
227         MatchReactor.getInstance().convert(match, version, oxmFieldsActionBuilder);
228
229         ActionBuilder actionBuilder = new ActionBuilder();
230         actionBuilder
231                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class);
232
233         actionBuilder.addAugmentation(OxmFieldsAction.class, oxmFieldsActionBuilder.build());
234         actionsListBuilder.setAction(actionBuilder.build());
235         return actionsListBuilder.build();
236
237     }
238
239     private static ActionsList SalToOFDecNwTtl(
240             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
241             ActionsListBuilder actionsListBuilder) {
242         ActionBuilder actionBuilder = new ActionBuilder();
243         actionBuilder
244                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl.class);
245
246         return emtpyAction(actionBuilder, actionsListBuilder);
247     }
248
249     private static ActionsList SalToOFPushMplsAction(
250             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
251             ActionsListBuilder actionsListBuilder) {
252         ActionBuilder actionBuilder = new ActionBuilder();
253         PushMplsActionCase pushMplsActionCase = (PushMplsActionCase) action;
254
255         actionBuilder.setType(PushMpls.class);
256
257         return SalToOFPushAction(pushMplsActionCase.getPushMplsAction().getEthernetType(), actionBuilder,
258                 actionsListBuilder);
259
260     }
261
262     private static ActionsList SalToOFPushPbbAction(
263             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
264             ActionsListBuilder actionsListBuilder) {
265         ActionBuilder actionBuilder = new ActionBuilder();
266         PushPbbActionCase pushPbbActionCase = (PushPbbActionCase) action;
267         actionBuilder.setType(PushPbb.class);
268
269         return SalToOFPushAction(pushPbbActionCase.getPushPbbAction().getEthernetType(), actionBuilder,
270                 actionsListBuilder);
271     }
272
273     private static ActionsList SalToOFPushVlanAction(
274             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
275             ActionsListBuilder actionsListBuilder) {
276         ActionBuilder actionBuilder = new ActionBuilder();
277         PushVlanActionCase pushVlanActionCase = (PushVlanActionCase) action;
278         PushVlanAction pushVlanAction = pushVlanActionCase.getPushVlanAction();
279         actionBuilder.setType(PushVlan.class);
280
281         return SalToOFPushAction(pushVlanAction.getEthernetType(), actionBuilder, actionsListBuilder);
282
283     }
284
285     private static ActionsList SalToOFSetNwTtl(
286             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
287             ActionsListBuilder actionsListBuilder) {
288         ActionBuilder actionBuilder = new ActionBuilder();
289         SetNwTtlActionCase nwTtlActionCase = (SetNwTtlActionCase) action;
290         NwTtlActionBuilder nwTtlActionBuilder = new NwTtlActionBuilder();
291         nwTtlActionBuilder.setNwTtl(nwTtlActionCase.getSetNwTtlAction().getNwTtl());
292         actionBuilder.setType(SetNwTtl.class);
293         actionBuilder.addAugmentation(NwTtlAction.class, nwTtlActionBuilder.build());
294         actionsListBuilder.setAction(actionBuilder.build());
295         return actionsListBuilder.build();
296
297     }
298
299     private static ActionsList SalToOFSetQueue(
300             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
301             ActionsListBuilder actionsListBuilder) {
302         ActionBuilder actionBuilder = new ActionBuilder();
303         SetQueueActionCase setQueueActionCase = (SetQueueActionCase) action;
304         SetQueueAction setQueueAction = setQueueActionCase.getSetQueueAction();
305
306         QueueIdActionBuilder queueIdActionBuilder = new QueueIdActionBuilder();
307         queueIdActionBuilder.setQueueId(setQueueAction.getQueueId());
308         actionBuilder.setType(SetQueue.class);
309         actionBuilder.addAugmentation(QueueIdAction.class, queueIdActionBuilder.build());
310
311         actionsListBuilder.setAction(actionBuilder.build());
312         return actionsListBuilder.build();
313     }
314
315     private static ActionsList SalToOFPopMpls(
316             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
317             ActionsListBuilder actionsListBuilder) {
318         ActionBuilder actionBuilder = new ActionBuilder();
319         PopMplsActionCase popMplsActionCase = (PopMplsActionCase) action;
320         actionBuilder.setType(PopMpls.class);
321
322         return SalToOFPushAction(popMplsActionCase.getPopMplsAction().getEthernetType(), actionBuilder,
323                 actionsListBuilder);
324     }
325
326     private static ActionsList SalToOFPopVlan(
327             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
328             ActionsListBuilder actionsListBuilder) {
329         ActionBuilder actionBuilder = new ActionBuilder();
330         actionBuilder.setType(PopVlan.class);
331
332         return emtpyAction(actionBuilder, actionsListBuilder);
333     }
334
335     private static ActionsList SalToOFPopPBB(
336             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
337             ActionsListBuilder actionsListBuilder) {
338         ActionBuilder actionBuilder = new ActionBuilder();
339         actionBuilder.setType(PopPbb.class);
340         return emtpyAction(actionBuilder, actionsListBuilder);
341     }
342
343     private static ActionsList SalToOFExperimenter(
344             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
345             ActionsListBuilder actionsListBuilder) {
346
347         ActionBuilder actionBuilder = new ActionBuilder();
348         ExperimenterActionBuilder experimenterActionBuilder = new ExperimenterActionBuilder();
349         experimenterActionBuilder.setExperimenter(((ExperimenterAction) action).getExperimenter());
350         actionBuilder.setType(Experimenter.class);
351         actionBuilder
352                 .addAugmentation(
353                         ExperimenterAction.class,
354                         (Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action>) experimenterActionBuilder);
355         actionsListBuilder.setAction(actionBuilder.build());
356         return actionsListBuilder.build();
357
358     }
359
360     private static ActionsList SalToOFSetVlanId(
361             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
362             ActionsListBuilder actionsListBuilder, short version) {
363
364         if (version == OFConstants.OFP_VERSION_1_0) {
365             ActionBuilder actionBuilder = new ActionBuilder();
366             SetVlanIdActionCase setvlanidcase = (SetVlanIdActionCase) action;
367             SetVlanIdAction setvlanidaction = setvlanidcase.getSetVlanIdAction();
368
369             VlanVidActionBuilder vlanidActionBuilder = new VlanVidActionBuilder();
370             vlanidActionBuilder.setVlanVid(setvlanidaction.getVlanId().getValue());
371             actionBuilder
372                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanVid.class);
373             actionBuilder.addAugmentation(VlanVidAction.class, vlanidActionBuilder.build());
374             actionsListBuilder.setAction(actionBuilder.build());
375             return actionsListBuilder.build();
376         } else {
377             logger.error("Unknown Action Type for the Version", version);
378             return null;
379         }
380
381     }
382
383     private static ActionsList SalToOFSetVlanpcp(
384             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
385             ActionsListBuilder actionsListBuilder, short version) {
386
387         if (version == OFConstants.OFP_VERSION_1_0) {
388             ActionBuilder actionBuilder = new ActionBuilder();
389             SetVlanPcpActionCase setvlanpcpcase = (SetVlanPcpActionCase) action;
390             SetVlanPcpAction setvlanpcpaction = setvlanpcpcase.getSetVlanPcpAction();
391
392             VlanPcpActionBuilder vlanpcpActionBuilder = new VlanPcpActionBuilder();
393             vlanpcpActionBuilder.setVlanPcp(setvlanpcpaction.getVlanPcp().getValue());
394             actionBuilder
395                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanPcp.class);
396             actionBuilder.addAugmentation(VlanPcpAction.class, vlanpcpActionBuilder.build());
397             actionsListBuilder.setAction(actionBuilder.build());
398             return actionsListBuilder.build();
399         } else {
400             logger.error("Unknown Action Type for the Version", version);
401             return null;
402         }
403
404     }
405
406     private static ActionsList SalToOFStripVlan(
407             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
408             ActionsListBuilder actionsListBuilder, short version) {
409
410         if (version == OFConstants.OFP_VERSION_1_0) {
411             ActionBuilder actionBuilder = new ActionBuilder();
412             actionBuilder
413                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.StripVlan.class);
414
415             return emtpyAction(actionBuilder, actionsListBuilder);
416         } else {
417             logger.error("Unknown Action Type for the Version", version);
418             return null;
419         }
420
421     }
422
423     private static ActionsList SalToOFSetDlSrc(
424             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
425             ActionsListBuilder actionsListBuilder, short version) {
426
427         if (version == OFConstants.OFP_VERSION_1_0) {
428             ActionBuilder actionBuilder = new ActionBuilder();
429             SetDlSrcActionCase setdlsrccase = (SetDlSrcActionCase) action;
430             SetDlSrcAction setdlsrcaction = setdlsrccase.getSetDlSrcAction();
431
432             DlAddressActionBuilder dladdressactionbuilder = new DlAddressActionBuilder();
433             dladdressactionbuilder.setDlAddress(setdlsrcaction.getAddress());
434             actionBuilder
435                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlSrc.class);
436             actionBuilder.addAugmentation(DlAddressAction.class, dladdressactionbuilder.build());
437             actionsListBuilder.setAction(actionBuilder.build());
438             return actionsListBuilder.build();
439         } else {
440             logger.error("Unknown Action Type for the Version", version);
441             return null;
442         }
443
444     }
445
446     private static ActionsList SalToOFSetDlDst(
447             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
448             ActionsListBuilder actionsListBuilder, short version) {
449
450         if (version == OFConstants.OFP_VERSION_1_0) {
451             ActionBuilder actionBuilder = new ActionBuilder();
452             SetDlDstActionCase setdldstcase = (SetDlDstActionCase) action;
453             SetDlDstAction setdldstaction = setdldstcase.getSetDlDstAction();
454
455             DlAddressActionBuilder dladdressactionbuilder = new DlAddressActionBuilder();
456             dladdressactionbuilder.setDlAddress(setdldstaction.getAddress());
457             actionBuilder
458                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlDst.class);
459             actionBuilder.addAugmentation(DlAddressAction.class, dladdressactionbuilder.build());
460             actionsListBuilder.setAction(actionBuilder.build());
461             return actionsListBuilder.build();
462         } else {
463             logger.error("Unknown Action Type for the Version", version);
464             return null;
465         }
466
467     }
468
469     private static ActionsList SalToOFSetNwSrc(
470             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
471             ActionsListBuilder actionsListBuilder, short version) {
472
473         if (version == OFConstants.OFP_VERSION_1_0) {
474             ActionBuilder actionBuilder = new ActionBuilder();
475             SetNwSrcActionCase setnwsrccase = (SetNwSrcActionCase) action;
476             SetNwSrcAction setnwsrcaction = setnwsrccase.getSetNwSrcAction();
477
478             IpAddressActionBuilder ipvaddress = new IpAddressActionBuilder();
479             ipvaddress.setIpAddress((Ipv4Address) setnwsrcaction.getAddress());
480             actionBuilder
481                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwSrc.class);
482             actionBuilder.addAugmentation(
483                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressAction.class,
484                     ipvaddress.build());
485             actionsListBuilder.setAction(actionBuilder.build());
486             return actionsListBuilder.build();
487         } else {
488             logger.error("Unknown Action Type for the Version", version);
489             return null;
490         }
491
492     }
493
494     private static ActionsList SalToOFSetNwDst(
495             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
496             ActionsListBuilder actionsListBuilder, short version) {
497
498         if (version == OFConstants.OFP_VERSION_1_0) {
499             ActionBuilder actionBuilder = new ActionBuilder();
500             SetNwDstActionCase setnwdstcase = (SetNwDstActionCase) action;
501             SetNwDstAction setnwdstaction = setnwdstcase.getSetNwDstAction();
502
503             IpAddressActionBuilder ipvaddress = new IpAddressActionBuilder();
504             ipvaddress.setIpAddress((Ipv4Address) setnwdstaction.getAddress());
505             actionBuilder
506                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwDst.class);
507             actionBuilder.addAugmentation(
508                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressAction.class,
509                     ipvaddress.build());
510             actionsListBuilder.setAction(actionBuilder.build());
511             return actionsListBuilder.build();
512
513         } else {
514             logger.error("Unknown Action Type for the Version", version);
515             return null;
516         }
517
518     }
519
520     private static ActionsList SalToOFSetTpSrc(
521             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
522             ActionsListBuilder actionsListBuilder, short version) {
523
524         if (version == OFConstants.OFP_VERSION_1_0) {
525             ActionBuilder actionBuilder = new ActionBuilder();
526             SetTpSrcActionCase settpsrccase = (SetTpSrcActionCase) action;
527             SetTpSrcAction settpsrcaction = settpsrccase.getSetTpSrcAction();
528
529             PortActionBuilder settpsrc = new PortActionBuilder();
530             PortNumber port = new PortNumber(settpsrcaction.getPort().getValue().longValue());
531             settpsrc.setPort(port);
532
533             actionBuilder
534                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpSrc.class);
535             actionBuilder.addAugmentation(PortAction.class, settpsrc.build());
536             actionsListBuilder.setAction(actionBuilder.build());
537             return actionsListBuilder.build();
538         } else {
539             logger.error("Unknown Action Type for the Version", version);
540             return null;
541         }
542
543     }
544
545     private static ActionsList SalToOFSetTpDst(
546             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
547             ActionsListBuilder actionsListBuilder, short version) {
548
549         if (version == OFConstants.OFP_VERSION_1_0) {
550             ActionBuilder actionBuilder = new ActionBuilder();
551
552             SetTpDstActionCase settpdstcase = (SetTpDstActionCase) action;
553             SetTpDstAction settpdstaction = settpdstcase.getSetTpDstAction();
554             PortActionBuilder settpdst = new PortActionBuilder();
555             PortNumber port = new PortNumber(settpdstaction.getPort().getValue().longValue());
556             settpdst.setPort(port);
557
558             actionBuilder
559                     .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpDst.class);
560             actionBuilder.addAugmentation(PortAction.class, settpdst.build());
561             actionsListBuilder.setAction(actionBuilder.build());
562             return actionsListBuilder.build();
563         } else {
564             logger.error("Unknown Action Type for the Version", version);
565             return null;
566         }
567
568     }
569
570     private static ActionsList SalToOFGroupAction(
571             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
572             ActionsListBuilder actionsListBuilder) {
573
574         GroupActionCase groupActionCase = (GroupActionCase) action;
575         GroupAction groupAction = groupActionCase.getGroupAction();
576
577         GroupIdActionBuilder groupIdBuilder = new GroupIdActionBuilder();
578         groupIdBuilder.setGroupId(groupAction.getGroupId());
579         ActionBuilder actionBuilder = new ActionBuilder();
580         actionBuilder.setType(Group.class);
581         actionBuilder.addAugmentation(GroupIdAction.class, groupIdBuilder.build());
582         actionsListBuilder.setAction(actionBuilder.build());
583         return actionsListBuilder.build();
584     }
585
586     private static ActionsList SalToOFPushAction(Integer ethernetType, ActionBuilder actionBuilder,
587             ActionsListBuilder actionsListBuilder) {
588
589         EthertypeActionBuilder ethertypeActionBuilder = new EthertypeActionBuilder();
590         ethertypeActionBuilder.setEthertype(new EtherType(ethernetType));
591
592         /* OF */
593         actionBuilder.addAugmentation(EthertypeAction.class, ethertypeActionBuilder.build());
594         actionsListBuilder.setAction(actionBuilder.build());
595         return actionsListBuilder.build();
596     }
597
598     private static ActionsList SalToOFDecMplsTtl(ActionsListBuilder actionsListBuilder) {
599         ActionBuilder actionBuilder = new ActionBuilder();
600         actionBuilder
601                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class);
602         return emtpyAction(actionBuilder, actionsListBuilder);
603     }
604
605     private static ActionsList SalToOFSetMplsTtl(
606             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
607             ActionsListBuilder actionsListBuilder) {
608         ActionBuilder actionBuilder = new ActionBuilder();
609
610         SetMplsTtlActionCase mplsTtlActionCase = (SetMplsTtlActionCase) action;
611         SetMplsTtlAction mplsTtlAction = mplsTtlActionCase.getSetMplsTtlAction();
612
613         MplsTtlActionBuilder mplsTtlActionBuilder = new MplsTtlActionBuilder();
614         mplsTtlActionBuilder.setMplsTtl(mplsTtlAction.getMplsTtl()/* SAL */);
615         /* OF */
616         actionBuilder.setType(SetMplsTtl.class);
617         actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtlActionBuilder.build());
618         actionsListBuilder.setAction(actionBuilder.build());
619         return actionsListBuilder.build();
620     }
621
622     private static ActionsList SalToOFCopyTTLIIn(ActionsListBuilder actionsListBuilder) {
623         ActionBuilder actionBuilder = new ActionBuilder();
624         actionBuilder
625                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class);
626         return emtpyAction(actionBuilder, actionsListBuilder);
627     }
628
629     private static ActionsList SalToOFCopyTTLIOut(ActionsListBuilder actionsListBuilder) {
630         ActionBuilder actionBuilder = new ActionBuilder();
631         actionBuilder
632                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class);
633         return emtpyAction(actionBuilder, actionsListBuilder);
634
635     }
636
637     private static ActionsList emtpyAction(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
638
639         actionsListBuilder.setAction(actionBuilder.build());
640         return actionsListBuilder.build();
641     }
642
643     private static ActionsList salToOFOutputAction(
644             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
645             ActionsListBuilder actionsListBuilder, short version) {
646
647         OutputActionCase outputActionCase = ((OutputActionCase) action);
648         OutputAction outputAction = outputActionCase.getOutputAction();
649         PortActionBuilder portAction = new PortActionBuilder();
650         MaxLengthActionBuilder maxLenActionBuilder = new MaxLengthActionBuilder();
651         maxLenActionBuilder.setMaxLength(outputAction.getMaxLength());
652         ActionBuilder actionBuilder = new ActionBuilder();
653         actionBuilder.addAugmentation(MaxLengthAction.class, maxLenActionBuilder.build());
654
655         Uri uri = outputAction.getOutputNodeConnector();
656
657         if (version >= OFConstants.OFP_VERSION_1_3) {
658             if (uri.getValue().equals(OutputPortValues.CONTROLLER.toString())) {
659                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.CONTROLLER
660                         .getIntValue())));
661             }
662             if (uri.getValue().equals(OutputPortValues.ALL.toString())) {
663                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.ALL.getIntValue())));
664             }
665             if (uri.getValue().equals(OutputPortValues.ANY.toString())) {
666                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.ANY.getIntValue())));
667
668             }
669             if (uri.getValue().equals(OutputPortValues.FLOOD.toString())) {
670                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.FLOOD.getIntValue())));
671
672             }
673             if (uri.getValue().equals(OutputPortValues.INPORT.toString())) {
674                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.INPORT.getIntValue())));
675
676             }
677             if (uri.getValue().equals(OutputPortValues.LOCAL.toString())) {
678                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.LOCAL.getIntValue())));
679
680             }
681             if (uri.getValue().equals(OutputPortValues.NORMAL.toString())) {
682                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.NORMAL.getIntValue())));
683
684             }
685             if (uri.getValue().equals(OutputPortValues.TABLE.toString())) {
686                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.TABLE.getIntValue())));
687
688             }
689             if (uri.getValue().equals(OutputPortValues.NONE.toString())) {
690                 logger.error("Unknown Port Type for the Version");
691             }
692         } else if (version == OFConstants.OFP_VERSION_1_0) {
693
694             if (uri.getValue().equals(OutputPortValues.CONTROLLER.toString())) {
695                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.CONTROLLER.getIntValue()));
696             }
697             if (uri.getValue().equals(OutputPortValues.ALL.toString())) {
698                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.ALL.getIntValue()));
699             }
700
701             if (uri.getValue().equals(OutputPortValues.FLOOD.toString())) {
702                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.FLOOD.getIntValue()));
703
704             }
705
706             if (uri.getValue().equals(OutputPortValues.INPORT.toString())) {
707                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.INPORT.getIntValue()));
708
709             }
710             if (uri.getValue().equals(OutputPortValues.LOCAL.toString())) {
711                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.LOCAL.getIntValue()));
712
713             }
714             if (uri.getValue().equals(OutputPortValues.NORMAL.toString())) {
715                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.NORMAL.getIntValue()));
716
717             }
718             if (uri.getValue().equals(OutputPortValues.TABLE.toString())) {
719                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.TABLE.getIntValue()));
720
721             }
722             if (uri.getValue().equals(OutputPortValues.NONE.toString())) {
723                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.NONE.getIntValue()));
724             }
725             if (uri.getValue().equals(OutputPortValues.ANY.toString())) {
726                 logger.error("Unknown Port Type for the Version");
727             }
728         }
729
730         actionBuilder
731                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
732         actionBuilder.addAugmentation(PortAction.class, portAction.build());
733         actionsListBuilder.setAction(actionBuilder.build());
734         return actionsListBuilder.build();
735
736     }
737
738     /**
739      * Method to convert OF actions associated with bucket to SAL Actions.
740      *
741      * @param actionList
742      * @return List of converted SAL Actions.
743      */
744     public static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> toSALBucketActions(
745             List<ActionsList> actionList) {
746
747         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>();
748         for (ActionsList actionDesc : actionList) {
749
750             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action = actionDesc
751                     .getAction();
752
753             if (action.getType().equals(
754                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class))
755                 bucketActions.add(ofToSALOutputAction(action));
756             else if (action.getType().equals(
757                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group.class))
758                 bucketActions.add(ofToSALGroupAction(action));
759             else if (action.getType().equals(
760                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class)) {
761                 CopyTtlOutBuilder copyTtlOutaction = new CopyTtlOutBuilder();
762                 bucketActions.add(new CopyTtlOutCaseBuilder().setCopyTtlOut(copyTtlOutaction.build()).build());
763             } else if (action.getType().equals(
764                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class)) {
765                 CopyTtlInBuilder copyTtlInaction = new CopyTtlInBuilder();
766                 bucketActions.add(new CopyTtlInCaseBuilder().setCopyTtlIn(copyTtlInaction.build()).build());
767             } else if (action.getType().equals(
768                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl.class))
769                 bucketActions.add(ofToSALSetMplsTtl(action));
770             else if (action.getType().equals(
771                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class)) {
772                 DecMplsTtlBuilder decMplsTtl = new DecMplsTtlBuilder();
773                 bucketActions.add(new DecMplsTtlCaseBuilder().setDecMplsTtl(decMplsTtl.build()).build());
774             } else if (action.getType().equals(
775                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan.class))
776                 bucketActions.add(ofToSALPushVlanAction(action));
777             else if (action.getType().equals(
778                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan.class)) {
779                 PopVlanActionBuilder popVlan = new PopVlanActionBuilder();
780                 bucketActions.add(new PopVlanActionCaseBuilder().setPopVlanAction(popVlan.build()).build());
781             } else if (action.getType().equals(
782                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls.class)) {
783                 PushMplsActionBuilder pushMpls = new PushMplsActionBuilder();
784                 bucketActions.add(new PushMplsActionCaseBuilder().setPushMplsAction(pushMpls.build()).build());
785             } else if (action.getType().equals(
786                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls.class)) {
787                 PopMplsActionBuilder popMpls = new PopMplsActionBuilder();
788                 bucketActions.add(new PopMplsActionCaseBuilder().setPopMplsAction(popMpls.build()).build());
789             } else if (action.getType().equals(
790                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue.class))
791                 bucketActions.add(ofToSALSetQueue(action));
792
793             else if (action.getType().equals(
794                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl.class))
795                 bucketActions.add(ofToSALSetNwTtl(action));
796             else if (action.getType().equals(
797                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl.class)) {
798                 DecNwTtlBuilder decNwTtl = new DecNwTtlBuilder();
799                 bucketActions.add(new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl.build()).build());
800             } else if (action.getType().equals(
801                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class))
802                 bucketActions.add(new SetFieldCaseBuilder().setSetField(MatchConvertorImpl.ofToSALSetField(action))
803                         .build());
804
805             else if (action.getType().equals(
806                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb.class))
807                 bucketActions.add(ofToSALPushPbbAction(action));
808             else if (action.getType().equals(
809                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb.class)) {
810                 PopPbbActionBuilder popPbb = new PopPbbActionBuilder();
811                 bucketActions.add(new PopPbbActionCaseBuilder().setPopPbbAction(popPbb.build()).build());
812             } else if (action.getType().equals(
813                     org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter.class)) {
814                 // bucketActions.add(ofToSALExperimenter(action));
815                 // TODO: Need to explore/discuss on how to handle experimenter
816                 // case.
817             }
818
819         }
820         return bucketActions;
821     }
822
823     /**
824      * Method converts OF Output action object to SAL Output action object.
825      *
826      * @param action
827      *            org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.
828      *            action.rev130731.actions.actions.list.Action
829      * @return OutputAction
830      */
831     public static OutputActionCase ofToSALOutputAction(
832             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
833
834         OutputActionBuilder outputAction = new OutputActionBuilder();
835         PortAction port = action.getAugmentation(PortAction.class);
836         if (port != null) {
837             outputAction.setOutputNodeConnector(new Uri(port.getPort().getValue().toString()));
838         } else {
839             logger.error("Provided action is not OF Output action, no associated port found!");
840         }
841
842         MaxLengthAction length = action.getAugmentation(MaxLengthAction.class);
843         if (length != null) {
844             outputAction.setMaxLength(length.getMaxLength());
845         } else {
846             logger.error("Provided action is not OF Output action, no associated length found!");
847         }
848
849         return new OutputActionCaseBuilder().setOutputAction(outputAction.build()).build();
850     }
851
852     /**
853      * Method converts OF GroupAction object to SAL GroupAction object
854      *
855      * @param action
856      * @return GroupAction
857      */
858     public static GroupActionCase ofToSALGroupAction(
859             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
860
861         GroupActionBuilder groupAction = new GroupActionBuilder();
862
863         GroupIdAction groupId = action.getAugmentation(GroupIdAction.class);
864         groupAction.setGroupId(groupId.getGroupId());
865
866         return new GroupActionCaseBuilder().setGroupAction(groupAction.build()).build();
867     }
868
869     /**
870      * Method converts OF SetMplsTTL action object to SAL SetMplsTTL action
871      * object.
872      *
873      * @param action
874      * @return
875      */
876     public static SetMplsTtlActionCase ofToSALSetMplsTtl(
877             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
878
879         SetMplsTtlActionBuilder mplsTtlAction = new SetMplsTtlActionBuilder();
880         MplsTtlAction mplsTtl = action.getAugmentation(MplsTtlAction.class);
881         mplsTtlAction.setMplsTtl(mplsTtl.getMplsTtl());
882         return new SetMplsTtlActionCaseBuilder().setSetMplsTtlAction(mplsTtlAction.build()).build();
883     }
884
885     /**
886      * Method converts OF Pushvlan action to SAL PushVlan action.
887      *
888      * @param action
889      * @return PushVlanAction
890      */
891     public static PushVlanActionCase ofToSALPushVlanAction(
892             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
893
894         PushVlanActionBuilder pushVlanAction = new PushVlanActionBuilder();
895
896         EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
897         pushVlanAction.setVlanId(new VlanId(etherType.getEthertype().getValue()));
898
899         return new PushVlanActionCaseBuilder().setPushVlanAction(pushVlanAction.build()).build();
900     }
901
902     /**
903      * Method converts OF SetQueue action to SAL SetQueue action.
904      *
905      * @param action
906      * @return SetQueueAction
907      */
908     public static SetQueueActionCase ofToSALSetQueue(
909             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
910
911         SetQueueActionBuilder setQueueAction = new SetQueueActionBuilder();
912
913         QueueIdAction queueId = action.getAugmentation(QueueIdAction.class);
914         setQueueAction.setQueueId(queueId.getQueueId());
915
916         return new SetQueueActionCaseBuilder().setSetQueueAction(setQueueAction.build()).build();
917     }
918
919     /**
920      * Method converts OF SetNwTtl action to SAL SetNwTtl action.
921      *
922      * @param action
923      * @return SetNwTtlAction
924      */
925     public static SetNwTtlActionCase ofToSALSetNwTtl(
926             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
927
928         SetNwTtlActionBuilder setNwTtl = new SetNwTtlActionBuilder();
929         NwTtlAction nwTtl = action.getAugmentation(NwTtlAction.class);
930         setNwTtl.setNwTtl(nwTtl.getNwTtl());
931
932         return new SetNwTtlActionCaseBuilder().setSetNwTtlAction(setNwTtl.build()).build();
933     }
934
935     /**
936      * Method converts OF Pushvlan action to SAL PushVlan action.
937      *
938      * @param action
939      * @return PushVlanAction
940      */
941     public static PushPbbActionCase ofToSALPushPbbAction(
942             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
943
944         PushPbbActionBuilder pushPbbAction = new PushPbbActionBuilder();
945
946         EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
947         pushPbbAction.setEthernetType(etherType.getEthertype().getValue());
948
949         return new PushPbbActionCaseBuilder().setPushPbbAction(pushPbbAction.build()).build();
950     }
951
952     public static Object ofToSALExperimenter(
953             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
954
955         ExperimenterAction ExperimenterAction = action.getAugmentation(ExperimenterAction.class);
956
957         return null;
958         /*
959          * TODO: Need to explore/discuss about how to handle experimenter
960          */
961
962     }
963 }