Tests for iovisor.sf
[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 com.google.common.collect.ImmutableList;
15 import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition;
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.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 /**
30  * Match against TCP or UDP, and source and/or destination ports
31  */
32 public class L4Classifier extends Classifier {
33
34     static final String EXC_MSG_PARAM_VALUE_NOT_SPECIFIED = "Value of parameter not specified: ";
35     static final String EXC_MSG_MUT_EXCLUSIVE_PARAMS = "Mutually exclusive parameters: ";
36     static final String EXC_MSG_RANGE_VALUE_MISMATCH = "Range value mismatch: ";
37
38     protected L4Classifier(Classifier parent) {
39         super(parent);
40     }
41
42     @Override
43     public ClassifierDefinitionId getId() {
44         return L4ClassifierDefinition.ID;
45     }
46
47     @Override
48     public ClassifierDefinition getClassifierDefinition() {
49         return L4ClassifierDefinition.DEFINITION;
50     }
51
52     @Override
53     public List<SupportedParameterValues> getSupportedParameterValues() {
54         List<SupportedIntValueInRange> allPossiblePortsIntInRange =
55                 ImmutableList.of(new SupportedIntValueInRangeBuilder().setMin(1L).setMax(65535L).build());
56         List<SupportedRangeValue> allPossiblePortsRange =
57                 ImmutableList.of(new SupportedRangeValueBuilder().setMin(1L).setMax(65535L).build());
58
59         SupportedParameterValues srcPorts = new SupportedParameterValuesBuilder()
60             .setParameterName(new ParameterName(L4ClassifierDefinition.SRC_PORT_PARAM))
61             .setParameterType(new IntBuilder().setSupportedIntValueInRange(allPossiblePortsIntInRange).build())
62             .build();
63         SupportedParameterValues dstPorts = new SupportedParameterValuesBuilder()
64             .setParameterName(new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM))
65             .setParameterType(new IntBuilder().setSupportedIntValueInRange(allPossiblePortsIntInRange).build())
66             .build();
67
68         SupportedParameterValues srcPortsRange = new SupportedParameterValuesBuilder()
69             .setParameterName(new ParameterName(L4ClassifierDefinition.SRC_PORT_RANGE_PARAM))
70             .setParameterType(new RangeBuilder().setSupportedRangeValue(allPossiblePortsRange).build())
71             .build();
72         SupportedParameterValues dstPortsRange = new SupportedParameterValuesBuilder()
73             .setParameterName(new ParameterName(L4ClassifierDefinition.DST_PORT_RANGE_PARAM))
74             .setParameterType(new RangeBuilder().setSupportedRangeValue(allPossiblePortsRange).build())
75             .build();
76
77         return ImmutableList.of(srcPorts, dstPorts, srcPortsRange, dstPortsRange);
78     }
79
80     @Override
81     protected void checkPresenceOfRequiredParams(Map<String, ParameterValue> params) {
82         validatePortParam(params, L4ClassifierDefinition.SRC_PORT_PARAM, L4ClassifierDefinition.SRC_PORT_RANGE_PARAM);
83         validatePortParam(params, L4ClassifierDefinition.DST_PORT_PARAM, L4ClassifierDefinition.DST_PORT_RANGE_PARAM);
84         validateRange(params, L4ClassifierDefinition.SRC_PORT_RANGE_PARAM);
85         validateRange(params, L4ClassifierDefinition.DST_PORT_RANGE_PARAM);
86     }
87
88     private void validatePortParam(Map<String, ParameterValue> params, String portParam, String portRangeParam) {
89         if (params.get(portParam) != null) {
90             StringBuilder paramLog = new StringBuilder();
91             if (params.get(portParam).getIntValue() == null) {
92                 paramLog.append(EXC_MSG_PARAM_VALUE_NOT_SPECIFIED).append(portParam);
93                 throw new IllegalArgumentException(paramLog.toString());
94             }
95             if (params.get(portRangeParam) != null) {
96                 paramLog.append(EXC_MSG_MUT_EXCLUSIVE_PARAMS).append(portParam).append(" and ").append(portRangeParam);
97                 throw new IllegalArgumentException(paramLog.toString());
98             }
99         }
100     }
101
102     private void validateRange(Map<String, ParameterValue> params, String portRangeParam) {
103         if (params.get(portRangeParam) != null) {
104             if (params.get(portRangeParam).getRangeValue() == null) {
105                 throw new IllegalArgumentException(EXC_MSG_PARAM_VALUE_NOT_SPECIFIED + portRangeParam);
106             }
107             Long min = params.get(portRangeParam).getRangeValue().getMin();
108             Long max = params.get(portRangeParam).getRangeValue().getMax();
109             if (min > max) {
110                 throw new IllegalArgumentException(EXC_MSG_RANGE_VALUE_MISMATCH + min + ">" + max);
111             }
112         }
113     }
114
115 }