diff options
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.java | 125 |
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 |