Modified as per gerrit 3314
[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         VlanId vlanId = new VlanId(pushVlanAction.getVlanId());
243         Integer etherType = vlanId.getValue();
244         actionBuilder.setType(PushVlan.class);
245
246         return SalToOFPushAction(etherType, actionBuilder, actionsListBuilder);
247
248     }
249
250     private static ActionsList SalToOFSetNwTtl(
251             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
252             ActionsListBuilder actionsListBuilder) {
253         ActionBuilder actionBuilder = new ActionBuilder();
254         SetNwTtlActionCase nwTtlActionCase = (SetNwTtlActionCase) action;
255         NwTtlActionBuilder nwTtlActionBuilder = new NwTtlActionBuilder();
256         nwTtlActionBuilder.setNwTtl(nwTtlActionCase.getSetNwTtlAction().getNwTtl());
257         actionBuilder.setType(SetNwTtl.class);
258         actionBuilder.addAugmentation(NwTtlAction.class, nwTtlActionBuilder.build());
259         actionsListBuilder.setAction(actionBuilder.build());
260         return actionsListBuilder.build();
261
262     }
263
264     private static ActionsList SalToOFSetQueue(
265             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
266             ActionsListBuilder actionsListBuilder) {
267         ActionBuilder actionBuilder = new ActionBuilder();
268         SetQueueActionCase setQueueActionCase = (SetQueueActionCase) action;
269         SetQueueAction setQueueAction = setQueueActionCase.getSetQueueAction();
270
271         QueueIdActionBuilder queueIdActionBuilder = new QueueIdActionBuilder();
272         queueIdActionBuilder.setQueueId(Long.getLong(setQueueAction.getQueue()));
273         actionBuilder.setType(SetQueue.class);
274         actionBuilder.addAugmentation(QueueIdAction.class, queueIdActionBuilder.build());
275
276         actionsListBuilder.setAction(actionBuilder.build());
277         return actionsListBuilder.build();
278     }
279
280     private static ActionsList SalToOFPopMpls(
281             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
282             ActionsListBuilder actionsListBuilder) {
283         ActionBuilder actionBuilder = new ActionBuilder();
284         PopMplsActionCase popMplsActionCase = (PopMplsActionCase) action;
285         actionBuilder.setType(PopMpls.class);
286
287         return SalToOFPushAction(popMplsActionCase.getPopMplsAction().getEthernetType(), actionBuilder, actionsListBuilder);
288     }
289
290     private static ActionsList SalToOFPopVlan(
291             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
292             ActionsListBuilder actionsListBuilder) {
293         ActionBuilder actionBuilder = new ActionBuilder();
294         actionBuilder.setType(PopVlan.class);
295
296         return emtpyAction(actionBuilder, actionsListBuilder);
297     }
298
299     private static ActionsList SalToOFPopPBB(
300             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
301             ActionsListBuilder actionsListBuilder) {
302         ActionBuilder actionBuilder = new ActionBuilder();
303         actionBuilder.setType(PopPbb.class);
304         return emtpyAction(actionBuilder, actionsListBuilder);
305     }
306
307     private static ActionsList SalToOFExperimenter(
308             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
309             ActionsListBuilder actionsListBuilder) {
310
311         ActionBuilder actionBuilder = new ActionBuilder();
312         ExperimenterActionBuilder experimenterActionBuilder = new ExperimenterActionBuilder();
313         experimenterActionBuilder.setExperimenter(((ExperimenterAction) action).getExperimenter());
314         actionBuilder.setType(Experimenter.class);
315         actionBuilder
316                 .addAugmentation(
317                         ExperimenterAction.class,
318                         (Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action>) experimenterActionBuilder);
319         actionsListBuilder.setAction(actionBuilder.build());
320         return actionsListBuilder.build();
321
322     }
323
324     private static ActionsList SalToOFGroupAction(
325             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
326             ActionsListBuilder actionsListBuilder) {
327
328         GroupActionCase groupActionCase = (GroupActionCase) action;
329         GroupAction groupAction = groupActionCase.getGroupAction();
330
331         GroupIdActionBuilder groupIdBuilder = new GroupIdActionBuilder();
332         groupIdBuilder.setGroupId(Long.getLong(groupAction.getGroup()));
333         ActionBuilder actionBuilder = new ActionBuilder();
334         actionBuilder.setType(Group.class);
335         actionBuilder.addAugmentation(GroupIdAction.class, groupIdBuilder.build());
336         actionsListBuilder.setAction(actionBuilder.build());
337         return actionsListBuilder.build();
338     }
339
340     private static ActionsList SalToOFPushAction(Integer ethernetType, ActionBuilder actionBuilder,
341             ActionsListBuilder actionsListBuilder) {
342
343         EthertypeActionBuilder ethertypeActionBuilder = new EthertypeActionBuilder();
344         ethertypeActionBuilder.setEthertype(new EtherType(ethernetType));
345
346         /* OF */
347         actionBuilder.addAugmentation(EthertypeAction.class, ethertypeActionBuilder.build());
348         actionsListBuilder.setAction(actionBuilder.build());
349         return actionsListBuilder.build();
350     }
351
352     private static ActionsList SalToOFDecMplsTtl(ActionsListBuilder actionsListBuilder) {
353         ActionBuilder actionBuilder = new ActionBuilder();
354         actionBuilder
355                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class);
356         return emtpyAction(actionBuilder, actionsListBuilder);
357     }
358
359     private static ActionsList SalToOFSetMplsTtl(
360             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
361             ActionsListBuilder actionsListBuilder) {
362         ActionBuilder actionBuilder = new ActionBuilder();
363
364         SetMplsTtlActionCase mplsTtlActionCase = (SetMplsTtlActionCase) action;
365         SetMplsTtlAction mplsTtlAction = mplsTtlActionCase.getSetMplsTtlAction();
366         
367
368         MplsTtlActionBuilder mplsTtlActionBuilder = new MplsTtlActionBuilder();
369         mplsTtlActionBuilder.setMplsTtl(mplsTtlAction.getMplsTtl()/* SAL */);
370         /* OF */
371         actionBuilder.setType(SetMplsTtl.class);
372         actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtlActionBuilder.build());
373         actionsListBuilder.setAction(actionBuilder.build());
374         return actionsListBuilder.build();
375     }
376
377     private static ActionsList SalToOFCopyTTLIIn(ActionsListBuilder actionsListBuilder) {
378         ActionBuilder actionBuilder = new ActionBuilder();
379         actionBuilder
380                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class);
381         return emtpyAction(actionBuilder, actionsListBuilder);
382     }
383
384     private static ActionsList SalToOFCopyTTLIOut(ActionsListBuilder actionsListBuilder) {
385         ActionBuilder actionBuilder = new ActionBuilder();
386         actionBuilder
387                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class);
388         return emtpyAction(actionBuilder, actionsListBuilder);
389
390     }
391
392     private static ActionsList emtpyAction(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
393
394         actionsListBuilder.setAction(actionBuilder.build());
395         return actionsListBuilder.build();
396     }
397
398     private static ActionsList salToOFOutputAction(
399             org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action,
400             ActionsListBuilder actionsListBuilder, short version) {
401
402         OutputActionCase outputActionCase = ((OutputActionCase) action);
403         OutputAction outputAction = outputActionCase.getOutputAction();
404         PortActionBuilder portAction = new PortActionBuilder();
405         MaxLengthActionBuilder maxLenActionBuilder = new MaxLengthActionBuilder();
406         maxLenActionBuilder.setMaxLength(outputAction.getMaxLength());
407         ActionBuilder actionBuilder = new ActionBuilder();
408         actionBuilder.addAugmentation(MaxLengthAction.class, maxLenActionBuilder.build());
409
410         Uri uri = outputAction.getOutputNodeConnector();
411         if (uri.getValue() == NodeConnectorIDType.ALL) {
412             if (version >= OF13) {
413                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.ALL.getIntValue())));
414
415             } else if (version == OF10) {
416                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.ALL.getIntValue()));
417
418             }
419         }
420         if (uri.getValue() == NodeConnectorIDType.SWSTACK) {
421             if (version >= OF13) {
422                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.LOCAL.getIntValue())));
423
424             } else if (version == OF10) {
425                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.LOCAL.getIntValue()));
426
427             }
428         }
429
430         if ((uri.getValue() == NodeConnectorIDType.HWPATH) || (uri.getValue() == NodeConnectorIDType.ONEPK)
431                 || (uri.getValue() == NodeConnectorIDType.ONEPK2OPENFLOW)
432                 || (uri.getValue() == NodeConnectorIDType.ONEPK2PCEP)
433                 || (uri.getValue() == NodeConnectorIDType.OPENFLOW)
434                 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2ONEPK)
435                 || (uri.getValue() == NodeConnectorIDType.OPENFLOW2PCEP)
436                 || (uri.getValue() == NodeConnectorIDType.PCEP) || (uri.getValue() == NodeConnectorIDType.PCEP2ONEPK)
437                 || (uri.getValue() == NodeConnectorIDType.PCEP2OPENFLOW)
438                 || (uri.getValue() == NodeConnectorIDType.PRODUCTION)) {
439             if (version >= OF13) {
440                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.NORMAL.getIntValue())));
441
442             } else if (version == OF10) {
443                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.NORMAL.getIntValue()));
444             }
445         }
446
447         if (uri.getValue() == NodeConnectorIDType.CONTROLLER) {
448
449             if (version >= OF13) {
450                 portAction.setPort(new PortNumber(BinContent.intToUnsignedLong(PortNumberValues.CONTROLLER
451                         .getIntValue())));
452
453             } else if (version == OF10) {
454                 portAction.setPort(new PortNumber((long) PortNumberValuesV10.CONTROLLER.getIntValue()));
455
456             }
457         }
458
459         actionBuilder
460                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
461         actionBuilder.addAugmentation(PortAction.class, portAction.build());
462         actionsListBuilder.setAction(actionBuilder.build());
463         return actionsListBuilder.build();
464     }
465
466     /**
467      * Method to convert OF actions associated with bucket to SAL Actions.
468      *
469      * @param actionList
470      * @return List of converted SAL Actions.
471      */
472     public static List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action> toSALBucketActions(
473             List<ActionsList> actionList) {
474
475         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>();
476         for (ActionsList actionDesc : actionList) {
477
478             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action = actionDesc
479                     .getAction();
480
481             if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class))
482                 bucketActions.add(ofToSALOutputAction(action));
483             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group.class))
484                 bucketActions.add(ofToSALGroupAction(action));
485             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class)){
486                 CopyTtlOutBuilder copyTtlOutaction = new CopyTtlOutBuilder();
487                 bucketActions.add(new CopyTtlOutCaseBuilder().setCopyTtlOut(copyTtlOutaction.build()).build());
488             }
489             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class)){
490                 CopyTtlInBuilder copyTtlInaction = new CopyTtlInBuilder();
491                 bucketActions.add(new CopyTtlInCaseBuilder().setCopyTtlIn(copyTtlInaction.build()).build());
492             }
493             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl.class))
494                 bucketActions.add(ofToSALSetMplsTtl(action));
495             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class)){
496                 DecMplsTtlBuilder decMplsTtl = new DecMplsTtlBuilder();
497                 bucketActions.add(new DecMplsTtlCaseBuilder().setDecMplsTtl(decMplsTtl.build()).build());
498             }
499             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan.class))
500                 bucketActions.add(ofToSALPushVlanAction(action));
501             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan.class)){
502                 PopVlanActionBuilder popVlan = new PopVlanActionBuilder();
503                 bucketActions.add(new PopVlanActionCaseBuilder().setPopVlanAction(popVlan.build()).build());
504             }
505             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls.class)){
506                 PushMplsActionBuilder pushMpls = new PushMplsActionBuilder();
507                 bucketActions.add(new PushMplsActionCaseBuilder().setPushMplsAction(pushMpls.build()).build());
508             }
509             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls.class)){
510                 PopMplsActionBuilder popMpls = new PopMplsActionBuilder();
511                 bucketActions.add(new PopMplsActionCaseBuilder().setPopMplsAction(popMpls.build()).build());
512             }
513             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue.class))
514                 bucketActions.add(ofToSALSetQueue(action));
515
516             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl.class))
517                 bucketActions.add(ofToSALSetNwTtl(action));
518             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl.class)){
519                 DecNwTtlBuilder decNwTtl = new DecNwTtlBuilder();
520                 bucketActions.add(new DecNwTtlCaseBuilder().setDecNwTtl(decNwTtl.build()).build());
521             }
522             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField.class))
523                 bucketActions.add(new SetFieldCaseBuilder().setSetField(MatchConvertor.ofToSALSetField(action)).build());
524
525             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb.class))
526                 bucketActions.add(ofToSALPushPbbAction(action));
527             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb.class)){
528                 PopPbbActionBuilder popPbb = new PopPbbActionBuilder();
529                 bucketActions.add(new PopPbbActionCaseBuilder().setPopPbbAction(popPbb.build()).build());
530             }
531             else if (action.getType().equals(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter.class)){
532                 //bucketActions.add(ofToSALExperimenter(action));
533                 // TODO: Need to explore/discuss on how to handle experimenter case.
534             }
535
536         }
537         return bucketActions;
538     }
539
540     /**
541      * Method converts OF Output action object to SAL Output action object.
542      *
543      * @param action
544      *            org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.
545      *            action.rev130731.actions.actions.list.Action
546      * @return OutputAction
547      */
548     public static OutputActionCase ofToSALOutputAction(
549             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
550
551         OutputActionBuilder outputAction = new OutputActionBuilder();
552         PortAction port = action.getAugmentation(PortAction.class);
553         if (port != null) {
554             outputAction.setOutputNodeConnector(new Uri(port.getPort().getValue().toString()));
555         } else {
556             logger.error("Provided action is not OF Output action, no associated port found!");
557         }
558
559         MaxLengthAction length = action.getAugmentation(MaxLengthAction.class);
560         if (length != null) {
561             outputAction.setMaxLength(length.getMaxLength());
562         } else {
563             logger.error("Provided action is not OF Output action, no associated length found!");
564         }
565
566         return new OutputActionCaseBuilder().setOutputAction(outputAction.build()).build();
567     }
568
569     /**
570      * Method converts OF GroupAction object to SAL GroupAction object
571      *
572      * @param action
573      * @return GroupAction
574      */
575     public static GroupActionCase ofToSALGroupAction(
576             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
577
578         GroupActionBuilder groupAction = new GroupActionBuilder();
579
580         GroupIdAction groupId = action.getAugmentation(GroupIdAction.class);
581         groupAction.setGroupId(groupId.getGroupId());
582
583         return new GroupActionCaseBuilder().setGroupAction(groupAction.build()).build();
584     }
585
586     /**
587      * Method converts OF SetMplsTTL action object to SAL SetMplsTTL action
588      * object.
589      *
590      * @param action
591      * @return
592      */
593     public static SetMplsTtlActionCase ofToSALSetMplsTtl(
594             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
595
596         SetMplsTtlActionBuilder mplsTtlAction = new SetMplsTtlActionBuilder();
597         MplsTtlAction mplsTtl = action.getAugmentation(MplsTtlAction.class);
598         mplsTtlAction.setMplsTtl(mplsTtl.getMplsTtl());
599         return new SetMplsTtlActionCaseBuilder().setSetMplsTtlAction(mplsTtlAction.build()).build();
600     }
601
602     /**
603      * Method converts OF Pushvlan action to SAL PushVlan action.
604      *
605      * @param action
606      * @return PushVlanAction
607      */
608     public static PushVlanActionCase ofToSALPushVlanAction(
609             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
610
611         PushVlanActionBuilder pushVlanAction = new PushVlanActionBuilder();
612
613         EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
614         pushVlanAction.setVlanId(new VlanId(etherType.getEthertype().getValue()));
615
616         return new PushVlanActionCaseBuilder().setPushVlanAction(pushVlanAction.build()).build();
617     }
618
619     /**
620      * Method converts OF SetQueue action to SAL SetQueue action.
621      *
622      * @param action
623      * @return SetQueueAction
624      */
625     public static SetQueueActionCase ofToSALSetQueue(
626             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
627
628         SetQueueActionBuilder setQueueAction = new SetQueueActionBuilder();
629
630         QueueIdAction queueId = action.getAugmentation(QueueIdAction.class);
631         setQueueAction.setQueueId(queueId.getQueueId());
632
633         return new SetQueueActionCaseBuilder().setSetQueueAction(setQueueAction.build()).build();
634     }
635
636     /**
637      * Method converts OF SetNwTtl action to SAL SetNwTtl action.
638      *
639      * @param action
640      * @return SetNwTtlAction
641      */
642     public static SetNwTtlActionCase ofToSALSetNwTtl(
643             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
644
645         SetNwTtlActionBuilder setNwTtl = new SetNwTtlActionBuilder();
646         NwTtlAction nwTtl = action.getAugmentation(NwTtlAction.class);
647         setNwTtl.setNwTtl(nwTtl.getNwTtl());
648
649         return new SetNwTtlActionCaseBuilder().setSetNwTtlAction(setNwTtl.build()).build();
650     }
651
652     /**
653      * Method converts OF Pushvlan action to SAL PushVlan action.
654      *
655      * @param action
656      * @return PushVlanAction
657      */
658     public static PushPbbActionCase ofToSALPushPbbAction(
659             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
660
661         PushPbbActionBuilder pushPbbAction = new PushPbbActionBuilder();
662
663         EthertypeAction etherType = action.getAugmentation(EthertypeAction.class);
664         pushPbbAction.setEthernetType(etherType.getEthertype().getValue());
665
666         return new PushPbbActionCaseBuilder().setPushPbbAction(pushPbbAction.build()).build();
667     }
668
669     public static Object ofToSALExperimenter(
670             org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action action) {
671
672         ExperimenterAction ExperimenterAction = action.getAugmentation(ExperimenterAction.class);
673
674         return null;
675         /*
676          * TODO: Need to explore/discuss about how to handle experimenter
677          */
678
679     }
680 }