Imported vpnservice as a subtree
[netvirt.git] / vpnservice / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / vpnservice / mdsalutil / ActionType.java
1 /*
2  * Copyright (c) 2015 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.vpnservice.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.rev100924.Uri;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.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.rev100924.Ipv4Prefix;
46 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.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.nx.action.resubmit.grouping.NxResubmitBuilder;
57
58 public enum ActionType {
59     group {
60         @Override
61         public Action buildAction(ActionInfo actionInfo) {
62             long groupId = Long.parseLong(actionInfo.getActionValues()[0]);
63
64             return new ActionBuilder().setAction(
65                             new GroupActionCaseBuilder().setGroupAction(
66                                     new GroupActionBuilder().setGroupId(groupId).build()).build())
67                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
68         }
69     },
70
71     output {
72         @Override
73         public Action buildAction(ActionInfo actionInfo) {
74             String[] actionValues = actionInfo.getActionValues();
75             String port = actionValues[0];
76             int maxLength = 0;
77
78             if (actionValues.length == 2) {
79                 maxLength = Integer.valueOf(actionValues[1]);
80             }
81
82             return new ActionBuilder().setAction(
83                     new OutputActionCaseBuilder().setOutputAction(
84                             new OutputActionBuilder().setMaxLength(Integer.valueOf(maxLength))
85                                             .setOutputNodeConnector(new Uri(port)).build()).build())
86                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
87         }
88     },
89
90     pop_mpls {
91         @Override
92         public Action buildAction(ActionInfo actionInfo) {
93             return new ActionBuilder().setAction(
94                     new PopMplsActionCaseBuilder().setPopMplsAction(
95                             new PopMplsActionBuilder().setEthernetType(
96                                     Integer.valueOf(NwConstants.ETHTYPE_IPV4)).build()).build())
97
98                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
99         }
100     },
101
102     pop_pbb {
103         @Override
104         public Action buildAction(ActionInfo actionInfo) {
105             return new ActionBuilder()
106                     .setAction(new PopPbbActionCaseBuilder().setPopPbbAction(new PopPbbActionBuilder().build()).build())
107                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
108         }
109     },
110
111     pop_vlan {
112         @Override
113         public Action buildAction(ActionInfo actionInfo) {
114             return new ActionBuilder().setAction(
115                     new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
116                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
117         }
118     },
119
120     push_mpls {
121         @Override
122         public Action buildAction(ActionInfo actionInfo) {
123             return new ActionBuilder().setAction(new PushMplsActionCaseBuilder().setPushMplsAction(
124                                     new PushMplsActionBuilder().setEthernetType(
125                                             Integer.valueOf(NwConstants.ETHTYPE_MPLS_UC)).build()).build())
126                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
127         }
128     },
129
130     push_pbb {
131         @Override
132         public Action buildAction(ActionInfo actionInfo) {
133             return new ActionBuilder().setAction(
134                     new PushPbbActionCaseBuilder().setPushPbbAction(
135                                     new PushPbbActionBuilder()
136                                             .setEthernetType(Integer.valueOf(NwConstants.ETHTYPE_PBB)).build()).build())
137                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
138         }
139     },
140
141     push_vlan {
142         @Override
143         public Action buildAction(ActionInfo actionInfo) {
144             return new ActionBuilder().setAction(
145                     new PushVlanActionCaseBuilder().setPushVlanAction(
146                                     new PushVlanActionBuilder().setEthernetType(
147                                             Integer.valueOf(NwConstants.ETHTYPE_802_1Q)).build()).build())
148                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
149         }
150     },
151
152     set_field_mpls_label {
153         @Override
154         public Action buildAction(ActionInfo actionInfo) {
155             String[] actionValues = actionInfo.getActionValues();
156             long label = Long.valueOf(actionValues[0]);
157
158             return new ActionBuilder().setAction(
159                     new SetFieldCaseBuilder().setSetField(new SetFieldBuilder().setProtocolMatchFields(
160                                             new ProtocolMatchFieldsBuilder().setMplsLabel(label).build()).build())
161                                     .build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
162         }
163     },
164
165     set_field_pbb_isid {
166         @Override
167         public Action buildAction(ActionInfo actionInfo) {
168             String[] actionValues = actionInfo.getActionValues();
169             long label = Long.valueOf(actionValues[0]);
170
171             return new ActionBuilder().setAction(
172                     new SetFieldCaseBuilder().setSetField(
173                             new SetFieldBuilder().setProtocolMatchFields(
174                                             new ProtocolMatchFieldsBuilder().setPbb(
175                                                     new PbbBuilder().setPbbIsid(label).build()).build()).build())
176                                     .build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
177         }
178     },
179
180     set_field_vlan_vid {
181         @Override
182         public Action buildAction(ActionInfo actionInfo) {
183             String[] actionValues = actionInfo.getActionValues();
184             int vlanId = Integer.valueOf(actionValues[0]);
185
186             return new ActionBuilder().setAction(
187                     new SetFieldCaseBuilder().setSetField(
188                             new SetFieldBuilder().setVlanMatch(
189                                     new VlanMatchBuilder().setVlanId(
190                                                     new VlanIdBuilder().setVlanId(new VlanId(vlanId))
191                                                             .setVlanIdPresent(true).build()).build()).build()).build())
192                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
193         }
194     },
195
196     set_field_tunnel_id {
197         @Override
198         public Action buildAction(ActionInfo actionInfo) {
199             BigInteger [] actionValues = actionInfo.getBigActionValues();
200             if (actionValues.length == 2) {
201                 return new ActionBuilder().setAction(
202                     new SetFieldCaseBuilder().setSetField(
203                         new SetFieldBuilder()
204                             .setTunnel(new TunnelBuilder().setTunnelId(actionValues[0])
205                                            .setTunnelMask(actionValues[1]).build()).build())
206                         .build())
207                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
208             } else {
209                 return new ActionBuilder().setAction(
210                     new SetFieldCaseBuilder().setSetField(
211                         new SetFieldBuilder()
212                             .setTunnel(new TunnelBuilder().setTunnelId(actionValues[0])
213                                            .build()).build())
214                         .build())
215                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
216             }
217
218         }
219
220     },
221
222     set_field_eth_dest {
223
224         @Override
225         public Action buildAction(ActionInfo actionInfo) {
226             String[] actionValues = actionInfo.getActionValues();
227             MacAddress mac = new MacAddress(actionValues[0]);
228
229             return new ActionBuilder().setAction(
230                     new SetFieldCaseBuilder().setSetField(
231                             new SetFieldBuilder().setEthernetMatch(
232                                     new EthernetMatchBuilder().setEthernetDestination(
233                                                     new EthernetDestinationBuilder().setAddress(mac).build()).build())
234                                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
235
236         }
237
238     },
239
240     set_udp_protocol {
241
242         @Override
243         public Action buildAction(ActionInfo actionInfo) {
244             return new ActionBuilder().setAction(
245                     new SetFieldCaseBuilder().setSetField(
246                             new SetFieldBuilder().setIpMatch(
247                                     new IpMatchBuilder().setIpProtocol((short) 17).build()).
248                                     build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
249
250         }
251
252     },
253     punt_to_controller {
254         @Override
255         public Action buildAction(ActionInfo actionInfo) {
256             ActionBuilder ab = new ActionBuilder();
257             OutputActionBuilder output = new OutputActionBuilder();
258             output.setMaxLength(0xffff);
259             Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
260             output.setOutputNodeConnector(value);
261             ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
262             ab.setKey(new ActionKey(actionInfo.getActionKey()));
263             return ab.build();
264         }
265
266     },
267     set_udp_destination_port {
268
269         @Override
270         public Action buildAction(ActionInfo actionInfo) {
271             String[] actionValues = actionInfo.getActionValues();
272             Integer portNumber = new Integer(actionValues[0]);
273
274             return new ActionBuilder().setAction(
275                     new SetFieldCaseBuilder().setSetField(
276                             new SetFieldBuilder().setLayer4Match(
277                                     new UdpMatchBuilder().setUdpDestinationPort(
278                                             new PortNumber(portNumber)).build())
279                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
280
281         }
282
283     },
284     set_udp_source_port {
285
286         @Override
287         public Action buildAction(ActionInfo actionInfo) {
288             String[] actionValues = actionInfo.getActionValues();
289             Integer portNumber = new Integer(actionValues[0]);
290
291             return new ActionBuilder().setAction(
292                     new SetFieldCaseBuilder().setSetField(
293                             new SetFieldBuilder().setLayer4Match(
294                                     new UdpMatchBuilder().setUdpSourcePort(
295                                             new PortNumber(portNumber)).build())
296                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
297
298         }
299
300     },
301     set_tcp_destination_port {
302
303         @Override
304         public Action buildAction(ActionInfo actionInfo) {
305             String[] actionValues = actionInfo.getActionValues();
306             Integer portNumber = new Integer(actionValues[0]);
307
308             return new ActionBuilder().setAction(
309                     new SetFieldCaseBuilder().setSetField(
310                             new SetFieldBuilder().setLayer4Match(
311                                     new TcpMatchBuilder().setTcpDestinationPort(
312                                             new PortNumber(portNumber)).build())
313                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
314
315         }
316
317     },
318     set_tcp_source_port {
319
320         @Override
321         public Action buildAction(ActionInfo actionInfo) {
322             String[] actionValues = actionInfo.getActionValues();
323             Integer portNumber = new Integer(actionValues[0]);
324
325             return new ActionBuilder().setAction(
326                     new SetFieldCaseBuilder().setSetField(
327                             new SetFieldBuilder().setLayer4Match(
328                                     new TcpMatchBuilder().setTcpSourcePort(
329                                             new PortNumber(portNumber)).build())
330                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
331
332         }
333
334     },
335     set_source_ip {
336
337         @Override
338         public Action buildAction(ActionInfo actionInfo) {
339             String[] actionValues = actionInfo.getActionValues();
340             InetAddress sourceIp = null;
341             try{
342                 sourceIp = InetAddress.getByName(actionValues[0]);
343             } catch (Exception e){
344                 e.printStackTrace();
345             }
346             return new ActionBuilder().setAction(
347                     new SetFieldCaseBuilder().setSetField(
348                             new SetFieldBuilder().setLayer3Match(
349                                     new Ipv4MatchBuilder().setIpv4Source(
350                                             new Ipv4Prefix(sourceIp.getHostAddress() + "/" + actionValues[1])).build()).
351                                             build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
352
353         }
354
355     },
356     set_destination_ip {
357
358         @Override
359         public Action buildAction(ActionInfo actionInfo) {
360             String[] actionValues = actionInfo.getActionValues();
361             InetAddress sourceIp = null;
362             try{
363                 sourceIp = InetAddress.getByName(actionValues[0]);
364             } catch (Exception e){
365                 e.printStackTrace();
366             }
367             return new ActionBuilder().setAction(
368                     new SetFieldCaseBuilder().setSetField(
369                             new SetFieldBuilder().setLayer3Match(
370                                     new Ipv4MatchBuilder().setIpv4Destination(
371                                             new Ipv4Prefix(sourceIp.getHostAddress() + "/" + actionValues[1])).build()).
372                                             build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
373
374         }
375
376     },
377     set_field_eth_src {
378
379         @Override
380         public Action buildAction(ActionInfo actionInfo) {
381             String[] actionValues = actionInfo.getActionValues();
382             MacAddress mac = new MacAddress(actionValues[0]);
383
384             return new ActionBuilder().setAction(
385                     new SetFieldCaseBuilder().setSetField(
386                             new SetFieldBuilder().setEthernetMatch(
387                                     new EthernetMatchBuilder().setEthernetSource(
388                                                     new EthernetSourceBuilder().setAddress(mac).build()).build())
389                                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
390
391         }
392     },
393
394     drop_action {
395
396         @Override
397         public Action buildAction(ActionInfo actionInfo) {
398             DropActionBuilder dab = new DropActionBuilder();
399             DropAction dropAction = dab.build();
400             ActionBuilder ab = new ActionBuilder();
401             ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build());
402             ab.setKey(new ActionKey(actionInfo.getActionKey())).build();
403             return ab.build();
404         }
405     },
406
407     nx_resubmit {
408
409         @Override
410         public Action buildAction(ActionInfo actionInfo) {
411             String[] actionValues = actionInfo.getActionValues();
412             NxResubmitBuilder nxarsb = new NxResubmitBuilder();
413             nxarsb.setTable(Short.parseShort(actionValues[0]));
414             ActionBuilder ab = new ActionBuilder();
415             ab.setAction(new NxActionResubmitRpcAddGroupCaseBuilder().setNxResubmit(nxarsb.build()).build());
416             ab.setKey(new ActionKey(actionInfo.getActionKey()));
417             return ab.build();
418         }
419     },
420
421     goto_table {
422
423         @Override
424         public Action buildAction(ActionInfo actionInfo) {
425             ActionBuilder ab = new ActionBuilder();
426             return null;
427         }
428     };
429
430     private static final int RADIX_HEX = 16;
431     public abstract Action buildAction(ActionInfo actionInfo);
432 }