a94058fe29462a0e5121e2a91edb0ab336e38e24
[genius.git] / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / genius / mdsalutil / ActionType.java
1 /*
2  * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.genius.mdsalutil;
9
10 import java.math.BigInteger;
11 import java.net.InetAddress;
12
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
45 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropAction;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.add.group.input.buckets.bucket.action.action.NxActionResubmitRpcAddGroupCaseBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nodes.node.table.flow.instructions.instruction.instruction.apply.actions._case.apply.actions.action.action.NxActionConntrackNodesNodeTableFlowApplyActionsCaseBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.NxConntrack;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.conntrack.grouping.NxConntrackBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.nicira.action.rev140714.nx.action.resubmit.grouping.NxResubmitBuilder;
60
61 public enum ActionType {
62     group {
63         @Override
64         public Action buildAction(ActionInfo actionInfo) {
65             long groupId = Long.parseLong(actionInfo.getActionValues()[0]);
66
67             return new ActionBuilder().setAction(
68                             new GroupActionCaseBuilder().setGroupAction(
69                                     new GroupActionBuilder().setGroupId(groupId).build()).build())
70                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
71         }
72     },
73
74     output {
75         @Override
76         public Action buildAction(ActionInfo actionInfo) {
77             String[] actionValues = actionInfo.getActionValues();
78             String port = actionValues[0];
79             int maxLength = 0;
80
81             if (actionValues.length == 2) {
82                 maxLength = Integer.valueOf(actionValues[1]);
83             }
84
85             return new ActionBuilder().setAction(
86                     new OutputActionCaseBuilder().setOutputAction(
87                             new OutputActionBuilder().setMaxLength(Integer.valueOf(maxLength))
88                                             .setOutputNodeConnector(new Uri(port)).build()).build())
89                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
90         }
91     },
92
93     pop_mpls {
94         @Override
95         public Action buildAction(ActionInfo actionInfo) {
96             return new ActionBuilder().setAction(
97                     new PopMplsActionCaseBuilder().setPopMplsAction(
98                             new PopMplsActionBuilder().setEthernetType(
99                                     Integer.valueOf(NwConstants.ETHTYPE_IPV4)).build()).build())
100
101                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
102         }
103     },
104
105     pop_pbb {
106         @Override
107         public Action buildAction(ActionInfo actionInfo) {
108             return new ActionBuilder()
109                     .setAction(new PopPbbActionCaseBuilder().setPopPbbAction(new PopPbbActionBuilder().build()).build())
110                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
111         }
112     },
113
114     pop_vlan {
115         @Override
116         public Action buildAction(ActionInfo actionInfo) {
117             return new ActionBuilder().setAction(
118                     new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
119                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
120         }
121     },
122
123     push_mpls {
124         @Override
125         public Action buildAction(ActionInfo actionInfo) {
126             return new ActionBuilder().setAction(new PushMplsActionCaseBuilder().setPushMplsAction(
127                                     new PushMplsActionBuilder().setEthernetType(
128                                             Integer.valueOf(NwConstants.ETHTYPE_MPLS_UC)).build()).build())
129                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
130         }
131     },
132
133     push_pbb {
134         @Override
135         public Action buildAction(ActionInfo actionInfo) {
136             return new ActionBuilder().setAction(
137                     new PushPbbActionCaseBuilder().setPushPbbAction(
138                                     new PushPbbActionBuilder()
139                                             .setEthernetType(Integer.valueOf(NwConstants.ETHTYPE_PBB)).build()).build())
140                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
141         }
142     },
143
144     push_vlan {
145         @Override
146         public Action buildAction(ActionInfo actionInfo) {
147             return new ActionBuilder().setAction(
148                     new PushVlanActionCaseBuilder().setPushVlanAction(
149                                     new PushVlanActionBuilder().setEthernetType(
150                                             Integer.valueOf(NwConstants.ETHTYPE_802_1Q)).build()).build())
151                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
152         }
153     },
154
155     set_field_mpls_label {
156         @Override
157         public Action buildAction(ActionInfo actionInfo) {
158             String[] actionValues = actionInfo.getActionValues();
159             long label = Long.valueOf(actionValues[0]);
160
161             return new ActionBuilder().setAction(
162                     new SetFieldCaseBuilder().setSetField(new SetFieldBuilder().setProtocolMatchFields(
163                                             new ProtocolMatchFieldsBuilder().setMplsLabel(label).build()).build())
164                                     .build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
165         }
166     },
167
168     set_field_pbb_isid {
169         @Override
170         public Action buildAction(ActionInfo actionInfo) {
171             String[] actionValues = actionInfo.getActionValues();
172             long label = Long.valueOf(actionValues[0]);
173
174             return new ActionBuilder().setAction(
175                     new SetFieldCaseBuilder().setSetField(
176                             new SetFieldBuilder().setProtocolMatchFields(
177                                             new ProtocolMatchFieldsBuilder().setPbb(
178                                                     new PbbBuilder().setPbbIsid(label).build()).build()).build())
179                                     .build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
180         }
181     },
182
183     set_field_vlan_vid {
184         @Override
185         public Action buildAction(ActionInfo actionInfo) {
186             String[] actionValues = actionInfo.getActionValues();
187             int vlanId = Integer.valueOf(actionValues[0]);
188
189             return new ActionBuilder().setAction(
190                     new SetFieldCaseBuilder().setSetField(
191                             new SetFieldBuilder().setVlanMatch(
192                                     new VlanMatchBuilder().setVlanId(
193                                                     new VlanIdBuilder().setVlanId(new VlanId(vlanId))
194                                                             .setVlanIdPresent(true).build()).build()).build()).build())
195                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
196         }
197     },
198
199     set_field_tunnel_id {
200         @Override
201         public Action buildAction(ActionInfo actionInfo) {
202             BigInteger [] actionValues = actionInfo.getBigActionValues();
203             if (actionValues.length == 2) {
204                 return new ActionBuilder().setAction(
205                     new SetFieldCaseBuilder().setSetField(
206                         new SetFieldBuilder()
207                             .setTunnel(new TunnelBuilder().setTunnelId(actionValues[0])
208                                            .setTunnelMask(actionValues[1]).build()).build())
209                         .build())
210                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
211             } else {
212                 return new ActionBuilder().setAction(
213                     new SetFieldCaseBuilder().setSetField(
214                         new SetFieldBuilder()
215                             .setTunnel(new TunnelBuilder().setTunnelId(actionValues[0])
216                                            .build()).build())
217                         .build())
218                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
219             }
220
221         }
222
223     },
224
225     set_field_eth_dest {
226
227         @Override
228         public Action buildAction(ActionInfo actionInfo) {
229             String[] actionValues = actionInfo.getActionValues();
230             MacAddress mac = new MacAddress(actionValues[0]);
231
232             return new ActionBuilder().setAction(
233                     new SetFieldCaseBuilder().setSetField(
234                             new SetFieldBuilder().setEthernetMatch(
235                                     new EthernetMatchBuilder().setEthernetDestination(
236                                                     new EthernetDestinationBuilder().setAddress(mac).build()).build())
237                                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
238
239         }
240
241     },
242
243     set_udp_protocol {
244
245         @Override
246         public Action buildAction(ActionInfo actionInfo) {
247             return new ActionBuilder().setAction(
248                     new SetFieldCaseBuilder().setSetField(
249                             new SetFieldBuilder().setIpMatch(
250                                     new IpMatchBuilder().setIpProtocol((short) 17).build()).
251                                     build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
252
253         }
254
255     },
256     punt_to_controller {
257         @Override
258         public Action buildAction(ActionInfo actionInfo) {
259             ActionBuilder ab = new ActionBuilder();
260             OutputActionBuilder output = new OutputActionBuilder();
261             output.setMaxLength(0xffff);
262             Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
263             output.setOutputNodeConnector(value);
264             ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
265             ab.setKey(new ActionKey(actionInfo.getActionKey()));
266             return ab.build();
267         }
268
269     },
270     set_udp_destination_port {
271
272         @Override
273         public Action buildAction(ActionInfo actionInfo) {
274             String[] actionValues = actionInfo.getActionValues();
275             Integer portNumber = new Integer(actionValues[0]);
276
277             return new ActionBuilder().setAction(
278                     new SetFieldCaseBuilder().setSetField(
279                             new SetFieldBuilder().setLayer4Match(
280                                     new UdpMatchBuilder().setUdpDestinationPort(
281                                             new PortNumber(portNumber)).build())
282                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
283
284         }
285
286     },
287     set_udp_source_port {
288
289         @Override
290         public Action buildAction(ActionInfo actionInfo) {
291             String[] actionValues = actionInfo.getActionValues();
292             Integer portNumber = new Integer(actionValues[0]);
293
294             return new ActionBuilder().setAction(
295                     new SetFieldCaseBuilder().setSetField(
296                             new SetFieldBuilder().setLayer4Match(
297                                     new UdpMatchBuilder().setUdpSourcePort(
298                                             new PortNumber(portNumber)).build())
299                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
300
301         }
302
303     },
304     set_tcp_destination_port {
305
306         @Override
307         public Action buildAction(ActionInfo actionInfo) {
308             String[] actionValues = actionInfo.getActionValues();
309             Integer portNumber = new Integer(actionValues[0]);
310
311             return new ActionBuilder().setAction(
312                     new SetFieldCaseBuilder().setSetField(
313                             new SetFieldBuilder().setLayer4Match(
314                                     new TcpMatchBuilder().setTcpDestinationPort(
315                                             new PortNumber(portNumber)).build())
316                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
317
318         }
319
320     },
321     set_tcp_source_port {
322
323         @Override
324         public Action buildAction(ActionInfo actionInfo) {
325             String[] actionValues = actionInfo.getActionValues();
326             Integer portNumber = new Integer(actionValues[0]);
327
328             return new ActionBuilder().setAction(
329                     new SetFieldCaseBuilder().setSetField(
330                             new SetFieldBuilder().setLayer4Match(
331                                     new TcpMatchBuilder().setTcpSourcePort(
332                                             new PortNumber(portNumber)).build())
333                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
334
335         }
336
337     },
338     set_source_ip {
339         @Override
340         public Action buildAction(ActionInfo actionInfo) {
341             String[] actionValues = actionInfo.getActionValues();
342             String sourceIp = actionValues[0];
343             String sourceMask = (actionValues.length > 1) ? actionValues[1] : "32";
344             String source = sourceIp + "/" + sourceMask;
345             return new ActionBuilder().setAction(
346                                         new SetFieldCaseBuilder().setSetField(
347                                                 new SetFieldBuilder().setLayer3Match(
348                                                         new Ipv4MatchBuilder().setIpv4Source(
349                                                                 new Ipv4Prefix(source)).build()).
350                                                                 build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
351
352
353         }
354
355     },
356     set_destination_ip {
357
358         @Override
359         public Action buildAction(ActionInfo actionInfo) {
360             String[] actionValues = actionInfo.getActionValues();
361             String destIp = actionValues[0];
362             String destMask = (actionValues.length > 1) ? actionValues[1] : "32";
363             String destination = destIp + "/" + destMask;
364             return new ActionBuilder().setAction(
365                     new SetFieldCaseBuilder().setSetField(
366                             new SetFieldBuilder().setLayer3Match(
367                                     new Ipv4MatchBuilder().setIpv4Destination(
368                                             new Ipv4Prefix(destination)).build()).
369                                             build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
370
371         }
372
373     },
374     set_field_eth_src {
375
376         @Override
377         public Action buildAction(ActionInfo actionInfo) {
378             String[] actionValues = actionInfo.getActionValues();
379             MacAddress mac = new MacAddress(actionValues[0]);
380
381             return new ActionBuilder().setAction(
382                     new SetFieldCaseBuilder().setSetField(
383                             new SetFieldBuilder().setEthernetMatch(
384                                     new EthernetMatchBuilder().setEthernetSource(
385                                                     new EthernetSourceBuilder().setAddress(mac).build()).build())
386                                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
387
388         }
389     },
390
391     drop_action {
392
393         @Override
394         public Action buildAction(ActionInfo actionInfo) {
395             DropActionBuilder dab = new DropActionBuilder();
396             DropAction dropAction = dab.build();
397             ActionBuilder ab = new ActionBuilder();
398             ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build());
399             ab.setKey(new ActionKey(actionInfo.getActionKey())).build();
400             return ab.build();
401         }
402     },
403
404     nx_resubmit {
405
406         @Override
407         public Action buildAction(ActionInfo actionInfo) {
408             String[] actionValues = actionInfo.getActionValues();
409             NxResubmitBuilder nxarsb = new NxResubmitBuilder();
410             nxarsb.setTable(Short.parseShort(actionValues[0]));
411             ActionBuilder ab = new ActionBuilder();
412             ab.setAction(new NxActionResubmitRpcAddGroupCaseBuilder().setNxResubmit(nxarsb.build()).build());
413             ab.setKey(new ActionKey(actionInfo.getActionKey()));
414             return ab.build();
415         }
416     },
417
418     goto_table {
419
420         @Override
421         public Action buildAction(ActionInfo actionInfo) {
422             ActionBuilder ab = new ActionBuilder();
423             return null;
424         }
425     },
426     nx_conntrack {
427         @Override
428         public Action buildAction(ActionInfo actionInfo) {
429             String[] actionValues = actionInfo.getActionValues();
430             Integer flags = new Integer(actionValues[0]);
431             Long zoneSrc = new Long(actionValues[1]);
432             Integer conntrackZone = new Integer(actionValues[2]);
433             Short recircTable = new Short(actionValues[3]);
434             NxConntrackBuilder ctb = new NxConntrackBuilder()
435                     .setFlags(flags)
436                     .setZoneSrc(zoneSrc)
437                     .setConntrackZone(conntrackZone)
438                     .setRecircTable(recircTable);
439             ActionBuilder ab = new ActionBuilder();
440             ab.setAction(new NxActionConntrackNodesNodeTableFlowApplyActionsCaseBuilder()
441                 .setNxConntrack(ctb.build()).build());
442             ab.setKey(new ActionKey(actionInfo.getActionKey()));
443             return ab.build();
444
445         }
446
447     };
448
449     private static final int RADIX_HEX = 16;
450     public abstract Action buildAction(ActionInfo actionInfo);
451 }