popListener mapping
[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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
8 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action;
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.CopyTtlOut;
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtl;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupAction;
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputAction;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsAction;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbAction;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanAction;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsAction;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbAction;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanAction;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlAction;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlAction;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetQueueAction;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdActionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlAction;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsList;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.ActionsListBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.ActionBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
56 import org.opendaylight.yangtools.yang.binding.Augmentation;
57 import org.openflow.protocol.OFPort;
58
59
60
61
62
63
64
65 /**
66  * @author usha@ericsson Action List:This class takes data from SAL layer and
67  *         converts into OF Data
68  *
69  */
70 public final class ActionConvertor {
71
72     private ActionConvertor() {
73         // NOOP
74     }
75
76     public static List<ActionsList> getActionList(
77             List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actions)
78
79     {
80         ActionBuilder  actionBuilder = new ActionBuilder();
81         ActionsListBuilder actionsListBuilder = new ActionsListBuilder();
82       List<ActionsList> actionsList = new ArrayList<ActionsList>();
83
84         for (int actionItem = 0; actionItem < actions.size(); actionItem++)
85       {
86             Action action = actions.get(
87                     actionItem).getAction();
88
89             if (action instanceof OutputAction)
90                actionsList.add(salToOFOutputAction(action,actionBuilder,actionsListBuilder));
91             else if (action instanceof GroupAction)
92                 actionsList.add(SalToOFGroupAction(action, actionBuilder, actionsListBuilder));
93             else if (action instanceof CopyTtlOut)
94                 actionsList.add(SalToOFCopyTTLIOut(actionBuilder, actionsListBuilder));
95             else if (action instanceof CopyTtlIn)
96                 actionsList.add(SalToOFCopyTTLIIn(actionBuilder, actionsListBuilder));
97             else if (action instanceof SetMplsTtlAction)
98                 actionsList.add(SalToOFSetMplsTtl(action, actionBuilder, actionsListBuilder));
99             else if (action instanceof DecMplsTtl)
100                 actionsList.add(SalToOFDecMplsTtl(actionBuilder, actionsListBuilder));
101             else if (action instanceof PushVlanAction)
102                 actionsList.add(SalToOFPushVlanAction(action, actionBuilder, actionsListBuilder));
103             else if (action instanceof PopVlanAction)
104                 actionsList.add(SalToOFPopVlan(action, actionBuilder, actionsListBuilder));
105             else if (action instanceof PushMplsAction)
106                 actionsList.add(SalToOFPushMplsAction(action, actionBuilder, actionsListBuilder));
107             else if (action instanceof PopMplsAction)
108                 actionsList.add(SalToOFPopMpls(action, actionBuilder, actionsListBuilder));
109             else if (action instanceof SetQueueAction)
110                 actionsList.add(SalToOFSetQueue(action, actionBuilder, actionsListBuilder));
111
112             else if (action instanceof SetNwTtlAction)
113                 actionsList.add(SalToOFSetNwTtl(action, actionBuilder, actionsListBuilder));
114             else if (action instanceof DecNwTtl)
115                 actionsList.add(SalToOFDecNwTtl(action, actionBuilder, actionsListBuilder));
116             // else if(action instanceof SetF) //TODO:SAL Class Missing //
117             // actionsList.add(SalToOFSetField(action));
118             else if (action instanceof PushPbbAction)
119                 actionsList.add(SalToOFPushPbbAction(action, actionBuilder, actionsListBuilder));
120             else if (action instanceof PopPbbAction)
121                 actionsList.add(SalToOFPopPBB(action, actionBuilder, actionsListBuilder));
122             else if (action instanceof ExperimenterAction)
123                 actionsList.add(SalToOFExperimenter(action, actionBuilder, actionsListBuilder));
124
125         }
126         return actionsList;
127
128
129     }
130
131
132     private static ActionsList SalToOFDecNwTtl(Action action, ActionBuilder actionBuilder,
133             ActionsListBuilder actionsListBuilder) {
134         actionBuilder.setType(DecNwTtl.class);
135
136         return emtpyAction(actionBuilder, actionsListBuilder);
137     }
138
139     private static ActionsList SalToOFPushMplsAction(
140 Action action, ActionBuilder actionBuilder,
141             ActionsListBuilder actionsListBuilder) {
142
143         actionBuilder.setType(PushMpls.class);
144
145         return SalToOFPushAction(((PushMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
146
147     }
148
149     private static ActionsList SalToOFPushPbbAction(
150 Action action, ActionBuilder actionBuilder,
151             ActionsListBuilder actionsListBuilder) {
152         actionBuilder.setType(PushPbb.class);
153
154         return SalToOFPushAction(((PushPbbAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
155     }
156
157     private static ActionsList SalToOFPushVlanAction(
158 Action action, ActionBuilder actionBuilder,
159             ActionsListBuilder actionsListBuilder) {
160
161         PushVlanAction pushVlanAction = (PushVlanAction) action;
162         VlanId vlanId = new VlanId(pushVlanAction.getVlanId());
163         Integer etherType = vlanId.getValue();
164         actionBuilder.setType(PushVlan.class);
165
166         return SalToOFPushAction(etherType, actionBuilder, actionsListBuilder);
167
168     }
169
170     private static ActionsList SalToOFSetNwTtl(
171 Action action, ActionBuilder actionBuilder,
172             ActionsListBuilder actionsListBuilder) {
173
174         NwTtlActionBuilder nwTtlActionBuilder = new NwTtlActionBuilder();
175         nwTtlActionBuilder.setNwTtl(((SetNwTtlAction) action).getNwTtl());
176
177
178         actionBuilder.setType(SetNwTtl.class);
179         actionBuilder.addAugmentation(NwTtlAction.class, nwTtlActionBuilder.build());
180         actionsListBuilder.setAction(actionBuilder.build());
181         return actionsListBuilder.build();
182
183     }
184
185     private static ActionsList SalToOFSetQueue(
186 Action action, ActionBuilder actionBuilder,
187             ActionsListBuilder actionsListBuilder) {
188
189         SetQueueAction setQueueAction = (SetQueueAction) action;
190
191         QueueIdActionBuilder queueIdActionBuilder = new QueueIdActionBuilder();
192         queueIdActionBuilder.setQueueId(Long.getLong(setQueueAction.getQueue()));
193         actionBuilder.setType(SetQueue.class);
194         actionBuilder.addAugmentation(QueueIdAction.class, queueIdActionBuilder.build());
195
196         actionsListBuilder.setAction(actionBuilder.build());
197         return actionsListBuilder.build();
198     }
199
200     private static ActionsList SalToOFPopMpls(
201 Action action, ActionBuilder actionBuilder,
202             ActionsListBuilder actionsListBuilder) {
203
204         actionBuilder.setType(PopMpls.class);
205
206         return SalToOFPushAction(((PopMplsAction) action).getEthernetType(), actionBuilder, actionsListBuilder);
207     }
208
209     private static ActionsList SalToOFPopVlan(
210 Action action, ActionBuilder actionBuilder,
211             ActionsListBuilder actionsListBuilder) {
212
213         actionBuilder.setType(PushMpls.class);
214
215         return emtpyAction(actionBuilder, actionsListBuilder);
216     }
217
218     private static ActionsList SalToOFPopPBB(Action action, ActionBuilder actionBuilder,
219             ActionsListBuilder actionsListBuilder) {
220         actionBuilder.setType(PopPbb.class);
221         return emtpyAction(actionBuilder, actionsListBuilder);
222     }
223
224     private static ActionsList SalToOFExperimenter(
225 Action action, ActionBuilder actionBuilder,
226             ActionsListBuilder actionsListBuilder) {
227
228         ExperimenterActionBuilder experimenterActionBuilder = new ExperimenterActionBuilder();
229         experimenterActionBuilder.setExperimenter(((ExperimenterAction) action).getExperimenter());
230         actionBuilder.setType(Experimenter.class);
231         actionBuilder
232                 .addAugmentation(
233                         ExperimenterAction.class,
234                         (Augmentation<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.actions.list.Action>) experimenterActionBuilder);
235         actionsListBuilder.setAction(actionBuilder.build());
236         return actionsListBuilder.build();
237
238     }
239
240     private static ActionsList SalToOFGroupAction(
241 Action action, ActionBuilder actionBuilder,
242             ActionsListBuilder actionsListBuilder) {
243
244         GroupAction groupAction = (GroupAction) action;
245
246         GroupIdActionBuilder groupIdBuilder = new GroupIdActionBuilder();
247         groupIdBuilder.setGroupId(Long.getLong(groupAction.getGroup()));
248         actionBuilder.setType(Group.class);
249         actionBuilder.addAugmentation(GroupIdAction.class, groupIdBuilder.build());
250         actionsListBuilder.setAction(actionBuilder.build());
251         return actionsListBuilder.build();
252     }
253
254     private static ActionsList SalToOFPushAction(Integer ethernetType, ActionBuilder actionBuilder,
255             ActionsListBuilder actionsListBuilder) {
256
257         EthertypeActionBuilder ethertypeActionBuilder = new EthertypeActionBuilder();
258         ethertypeActionBuilder.setEthertype(new EtherType(ethernetType));
259
260         /* OF */
261         actionBuilder.addAugmentation(EthertypeAction.class, ethertypeActionBuilder.build());
262         actionsListBuilder.setAction(actionBuilder.build());
263         return actionsListBuilder.build();
264     }
265
266     private static ActionsList SalToOFDecMplsTtl(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
267         actionBuilder
268                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl.class);
269         return emtpyAction(actionBuilder, actionsListBuilder);
270     }
271
272     private static ActionsList SalToOFSetMplsTtl(
273 Action action, ActionBuilder actionBuilder,
274             ActionsListBuilder actionsListBuilder) {
275
276         SetMplsTtlAction mplsTtlAction = (SetMplsTtlAction) action;
277
278         MplsTtlActionBuilder mplsTtlActionBuilder = new MplsTtlActionBuilder();
279         mplsTtlActionBuilder.setMplsTtl(mplsTtlAction.getMplsTtl()/* SAL */);
280         /* OF */
281         actionBuilder.setType(SetMplsTtl.class);
282         actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtlActionBuilder.build());
283         actionsListBuilder.setAction(actionBuilder.build());
284         return actionsListBuilder.build();
285     }
286
287     private static ActionsList SalToOFCopyTTLIIn(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
288         actionBuilder
289                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn.class);
290         return emtpyAction(actionBuilder, actionsListBuilder);
291     }
292
293     private static ActionsList SalToOFCopyTTLIOut(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
294         actionBuilder
295                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut.class);
296         return emtpyAction(actionBuilder, actionsListBuilder);
297
298     }
299
300     private static ActionsList emtpyAction(ActionBuilder actionBuilder, ActionsListBuilder actionsListBuilder) {
301
302         actionsListBuilder.setAction(actionBuilder.build());
303         return actionsListBuilder.build();
304     }
305
306     private static ActionsList salToOFOutputAction(Action action, ActionBuilder actionBuilder,
307             ActionsListBuilder actionsListBuilder) {
308
309
310         OutputAction outputAction = ((OutputAction) action);
311         PortActionBuilder portAction = new PortActionBuilder();
312         MaxLengthActionBuilder maxLenActionBuilder = new MaxLengthActionBuilder();
313         maxLenActionBuilder.setMaxLength(outputAction.getMaxLength());
314
315         actionBuilder.addAugmentation(MaxLengthAction.class, maxLenActionBuilder.build());
316
317         Uri uri = outputAction.getOutputNodeConnector();
318             if (uri.getValue() == NodeConnectorIDType.ALL)
319                 portAction.setPort(new PortNumber((long) OFPort.OFPP_ALL.getValue()));
320
321             if (uri.getValue() == NodeConnectorIDType.SWSTACK)
322                 portAction.setPort(new PortNumber((long) OFPort.OFPP_LOCAL.getValue()));
323
324             if ((uri.getValue() == NodeConnectorIDType.HWPATH)
325  || (uri.getValue() == NodeConnectorIDType.ONEPK)
326                     || (uri.getValue() == NodeConnectorIDType.ONEPK2OPENFLOW)
327                     || (uri.getValue() == NodeConnectorIDType.ONEPK2PCEP)
328                     || (uri.getValue() == NodeConnectorIDType.OPENFLOW)
329                     || (uri.getValue() == NodeConnectorIDType.OPENFLOW2ONEPK)
330                     || (uri.getValue() == NodeConnectorIDType.OPENFLOW2PCEP)
331                     || (uri.getValue() == NodeConnectorIDType.PCEP)
332                     || (uri.getValue() == NodeConnectorIDType.PCEP2ONEPK)
333                     || (uri.getValue() == NodeConnectorIDType.PCEP2OPENFLOW)
334                 || (uri.getValue() == NodeConnectorIDType.PRODUCTION)) {
335                 portAction.setPort(new PortNumber((long) OFPort.OFPP_NORMAL.getValue()));
336             }
337
338             if (uri.getValue() == NodeConnectorIDType.CONTROLLER) {
339                 portAction.setPort(new PortNumber((long) OFPort.OFPP_CONTROLLER.getValue()));
340             }
341
342         actionBuilder
343                 .setType(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output.class);
344         actionBuilder.addAugmentation(PortAction.class, portAction.build());
345         actionsListBuilder.setAction(actionBuilder.build());
346         return actionsListBuilder.build();
347     }
348 }