Fixed issues with registration point for renderers
[groupbasedpolicy.git] / renderers / ofoverlay / src / main / java / org / opendaylight / groupbasedpolicy / renderer / ofoverlay / sf / EtherTypeClassifier.java
1 /*
2  * Copyright (c) 2014 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.ofoverlay.sf;
10
11 import java.util.List;
12 import java.util.Map;
13
14 import com.google.common.collect.ImmutableList;
15 import org.opendaylight.groupbasedpolicy.sf.classifiers.EtherTypeClassifierDefinition;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.parameter.type.IntBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValuesBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported._int.value.fields.SupportedIntValue;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported._int.value.fields.SupportedIntValueBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetType;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
30
31 /**
32  * Match on the ether type of the traffic
33  */
34 public class EtherTypeClassifier extends Classifier {
35
36     protected EtherTypeClassifier(Classifier parent) {
37         super(parent);
38     }
39
40     @Override
41     public ClassifierDefinitionId getId() {
42         return EtherTypeClassifierDefinition.ID;
43     }
44
45     @Override
46     public ClassifierDefinition getClassifierDefinition() {
47         return EtherTypeClassifierDefinition.DEFINITION;
48     }
49
50     @Override
51     public List<SupportedParameterValues> getSupportedParameterValues() {
52
53         List<SupportedIntValue> values = ImmutableList.of(
54                 new SupportedIntValueBuilder().setValue(EtherTypeClassifierDefinition.ARP_VALUE)
55                         .build(),
56                 new SupportedIntValueBuilder().setValue(EtherTypeClassifierDefinition.IPv4_VALUE)
57                         .build(),
58                 new SupportedIntValueBuilder().setValue(EtherTypeClassifierDefinition.IPv6_VALUE)
59                         .build());
60         SupportedParameterValuesBuilder b = new SupportedParameterValuesBuilder();
61         b.setParameterName(new ParameterName(EtherTypeClassifierDefinition.ETHERTYPE_PARAM));
62         b.setParameterType(new IntBuilder().setSupportedIntValue(values).build());
63
64         return ImmutableList.of(b.build());
65     }
66
67     @Override
68     protected void checkPresenceOfRequiredParams(Map<String, ParameterValue> params) {
69         if (params.get(EtherTypeClassifierDefinition.ETHERTYPE_PARAM) == null) {
70             throw new IllegalArgumentException(
71                     "Parameter " + EtherTypeClassifierDefinition.ETHERTYPE_PARAM + " not specified.");
72         }
73         if (params.get(EtherTypeClassifierDefinition.ETHERTYPE_PARAM).getIntValue() == null) {
74             throw new IllegalArgumentException(
75                     "Value of " + EtherTypeClassifierDefinition.ETHERTYPE_PARAM + " parameter is not present.");
76         }
77     }
78
79     @Override
80     protected List<MatchBuilder> update(List<MatchBuilder> matches,
81             Map<String, ParameterValue> params) {
82         Long type = params.get(EtherTypeClassifierDefinition.ETHERTYPE_PARAM).getIntValue();
83         for (MatchBuilder match : matches) {
84             EthernetMatchBuilder em;
85             if (match.getEthernetMatch() != null) {
86                 equalOrNotSetValidation(match.getEthernetMatch().getEthernetType(), type);
87                 continue;
88             } else {
89                 em = new EthernetMatchBuilder();
90             }
91             em.setEthernetType(new EthernetTypeBuilder().setType(new EtherType(type)).build());
92             match.setEthernetMatch(em.build());
93         }
94         return matches;
95     }
96
97     private void equalOrNotSetValidation(EthernetType ethTypeInMatch, long paramValue) {
98         if (ethTypeInMatch != null) {
99             if (paramValue != ethTypeInMatch.getType().getValue().longValue()) {
100                 throw new IllegalArgumentException(
101                         "Classification conflict detected at " + EtherTypeClassifierDefinition.ETHERTYPE_PARAM + " parameter for values " + ethTypeInMatch
102                                 .getType()
103                                 .getValue() + " and " + paramValue + ". It is not allowed " + "to assign different values to the same parameter among all the classifiers within one rule.");
104             }
105         }
106     }
107
108     @Override
109     protected void checkPrereqs(List<MatchBuilder> matches) {
110         // So far EthType has no prereqs.
111     }
112 }