Upgrading ACL implementation
[groupbasedpolicy.git] / renderers / vpp / src / main / java / org / opendaylight / groupbasedpolicy / renderer / vpp / sf / EtherTypeClassifier.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. 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
9 package org.opendaylight.groupbasedpolicy.renderer.vpp.sf;
10
11 import java.util.List;
12 import java.util.Map;
13
14 import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;
15 import org.opendaylight.groupbasedpolicy.renderer.vpp.policy.acl.GbpAceBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.parameter.type.IntBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValuesBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported._int.value.fields.SupportedIntValue;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported._int.value.fields.SupportedIntValueBuilder;
25
26 import com.google.common.collect.ImmutableList;
27
28 /**
29  * Match on the ether type of the traffic.
30  */
31 public class EtherTypeClassifier extends Classifier {
32
33     public EtherTypeClassifier(Classifier parent) {
34         super(parent);
35     }
36
37     @Override
38     public ClassifierDefinitionId getId() {
39         return EtherTypeClassifierDefinition.ID;
40     }
41
42     @Override
43     public ClassifierDefinition getClassifierDefinition() {
44         return EtherTypeClassifierDefinition.DEFINITION;
45     }
46
47     @Override
48     public List<SupportedParameterValues> getSupportedParameterValues() {
49
50         List<SupportedIntValue> values = ImmutableList.of(
51                 new SupportedIntValueBuilder().setValue(EtherTypeClassifierDefinition.IPv4_VALUE).build(),
52                 new SupportedIntValueBuilder().setValue(EtherTypeClassifierDefinition.IPv6_VALUE).build());
53         SupportedParameterValuesBuilder builder = new SupportedParameterValuesBuilder();
54         builder.setParameterName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM));
55         builder.setParameterType(new IntBuilder().setSupportedIntValue(values).build());
56
57         return ImmutableList.of(builder.build());
58     }
59
60     @Override
61     protected void checkPresenceOfRequiredParams(Map<String, ParameterValue> params) {
62         if (params.get(EtherTypeClassifierDefinition.ETHERTYPE_PARAM) == null) {
63             throw new IllegalArgumentException("Parameter " + EtherTypeClassifierDefinition.ETHERTYPE_PARAM
64                     + " not specified.");
65         }
66         if (params.get(EtherTypeClassifierDefinition.ETHERTYPE_PARAM).getIntValue() == null) {
67             throw new IllegalArgumentException("Value of " + EtherTypeClassifierDefinition.ETHERTYPE_PARAM
68                     + " parameter is not present.");
69         }
70     }
71
72     @Override
73     GbpAceBuilder update(GbpAceBuilder ruleBuilder, Map<String, ParameterValue> params) {
74         Long etherType = getEtherTypeValue(params);
75         if (!ruleBuilder.getEtherType().isPresent() && etherType != null) {
76             if (EtherTypeClassifierDefinition.IPv4_VALUE.equals(etherType)) {
77                 ruleBuilder.setIpv4EtherType();
78             } else if (EtherTypeClassifierDefinition.IPv6_VALUE.equals(etherType)) {
79                 ruleBuilder.setIpv6EtherType();
80             }
81         }
82         return ruleBuilder;
83     }
84
85     private static Long getEtherTypeValue(Map<String, ParameterValue> params) {
86         if (params == null || params.get(EtherTypeClassifierDefinition.ETHERTYPE_PARAM) == null) {
87             return null;
88         }
89         return params.get(EtherTypeClassifierDefinition.ETHERTYPE_PARAM).getIntValue();
90     }
91
92     @Override
93     void checkPrereqs(GbpAceBuilder matchBuilders) {
94         // Nothing to consider yet.
95     }
96 }