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