8dba62c17efe1804a90ab7a3c03383d25f6d40cb
[vpnservice.git] / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / vpnservice / mdsalutil / ActionType.java
1 /*
2  * Copyright (c) 2013 Ericsson AB.  All rights reserved.
3  *
4  */
5 package org.opendaylight.vpnservice.mdsalutil;
6
7 import java.math.BigInteger;
8 import java.net.InetAddress;
9
10 //import org.opendaylight.yang.gen.v1.urn.ericsson.experimenter.action.types.rev140228.EricFilterTypes;
11 //import org.opendaylight.yang.gen.v1.urn.ericsson.experimenter.action.types.rev140228.action.types.action.action.ExperimenterActionTypeBuilder;
12 //import org.opendaylight.yang.gen.v1.urn.ericsson.experimenter.action.types.rev140228.action.types.action.action.experimenter.action.type.action.type.FilterTypesActionBuilder;
13 //import org.opendaylight.yang.gen.v1.urn.ericsson.experimenter.action.types.rev140228.filter.types.group.Metadata;
14 //import org.opendaylight.yang.gen.v1.urn.ericsson.experimenter.action.types.rev140228.filter.types.group.MetadataBuilder;
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCaseBuilder;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCaseBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopMplsActionCaseBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCaseBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushMplsActionCaseBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCaseBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCaseBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.group.action._case.GroupActionBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.output.action._case.OutputActionBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.mpls.action._case.PopMplsActionBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.pbb.action._case.PopPbbActionBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.mpls.action._case.PushMplsActionBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.pbb.action._case.PushPbbActionBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.push.vlan.action._case.PushVlanActionBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
39 //import org.opendaylight.yang.gen.v1.urn.ericsson.experimenter.flow.types.rev140422.EricssonPortTypes;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
48 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
49 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
50 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Uri;
51 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
62 //import org.opendaylight.yang.gen.v1.urn.ericsson.experimenter.action.types.rev140228.action.types.action.action.ExperimenterActionTypeBuilder;
63 //import org.opendaylight.yang.gen.v1.urn.ericsson.experimenter.action.types.rev140228.action.types.action.action.experimenter.action.type.action.type.VxlanPopActionBuilder;
64 //import org.opendaylight.yang.gen.v1.urn.ericsson.experimenter.action.types.rev140228.action.types.action.action.experimenter.action.type.action.type.VxlanPushActionBuilder;
65 //import org.opendaylight.yang.gen.v1.urn.ericsson.experimenter.action.types.rev140228.action.types.action.action.experimenter.action.type.action.type.GrePopActionBuilder;
66 //import org.opendaylight.yang.gen.v1.urn.ericsson.experimenter.action.types.rev140228.action.types.action.action.experimenter.action.type.action.type.GrePushActionBuilder;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DropActionCaseBuilder;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropAction;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.drop.action._case.DropActionBuilder;
70
71 public enum ActionType {
72     group {
73         @Override
74         public Action buildAction(ActionInfo actionInfo) {
75             long groupId = Long.parseLong(actionInfo.getActionValues()[0]);
76
77             return new ActionBuilder().setAction(
78                             new GroupActionCaseBuilder().setGroupAction(
79                                     new GroupActionBuilder().setGroupId(groupId).build()).build())
80                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
81         }
82     },
83
84     output {
85         @Override
86         public Action buildAction(ActionInfo actionInfo) {
87             String[] actionValues = actionInfo.getActionValues();
88             String port = actionValues[0];
89             int maxLength = 0;
90
91             if (actionValues.length == 2) {
92                 maxLength = Integer.valueOf(actionValues[1]);
93             }
94
95             return new ActionBuilder().setAction(
96                     new OutputActionCaseBuilder().setOutputAction(
97                             new OutputActionBuilder().setMaxLength(Integer.valueOf(maxLength))
98                                             .setOutputNodeConnector(new Uri(port)).build()).build())
99                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
100         }
101     },
102
103     pop_mpls {
104         @Override
105         public Action buildAction(ActionInfo actionInfo) {
106             return new ActionBuilder().setAction(
107                     new PopMplsActionCaseBuilder().setPopMplsAction(
108                             new PopMplsActionBuilder().setEthernetType(
109                                     Integer.valueOf(NwConstants.ETHTYPE_IPV4)).build()).build())
110
111                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
112         }
113     },
114
115     pop_pbb {
116         @Override
117         public Action buildAction(ActionInfo actionInfo) {
118             return new ActionBuilder()
119                     .setAction(new PopPbbActionCaseBuilder().setPopPbbAction(new PopPbbActionBuilder().build()).build())
120                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
121         }
122     },
123
124     pop_vlan {
125         @Override
126         public Action buildAction(ActionInfo actionInfo) {
127             return new ActionBuilder().setAction(
128                     new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
129                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
130         }
131     },
132
133     push_mpls {
134         @Override
135         public Action buildAction(ActionInfo actionInfo) {
136             return new ActionBuilder().setAction(new PushMplsActionCaseBuilder().setPushMplsAction(
137                                     new PushMplsActionBuilder().setEthernetType(
138                                             Integer.valueOf(NwConstants.ETHTYPE_MPLS_UC)).build()).build())
139                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
140         }
141     },
142
143     push_pbb {
144         @Override
145         public Action buildAction(ActionInfo actionInfo) {
146             return new ActionBuilder().setAction(
147                     new PushPbbActionCaseBuilder().setPushPbbAction(
148                                     new PushPbbActionBuilder()
149                                             .setEthernetType(Integer.valueOf(NwConstants.ETHTYPE_PBB)).build()).build())
150                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
151         }
152     },
153
154     push_vlan {
155         @Override
156         public Action buildAction(ActionInfo actionInfo) {
157             return new ActionBuilder().setAction(
158                     new PushVlanActionCaseBuilder().setPushVlanAction(
159                                     new PushVlanActionBuilder().setEthernetType(
160                                             Integer.valueOf(NwConstants.ETHTYPE_802_1Q)).build()).build())
161                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
162         }
163     },
164
165     set_field_mpls_label {
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(new SetFieldBuilder().setProtocolMatchFields(
173                                             new ProtocolMatchFieldsBuilder().setMplsLabel(label).build()).build())
174                                     .build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
175         }
176     },
177
178     set_field_pbb_isid {
179         @Override
180         public Action buildAction(ActionInfo actionInfo) {
181             String[] actionValues = actionInfo.getActionValues();
182             long label = Long.valueOf(actionValues[0]);
183
184             return new ActionBuilder().setAction(
185                     new SetFieldCaseBuilder().setSetField(
186                             new SetFieldBuilder().setProtocolMatchFields(
187                                             new ProtocolMatchFieldsBuilder().setPbb(
188                                                     new PbbBuilder().setPbbIsid(label).build()).build()).build())
189                                     .build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
190         }
191     },
192
193     set_field_vlan_vid {
194         @Override
195         public Action buildAction(ActionInfo actionInfo) {
196             String[] actionValues = actionInfo.getActionValues();
197             int vlanId = Integer.valueOf(actionValues[0]);
198
199             return new ActionBuilder().setAction(
200                     new SetFieldCaseBuilder().setSetField(
201                             new SetFieldBuilder().setVlanMatch(
202                                     new VlanMatchBuilder().setVlanId(
203                                                     new VlanIdBuilder().setVlanId(new VlanId(vlanId))
204                                                             .setVlanIdPresent(true).build()).build()).build()).build())
205                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
206         }
207     },
208
209     set_field_tunnel_id {
210         @Override
211         public Action buildAction(ActionInfo actionInfo) {
212             BigInteger [] actionValues = actionInfo.getBigActionValues();
213             return new ActionBuilder().setAction(
214                     new SetFieldCaseBuilder().setSetField(
215                             new SetFieldBuilder().setTunnel(new TunnelBuilder().setTunnelId(actionValues[0])
216                                     .setTunnelMask(actionValues[1]).build()).build()).build())
217                                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
218
219         }
220
221     },
222
223     set_field_eth_dest {
224
225         @Override
226         public Action buildAction(ActionInfo actionInfo) {
227             String[] actionValues = actionInfo.getActionValues();
228             MacAddress mac = new MacAddress(actionValues[0]);
229
230             return new ActionBuilder().setAction(
231                     new SetFieldCaseBuilder().setSetField(
232                             new SetFieldBuilder().setEthernetMatch(
233                                     new EthernetMatchBuilder().setEthernetDestination(
234                                                     new EthernetDestinationBuilder().setAddress(mac).build()).build())
235                                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
236
237         }
238
239     },
240
241     set_udp_protocol {
242
243         @Override
244         public Action buildAction(ActionInfo actionInfo) {
245             return new ActionBuilder().setAction(
246                     new SetFieldCaseBuilder().setSetField(
247                             new SetFieldBuilder().setIpMatch(
248                                     new IpMatchBuilder().setIpProtocol((short) 17).build()).
249                                     build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
250
251         }
252
253     },
254     punt_to_controller {
255         @Override
256         public Action buildAction(ActionInfo actionInfo) {
257             ActionBuilder ab = new ActionBuilder();
258             OutputActionBuilder output = new OutputActionBuilder();
259             output.setMaxLength(0xffff);
260             Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
261             output.setOutputNodeConnector(value);
262             ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
263             ab.setKey(new ActionKey(actionInfo.getActionKey()));
264             return ab.build();
265         }
266
267     },
268     set_destination_port_field {
269
270         @Override
271         public Action buildAction(ActionInfo actionInfo) {
272             String[] actionValues = actionInfo.getActionValues();
273             Integer portNumber = new Integer(actionValues[0]);
274
275             return new ActionBuilder().setAction(
276                     new SetFieldCaseBuilder().setSetField(
277                             new SetFieldBuilder().setLayer4Match(
278                                     new UdpMatchBuilder().setUdpDestinationPort(
279                                             new PortNumber(portNumber)).build())
280                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
281
282         }
283
284     },
285     set_source_port_field {
286
287         @Override
288         public Action buildAction(ActionInfo actionInfo) {
289             String[] actionValues = actionInfo.getActionValues();
290             Integer portNumber = new Integer(actionValues[0]);
291
292             return new ActionBuilder().setAction(
293                     new SetFieldCaseBuilder().setSetField(
294                             new SetFieldBuilder().setLayer4Match(
295                                     new UdpMatchBuilder().setUdpSourcePort(
296                                             new PortNumber(portNumber)).build())
297                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
298
299         }
300
301     },
302     set_source_ip {
303
304         @Override
305         public Action buildAction(ActionInfo actionInfo) {
306             String[] actionValues = actionInfo.getActionValues();
307             InetAddress sourceIp = null;
308             try{
309                 sourceIp = InetAddress.getByName(actionValues[0]);
310             } catch (Exception e){
311                 e.printStackTrace();
312             }
313             return new ActionBuilder().setAction(
314                     new SetFieldCaseBuilder().setSetField(
315                             new SetFieldBuilder().setLayer3Match(
316                                     new Ipv4MatchBuilder().setIpv4Source(
317                                             new Ipv4Prefix(sourceIp.getHostAddress())).build()).
318                                             build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
319
320         }
321
322     },
323     set_destination_ip {
324
325         @Override
326         public Action buildAction(ActionInfo actionInfo) {
327             String[] actionValues = actionInfo.getActionValues();
328             InetAddress sourceIp = null;
329             try{
330                 sourceIp = InetAddress.getByName(actionValues[0]);
331             } catch (Exception e){
332                 e.printStackTrace();
333             }
334             return new ActionBuilder().setAction(
335                     new SetFieldCaseBuilder().setSetField(
336                             new SetFieldBuilder().setLayer3Match(
337                                     new Ipv4MatchBuilder().setIpv4Destination(
338                                             new Ipv4Prefix(sourceIp.getHostAddress())).build()).
339                                             build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
340
341         }
342
343     },
344     set_field_eth_src {
345
346         @Override
347         public Action buildAction(ActionInfo actionInfo) {
348             String[] actionValues = actionInfo.getActionValues();
349             MacAddress mac = new MacAddress(actionValues[0]);
350
351             return new ActionBuilder().setAction(
352                     new SetFieldCaseBuilder().setSetField(
353                             new SetFieldBuilder().setEthernetMatch(
354                                     new EthernetMatchBuilder().setEthernetSource(
355                                                     new EthernetSourceBuilder().setAddress(mac).build()).build())
356                                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
357
358         }
359     },
360     drop_action {
361
362         @Override
363         public Action buildAction(ActionInfo actionInfo) {
364             DropActionBuilder dab = new DropActionBuilder();
365             DropAction dropAction = dab.build();
366             ActionBuilder ab = new ActionBuilder();
367             ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build());
368             return ab.build();
369         }
370     },
371     goto_table {
372
373         @Override
374         public Action buildAction(ActionInfo actionInfo) {
375             ActionBuilder ab = new ActionBuilder();
376             return null;
377         }
378     };
379
380     private static final int RADIX_HEX = 16;
381     public abstract Action buildAction(ActionInfo actionInfo);
382 }