3744928c482cf72e5a9f77d50f64a721a0afa07a
[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     /**
104      * The action info passed to this ActionType should have two actionValues string.
105      *
106      * The first string representing the metadata and the next string representing the metadatamask
107      */
108     /*
109     filter_equals {
110
111         @Override
112         public Action buildAction(ActionInfo actionInfo) {
113             String[] actionValues = actionInfo.getActionValues();
114             if (actionValues == null || actionValues.length != 2) {
115                 throw new RuntimeException("Filter Equal set field action should have two arguments for metadata and metadata mask");
116             }
117             final BigInteger metaData = new BigInteger(actionValues[0]);
118             final BigInteger metadataMask = new BigInteger(actionValues[1]);
119             return new ActionBuilder()
120                 .setAction(
121                     new ExperimenterActionTypeBuilder().setActionType(
122                         new FilterTypesActionBuilder()
123                             .setFilterType(EricFilterTypes.ERICFTEQUAL)
124                             .setMetadata(
125                                 new MetadataBuilder().setMetadata(metaData).setMetadataMask(metadataMask).build())
126                         .build())//Filter Equal Action Type
127                     .build())//Experimenter Action
128                 .setKey(new ActionKey(actionInfo.getActionKey()))
129                 .build();
130         }
131     },
132     */
133
134     pop_mpls {
135         @Override
136         public Action buildAction(ActionInfo actionInfo) {
137             return new ActionBuilder().setAction(
138                     new PopMplsActionCaseBuilder().setPopMplsAction(
139                             new PopMplsActionBuilder().setEthernetType(
140                                     Integer.valueOf(NwConstants.ETHTYPE_IPV4)).build()).build())
141
142                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
143         }
144     },
145
146     pop_pbb {
147         @Override
148         public Action buildAction(ActionInfo actionInfo) {
149             return new ActionBuilder()
150                     .setAction(new PopPbbActionCaseBuilder().setPopPbbAction(new PopPbbActionBuilder().build()).build())
151                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
152         }
153     },
154
155     pop_vlan {
156         @Override
157         public Action buildAction(ActionInfo actionInfo) {
158             return new ActionBuilder().setAction(
159                     new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build())
160                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
161         }
162     },
163 /*
164     pop_vxlan {
165         @Override
166         public Action buildAction(ActionInfo actionInfo) {
167             return new ActionBuilder().setAction(
168                     new ExperimenterActionTypeBuilder().setActionType(
169                             new VxlanPopActionBuilder().build()).build())
170                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
171         }
172     },
173     */
174 /*
175     pop_gre {
176         @Override
177         public Action buildAction(ActionInfo actionInfo) {
178             return new ActionBuilder().setAction(
179                     new ExperimenterActionTypeBuilder().setActionType(
180                             new GrePopActionBuilder().build()).build())
181                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
182         }
183     },
184 */
185     push_mpls {
186         @Override
187         public Action buildAction(ActionInfo actionInfo) {
188             return new ActionBuilder().setAction(new PushMplsActionCaseBuilder().setPushMplsAction(
189                                     new PushMplsActionBuilder().setEthernetType(
190                                             Integer.valueOf(NwConstants.ETHTYPE_MPLS_UC)).build()).build())
191                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
192         }
193     },
194
195     push_pbb {
196         @Override
197         public Action buildAction(ActionInfo actionInfo) {
198             return new ActionBuilder().setAction(
199                     new PushPbbActionCaseBuilder().setPushPbbAction(
200                                     new PushPbbActionBuilder()
201                                             .setEthernetType(Integer.valueOf(NwConstants.ETHTYPE_PBB)).build()).build())
202                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
203         }
204     },
205
206     push_vlan {
207         @Override
208         public Action buildAction(ActionInfo actionInfo) {
209             return new ActionBuilder().setAction(
210                     new PushVlanActionCaseBuilder().setPushVlanAction(
211                                     new PushVlanActionBuilder().setEthernetType(
212                                             Integer.valueOf(NwConstants.ETHTYPE_802_1Q)).build()).build())
213                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
214         }
215     },
216 /*
217     push_vxlan {
218         @Override
219         public Action buildAction(ActionInfo actionInfo) {
220             return new ActionBuilder().setAction(
221                     new ExperimenterActionTypeBuilder().setActionType(
222                                     new VxlanPushActionBuilder().setEthType(0x0800).build()).build())
223                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
224         }
225     },
226     */
227 /*
228     push_gre {
229         @Override
230         public Action buildAction(ActionInfo actionInfo) {
231             return new ActionBuilder().setAction(
232                     new ExperimenterActionTypeBuilder().setActionType(
233                             new GrePushActionBuilder().setEthType(0x0800).build()).build())
234                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
235         }
236     },
237 */
238     set_field_mpls_label {
239         @Override
240         public Action buildAction(ActionInfo actionInfo) {
241             String[] actionValues = actionInfo.getActionValues();
242             long label = Long.valueOf(actionValues[0]);
243
244             return new ActionBuilder().setAction(
245                     new SetFieldCaseBuilder().setSetField(new SetFieldBuilder().setProtocolMatchFields(
246                                             new ProtocolMatchFieldsBuilder().setMplsLabel(label).build()).build())
247                                     .build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
248         }
249     },
250
251     set_field_pbb_isid {
252         @Override
253         public Action buildAction(ActionInfo actionInfo) {
254             String[] actionValues = actionInfo.getActionValues();
255             long label = Long.valueOf(actionValues[0]);
256
257             return new ActionBuilder().setAction(
258                     new SetFieldCaseBuilder().setSetField(
259                             new SetFieldBuilder().setProtocolMatchFields(
260                                             new ProtocolMatchFieldsBuilder().setPbb(
261                                                     new PbbBuilder().setPbbIsid(label).build()).build()).build())
262                                     .build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
263         }
264     },
265
266     set_field_vlan_vid {
267         @Override
268         public Action buildAction(ActionInfo actionInfo) {
269             String[] actionValues = actionInfo.getActionValues();
270             int vlanId = Integer.valueOf(actionValues[0]);
271
272             return new ActionBuilder().setAction(
273                     new SetFieldCaseBuilder().setSetField(
274                             new SetFieldBuilder().setVlanMatch(
275                                     new VlanMatchBuilder().setVlanId(
276                                                     new VlanIdBuilder().setVlanId(new VlanId(vlanId))
277                                                             .setVlanIdPresent(true).build()).build()).build()).build())
278                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
279         }
280     },
281
282     set_field_tunnel_id {
283         @Override
284         public Action buildAction(ActionInfo actionInfo) {
285             BigInteger [] actionValues = actionInfo.getBigActionValues();
286             return new ActionBuilder().setAction(
287                     new SetFieldCaseBuilder().setSetField(
288                             new SetFieldBuilder().setTunnel(new TunnelBuilder().setTunnelId(actionValues[0])
289                                     .setTunnelMask(actionValues[1]).build()).build()).build())
290                                     .setKey(new ActionKey(actionInfo.getActionKey())).build();
291
292         }
293
294     },
295
296     set_field_eth_dest {
297
298         @Override
299         public Action buildAction(ActionInfo actionInfo) {
300             String[] actionValues = actionInfo.getActionValues();
301             MacAddress mac = new MacAddress(actionValues[0]);
302
303             return new ActionBuilder().setAction(
304                     new SetFieldCaseBuilder().setSetField(
305                             new SetFieldBuilder().setEthernetMatch(
306                                     new EthernetMatchBuilder().setEthernetDestination(
307                                                     new EthernetDestinationBuilder().setAddress(mac).build()).build())
308                                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
309
310         }
311
312     },
313
314     set_udp_protocol {
315
316         @Override
317         public Action buildAction(ActionInfo actionInfo) {
318             return new ActionBuilder().setAction(
319                     new SetFieldCaseBuilder().setSetField(
320                             new SetFieldBuilder().setIpMatch(
321                                     new IpMatchBuilder().setIpProtocol((short) 17).build()).
322                                     build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
323
324         }
325
326     },
327     punt_to_controller {
328         @Override
329         public Action buildAction(ActionInfo actionInfo) {
330             ActionBuilder ab = new ActionBuilder();
331             OutputActionBuilder output = new OutputActionBuilder();
332             output.setMaxLength(0xffff);
333             Uri value = new Uri(OutputPortValues.CONTROLLER.toString());
334             output.setOutputNodeConnector(value);
335             ab.setAction(new OutputActionCaseBuilder().setOutputAction(output.build()).build());
336             ab.setKey(new ActionKey(actionInfo.getActionKey()));
337             return ab.build();
338         }
339
340     },
341     set_destination_port_field {
342
343         @Override
344         public Action buildAction(ActionInfo actionInfo) {
345             String[] actionValues = actionInfo.getActionValues();
346             Integer portNumber = new Integer(actionValues[0]);
347
348             return new ActionBuilder().setAction(
349                     new SetFieldCaseBuilder().setSetField(
350                             new SetFieldBuilder().setLayer4Match(
351                                     new UdpMatchBuilder().setUdpDestinationPort(
352                                             new PortNumber(portNumber)).build())
353                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
354
355         }
356
357     },
358     set_source_port_field {
359
360         @Override
361         public Action buildAction(ActionInfo actionInfo) {
362             String[] actionValues = actionInfo.getActionValues();
363             Integer portNumber = new Integer(actionValues[0]);
364
365             return new ActionBuilder().setAction(
366                     new SetFieldCaseBuilder().setSetField(
367                             new SetFieldBuilder().setLayer4Match(
368                                     new UdpMatchBuilder().setUdpSourcePort(
369                                             new PortNumber(portNumber)).build())
370                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
371
372         }
373
374     },
375     set_source_ip {
376
377         @Override
378         public Action buildAction(ActionInfo actionInfo) {
379             String[] actionValues = actionInfo.getActionValues();
380             InetAddress sourceIp = null;
381             try{
382                 sourceIp = InetAddress.getByName(actionValues[0]);
383             } catch (Exception e){
384                 e.printStackTrace();
385             }
386             return new ActionBuilder().setAction(
387                     new SetFieldCaseBuilder().setSetField(
388                             new SetFieldBuilder().setLayer3Match(
389                                     new Ipv4MatchBuilder().setIpv4Source(
390                                             new Ipv4Prefix(sourceIp.getHostAddress())).build()).
391                                             build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
392
393         }
394
395     },
396     set_destination_ip {
397
398         @Override
399         public Action buildAction(ActionInfo actionInfo) {
400             String[] actionValues = actionInfo.getActionValues();
401             InetAddress sourceIp = null;
402             try{
403                 sourceIp = InetAddress.getByName(actionValues[0]);
404             } catch (Exception e){
405                 e.printStackTrace();
406             }
407             return new ActionBuilder().setAction(
408                     new SetFieldCaseBuilder().setSetField(
409                             new SetFieldBuilder().setLayer3Match(
410                                     new Ipv4MatchBuilder().setIpv4Destination(
411                                             new Ipv4Prefix(sourceIp.getHostAddress())).build()).
412                                             build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
413
414         }
415
416     },
417     set_field_eth_src {
418
419         @Override
420         public Action buildAction(ActionInfo actionInfo) {
421             String[] actionValues = actionInfo.getActionValues();
422             MacAddress mac = new MacAddress(actionValues[0]);
423
424             return new ActionBuilder().setAction(
425                     new SetFieldCaseBuilder().setSetField(
426                             new SetFieldBuilder().setEthernetMatch(
427                                     new EthernetMatchBuilder().setEthernetSource(
428                                                     new EthernetSourceBuilder().setAddress(mac).build()).build())
429                                             .build()).build()).setKey(new ActionKey(actionInfo.getActionKey())).build();
430
431         }
432     },
433     drop_action {
434
435         @Override
436         public Action buildAction(ActionInfo actionInfo) {
437             DropActionBuilder dab = new DropActionBuilder();
438             DropAction dropAction = dab.build();
439             ActionBuilder ab = new ActionBuilder();
440             ab.setAction(new DropActionCaseBuilder().setDropAction(dropAction).build());
441             return ab.build();
442         }
443     },
444     goto_table {
445
446         @Override
447         public Action buildAction(ActionInfo actionInfo) {
448             ActionBuilder ab = new ActionBuilder();
449             return null;
450         }
451     };
452
453     private static final int RADIX_HEX = 16;
454     public abstract Action buildAction(ActionInfo actionInfo);
455 }