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