--- /dev/null
+/*\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
\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
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
\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
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
--- /dev/null
+/*\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
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
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
.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
<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>
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.";
"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.";
}
}
}
+
+ 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;
+ }
+ }
+ }
}
}