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