From: Konstantin Blagov Date: Tue, 7 Jun 2016 13:08:26 +0000 (+0200) Subject: Unit tests for neutron mapper (parent commit) X-Git-Tag: release/boron~126 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=581c6ac45b934b8c4fe3d7265d1f84d143cc794c;p=groupbasedpolicy.git Unit tests for neutron mapper (parent commit) - base setup for DataStore testing - tests for SecurityGroupAware, PortAware Change-Id: I99ba280c96d60cd1b3e3d1e4923823a8344b5721 Signed-off-by: Konstantin Blagov --- diff --git a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAware.java b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAware.java index 03e06b2b8..7bd5b1c18 100644 --- a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAware.java +++ b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAware.java @@ -129,7 +129,7 @@ public class NeutronPortAware implements NeutronAware { .setContextType(MappingUtils.L2_BRDIGE_DOMAIN) .setParent(MappingUtils.createParent(routerL3Context, MappingUtils.L3_CONTEXT)) .build(); - rwTx.merge(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.l2BridgeDomainIid(tenantId, l2BdId), l2Bd); + rwTx.merge(LogicalDatastoreType.CONFIGURATION, L2L3IidFactory.l2BridgeDomainIid(tenantId, l2BdId), l2Bd, true); // set virtual router IP for subnet NetworkDomain subnetDomain = NeutronSubnetAware.createSubnet( routerPortSubnet, portIpWithSubnet.getIpAddress()); @@ -165,7 +165,7 @@ public class NeutronPortAware implements NeutronAware { ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction(); registerBaseEndpointAndStoreMapping( - ImmutableList.of(l2BaseEp.build(), l3BaseEp.build()), port, rwTx); + ImmutableList.of(l2BaseEp.build(), l3BaseEp.build()), port, rwTx); registerEndpointAndStoreMapping(epInBuilder.build(), port, rwTx); DataStoreHelper.submitToDs(rwTx); } else if (PortUtils.isNormalPort(port)) { @@ -222,7 +222,7 @@ public class NeutronPortAware implements NeutronAware { TenantId tenantId, ReadWriteTransaction rwTx) { L2BridgeDomainId l2BdId = new L2BridgeDomainId(routerPortSubnet.getNetworkId().getValue()); L2BridgeDomain l2Bd = new L2BridgeDomainBuilder().setId(l2BdId).setParent(new L3ContextId(routerL3Context)).build(); - rwTx.merge(LogicalDatastoreType.CONFIGURATION, IidFactory.l2BridgeDomainIid(tenantId, l2BdId), l2Bd); + rwTx.merge(LogicalDatastoreType.CONFIGURATION, IidFactory.l2BridgeDomainIid(tenantId, l2BdId), l2Bd, true); // set virtual router IP for subnet org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.Subnet subnet = NeutronSubnetAware.createTenantSubnet( routerPortSubnet, portIpWithSubnet.getIpAddress()); diff --git a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/util/PortUtils.java b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/util/PortUtils.java index 3ef29b5c1..debe75422 100644 --- a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/util/PortUtils.java +++ b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/util/PortUtils.java @@ -24,10 +24,10 @@ import com.google.common.base.Optional; public class PortUtils { - private static final String DEVICE_OWNER_DHCP = "network:dhcp"; - private static final String DEVICE_OWNER_ROUTER_IFACE = "network:router_interface"; - private static final String DEVICE_OWNER_ROUTER_GATEWAY = "network:router_gateway"; - private static final String DEVICE_OWNER_FLOATING_IP = "network:floatingip"; + public static final String DEVICE_OWNER_DHCP = "network:dhcp"; + public static final String DEVICE_OWNER_ROUTER_IFACE = "network:router_interface"; + public static final String DEVICE_OWNER_ROUTER_GATEWAY = "network:router_gateway"; + public static final String DEVICE_OWNER_FLOATING_IP = "network:floatingip"; public static Optional findPort(Uuid uuid, @Nullable Ports ports) { if (ports == null || ports.getPort() == null) { diff --git a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/NetworkClientTest.java b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/NetworkClientTest.java index 819c083d8..b94caec29 100644 --- a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/NetworkClientTest.java +++ b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/NetworkClientTest.java @@ -7,14 +7,14 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; -import org.opendaylight.groupbasedpolicy.neutron.mapper.test.GbpDataBrokerTest; +import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronMapperDataBrokerTest; import org.opendaylight.groupbasedpolicy.neutron.mapper.test.PolicyAssert; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.SelectorName; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ConsumerNamedSelectorBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.endpoint.group.ConsumerNamedSelectorKey; -public class NetworkClientTest extends GbpDataBrokerTest { +public class NetworkClientTest extends NeutronMapperDataBrokerTest { private final String tenantID = "00000000-0000-0000-0000-000000000001"; private final SelectorName selector = new SelectorName("dummy-selector"); diff --git a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/NetworkServiceTest.java b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/NetworkServiceTest.java index 625c1f81c..7d2e18a40 100644 --- a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/NetworkServiceTest.java +++ b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/infrastructure/NetworkServiceTest.java @@ -9,7 +9,7 @@ import java.util.Set; import org.junit.Test; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; -import org.opendaylight.groupbasedpolicy.neutron.mapper.test.GbpDataBrokerTest; +import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronMapperDataBrokerTest; import org.opendaylight.groupbasedpolicy.neutron.mapper.test.PolicyAssert; import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix; @@ -19,7 +19,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ClassifierInstance; -public class NetworkServiceTest extends GbpDataBrokerTest { +public class NetworkServiceTest extends NeutronMapperDataBrokerTest { // dhcp private static final SubjectName DHCP_SUBJECT_NAME = new SubjectName("ALLOW_DHCP"); diff --git a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAwareDataStoreTest.java b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAwareDataStoreTest.java new file mode 100644 index 000000000..a5d1f4d45 --- /dev/null +++ b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronPortAwareDataStoreTest.java @@ -0,0 +1,249 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.List; + +import com.google.common.collect.ImmutableList; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.groupbasedpolicy.neutron.mapper.EndpointRegistrator; +import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronMapperAssert; +import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronMapperDataBrokerTest; +import org.opendaylight.groupbasedpolicy.neutron.mapper.util.PortUtils; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.RegisterEndpointInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.base_endpoint.rev160427.UnregisterEndpointInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIpsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.PortsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.Subnets; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.SubnetsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetBuilder; + +public class NeutronPortAwareDataStoreTest extends NeutronMapperDataBrokerTest { + + private final Uuid tenantUuid = new Uuid("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"); + private final Uuid portUuid = new Uuid("bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"); + private final Uuid subnetUuid = new Uuid("cccccccc-cccc-cccc-cccc-cccccccccccc"); + private final Uuid networkUuid = new Uuid("dddddddd-dddd-dddd-dddd-dddddddddddd"); + private final Uuid uuidReserved3 = new Uuid("dddddddd-dddd-dddd-dddd-ddddddddddd3"); + + private DataBroker dataBroker; + private NeutronPortAware portAware; + private EndpointRegistrator epRegistrator; + private Neutron neutron; + + @Before + public void init() { + dataBroker = getDataBroker(); + neutron = mock(Neutron.class); + epRegistrator = mock(EndpointRegistrator.class); + when(epRegistrator.registerEndpoint(any(RegisterEndpointInput.class))).thenReturn(true); + when(epRegistrator.registerEndpoint( + any(org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.RegisterEndpointInput.class))) + .thenReturn(true); + when(epRegistrator.unregisterEndpoint(any(UnregisterEndpointInput.class))).thenReturn(true); + when(epRegistrator.unregisterEndpoint( + any(org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.UnregisterEndpointInput.class))) + .thenReturn(true); + + portAware = new NeutronPortAware(dataBroker, epRegistrator); + } + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void testConstructor_invalidArgument() throws NullPointerException { + thrown.expect(NullPointerException.class); + new NeutronPortAware(null, null); + } + + @Test + public void test_createAndDeleteDhcpPort() { + IpAddress ipAddress = new IpAddress(new Ipv4Address("10.0.0.2")); + Subnets subnets = createSubnets(); + when(neutron.getSubnets()).thenReturn(subnets); + + FixedIps portIpWithSubnet = createFixedIps(ipAddress); + Port port = newBasePort().setDeviceOwner(PortUtils.DEVICE_OWNER_DHCP) + .setFixedIps(ImmutableList.of(portIpWithSubnet)) + .build(); + portAware.onCreated(port, neutron); + NeutronMapperAssert.assertPortExists(dataBroker, port.getUuid()); + + portAware.onDeleted(port, neutron, neutron); + NeutronMapperAssert.assertPortNotExists(dataBroker, port.getUuid()); + } + + @Test + public void test_createDhcpPort_noFixedIps() { + Subnets subnets = createSubnets(); + when(neutron.getSubnets()).thenReturn(subnets); + + Port port = newBasePort().setDeviceOwner(PortUtils.DEVICE_OWNER_DHCP).build(); + portAware.onCreated(port, neutron); + NeutronMapperAssert.assertPortNotExists(dataBroker, port.getUuid()); + } + + @Test + public void test_createAndDeleteNormalPort() throws Exception { + IpAddress ipAddress = new IpAddress(new Ipv4Address("10.0.0.2")); + Subnets subnets = createSubnets(); + when(neutron.getSubnets()).thenReturn(subnets); + + FixedIps portIpWithSubnet = createFixedIps(ipAddress); + Port port = newBasePort().setDeviceOwner("owner for normal port") + .setFixedIps(ImmutableList.of(portIpWithSubnet)) + .build(); + portAware.onCreated(port, neutron); + NeutronMapperAssert.assertPortExists(dataBroker, port.getUuid()); + + portAware.onDeleted(port, neutron, neutron); + NeutronMapperAssert.assertPortNotExists(dataBroker, port.getUuid()); + } + + @Test + public void test_createAndUpdateNormalPort() { + IpAddress ipAddress = new IpAddress(new Ipv4Address("10.0.0.2")); + Subnets subnets = createSubnets(); + when(neutron.getSubnets()).thenReturn(subnets); + + FixedIps portIpWithSubnet = createFixedIps(ipAddress); + Port port = newBasePort().setDeviceOwner("owner for normal port") + .setFixedIps(ImmutableList.of(portIpWithSubnet)) + .build(); + portAware.onCreated(port, neutron); + NeutronMapperAssert.assertPortExists(dataBroker, port.getUuid()); + + Port newPort = new PortBuilder(port).setName("updatedName").build(); + portAware.onUpdated(port, newPort, neutron, neutron); + NeutronMapperAssert.assertPortExists(dataBroker, port.getUuid()); + } + + @Test + public void test_createNormalPort_noFixedIps() { + Subnets subnets = createSubnets(); + when(neutron.getSubnets()).thenReturn(subnets); + + Port port = newBasePort().setDeviceOwner("owner for normal port").build(); + portAware.onCreated(port, neutron); + NeutronMapperAssert.assertPortExists(dataBroker, port.getUuid()); + } + + @Test + public void test_createAndDeleteRouterInterfacePort() { + IpAddress ipAddress = new IpAddress(new Ipv4Address("10.0.0.2")); + Subnets subnets = createSubnets(); + when(neutron.getSubnets()).thenReturn(subnets); + + FixedIps portIpWithSubnet = createFixedIps(ipAddress); + Port neutronPort1 = new PortBuilder().setTenantId(new Uuid(tenantUuid)) + .setFixedIps(ImmutableList.of(portIpWithSubnet)) + .setName("portName1") + .setUuid(portUuid) + .setDeviceId("deviceId") + .setFixedIps(ImmutableList.of(portIpWithSubnet)) + .setNetworkId(networkUuid) + .setMacAddress("00:00:00:00:35:02") + .build(); + Port neutronPort2 = new PortBuilder().setTenantId(new Uuid(tenantUuid)) + .setFixedIps(ImmutableList.of(portIpWithSubnet)) + .setName("portName2") + .setUuid(portUuid) + .setDeviceId("deviceId") + .setDeviceOwner(PortUtils.DEVICE_OWNER_DHCP) + .setFixedIps(ImmutableList.of(portIpWithSubnet)) + .setNetworkId(networkUuid) + .setMacAddress("00:00:00:00:35:02") + .build(); + Ports neutronPorts = new PortsBuilder().setPort(ImmutableList.of(neutronPort1, neutronPort2)).build(); + when(neutron.getPorts()).thenReturn(neutronPorts); + + Subnet subnet = subnets.getSubnet().get(0); + Port port = newBasePort().setDeviceOwner(PortUtils.DEVICE_OWNER_ROUTER_IFACE) + .setFixedIps(ImmutableList.of(portIpWithSubnet)) + .build(); + portAware.onCreated(port, neutron); + NeutronMapperAssert.assertNetworkDomainExists(dataBroker, port, subnet, ipAddress); + + portAware.onDeleted(port, neutron, neutron); + NeutronMapperAssert.assertNetworkDomainExists(dataBroker, port, subnet, ipAddress); + NeutronMapperAssert.assertPortNotExists(dataBroker, port.getUuid()); + } + + @Test + public void test_createRouterInterfacePort_noFixedIps() { + IpAddress ipAddress = new IpAddress(new Ipv4Address("10.0.0.2")); + Subnets subnets = createSubnets(); + when(neutron.getSubnets()).thenReturn(subnets); + + Subnet subnet = subnets.getSubnet().get(0); + Port port = newBasePort().setDeviceOwner(PortUtils.DEVICE_OWNER_ROUTER_IFACE).build(); + portAware.onCreated(port, neutron); + NeutronMapperAssert.assertNetworkDomainNotExists(dataBroker, port, subnet, ipAddress); + } + + @Test + public void test_createAndDeleteRouterGatewayPort() { + Port port = new PortBuilder().setUuid(portUuid).setDeviceOwner(PortUtils.DEVICE_OWNER_ROUTER_GATEWAY).build(); + portAware.onCreated(port, neutron); + portAware.onDeleted(port, neutron, neutron); + // no op + } + + @Test + public void test_createAndDeleteFloatingIpPort() { + Port port = new PortBuilder().setUuid(portUuid).setDeviceOwner(PortUtils.DEVICE_OWNER_FLOATING_IP).build(); + portAware.onCreated(port, neutron); + portAware.onDeleted(port, neutron, neutron); + // no op + } + + private PortBuilder newBasePort() { + List secGroups = ImmutableList.of(uuidReserved3); + return new PortBuilder().setTenantId(new Uuid(tenantUuid)) + .setSecurityGroups(secGroups) + .setName("portName") + .setUuid(portUuid) + .setDeviceId("deviceId") + .setNetworkId(networkUuid) + .setMacAddress("00:00:00:00:35:02"); + } + + private Subnets createSubnets() { + Subnet subnet = new SubnetBuilder().setTenantId(tenantUuid) + .setUuid(subnetUuid) + .setName("subnetName") + .setNetworkId(networkUuid) + .setCidr("10.0.0.0/24") + .build(); + return new SubnetsBuilder().setSubnet(ImmutableList.of(subnet)).build(); + } + + private FixedIps createFixedIps(IpAddress ipAddress) { + return new FixedIpsBuilder().setSubnetId(subnetUuid).setIpAddress(ipAddress).build(); + } + +} diff --git a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronSecurityGroupAwareDataStoreTest.java b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronSecurityGroupAwareDataStoreTest.java index 64f083958..90fc4ad67 100644 --- a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronSecurityGroupAwareDataStoreTest.java +++ b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronSecurityGroupAwareDataStoreTest.java @@ -1,30 +1,50 @@ -package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping; +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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 + */ -import static org.junit.Assert.fail; +package org.opendaylight.groupbasedpolicy.neutron.mapper.mapping; +import org.apache.commons.lang3.StringUtils; +import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronSecurityGroupAware; -import org.opendaylight.groupbasedpolicy.neutron.mapper.test.GbpDataBrokerTest; +import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronMapperDataBrokerTest; 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.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid; import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.EndpointGroup.IntraGroupPolicy; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.security.groups.attributes.security.groups.SecurityGroup; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.security.groups.attributes.security.groups.SecurityGroupBuilder; -public class NeutronSecurityGroupAwareDataStoreTest extends GbpDataBrokerTest { +public class NeutronSecurityGroupAwareDataStoreTest extends NeutronMapperDataBrokerTest { - @Test - public void testAddAndDeleteNeutronSecurityGroup_noSecurityRules() throws Exception { - DataBroker dataBroker = getDataBroker(); - NeutronSecurityGroupAware groupAware = new NeutronSecurityGroupAware(dataBroker); + private final String tenantId = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"; + private final String secGroupId1 = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"; + private final String secGroupId2 = "cccccccc-cccc-cccc-cccc-cccccccccccc"; + + private DataBroker dataBroker; + private NeutronSecurityGroupAware groupAware; + private SecurityGroup secGroup1; + private SecurityGroup secGroup2; - final String tenantId = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"; - final String secGroupId1 = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"; - final String secGroupId2 = "cccccccc-cccc-cccc-cccc-cccccccccccc"; + @Before + public void init() { + dataBroker = getDataBroker(); + groupAware = new NeutronSecurityGroupAware(dataBroker); - SecurityGroup secGroup1 = NeutronEntityFactory.securityGroup(secGroupId1, tenantId); - SecurityGroup secGroup2 = NeutronEntityFactory.securityGroup(secGroupId2, tenantId); + secGroup1 = NeutronEntityFactory.securityGroup(secGroupId1, tenantId); + secGroup2 = NeutronEntityFactory.securityGroup(secGroupId2, tenantId); + } + @Test + public void testAddAndDeleteNeutronSecurityGroup_noSecurityRules() throws Exception { groupAware.onCreated(secGroup1, null); PolicyAssert.assertTenantExists(dataBroker, tenantId); @@ -72,14 +92,49 @@ public class NeutronSecurityGroupAwareDataStoreTest extends GbpDataBrokerTest { PolicyAssert.assertEndpointGroupCount(dataBroker, tenantId, 0); } + @Rule + public ExpectedException thrown = ExpectedException.none(); + @Test - public void testConstructor_invalidArgument() throws Exception { - try { - new NeutronSecurityGroupAware(null); - fail(NullPointerException.class.getName() + " expected"); - } catch (NullPointerException e) { - // do nothing - } + public void testConstructor_invalidArgument() throws NullPointerException { + thrown.expect(NullPointerException.class); + new NeutronSecurityGroupAware(null); + } + + @Test + public void testAddNeutronSecurityGroup_ExternalImplicitGroup() throws Exception { + String uuid = MappingUtils.EIG_UUID.getValue(); + SecurityGroup secGroupA = new SecurityGroupBuilder().setUuid(new Uuid(uuid)) + .setTenantId(new Uuid(tenantId)) + .setName("correctName") + .setDescription("correct description") + .build(); + groupAware.onCreated(secGroupA, null); + + PolicyAssert.assertEndpointGroupExists(dataBroker, tenantId, uuid); + } + + @Test + public void testAddNeutronSecurityGroup_incorrectNameDescription() throws Exception { + String uuid = "dddddddd-dddd-dddd-dddd-dddddddddddd"; + String longDescription = StringUtils.repeat("a", 4100); + SecurityGroup secGroupA = new SecurityGroupBuilder().setUuid(new Uuid(uuid)) + .setTenantId(new Uuid(tenantId)) + .setName("123") + .setDescription(longDescription) + .build(); + groupAware.onCreated(secGroupA, null); + + PolicyAssert.assertEndpointGroupExists(dataBroker, tenantId, uuid); + } + + @Test + public void testOnDelete_NonExistingSecGroup() throws Exception { + PolicyAssert.assertEndpointGroupNotExists(dataBroker, tenantId, secGroupId2); + + groupAware.onDeleted(secGroup2, null, null); + + PolicyAssert.assertEndpointGroupNotExists(dataBroker, tenantId, secGroupId2); } } diff --git a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/NeutronSecurityRuleAwareDataStoreTest.java b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/NeutronSecurityRuleAwareDataStoreTest.java index d3a4ad13e..9d3c19998 100644 --- a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/NeutronSecurityRuleAwareDataStoreTest.java +++ b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/NeutronSecurityRuleAwareDataStoreTest.java @@ -11,7 +11,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.groupbasedpolicy.neutron.mapper.test.ConfigDataStoreReader; -import org.opendaylight.groupbasedpolicy.neutron.mapper.test.GbpDataBrokerTest; +import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronMapperDataBrokerTest; import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronEntityFactory; import org.opendaylight.groupbasedpolicy.neutron.mapper.test.PolicyAssert; import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils; @@ -46,7 +46,7 @@ import com.google.common.collect.ImmutableSet; * datastore */ -public class NeutronSecurityRuleAwareDataStoreTest extends GbpDataBrokerTest { +public class NeutronSecurityRuleAwareDataStoreTest extends NeutronMapperDataBrokerTest { @Test public final void testAddNeutronSecurityRule_rulesWithRemoteIpPrefix() throws Exception { diff --git a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/NeutronSecurityRuleAwareTest.java b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/NeutronSecurityRuleAwareTest.java index e77e2937f..d824e8a5e 100644 --- a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/NeutronSecurityRuleAwareTest.java +++ b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/rule/NeutronSecurityRuleAwareTest.java @@ -11,7 +11,7 @@ import java.util.List; import org.junit.Test; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.groupbasedpolicy.neutron.mapper.test.ConfigDataStoreReader; -import org.opendaylight.groupbasedpolicy.neutron.mapper.test.GbpDataBrokerTest; +import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronMapperDataBrokerTest; import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronEntityFactory; import org.opendaylight.groupbasedpolicy.neutron.mapper.test.PolicyAssert; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpPrefix; @@ -29,7 +29,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.security.rules.attributes.security.rules.SecurityRule; import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.security.rules.attributes.security.rules.SecurityRuleBuilder; -public class NeutronSecurityRuleAwareTest extends GbpDataBrokerTest { +public class NeutronSecurityRuleAwareTest extends NeutronMapperDataBrokerTest { private static final String RULE_ID = "00000000-0000-0000-0000-000000000001"; private static final String RULE_TENANT_ID = "00000000-0000-0000-0000-000000000002"; diff --git a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/test/GbpDataBrokerTest.java b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/test/CustomDataBrokerTest.java similarity index 60% rename from neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/test/GbpDataBrokerTest.java rename to neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/test/CustomDataBrokerTest.java index 0a446aea8..f13748b29 100644 --- a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/test/GbpDataBrokerTest.java +++ b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/test/CustomDataBrokerTest.java @@ -1,31 +1,49 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. 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.test; import static com.google.common.base.Preconditions.checkState; +import javax.annotation.Nonnull; import java.io.IOException; +import java.util.Collection; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSet.Builder; import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTest; -import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.Tenant; import org.opendaylight.yangtools.yang.binding.YangModuleInfo; import org.opendaylight.yangtools.yang.binding.util.BindingReflections; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSet.Builder; - /** * Loads only modules of GBP and it's dependencies for data broker. - *
Therefore this implementation is faster than {@link AbstractDataBrokerTest} + *
+ * Therefore this implementation is faster than {@link AbstractDataBrokerTest} */ -public class GbpDataBrokerTest extends AbstractDataBrokerTest { +public abstract class CustomDataBrokerTest extends AbstractDataBrokerTest { @Override protected Iterable getModuleInfos() throws Exception { Builder moduleInfoSet = ImmutableSet.builder(); - loadModuleInfos(Tenant.class, moduleInfoSet); + for (Class clazz : getClassesFromModules()) { + loadModuleInfos(clazz, moduleInfoSet); + } return moduleInfoSet.build(); } - public static void loadModuleInfos(Class clazzFromModule, Builder moduleInfoSet) throws Exception { + /** + * @return a class from every yang module which needs to be loaded. Cannot return {@code null} + * or empty collection. + */ + public abstract @Nonnull Collection> getClassesFromModules(); + + public static void loadModuleInfos(Class clazzFromModule, Builder moduleInfoSet) + throws Exception { YangModuleInfo moduleInfo = BindingReflections.getModuleInfo(clazzFromModule); checkState(moduleInfo != null, "Module Info for %s is not available.", clazzFromModule); collectYangModuleInfo(moduleInfo, moduleInfoSet); diff --git a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/test/NeutronMapperAssert.java b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/test/NeutronMapperAssert.java new file mode 100644 index 000000000..5a2bd0cb0 --- /dev/null +++ b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/test/NeutronMapperAssert.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. 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.test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import com.google.common.base.Optional; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.groupbasedpolicy.domain_extension.l2_l3.util.L2L3IidFactory; +import org.opendaylight.groupbasedpolicy.neutron.gbp.util.NeutronGbpIidFactory; +import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronSubnetAware; +import org.opendaylight.groupbasedpolicy.util.DataStoreHelper; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.IpAddress; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.UniqueId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.forwarding.forwarding.by.tenant.NetworkDomain; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.mappings.gbp.by.neutron.mappings.endpoints.by.ports.EndpointByPort; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.FixedIps; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.Subnet; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.subnets.rev150712.subnets.attributes.subnets.SubnetBuilder; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class NeutronMapperAssert { + + // asserts for port + + public static void assertPortExists(DataBroker dataBroker, Uuid portUuid) { + Optional portOptional = getEndpointByPortOptional(dataBroker, portUuid); + assertTrue(portOptional.isPresent()); + } + + public static void assertPortNotExists(DataBroker dataBroker, Uuid portUuid) { + Optional portOptional = getEndpointByPortOptional(dataBroker, portUuid); + assertFalse(portOptional.isPresent()); + } + + private static Optional getEndpointByPortOptional(DataBroker dataBroker, Uuid portUuid) { + UniqueId portId = new UniqueId(portUuid.getValue()); + InstanceIdentifier iid = NeutronGbpIidFactory.endpointByPortIid(portId); + Optional portOptional; + try (ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction()) { + portOptional = DataStoreHelper.readFromDs(LogicalDatastoreType.OPERATIONAL, iid, rTx); + } + return portOptional; + } + + public static void assertNetworkDomainExists(DataBroker dataBroker, Port port, Subnet subnet, IpAddress ipAddress) { + Optional portOptional = + getNetworkDomainOptional(dataBroker, port.getTenantId(), ipAddress, subnet); + assertTrue(portOptional.isPresent()); + } + + public static void assertNetworkDomainNotExists(DataBroker dataBroker, Port port, Subnet subnet, + IpAddress ipAddress) { + Optional portOptional = + getNetworkDomainOptional(dataBroker, port.getTenantId(), ipAddress, subnet); + assertFalse(portOptional.isPresent()); + } + + private static Optional getNetworkDomainOptional(DataBroker dataBroker, Uuid tenantUuid, + IpAddress ipAddress, Subnet subnet) { + InstanceIdentifier iid; + NetworkDomain subnetDomain = NeutronSubnetAware.createSubnet(subnet, ipAddress); + TenantId tenantId = new TenantId(tenantUuid.getValue()); + iid = L2L3IidFactory.subnetIid(tenantId, subnetDomain.getNetworkDomainId()); + Optional optional; + try (ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction()) { + optional = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, iid, rTx); + } + return optional; + } + +} diff --git a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/test/NeutronMapperDataBrokerTest.java b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/test/NeutronMapperDataBrokerTest.java new file mode 100644 index 000000000..c0ea1a20b --- /dev/null +++ b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/test/NeutronMapperDataBrokerTest.java @@ -0,0 +1,25 @@ +package org.opendaylight.groupbasedpolicy.neutron.mapper.test; + +import java.util.Collection; + +import com.google.common.collect.ImmutableList; +import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTest; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.l2_l3.rev160427.SubnetAugmentForwarding; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding.rev160427.Forwarding; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gbp.mapper.rev150513.Mappings; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.Tenants; + +/** + * Loads only modules of GBP and it's dependencies for data broker. + *
+ * Therefore this implementation is faster than {@link AbstractDataBrokerTest} + */ +public class NeutronMapperDataBrokerTest extends CustomDataBrokerTest { + + @Override + public Collection> getClassesFromModules() { + return ImmutableList.>of(Tenants.class, Forwarding.class, SubnetAugmentForwarding.class, + Mappings.class); + } + +}