summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--vbd/api/src/main/yang/vbridge-topology.yang2
-rw-r--r--vbd/impl/pom.xml6
-rw-r--r--vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java61
3 files changed, 65 insertions, 4 deletions
diff --git a/vbd/api/src/main/yang/vbridge-topology.yang b/vbd/api/src/main/yang/vbridge-topology.yang
index f105b5e41..901907387 100644
--- a/vbd/api/src/main/yang/vbridge-topology.yang
+++ b/vbd/api/src/main/yang/vbridge-topology.yang
@@ -91,8 +91,10 @@ module vbridge-topology {
}
augment "/nt:network-topology/nt:topology/nt:node" {
+ ext:augment-identifier "node-vbridge-augment";
when "../nt:topology-types/vbridge-topology";
+
container bridge-member {
presence "Indicates this node is part of the bridge domain";
diff --git a/vbd/impl/pom.xml b/vbd/impl/pom.xml
index d4ac30d62..6f966b8c8 100644
--- a/vbd/impl/pom.xml
+++ b/vbd/impl/pom.xml
@@ -51,6 +51,12 @@
<artifactId>vbd-api</artifactId>
</dependency>
+ <dependency>
+ <groupId>io.fd.honeycomb.v3po</groupId>
+ <artifactId>v3po-api</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </dependency>
+
<!-- Testing Dependencies -->
<dependency>
<groupId>junit</groupId>
diff --git a/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java b/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java
index 9cea6589f..e7652aa32 100644
--- a/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java
+++ b/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java
@@ -8,6 +8,7 @@
package io.fd.honeycomb.vbd.impl;
+import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import java.util.Collection;
import javax.annotation.concurrent.GuardedBy;
@@ -18,15 +19,26 @@ import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.Mod
import org.opendaylight.controller.md.sal.binding.api.DataTreeChangeListener;
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.MountPoint;
import org.opendaylight.controller.md.sal.binding.api.MountPointService;
import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.Vpp;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.BridgeDomains;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomainBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.TopologyVbridgeAugment;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.node.attributes.SupportingNode;
import org.opendaylight.yangtools.concepts.ListenerRegistration;
import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,12 +50,14 @@ import org.slf4j.LoggerFactory;
final class BridgeDomain implements DataTreeChangeListener<Topology> {
private static final Logger LOG = LoggerFactory.getLogger(BridgeDomain.class);
private final KeyedInstanceIdentifier<Topology, TopologyKey> topology;
-
@GuardedBy("this")
+
private final BindingTransactionChain chain;
private final ListenerRegistration<?> reg;
private final MountPointService mountService;
private TopologyVbridgeAugment config;
+ private final String bridgeDomainName;
+ private final InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain> iiBridgeDomainOnVPP;
private BridgeDomain(final DataBroker dataBroker, final MountPointService mountService, final KeyedInstanceIdentifier<Topology, TopologyKey> topology,
final BindingTransactionChain chain) {
@@ -51,6 +65,11 @@ final class BridgeDomain implements DataTreeChangeListener<Topology> {
this.chain = Preconditions.checkNotNull(chain);
this.mountService = mountService;
+ this.bridgeDomainName = topology.getKey().getTopologyId().getValue();
+ this.iiBridgeDomainOnVPP = InstanceIdentifier.create(Vpp.class)
+ .child(BridgeDomains.class)
+ .child(org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain.class, new BridgeDomainKey(bridgeDomainName));
+
reg = dataBroker.registerDataTreeChangeListener(
new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, topology), this);
}
@@ -110,7 +129,7 @@ final class BridgeDomain implements DataTreeChangeListener<Topology> {
LOG.debug("Topology {} modified child {}", topology, child);
if (Node.class.isAssignableFrom(child.getDataType())) {
- modifyNode((DataObjectModification<Node>) child);
+ modifyNode((DataObjectModification<Node>) child, newConfig.getDataAfter());
}
}
@@ -136,7 +155,7 @@ final class BridgeDomain implements DataTreeChangeListener<Topology> {
}
}
- private void modifyNode(final DataObjectModification<Node> child) {
+ private void modifyNode(final DataObjectModification<Node> child, final TopologyVbridgeAugment topologyVbridgeAugment) {
switch (child.getModificationType()) {
case DELETE:
LOG.debug("Topology {} node {} deleted", topology, child.getIdentifier());
@@ -148,7 +167,7 @@ final class BridgeDomain implements DataTreeChangeListener<Topology> {
break;
case WRITE:
LOG.debug("Topology {} node {} created", topology, child.getIdentifier());
- // FIXME: do something
+ createNode(child.getDataAfter(), topologyVbridgeAugment);
break;
default:
LOG.warn("Unhandled node modification {} in topology {}", child, topology);
@@ -156,6 +175,40 @@ final class BridgeDomain implements DataTreeChangeListener<Topology> {
}
}
+ private void createNode(final Node node, final TopologyVbridgeAugment topologyVbridgeAugment) {
+ for (SupportingNode supportingNode : node.getSupportingNode()) {
+ final NodeId nodeMount = supportingNode.getNodeRef();
+ final TopologyId topologyMount = supportingNode.getTopologyRef();
+
+ final KeyedInstanceIdentifier<Node, NodeKey> iiToMount = InstanceIdentifier
+ .create(NetworkTopology.class)
+ .child(Topology.class, new TopologyKey(topologyMount))
+ .child(Node.class, new NodeKey(nodeMount));
+ final Optional<MountPoint> vppMountOption = mountService.getMountPoint(iiToMount);
+ if (vppMountOption.isPresent()) {
+ final MountPoint vppMount = vppMountOption.get();
+ addVppToBridgeDomain(topologyVbridgeAugment, vppMount);
+ }
+ }
+ }
+
+ private void addVppToBridgeDomain(TopologyVbridgeAugment topologyVbridgeAugment, MountPoint vppMount) {
+ final Optional<DataBroker> dataBrokerOpt = vppMount.getService(DataBroker.class);
+ if (dataBrokerOpt.isPresent()) {
+ final DataBroker vppDataBroker = dataBrokerOpt.get();
+ final WriteTransaction wTx = vppDataBroker.newWriteOnlyTransaction();
+ wTx.put(LogicalDatastoreType.OPERATIONAL, iiBridgeDomainOnVPP, prepareNewBridgeDomainData(topologyVbridgeAugment));
+ wTx.submit();
+ }
+ }
+
+ private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.v3po.rev150105.vpp.bridge.domains.BridgeDomain
+ prepareNewBridgeDomainData(TopologyVbridgeAugment topologyVbridgeAugment) {
+ final BridgeDomainBuilder bridgeDomainBuilder = new BridgeDomainBuilder(topologyVbridgeAugment);
+ bridgeDomainBuilder.setName(topology.getKey().getTopologyId().getValue());
+ return bridgeDomainBuilder.build();
+ }
+
private void setConfiguration(final TopologyVbridgeAugment config) {
LOG.debug("Topology {} configuration set to {}", topology, config);