summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJozef Gloncak <jgloncak@cisco.com>2016-02-04 10:34:38 +0100
committerDave Wallace <dwallacelf@gmail.com>2016-02-04 13:53:46 +0000
commit3ee450a938e9a98c46fab07955f7f34e84c0cba9 (patch)
tree53a84fe85f91b3ef9d7d408e45ab0e5e21615b16
parent809e3e17a7582e56404c95e645914dd341fa379e (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>
-rw-r--r--vbd/impl/src/main/java/io/fd/honeycomb/vbd/impl/BridgeDomain.java60
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());