/* * Copyright (c) 2015 Pantheon Technologies s.r.o. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.rule; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.util.Arrays; import org.junit.Test; import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition; import org.opendaylight.groupbasedpolicy.api.sf.IpProtoClassifierDefinition; import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition; import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronEntityFactory; import org.opendaylight.groupbasedpolicy.neutron.mapper.test.PolicyAssert; import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.change.action.of.security.group.rules.input.action.ActionChoice; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.change.action.of.security.group.rules.input.action.action.choice.AllowActionCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.change.action.of.security.group.rules.input.action.action.choice.SfcActionCaseBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.change.action.of.security.group.rules.input.action.action.choice.allow.action._case.AllowBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.has.classifier.refs.ClassifierRef; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.parameter.value.RangeValueBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.contract.subject.Rule; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstance; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstanceBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.DirectionIngress; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.EthertypeV4; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolTcp; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.security.rules.attributes.security.rules.SecurityRule; public class SingleClassifierRuleTest { private ActionChoice allow = new AllowActionCaseBuilder().setAllow(new AllowBuilder().build()).build(); private ActionChoice sfc = new SfcActionCaseBuilder().setSfcChainName("orange_chain").build(); private SingleClassifierRule singleClsfRule; @Test public void testConstructorAndGetters() { SecurityRule secRule = NeutronEntityFactory.securityRuleWithoutGroupIds( "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", EthertypeV4.class, DirectionIngress.class, ProtocolTcp.class, 8010, 8020); final int ruleOrder = 1; singleClsfRule = new SingleClassifierRule(secRule, ruleOrder, MappingUtils.ALLOW_ACTION_CHOICE); ClassifierInstance clsfInstance = singleClsfRule.getClassifierInstance(); assertNotNull(clsfInstance); assertEquals(clsfInstance, SecRuleEntityDecoder.getClassifierInstance(secRule)); ClassifierRef clsfRef = singleClsfRule.getClassifierRef(); assertNotNull(clsfRef); assertEquals(clsfRef, SecRuleEntityDecoder.getClassifierRef(secRule)); Rule rule = singleClsfRule.getRule(); assertNotNull(rule); PolicyAssert.assertRule(rule, secRule, ruleOrder + 180); } @Test public final void updateOrderBasedOnEthTypeClassifTest() throws Exception { ClassifierInstance ci = createClassifierInstance(EtherTypeClassifierDefinition.ID); SingleClassifierRule.updateOrderBasedOn(ci, allow, 0); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 350); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, sfc, 0), 345); } @Test public final void updateOrderBasedOnProtoClassifTest() throws Exception { ClassifierInstance ci = createClassifierInstance(IpProtoClassifierDefinition.ID); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 300); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, sfc, 0), 295); } @Test public final void updateOrderBasedOnL4ClassifTest() throws Exception { ParameterValue sPort = createIntParameterValue(L4ClassifierDefinition.SRC_PORT_PARAM, Long.valueOf(4999)); ParameterValue dPort = createIntParameterValue(L4ClassifierDefinition.DST_PORT_PARAM, Long.valueOf(8080)); ParameterValue sMiniRange = createRangeParameterValue(L4ClassifierDefinition.SRC_PORT_RANGE_PARAM, 1000, 1000); ParameterValue dMiniRange = createRangeParameterValue(L4ClassifierDefinition.DST_PORT_RANGE_PARAM, 2000, 2000); ParameterValue sPortRange = createRangeParameterValue(L4ClassifierDefinition.SRC_PORT_RANGE_PARAM, 3335, 3336); ParameterValue dPortRange = createRangeParameterValue(L4ClassifierDefinition.DST_PORT_RANGE_PARAM, 9998, 9999); ClassifierInstance ci; ci = createClassifierInstance(L4ClassifierDefinition.ID, dPortRange); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 180); ci = createClassifierInstance(L4ClassifierDefinition.ID, sPortRange); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 180); ci = createClassifierInstance(L4ClassifierDefinition.ID, sPort); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 170); ci = createClassifierInstance(L4ClassifierDefinition.ID, sMiniRange); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 170); ci = createClassifierInstance(L4ClassifierDefinition.ID, dPort); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 170); ci = createClassifierInstance(L4ClassifierDefinition.ID, dMiniRange); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 170); ci = createClassifierInstance(L4ClassifierDefinition.ID, sPortRange, dPortRange); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 160); ci = createClassifierInstance(L4ClassifierDefinition.ID, sPortRange, dPort); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 150); ci = createClassifierInstance(L4ClassifierDefinition.ID, sPortRange, dMiniRange); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 150); ci = createClassifierInstance(L4ClassifierDefinition.ID, dPortRange, sPort); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 150); ci = createClassifierInstance(L4ClassifierDefinition.ID, dPortRange, sMiniRange); assertEquals(SingleClassifierRule.updateOrderBasedOn(ci, allow, 0), 150); } private ParameterValue createIntParameterValue(String paramName, Long value) { return new ParameterValueBuilder().setName(new ParameterName(paramName)).setIntValue(value).build(); } private ParameterValue createRangeParameterValue(String paramName, int min, int max) { return new ParameterValueBuilder() .setName(new ParameterName(paramName)) .setRangeValue(new RangeValueBuilder() .setMin(Long.valueOf(min)) .setMax(Long.valueOf(max)) .build()) .build(); } private ClassifierInstance createClassifierInstance(ClassifierDefinitionId id, ParameterValue... pv) { return new ClassifierInstanceBuilder() .setClassifierDefinitionId(id) .setParameterValue(Arrays.asList(pv)) .build(); } }