Mapping Neutron network for VPP renderer 51/40051/16
authorTomas Cechvala <tcechval@cisco.com>
Wed, 8 Jun 2016 07:52:58 +0000 (09:52 +0200)
committerMartin Sunal <msunal@cisco.com>
Thu, 16 Jun 2016 10:54:43 +0000 (10:54 +0000)
Neutron networks are mapped to bridge-domains
Works for vxlan, flat and vlan networks.

Any comments on naming are appreciated

Change-Id: Ia96d661ff7c1bcc596e4b50ff189724233e6563f
Signed-off-by: Tomas Cechvala <tcechval@cisco.com>
neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NetworkAware.java [new file with mode: 0644]
neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListener.java
neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortAware.java [moved from neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/BaseEndpointByPortListener.java with 92% similarity]
neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/PortHandler.java
neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NetworkAwareTest.java [new file with mode: 0644]
neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NeutronListenerTest.java
renderers/vpp/pom.xml
renderers/vpp/src/main/yang/vpp-renderer.yang

diff --git a/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NetworkAware.java b/neutron-vpp-mapper/src/main/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NetworkAware.java
new file mode 100644 (file)
index 0000000..03c27ec
--- /dev/null
@@ -0,0 +1,166 @@
+/*\r
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.processors;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
+import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;\r
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.Config;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.FlatNetwork;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.NetworkTypeBase;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.VlanNetwork;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomain;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomainBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomainKey;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.bridge.domain.PhysicalLocationRef;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.bridge.domain.PhysicalLocationRefBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.Networks;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;\r
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+import com.google.common.annotations.VisibleForTesting;\r
+import com.google.common.base.Function;\r
+import com.google.common.base.Optional;\r
+import com.google.common.collect.Lists;\r
+\r
+public class NetworkAware implements MappingProvider<Network> {\r
+\r
+    private static final Logger LOG = LoggerFactory.getLogger(NetworkAware.class);\r
+\r
+    private final DataBroker dataBroker;\r
+\r
+    public NetworkAware(DataBroker dataBroker) {\r
+        this.dataBroker = dataBroker;\r
+    }\r
+\r
+    @Override\r
+    public InstanceIdentifier<Network> getNeutronDtoIid() {\r
+        return InstanceIdentifier.builder(Neutron.class).child(Networks.class).child(Network.class).build();\r
+    }\r
+\r
+    @Override\r
+    public void processCreatedNeutronDto(Network network) {\r
+        BridgeDomain bridgeDomain = createBridgeDomain(network);\r
+        if (bridgeDomain != null) {\r
+            ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
+            rwTx.put(LogicalDatastoreType.CONFIGURATION, getBridgeDomainIid(bridgeDomain.getId()), bridgeDomain);\r
+            DataStoreHelper.submitToDs(rwTx);\r
+        }\r
+    }\r
+\r
+    @VisibleForTesting\r
+    BridgeDomain createBridgeDomain(Network network) {\r
+        BridgeDomainBuilder bridgeDomainBuilder = new BridgeDomainBuilder();\r
+        String description = (network.getName() != null) ? network.getName() : "Neutron network";\r
+        bridgeDomainBuilder.setDescription(description);\r
+        bridgeDomainBuilder.setId(network.getUuid().getValue());\r
+        NetworkProviderExtension providerAug = network.getAugmentation(NetworkProviderExtension.class);\r
+        if (providerAug == null || providerAug.getNetworkType() == null) {\r
+            LOG.error("Cannot create VPP bridge domain. Network type not specified in neutron network: {}", network);\r
+            return null;\r
+        }\r
+        bridgeDomainBuilder.setPhysicalLocationRef(resolveDomainLocations(providerAug));\r
+        bridgeDomainBuilder.setType(convertNetworkType(providerAug.getNetworkType()));\r
+        if (providerAug.getNetworkType().isAssignableFrom(NetworkTypeVlan.class)\r
+                && providerAug.getSegmentationId() != null) {\r
+            try {\r
+                bridgeDomainBuilder.setVlan(new VlanId(Integer.valueOf(providerAug.getSegmentationId())));\r
+            } catch (NumberFormatException e) {\r
+                LOG.error("Neutron network {}. Cannot create VLAN ID from segmentation-id: {}. {}",\r
+                        providerAug.getSegmentationId(), network.getUuid(), e);\r
+                return null;\r
+            }\r
+        }\r
+        return bridgeDomainBuilder.build();\r
+    }\r
+\r
+    @VisibleForTesting\r
+    List<PhysicalLocationRef> resolveDomainLocations(NetworkProviderExtension providerAug) {\r
+        List<PhysicalLocationRef> locationRefs = new ArrayList<>();\r
+        ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();\r
+        if (providerAug.getPhysicalNetwork() == null) {\r
+            return null;\r
+        }\r
+        Optional<Topology> readTopology = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                getTopologyIid(new TopologyId(providerAug.getPhysicalNetwork())), rTx);\r
+        if (readTopology.isPresent()) {\r
+            Topology topology = readTopology.get();\r
+            for (Node node : topology.getNode()) {\r
+                PhysicalLocationRefBuilder location = new PhysicalLocationRefBuilder();\r
+                location.setNodeId(node.getNodeId());\r
+                location.setInterface(Lists.transform(node.getTerminationPoint(),\r
+                        new Function<TerminationPoint, String>() {\r
+\r
+                            @Override\r
+                            public String apply(TerminationPoint input) {\r
+                                return input.getTpId().getValue();\r
+                            }\r
+                        }));\r
+                locationRefs.add(location.build());\r
+            }\r
+        }\r
+        return locationRefs;\r
+    }\r
+\r
+    public static Class<? extends NetworkTypeBase> convertNetworkType(\r
+            Class<? extends org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeBase> base) {\r
+        if (base.isAssignableFrom(NetworkTypeFlat.class)) {\r
+            return FlatNetwork.class;\r
+        }\r
+        if (base.isAssignableFrom(NetworkTypeVlan.class)) {\r
+            return VlanNetwork.class;\r
+        }\r
+        throw new IllegalStateException("Unsupported network type: " + base);\r
+    }\r
+\r
+    InstanceIdentifier<Topology> getTopologyIid(TopologyId topologyId) {\r
+        return InstanceIdentifier.builder(NetworkTopology.class)\r
+            .child(Topology.class, new TopologyKey(topologyId))\r
+            .build();\r
+    }\r
+\r
+    InstanceIdentifier<BridgeDomain> getBridgeDomainIid(String id) {\r
+        return InstanceIdentifier.builder(Config.class).child(BridgeDomain.class, new BridgeDomainKey(id)).build();\r
+    }\r
+\r
+    @Override\r
+    public void processUpdatedNeutronDto(Network originalNetwork, Network updatedNetwork) {\r
+        InstanceIdentifier<BridgeDomain> bdId = getBridgeDomainIid(originalNetwork.getUuid().getValue());\r
+        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
+        rwTx.delete(LogicalDatastoreType.CONFIGURATION, bdId);\r
+        rwTx.put(LogicalDatastoreType.CONFIGURATION, bdId, createBridgeDomain(updatedNetwork));\r
+        DataStoreHelper.submitToDs(rwTx);\r
+    }\r
+\r
+    @Override\r
+    public void processDeletedNeutronDto(Network network) {\r
+        InstanceIdentifier<BridgeDomain> bdId = getBridgeDomainIid(network.getUuid().getValue());\r
+        ReadWriteTransaction rwTx = dataBroker.newReadWriteTransaction();\r
+        rwTx.delete(LogicalDatastoreType.CONFIGURATION, bdId);\r
+        DataStoreHelper.submitToDs(rwTx);\r
+    }\r
+}\r
index 353120c35d6cb1d5815b37158bf79b0a10c339b9..8f80cc385765d8c9f6d604bca6f9914f99c2e4ed 100644 (file)
@@ -51,7 +51,8 @@ public class NeutronListener implements DataTreeChangeListener<Neutron>, Closeab
 \r
     private void registerHandlersAndListeners(DataBroker dataBroker, SocketInfo socketInfo) {\r
         PortHandler portHandler = new PortHandler(dataBroker, socketInfo);\r
-        dataChangeProviders.add(new BaseEndpointByPortListener(portHandler, dataBroker));\r
+        dataChangeProviders.add(new PortAware(portHandler, dataBroker));\r
+        dataChangeProviders.add(new NetworkAware(dataBroker));\r
     }\r
 \r
     @Override\r
@@ -20,12 +20,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.neutron.gb
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;\r
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
 \r
-public class BaseEndpointByPortListener extends DataTreeChangeHandler<BaseEndpointByPort> implements\r
+public class PortAware extends DataTreeChangeHandler<BaseEndpointByPort> implements\r
         MappingProvider<Port> {\r
 \r
     private final PortHandler portHandler;\r
 \r
-    protected BaseEndpointByPortListener(PortHandler portHandler, DataBroker dataProvider) {\r
+    protected PortAware(PortHandler portHandler, DataBroker dataProvider) {\r
         super(dataProvider);\r
         this.portHandler = portHandler;\r
         registerDataTreeChangeListener(new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,\r
index 5bce99cce32874db3177bbee9e9ab8b51a0d293f..74a0f6be9b417fb226ef8eb20825fd12e34ff5de 100644 (file)
@@ -56,12 +56,12 @@ public class PortHandler implements TransactionChainListener {
 \r
     private static final Logger LOG = LoggerFactory.getLogger(MappingProvider.class);\r
 \r
-    private static final String COMPUTE_OWNER = "compute";\r
+    private static final String[] COMPUTE_OWNER = {"compute"};\r
     private static final String VHOST_USER = "vhostuser";\r
     private static final String NETCONF_TOPOLOGY_ID = "topology-netconf";\r
 \r
     private BindingTransactionChain transactionChain;\r
-    BaseEndpointByPortListener portByBaseEpListener;\r
+    PortAware portByBaseEpListener;\r
     DataBroker dataBroker;\r
     SocketInfo socketInfo;\r
 \r
@@ -106,8 +106,12 @@ public class PortHandler implements TransactionChainListener {
             String vifType = portBindingExt.getVifType();\r
             String deviceOwner = port.getDeviceOwner();\r
             if (vifType != null && deviceOwner != null) {\r
-                if (vifType.contains(VHOST_USER) && deviceOwner.contains(COMPUTE_OWNER)) {\r
-                    return true;\r
+                if (vifType.contains(VHOST_USER)) {\r
+                    for (String computeOwner : COMPUTE_OWNER) {\r
+                        if (deviceOwner.contains(computeOwner)) {\r
+                            return true;\r
+                        }\r
+                    }\r
                 }\r
             }\r
         }\r
diff --git a/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NetworkAwareTest.java b/neutron-vpp-mapper/src/test/java/org/opendaylight/groupbasedpolicy/neutron/vpp/mapper/processors/NetworkAwareTest.java
new file mode 100644 (file)
index 0000000..c3eab90
--- /dev/null
@@ -0,0 +1,176 @@
+/*\r
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.neutron.vpp.mapper.processors;\r
+\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNull;\r
+import static org.junit.Assert.assertFalse;\r
+import static org.junit.Assert.assertTrue;\r
+\r
+import java.util.List;\r
+import java.util.UUID;\r
+\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.mockito.Mockito;\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;\r
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
+import org.opendaylight.controller.md.sal.binding.test.AbstractDataBrokerTest;\r
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
+import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.FlatNetwork;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.VlanNetwork;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.BridgeDomain;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp_renderer.rev160425.config.bridge.domain.PhysicalLocationRef;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeFlat;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.NetworkTypeVlan;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.Network;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.networks.rev150712.networks.attributes.networks.NetworkBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtension;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.provider.ext.rev150712.NetworkProviderExtensionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TpId;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPoint;\r
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.node.TerminationPointBuilder;\r
+\r
+import com.google.common.base.Optional;\r
+import com.google.common.collect.ImmutableList;\r
+\r
+public class NetworkAwareTest extends AbstractDataBrokerTest {\r
+\r
+    private DataBroker dataBroker;\r
+    private NetworkAware networkAware;\r
+    private NetworkProviderExtensionBuilder netExtBuilder;\r
+\r
+    @Before\r
+    public void init() {\r
+        dataBroker = Mockito.spy(getDataBroker());\r
+        networkAware = new NetworkAware(dataBroker);\r
+        netExtBuilder = new NetworkProviderExtensionBuilder();\r
+        netExtBuilder.setPhysicalNetwork("physicalNet");\r
+    }\r
+\r
+    @Test\r
+    public void testProcessCreatedNeutronDto_flat() {\r
+        netExtBuilder.setNetworkType(NetworkTypeFlat.class);\r
+        Network network = createTestNetwork("net", netExtBuilder.build());\r
+        networkAware.processCreatedNeutronDto(network);\r
+        ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();\r
+        Optional<BridgeDomain> optBrDomain = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                networkAware.getBridgeDomainIid(network.getUuid().getValue()), rTx);\r
+        assertTrue(optBrDomain.isPresent());\r
+    }\r
+\r
+    @Test\r
+    public void testProcessUpdatedNeutronDto() {\r
+        netExtBuilder.setNetworkType(NetworkTypeFlat.class);\r
+        Network network1 = createTestNetwork("net1", netExtBuilder.build());\r
+        Network network2 = new NetworkBuilder(network1).setName("net2")\r
+            .addAugmentation(NetworkProviderExtension.class, netExtBuilder.build())\r
+            .build();\r
+        networkAware.processUpdatedNeutronDto(network1, network2);\r
+        ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();\r
+        Optional<BridgeDomain> optBrDomain = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                networkAware.getBridgeDomainIid(network2.getUuid().getValue()), rTx);\r
+        assertTrue(optBrDomain.isPresent());\r
+        assertEquals(optBrDomain.get().getDescription(), "net2");\r
+    }\r
+\r
+    @Test\r
+    public void testProcessDeletedNeutronDto() {\r
+        netExtBuilder.setNetworkType(NetworkTypeFlat.class);\r
+        Network network = createTestNetwork("net1", netExtBuilder.build());\r
+        networkAware.processDeletedNeutronDto(network);\r
+        ReadOnlyTransaction rTx = dataBroker.newReadOnlyTransaction();\r
+        Optional<BridgeDomain> optBrDomain = DataStoreHelper.readFromDs(LogicalDatastoreType.CONFIGURATION,\r
+                networkAware.getBridgeDomainIid(network.getUuid().getValue()), rTx);\r
+        assertFalse(optBrDomain.isPresent());\r
+    }\r
+\r
+    @Test\r
+    public void testCreateBridgeDomain_vlanNetwork() {\r
+        netExtBuilder.setNetworkType(NetworkTypeVlan.class);\r
+        netExtBuilder.setSegmentationId("2016");\r
+        Network vlanNetwork = createTestNetwork("VlanNet", netExtBuilder.build());\r
+        BridgeDomain bridgeDomain = networkAware.createBridgeDomain(vlanNetwork);\r
+        assertEquals(bridgeDomain.getId(), vlanNetwork.getUuid().getValue());\r
+        assertEquals(bridgeDomain.getDescription(), vlanNetwork.getName());\r
+        assertEquals(bridgeDomain.getType(), VlanNetwork.class);\r
+        assertEquals(bridgeDomain.getVlan(), new VlanId(Integer.valueOf(2016)));\r
+    }\r
+\r
+    @Test\r
+    public void testCreateBridgeDomain_flatNetwork() {\r
+        netExtBuilder.setNetworkType(NetworkTypeFlat.class);\r
+        Network flatNetwork = createTestNetwork("FlatNet", netExtBuilder.build());\r
+        BridgeDomain bridgeDomain = networkAware.createBridgeDomain(flatNetwork);\r
+        assertEquals(bridgeDomain.getId(), flatNetwork.getUuid().getValue());\r
+        assertEquals(bridgeDomain.getDescription(), flatNetwork.getName());\r
+        assertEquals(bridgeDomain.getType(), FlatNetwork.class);\r
+    }\r
+\r
+    @Test\r
+    public void testCreateBridgeDomain_noPhysicalNetwork() {\r
+        netExtBuilder.setNetworkType(NetworkTypeFlat.class);\r
+        netExtBuilder.setPhysicalNetwork(null);\r
+        Network flatNetwork = createTestNetwork("FlatNet", netExtBuilder.build());\r
+        BridgeDomain bridgeDomain = networkAware.createBridgeDomain(flatNetwork);\r
+        assertNull(bridgeDomain.getPhysicalLocationRef());\r
+    }\r
+\r
+    @Test\r
+    public void testCreateBridgeDomain_noNetworkType() {\r
+        Network vlanNetwork = createTestNetwork("noTypeNet", new NetworkProviderExtensionBuilder().build());\r
+        BridgeDomain bridgeDomain = networkAware.createBridgeDomain(vlanNetwork);\r
+        assertNull(bridgeDomain);\r
+    }\r
+\r
+    @Test\r
+    public void testResolveDomainLocations() {\r
+        NodeId nodeId = new NodeId("node1");\r
+        TpId tpId = new TpId("tp1");\r
+        TopologyId topologyId = new TopologyId("physicalNet");\r
+        writeBasicTopology(topologyId, nodeId, tpId);\r
+        NetworkProviderExtension netExt = new NetworkProviderExtensionBuilder().setPhysicalNetwork("physicalNet")\r
+            .build();\r
+        List<PhysicalLocationRef> resolvedLocations = networkAware.resolveDomainLocations(netExt);\r
+        PhysicalLocationRef physLocationRef = resolvedLocations.get(0);\r
+        assertEquals(nodeId, physLocationRef.getNodeId());\r
+        assertEquals(tpId.getValue(), physLocationRef.getInterface().get(0));\r
+    }\r
+\r
+    private Network createTestNetwork(String name, NetworkProviderExtension ext) {\r
+        return new NetworkBuilder().setUuid(new Uuid(UUID.randomUUID().toString()))\r
+            .setName(name)\r
+            .addAugmentation(NetworkProviderExtension.class, ext)\r
+            .build();\r
+    }\r
+\r
+    private void writeBasicTopology(TopologyId topologyId, NodeId nodeId, TpId tpId) {\r
+        TerminationPoint tp = new TerminationPointBuilder().setTpId(tpId).build();\r
+        Node node = new NodeBuilder().setNodeId(new NodeId(nodeId))\r
+            .setTerminationPoint(ImmutableList.<TerminationPoint>of(tp))\r
+            .build();\r
+        Topology topology = new TopologyBuilder().setTopologyId(topologyId)\r
+            .setNode(ImmutableList.<Node>of(node))\r
+            .build();\r
+        WriteTransaction wTx = dataBroker.newWriteOnlyTransaction();\r
+        wTx.put(LogicalDatastoreType.CONFIGURATION, networkAware.getTopologyIid(new TopologyId("physicalNet")),\r
+                topology, true);\r
+        DataStoreHelper.submitToDs(wTx);\r
+    }\r
+}\r
index ee359c18d6b05a1e309f609b7ee1aac634c9be53..0c81dfedc51de340543e945dd0119294c1e72aee 100644 (file)
@@ -40,7 +40,7 @@ public class NeutronListenerTest extends AbstractDataBrokerTest {
     private Port port;\r
     private BaseEndpointByPort bebp;\r
     private NeutronListener neutronListener;\r
-    private BaseEndpointByPortListener baseEpByPortListener;\r
+    private PortAware baseEpByPortListener;\r
 \r
     @Before\r
     public void init() {\r
@@ -50,7 +50,7 @@ public class NeutronListenerTest extends AbstractDataBrokerTest {
         dataBroker = getDataBroker();\r
         neutronListener = new NeutronListener(dataBroker, socketInfo);\r
         neutronListener.clearDataChangeProviders();\r
-        baseEpByPortListener = Mockito.spy(new BaseEndpointByPortListener(new PortHandler(\r
+        baseEpByPortListener = Mockito.spy(new PortAware(new PortHandler(\r
                 dataBroker, socketInfo), dataBroker));\r
         neutronListener.addDataChangeProvider(baseEpByPortListener);\r
     }\r
@@ -69,7 +69,7 @@ public class NeutronListenerTest extends AbstractDataBrokerTest {
                         .child(GbpByNeutronMappings.class)\r
                         .child(BaseEndpointsByPorts.class)\r
                         .child(BaseEndpointByPort.class)\r
-                        .build())), any(BaseEndpointByPortListener.class));\r
+                        .build())), any(PortAware.class));\r
         neutronListener.close();\r
     }\r
 \r
index e8a91201d30d48ade7d8b5cfcf66fa5342246385..f16ccfc46c06021c05d103274200ea80e60d7989 100644 (file)
       <artifactId>vbd-api</artifactId>
       <version>1.0.0-SNAPSHOT</version>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal.model</groupId>
+      <artifactId>opendaylight-l2-types</artifactId>
+    </dependency>
 
     <!-- testing dependencies -->
     <dependency>
index e15b1d7a85bfe03ccb28bc208c776628a356c4dd..81f2f45346113fa70182e528a9eaf227411c3922 100644 (file)
@@ -13,6 +13,8 @@ module vpp-renderer {
     prefix "vpp-renderer";
 
     import base-endpoint { prefix base-ep; revision-date 2016-04-27; }
+    import network-topology { prefix nt; revision-date 2013-10-21; }
+    import opendaylight-l2-types { prefix l2-types; revision-date "2013-08-27"; }
 
     description
         "This module is a baseline for the group-based policy vpp renderer model.";
@@ -22,6 +24,27 @@ module vpp-renderer {
             "Initial revision.";
     }
 
+    identity network-type-base {
+        description "Base for Network Types.";
+    }
+
+    identity flat-network {
+        description "Flat Provider Network Type";
+        base network-type-base;
+    }
+
+    identity vlan-network {
+        description "VLAN Provider Network Type";
+        base network-type-base;
+    }
+
+    typedef network-type {
+        description "Type of Network.";
+        type identityref {
+            base network-type-base;
+        }
+    }
+
     container config {
         list vpp-endpoint {
             description "Renderer creates/removes interface on VPP node based on given parameters.";
@@ -52,5 +75,38 @@ module vpp-renderer {
                 }
             }
         }
+
+        list bridge-domain {
+            key "id";
+            leaf id {
+                description "Same as in VBD.";
+                type string;
+            }
+            leaf description {
+               type string;
+            }
+            leaf type {
+                mandatory true;
+                type network-type;
+            }
+            leaf vlan {
+                when "type = 'vlan-network'";
+                type l2-types:vlan-id;
+            }
+            list physical-location-ref {
+                description
+                    "Refers to physical interfaces on vpp nodes through which external
+                     nodes belonging to the same bridge-domain can be reached.";
+                key "node-id";
+                leaf node-id {
+                    description "Refers to a VPP node.";
+                    type nt:node-id;
+                }
+                leaf-list interface {
+                    description "Physical interface on the VPP node.";
+                    type string;
+                }
+            }
+        }
     }
 }