From 7f53cb9ad248ed0bf5ec277f8ab38035e3941784 Mon Sep 17 00:00:00 2001 From: Konstantin Blagov Date: Thu, 23 Jun 2016 14:34:41 +0200 Subject: [PATCH] Tests for NeutronMapper, NeutronNetworkAware Change-Id: I1ef9e4250a2e6e126515e82181f553ae51d550cd Signed-off-by: Konstantin Blagov --- .../neutron/mapper/NeutronMapper.java | 4 +- .../mapper/mapping/NeutronNetworkAware.java | 3 +- .../neutron/mapper/NeutronMapperTest.java | 203 ++++++++++++++++++ .../NeutronNetworkAwareDataStoreTest.java | 162 ++++++++++++++ .../test/NeutronMapperDataBrokerTest.java | 3 +- 5 files changed, 371 insertions(+), 4 deletions(-) create mode 100644 neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/NeutronMapperTest.java create mode 100644 neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAwareDataStoreTest.java diff --git a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/NeutronMapper.java b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/NeutronMapper.java index 207fc3357..71456e344 100644 --- a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/NeutronMapper.java +++ b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/NeutronMapper.java @@ -68,6 +68,8 @@ import com.google.common.collect.PeekingIterator; public class NeutronMapper implements DataTreeChangeListener, AutoCloseable { + public static final String EXC_MSG_UNKNOWN_MODIFICATION_TYPE_WITHIN_DATA = "Unknown modification type within data "; + private final static SecurityRuleBuilder EIG_INGRESS_IPV4_SEC_RULE_BUILDER = new SecurityRuleBuilder() .setUuid(new Uuid("0a629f80-2408-11e6-b67b-9e71128cae77")) .setDirection(DirectionIngress.class) @@ -181,7 +183,7 @@ public class NeutronMapper implements DataTreeChangeListener, AutoClose } break; default: - throw new IllegalStateException("Unknown modification type within data " + dataModif); + throw new IllegalStateException(EXC_MSG_UNKNOWN_MODIFICATION_TYPE_WITHIN_DATA + dataModif); } } } diff --git a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAware.java b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAware.java index 8c42a7454..bd2a45faa 100644 --- a/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAware.java +++ b/neutron-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAware.java @@ -67,7 +67,7 @@ public class NeutronNetworkAware implements NeutronAware { LOG.trace("created network - {}", network); ReadWriteTransaction rwTx = dataProvider.newReadWriteTransaction(); TenantId tenantId = new TenantId(network.getTenantId().getValue()); - Name name = null; + Name name; ContextId ctxId = new ContextId(network.getUuid().getValue()); ForwardingContextBuilder fwdCtxBuilder = new ForwardingContextBuilder() .setContextId(ctxId) @@ -77,7 +77,6 @@ public class NeutronNetworkAware implements NeutronAware { name = new Name(network.getName()); fwdCtxBuilder.setName(name); } catch (Exception e) { - name = null; LOG.info("Name of Neutron Network '{}' is ignored.", network.getName()); LOG.debug("Name exception", e); } diff --git a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/NeutronMapperTest.java b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/NeutronMapperTest.java new file mode 100644 index 000000000..b68e3e160 --- /dev/null +++ b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/NeutronMapperTest.java @@ -0,0 +1,203 @@ +/* + * 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; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.util.Set; + +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import org.junit.Before; +import org.junit.Test; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; +import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; +import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; +import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; +import org.opendaylight.groupbasedpolicy.neutron.mapper.mapping.NeutronNetworkAware; +import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronMapperDataBrokerTest; +import org.opendaylight.groupbasedpolicy.neutron.mapper.util.MappingUtils; +import org.opendaylight.groupbasedpolicy.util.DataStoreHelper; +import org.opendaylight.groupbasedpolicy.util.IidFactory; +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.BaseEndpointService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ContextId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.endpoint.rev140421.EndpointService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.forwarding.context.L3Context; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev150712.NetworkL3Extension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.ext.rev150712.NetworkL3ExtensionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.NeutronBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.security.groups.attributes.SecurityGroups; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.secgroups.rev150712.security.groups.attributes.SecurityGroupsBuilder; +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; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; + +public class NeutronMapperTest extends NeutronMapperDataBrokerTest { + + private final Uuid tenantUuid = new Uuid("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"); + private final Uuid networkUuid = new Uuid("dddddddd-dddd-dddd-dddd-dddddddddddd"); + private final Uuid networkUuid2 = new Uuid("dddddddd-dddd-dddd-dddd-ddddddddddd2"); + + private DataBroker dataBroker; + private RpcProviderRegistry rpcProvider; + private EndpointService epService; + private BaseEndpointService baseEpService; + + private DataObjectModification rootNode; + private Set> changes; + private Neutron oldNeutronBefore; + private Neutron oldNeutronAfter; + + private NeutronMapper mapper; + private DataObjectModification networkModif; + private Network networkBefore; + private Network networkAfter; + private NetworkL3Extension networkL3Extension; + + @Before + public void init() { + dataBroker = getDataBroker(); + epService = mock(EndpointService.class); + baseEpService = mock(BaseEndpointService.class); + rpcProvider = mock(RpcProviderRegistry.class); + when(rpcProvider.getRpcService(EndpointService.class)).thenReturn(epService); + when(rpcProvider.getRpcService(BaseEndpointService.class)).thenReturn(baseEpService); + + mapper = new NeutronMapper(dataBroker, rpcProvider); + + networkL3Extension = new NetworkL3ExtensionBuilder().setExternal(true).build(); + + rootNode = mock(DataObjectModification.class); + + networkModif = mock(DataObjectModification.class); + networkBefore = new NetworkBuilder().setTenantId(tenantUuid).setUuid(networkUuid).build(); + networkAfter = new NetworkBuilder().setTenantId(tenantUuid) + .setUuid(networkUuid2) + .addAugmentation(NetworkL3Extension.class, networkL3Extension) + .build(); + when(networkModif.getDataType()).thenReturn(NeutronNetworkAware.NETWORK_WILDCARD_IID.getTargetType()); + + when(networkModif.getDataBefore()).thenReturn(networkBefore); + when(networkModif.getDataAfter()).thenReturn(networkAfter); + + when(rootNode.getModifiedChildren()).thenReturn(ImmutableSet.of(networkModif)); + + DataTreeModification change = mock(DataTreeModification.class); + when(change.getRootNode()).thenReturn(rootNode); + + changes = ImmutableSet.of(change); + + oldNeutronBefore = new NeutronBuilder().build(); + SecurityGroup sg = new SecurityGroupBuilder().setTenantId(tenantUuid).setUuid(MappingUtils.EIG_UUID).build(); + SecurityGroups securityGroups = new SecurityGroupsBuilder().setSecurityGroup(ImmutableList.of(sg)).build(); + oldNeutronAfter = new NeutronBuilder().setSecurityGroups(securityGroups).build(); + } + + @Test + public void testConstructor() throws IOException { + DataBroker dataBrokerSpy = spy(dataBroker); + NeutronMapper other = new NeutronMapper(dataBrokerSpy, rpcProvider); + + verify(dataBrokerSpy).registerDataTreeChangeListener(new DataTreeIdentifier<>( + LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(Neutron.class).build()), other); + + other.close(); + } + + @Test + public void test_Write_withNetworkCreate() { + when(networkModif.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE); + when(networkModif.getDataBefore()).thenReturn(null); + when(rootNode.getDataBefore()).thenReturn(oldNeutronBefore); + when(rootNode.getDataAfter()).thenReturn(oldNeutronAfter); + + mapper.onDataTreeChanged(changes); + assertNetworkExists(networkAfter); + } + + @Test + public void test_Write_withNetworkUpdate() { + when(networkModif.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE); + when(networkModif.getDataBefore()).thenReturn(null); + when(networkModif.getDataAfter()).thenReturn(networkBefore); + when(rootNode.getDataBefore()).thenReturn(oldNeutronBefore); + when(rootNode.getDataAfter()).thenReturn(oldNeutronAfter); + + mapper.onDataTreeChanged(changes); + + assertNetworkExists(networkBefore); + assertNetworkNotExists(networkAfter); + + when(networkModif.getDataBefore()).thenReturn(networkBefore); + when(networkModif.getDataAfter()).thenReturn(networkAfter); + + mapper.onDataTreeChanged(changes); + // no-op in NeutronNetworkAware#onUpdated + } + + @Test + public void test_Delete() { + when(networkModif.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE); + when(rootNode.getDataBefore()).thenReturn(oldNeutronBefore); + when(rootNode.getDataAfter()).thenReturn(oldNeutronAfter); + + mapper.onDataTreeChanged(changes); + } + + @Test + public void test_SubtreeModified() { + when(networkModif.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED); + when(rootNode.getDataBefore()).thenReturn(oldNeutronBefore); + when(rootNode.getDataAfter()).thenReturn(oldNeutronAfter); + + mapper.onDataTreeChanged(changes); + } + + private void assertNetworkExists(Network network) { + Optional opt = getL3ContextOptional(network); + if (opt.isPresent()) { + assertEquals(network.getUuid().getValue(), opt.get().getId().getValue()); + } else { + fail("no network in DS, Uuid:" + network.getUuid()); + } + } + + private void assertNetworkNotExists(Network network) { + Optional opt = getL3ContextOptional(network); + if (opt.isPresent()) { + assertNotEquals(network.getUuid().getValue(), opt.get().getId().getValue()); + } + } + + private Optional getL3ContextOptional(Network network) { + ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction(); + TenantId tenantId = new TenantId(network.getTenantId().getValue()); + ContextId l3CtxId = new ContextId(network.getUuid().getValue()); + L3ContextId l3ContextId = new L3ContextId(l3CtxId); + InstanceIdentifier l3ContextIid = IidFactory.l3ContextIid(tenantId, l3ContextId); + return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, l3ContextIid, rTx); + } +} diff --git a/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAwareDataStoreTest.java b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAwareDataStoreTest.java new file mode 100644 index 000000000..a56822f93 --- /dev/null +++ b/neutron-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/mapper/mapping/NeutronNetworkAwareDataStoreTest.java @@ -0,0 +1,162 @@ +/* + * 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.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +import com.google.common.base.Optional; +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.controller.md.sal.binding.api.ReadOnlyTransaction; +import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.groupbasedpolicy.neutron.mapper.test.NeutronMapperDataBrokerTest; +import org.opendaylight.groupbasedpolicy.util.DataStoreHelper; +import org.opendaylight.groupbasedpolicy.util.IidFactory; +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.ContextId; +import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.L3ContextId; +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.forwarding.context.L3Context; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtensionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron; +import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.RpcResult; + +public class NeutronNetworkAwareDataStoreTest extends NeutronMapperDataBrokerTest { + + private final Uuid tenantUuid = new Uuid("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"); + private final Uuid networkUuid = new Uuid("dddddddd-dddd-dddd-dddd-dddddddddddd"); + + private DataBroker dataBroker; + private NeutronNetworkAware networkAware; + private Neutron neutron; + private Future> futureRpcResult; + private Future> futureRpcFail; + private RpcResult rpcResult; + private RpcResult rpcFail; + private Network network; + private NetworkProviderExtension providerExtension; + + @Before + public void init() throws ExecutionException, InterruptedException { + futureRpcResult = mock(Future.class); + futureRpcFail = mock(Future.class); + rpcResult = mock(RpcResult.class); + rpcFail = mock(RpcResult.class); + when(rpcResult.isSuccessful()).thenReturn(true); + when(rpcFail.isSuccessful()).thenReturn(false); + dataBroker = getDataBroker(); + neutron = mock(Neutron.class); + + when(futureRpcResult.get()).thenReturn(rpcResult); + when(futureRpcFail.get()).thenReturn(rpcFail); + + providerExtension = new NetworkProviderExtensionBuilder().setPhysicalNetwork("physicalNetwork") + .setSegmentationId("segmentationId") + .build(); + + network = new NetworkBuilder().setTenantId(tenantUuid) + .setUuid(networkUuid) + .setName("networkName") + .addAugmentation(NetworkProviderExtension.class, providerExtension) + .build(); + + networkAware = new NeutronNetworkAware(dataBroker); + } + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void testConstructor_invalidArgument() throws NullPointerException { + thrown.expect(NullPointerException.class); + new NeutronNetworkAware(null); + } + + @Test + public void testOnCreated() { + + networkAware.onCreated(network, neutron); + + assertNetworkExists(network); + } + + @Test + public void testOnCreated_incorrectName() { + Network network = new NetworkBuilder().setTenantId(tenantUuid).setName("123").setUuid(networkUuid).build(); + + networkAware.onCreated(network, neutron); + + assertNetworkExists(network); + } + + @Test + public void testOnDeleted() { + Network network = + new NetworkBuilder().setTenantId(tenantUuid).setName("networkName").setUuid(networkUuid).build(); + + assertNetworkNotExists(network); + + networkAware.onCreated(network, neutron); + + assertNetworkExists(network); + + networkAware.onDeleted(network, neutron, neutron); + + assertNetworkNotExists(network); + } + + @Test + public void testOnUpdated() { + Network network = + new NetworkBuilder().setTenantId(tenantUuid).setName("networkName").setUuid(networkUuid).build(); + + networkAware.onUpdated(network, network, neutron, neutron); + // no op + } + + private void assertNetworkExists(Network network) { + Optional opt = getL3ContextOptional(network); + if (opt.isPresent()) { + assertEquals(network.getUuid().getValue(), opt.get().getId().getValue()); + } else { + fail("no network in DS, Uuid:" + network.getUuid()); + } + } + + private void assertNetworkNotExists(Network network) { + Optional opt = getL3ContextOptional(network); + if (opt.isPresent()) { + assertNotEquals(network.getUuid().getValue(), opt.get().getId().getValue()); + } + } + + private Optional getL3ContextOptional(Network network) { + ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction(); + TenantId tenantId = new TenantId(network.getTenantId().getValue()); + ContextId l3CtxId = new ContextId(network.getUuid().getValue()); + L3ContextId l3ContextId = new L3ContextId(l3CtxId); + InstanceIdentifier l3ContextIid = IidFactory.l3ContextIid(tenantId, l3ContextId); + return DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION, l3ContextIid, rTx); + } + +} 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 index c0ea1a20b..19f4a126d 100644 --- 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 @@ -8,6 +8,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.forwarding 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; +import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron; /** * Loads only modules of GBP and it's dependencies for data broker. @@ -18,7 +19,7 @@ public class NeutronMapperDataBrokerTest extends CustomDataBrokerTest { @Override public Collection> getClassesFromModules() { - return ImmutableList.>of(Tenants.class, Forwarding.class, SubnetAugmentForwarding.class, + return ImmutableList.>of(Neutron.class, Tenants.class, Forwarding.class, SubnetAugmentForwarding.class, Mappings.class); } -- 2.36.6