diff options
author | Jozef Gloncak <jgloncak@cisco.com> | 2016-02-04 10:34:38 +0100 |
---|---|---|
committer | Dave Wallace <dwallacelf@gmail.com> | 2016-02-04 13:53:46 +0000 |
commit | 3ee450a938e9a98c46fab07955f7f34e84c0cba9 (patch) | |
tree | 53a84fe85f91b3ef9d7d408e45ab0e5e21615b16 /vbd/impl/src/main | |
parent | 809e3e17a7582e56404c95e645914dd341fa379e (diff) |
Adding automatic creation of tunnel.
Initial code for adding code for interconnecting of virtual
bridge domain (via tunnel) which is spread on several VPPs.
Change-Id: I0da88c977e820b0b8edc565d261d3d8fb0629a1a
Signed-off-by: Jozef Gloncak <jgloncak@cisco.com>
Diffstat (limited to 'vbd/impl/src/main')
-rw-r--r-- | vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java | 60 |
1 files changed, 57 insertions, 3 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 82558684f..1bbac451a 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 @@ -16,6 +16,7 @@ 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 java.util.Map; import javax.annotation.concurrent.GuardedBy; import org.opendaylight.controller.md.sal.binding.api.BindingTransactionChain; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -26,10 +27,13 @@ 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.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; +import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.external.reference.rev160129.ExternalReference; @@ -81,7 +85,7 @@ final class BridgeDomain implements DataTreeChangeListener<Topology> { 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 Multimap<NodeId, InstanceIdentifier<?>> nodesToVpps = ArrayListMultimap.create(); + private Multimap<NodeId, KeyedInstanceIdentifier<Node, NodeKey>> nodesToVpps = ArrayListMultimap.create(); private BridgeDomain(final DataBroker dataBroker, final MountPointService mountService, final KeyedInstanceIdentifier<Topology, TopologyKey> topology, final BindingTransactionChain chain) { @@ -204,7 +208,13 @@ final class BridgeDomain implements DataTreeChangeListener<Topology> { break; case WRITE: LOG.debug("Topology {} node {} created", topology, nodeMod.getIdentifier()); - createNode(nodeMod.getDataAfter()); + final int numberVppsBeforeAddition = nodesToVpps.keySet().size(); + final Node newNode = nodeMod.getDataAfter(); + createNode(newNode); + final int numberVppsAfterAddition = nodesToVpps.keySet().size(); + if ((numberVppsBeforeAddition < numberVppsAfterAddition) && (numberVppsBeforeAddition >= 1)) { + addTunnel(newNode.getNodeId()); + } break; default: LOG.warn("Unhandled node modification {} in topology {}", nodeMod, topology); @@ -212,11 +222,55 @@ final class BridgeDomain implements DataTreeChangeListener<Topology> { } } + private void addTunnel(final NodeId newNode) { + for (Map.Entry<NodeId, KeyedInstanceIdentifier<Node, NodeKey>> entryToVpp : nodesToVpps.entries()) { + if (!entryToVpp.getKey().equals(newNode)) { + createTunnelEndPoint(entryToVpp.getValue()); + createTunnelEndPoint(nodesToVpps.get(newNode)); + } + + + } + } + + private void createTunnelEndPoint(Collection<KeyedInstanceIdentifier<Node, NodeKey>> keyedInstanceIdentifiers) { + for (KeyedInstanceIdentifier<Node, NodeKey> iiToVpp : keyedInstanceIdentifiers) { + createTunnelEndPoint(iiToVpp); + } + } + + private void createTunnelEndPoint(final KeyedInstanceIdentifier<Node, NodeKey> iiToVpp) { + final DataBroker vppDataBroker = resolveDataBrokerForMountPoint(iiToVpp); + final ReadOnlyTransaction rTx = vppDataBroker.newReadOnlyTransaction(); + + final CheckedFuture<Optional<InterfacesState>, ReadFailedException> interfaceStateFuture + = rTx.read(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(InterfacesState.class)); + Futures.addCallback(interfaceStateFuture, new FutureCallback<Optional<InterfacesState>>() { + @Override + public void onSuccess(Optional<InterfacesState> optInterfacesState) { + if (optInterfacesState.isPresent()) { + for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface intf : optInterfacesState.get().getInterface()) { + //TODO find interface with IP address set + } + } + + } + + @Override + public void onFailure(Throwable t) { + + } + }); + + + } + + private void modifyTerminationPoint(final DataObjectModification<TerminationPoint> nodeChild, final NodeId nodeId) { final TerminationPoint terminationPoint = nodeChild.getDataAfter(); final TerminationPointVbridgeAugment termPointVbridgeAug = terminationPoint.getAugmentation(TerminationPointVbridgeAugment.class); if (termPointVbridgeAug != null) { - final Collection<InstanceIdentifier<?>> instanceIdentifiersVPP = nodesToVpps.get(nodeId); + final Collection<KeyedInstanceIdentifier<Node, NodeKey>> instanceIdentifiersVPP = nodesToVpps.get(nodeId); //TODO: probably iterate via all instance identifiers. if (!instanceIdentifiersVPP.isEmpty()) { final DataBroker dataBroker = resolveDataBrokerForMountPoint(instanceIdentifiersVPP.iterator().next()); |