7bb668e34115d881550e6f949735d928db9073d4
[groupbasedpolicy.git] / renderers / iovisor / src / main / java / org / opendaylight / groupbasedpolicy / renderer / iovisor / sf / L4Classifier.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.iovisor.sf;
10
11 import java.util.List;
12 import java.util.Map;
13
14 import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.parameter.value.RangeValue;
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.has.parameters.type.parameter.type.RangeBuilder;
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.SupportedIntValueInRange;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported._int.value.fields.SupportedIntValueInRangeBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported.range.value.fields.SupportedRangeValue;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported.range.value.fields.SupportedRangeValueBuilder;
28
29 import com.google.common.collect.ImmutableList;
30
31 /**
32  * Match against TCP or UDP, and source and/or destination ports
33  */
34 public class L4Classifier extends Classifier {
35
36     protected L4Classifier(Classifier parent) {
37         super(parent);
38     }
39
40     @Override
41     public ClassifierDefinitionId getId() {
42         return L4ClassifierDefinition.ID;
43     }
44
45     @Override
46     public ClassifierDefinition getClassifierDefinition() {
47         return L4ClassifierDefinition.DEFINITION;
48     }
49
50     @Override
51     public List<SupportedParameterValues> getSupportedParameterValues() {
52         List<SupportedIntValueInRange> allPossiblePortsIntInRange =
53                 ImmutableList.of(new SupportedIntValueInRangeBuilder().setMin(1L).setMax(65535L).build());
54         List<SupportedRangeValue> allPossiblePortsRange =
55                 ImmutableList.of(new SupportedRangeValueBuilder().setMin(1L).setMax(65535L).build());
56
57         SupportedParameterValues srcPorts = new SupportedParameterValuesBuilder()
58             .setParameterName(new ParameterName(L4ClassifierDefinition.SRC_PORT_PARAM))
59             .setParameterType(new IntBuilder().setSupportedIntValueInRange(allPossiblePortsIntInRange).build())
60             .build();
61         SupportedParameterValues dstPorts = new SupportedParameterValuesBuilder()
62             .setParameterName(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM))
63             .setParameterType(new IntBuilder().setSupportedIntValueInRange(allPossiblePortsIntInRange).build())
64             .build();
65
66         SupportedParameterValues srcPortsRange = new SupportedParameterValuesBuilder()
67             .setParameterName(new ParameterName(L4ClassifierDefinition.SRC_PORT_RANGE_PARAM))
68             .setParameterType(new RangeBuilder().setSupportedRangeValue(allPossiblePortsRange).build())
69             .build();
70         SupportedParameterValues dstPortsRange = new SupportedParameterValuesBuilder()
71             .setParameterName(new ParameterName(L4ClassifierDefinition.DST_PORT_RANGE_PARAM))
72             .setParameterType(new RangeBuilder().setSupportedRangeValue(allPossiblePortsRange).build())
73             .build();
74
75         return ImmutableList.of(srcPorts, dstPorts, srcPortsRange, dstPortsRange);
76     }
77
78     @Override
79     protected void checkPresenceOfRequiredParams(Map<String, ParameterValue> params) {
80         validatePortParam(params, L4ClassifierDefinition.SRC_PORT_PARAM, L4ClassifierDefinition.SRC_PORT_RANGE_PARAM);
81         validatePortParam(params, L4ClassifierDefinition.DST_PORT_PARAM, L4ClassifierDefinition.DST_PORT_RANGE_PARAM);
82         validateRange(params, L4ClassifierDefinition.SRC_PORT_RANGE_PARAM);
83         validateRange(params, L4ClassifierDefinition.DST_PORT_RANGE_PARAM);
84     }
85
86     private void validatePortParam(Map<String, ParameterValue> params, String portParam, String portRangeParam) {
87         if (params.get(portParam) != null) {
88             StringBuilder paramLog = new StringBuilder();
89             if (params.get(portParam).getIntValue() == null) {
90                 paramLog.append("Value of ").append(portParam).append(" parameter is not specified.");
91                 throw new IllegalArgumentException(paramLog.toString());
92             }
93             if (params.get(portRangeParam) != null) {
94                 paramLog.append("Source port parameters ")
95                     .append(portParam)
96                     .append(" and ")
97                     .append(portRangeParam)
98                     .append(" are mutually exclusive.");
99                 throw new IllegalArgumentException(paramLog.toString());
100             }
101         }
102     }
103
104     private void validateRange(Map<String, ParameterValue> params, String portRangeParam) {
105         if (params.get(portRangeParam) != null) {
106             validateRangeValue(params.get(portRangeParam).getRangeValue());
107         }
108     }
109
110     private void validateRangeValue(RangeValue rangeValueParam) {
111         if (rangeValueParam == null) {
112             throw new IllegalArgumentException("Range parameter is specifiet but value is not present.");
113         }
114         final Long min = rangeValueParam.getMin();
115         final Long max = rangeValueParam.getMax();
116         if (min > max) {
117             throw new IllegalArgumentException("Range value mismatch. " + min + " is greater than MAX " + max + ".");
118         }
119     }
120
121 }