From a9794fb3b835682615ea35dd766a9b3a490b77aa Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 16 Jan 2018 17:59:35 +0200 Subject: [PATCH] NETVIRT-1065 Handle new bridges If a provider network's value is a bridge name we patch it to br-int. If the bridge does not exist prior to the discovery of the provider mapping ODL will assume the provider net is a local port and add it to br-int. However, a user can remove that port and then add the bridge and now the code will detect that addition and create the patch ports. Change-Id: Ieae1a37ccf90caa51566864be14d840319429e61 Signed-off-by: Josh (cherry picked from commit 216a424f69d254cbafe86a06cd90a42ed7fb6d2e) --- .../elan/internal/ElanBridgeManager.java | 51 +++++++++++++++++++ .../elan/internal/ElanOvsdbNodeListener.java | 1 + 2 files changed, 52 insertions(+) diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java index a2f591247f..edf744eee6 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanBridgeManager.java @@ -12,6 +12,7 @@ import com.google.common.base.Strings; import com.google.common.collect.Lists; import java.math.BigInteger; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -39,6 +40,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.re import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbTerminationPointAugmentationBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.BridgeOtherConfigs; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.bridge.attributes.BridgeOtherConfigsBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.ovsdb.node.attributes.ManagedNodeEntry; 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.network.topology.Topology; @@ -177,6 +179,55 @@ public class ElanBridgeManager implements IElanBridgeManager { } + public void handleNewProviderNetBridges(Node originalNode, Node updatedNode) { + if (!isOvsdbNode(updatedNode)) { + return; + } + + List originalManagedNodes = getManagedNodeEntries(originalNode); + if (originalManagedNodes == null) { + return; + } + List updatedManagedNodes = getManagedNodeEntries(updatedNode); + if (updatedManagedNodes == null) { + return; + } + updatedManagedNodes.removeAll(originalManagedNodes); + if (updatedManagedNodes.isEmpty()) { + return; + } + LOG.debug("handleNewProviderNetBridges checking if any of these are provider nets {}", updatedManagedNodes); + + Node brInt = southboundUtils.readBridgeNode(updatedNode, INTEGRATION_BRIDGE); + if (brInt == null) { + LOG.info("handleNewProviderNetBridges, br-int not found"); + return; + } + + Collection providerVals = getOpenvswitchOtherConfigMap(updatedNode, PROVIDER_MAPPINGS_KEY).values(); + for (ManagedNodeEntry nodeEntry : updatedManagedNodes) { + String bridgeName = nodeEntry.getBridgeRef().getValue().firstKeyOf(Node.class).getNodeId().getValue(); + bridgeName = bridgeName.substring(bridgeName.lastIndexOf('/') + 1); + if (bridgeName.equals(INTEGRATION_BRIDGE)) { + continue; + } + if (providerVals.contains(bridgeName)) { + patchBridgeToBrInt(brInt, southboundUtils.readBridgeNode(updatedNode, bridgeName), bridgeName); + } + } + + + } + + private List getManagedNodeEntries(Node node) { + OvsdbNodeAugmentation ovsdbNode = southboundUtils.extractNodeAugmentation(node); + if (ovsdbNode == null) { + return null; + } + + return ovsdbNode.getManagedNodeEntry(); + } + private void prepareIntegrationBridge(Node ovsdbNode, Node brIntNode) { if (southboundUtils.getBridgeFromConfig(ovsdbNode, INTEGRATION_BRIDGE) == null) { LOG.debug("br-int in operational but not config, copying into config"); diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java index 8135957d31..4fb4ace555 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanOvsdbNodeListener.java @@ -86,6 +86,7 @@ public class ElanOvsdbNodeListener extends AsyncDataTreeChangeListenerBase