summaryrefslogtreecommitdiffstats
path: root/vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java
diff options
context:
space:
mode:
Diffstat (limited to 'vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java')
-rw-r--r--vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java125
1 files changed, 111 insertions, 14 deletions
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 aff03b2a6..6105cb26d 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,7 +8,11 @@
package io.fd.honeycomb.vbd.impl;
+import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
import java.util.Collection;
import javax.annotation.concurrent.GuardedBy;
import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain;
@@ -18,14 +22,31 @@ 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.vbridge.topology.rev160129.Topology1;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.external.reference.rev160129.ExternalReference;
+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.BridgeDomainBuilder;
+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.vbridge.topology.rev160129.NodeVbridgeAugment;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.TopologyVbridgeAugment;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.network.topology.topology.node.BridgeMember;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vbridge.topology.rev160129.network.topology.topology.node.BridgeMemberBuilder;
+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;
@@ -37,23 +58,43 @@ 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 Topology1 config;
+ 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 final String iiBridgeDomainOnVPPRest;
+ private final DataBroker dataBroker;
- private BridgeDomain(final DataBroker dataBroker, final KeyedInstanceIdentifier<Topology, TopologyKey> topology,
+ private BridgeDomain(final DataBroker dataBroker, final MountPointService mountService, final KeyedInstanceIdentifier<Topology, TopologyKey> topology,
final BindingTransactionChain chain) {
this.topology = Preconditions.checkNotNull(topology);
this.chain = Preconditions.checkNotNull(chain);
+ this.mountService = mountService;
+
+ this.bridgeDomainName = topology.getKey().getTopologyId().getValue();
+ this.iiBridgeDomainOnVPPRest = provideIIBrdigeDomainOnVPPRest();
+ 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));
+ this.dataBroker = dataBroker;
reg = dataBroker.registerDataTreeChangeListener(
- new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, topology), this);
+ new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, topology), this);
+ }
+
+ private String provideIIBrdigeDomainOnVPPRest() {
+ final StringBuilder strBuilder = new StringBuilder();
+ strBuilder.append("v3po:vpp/bridge-domains/bridge-domain/");
+ strBuilder.append(bridgeDomainName);
+ return strBuilder.toString();
}
static BridgeDomain create(final DataBroker dataBroker,
- final KeyedInstanceIdentifier<Topology, TopologyKey> topology, final BindingTransactionChain chain) {
+ MountPointService mountService, final KeyedInstanceIdentifier<Topology, TopologyKey> topology, final BindingTransactionChain chain) {
LOG.debug("Wiping operational state of {}", topology);
@@ -61,7 +102,7 @@ final class BridgeDomain implements DataTreeChangeListener<Topology> {
tx.delete(LogicalDatastoreType.OPERATIONAL, topology);
tx.submit();
- return new BridgeDomain(dataBroker, topology, chain);
+ return new BridgeDomain(dataBroker, mountService, topology, chain);
}
synchronized void forceStop() {
@@ -92,7 +133,7 @@ final class BridgeDomain implements DataTreeChangeListener<Topology> {
break;
case SUBTREE_MODIFIED:
// First check if the configuration has changed
- final DataObjectModification<Topology1> newConfig = mod.getModifiedAugmentation(Topology1.class);
+ final DataObjectModification<TopologyVbridgeAugment> newConfig = mod.getModifiedAugmentation(TopologyVbridgeAugment.class);
if (newConfig != null) {
if (newConfig.getModificationType() != ModificationType.DELETE) {
LOG.debug("Topology {} modified configuration {}", topology, newConfig);
@@ -107,7 +148,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());
}
}
@@ -116,7 +157,7 @@ final class BridgeDomain implements DataTreeChangeListener<Topology> {
final Topology data = mod.getDataAfter();
// Read configuration
- final Topology1 config = data.getAugmentation(Topology1.class);
+ final TopologyVbridgeAugment config = data.getAugmentation(TopologyVbridgeAugment.class);
if (config != null) {
setConfiguration(config);
} else {
@@ -133,7 +174,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());
@@ -145,7 +186,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);
@@ -153,14 +194,70 @@ final class BridgeDomain implements DataTreeChangeListener<Topology> {
}
}
- private void setConfiguration(final Topology1 config) {
+ 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, node);
+ }
+ }
+ }
+
+ private void addVppToBridgeDomain(final TopologyVbridgeAugment topologyVbridgeAugment, final MountPoint vppMount, final Node node) {
+ 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));
+ final CheckedFuture<Void, TransactionCommitFailedException> addVppToBridgeDomainFuture = wTx.submit();
+ addSupportingBridgeDomain(addVppToBridgeDomainFuture, node);
+ }
+ }
+
+ private void addSupportingBridgeDomain(final CheckedFuture<Void, TransactionCommitFailedException> addVppToBridgeDomainFuture, final Node node) {
+ Futures.addCallback(addVppToBridgeDomainFuture, new FutureCallback() {
+ @Override
+ public void onSuccess(Object result) {
+ LOG.debug("Storing bridge member to operational DS....");
+ final BridgeMemberBuilder bridgeMemberBuilder = new BridgeMemberBuilder();
+ bridgeMemberBuilder.setSupportingBridgeDomain(new ExternalReference(iiBridgeDomainOnVPPRest));
+ final InstanceIdentifier<BridgeMember> iiToBridgeMember = topology.child(Node.class, node.getKey()).augmentation(NodeVbridgeAugment.class).child(BridgeMember.class);
+ final WriteTransaction wTx = chain.newWriteOnlyTransaction();
+ wTx.put(LogicalDatastoreType.OPERATIONAL, iiToBridgeMember, bridgeMemberBuilder.build(), true);
+ wTx.submit();
+ }
+
+ @Override
+ public void onFailure(Throwable t) {
+ //TODO handle this state
+ }
+ });
+
+ }
+
+ 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);
this.config = config;
}
@GuardedBy("this")
- private void updateConfiguration(final DataObjectModification<Topology1> mod) {
+ private void updateConfiguration(final DataObjectModification<TopologyVbridgeAugment> mod) {
LOG.debug("Topology {} configuration changed", topology);
// FIXME: do something smarter