Merge "Handle duplicate tunnel on multiple dpns"
authorVishal Thapar <vishal.thapar@ericsson.com>
Thu, 22 Dec 2016 01:58:18 +0000 (01:58 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Thu, 22 Dec 2016 01:58:18 +0000 (01:58 +0000)
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/commons/InterfaceManagerCommonUtils.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/commons/InterfaceMetaUtils.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/listeners/InterfaceInventoryStateListener.java

index 10628b2ed37c849c71df1eabbe41adf792ae23fb..eed69df15d5d7256d70f6f6cf14ed776ea14c4f3 100644 (file)
@@ -80,7 +80,12 @@ public class InterfaceManagerCommonUtils {
             new ConcurrentHashMap<>();
 
     private static final String NOVA_OR_TUNNEL_PORT_REGEX = "(tap|vhu)[0-9a-f]{8}-[0-9a-f]{2}|tun[0-9a-f]{11}";
-    private static final Pattern pattern = Pattern.compile(NOVA_OR_TUNNEL_PORT_REGEX);
+    private static final String NOVA_PORT_REGEX = "(tap|vhu)[0-9a-f]{8}-[0-9a-f]{2}";
+    private static final String TUNNEL_PORT_REGEX = "tun[0-9a-f]{11}";
+
+    private static final Pattern novaOrTunnelPortPattern = Pattern.compile(NOVA_OR_TUNNEL_PORT_REGEX);
+    private static final Pattern tunnelPortPattern = Pattern.compile(TUNNEL_PORT_REGEX);
+    private static final Pattern novaPortPattern = Pattern.compile(NOVA_PORT_REGEX);
 
     public static NodeConnector getNodeConnectorFromInventoryOperDS(NodeConnectorId nodeConnectorId,
             DataBroker dataBroker) {
@@ -505,8 +510,17 @@ public class InterfaceManagerCommonUtils {
     }
 
     public static boolean isNovaOrTunnelPort(String portName) {
+        Matcher matcher = novaOrTunnelPortPattern.matcher(portName);
+        return matcher.matches();
+    }
+
+    public static boolean isNovaPort(String portName){
+        Matcher matcher = novaPortPattern.matcher(portName);
+        return matcher.matches();
+    }
 
-        Matcher matcher = pattern.matcher(portName);
+    public static boolean isTunnelPort(String portName){
+        Matcher matcher = tunnelPortPattern.matcher(portName);
         return matcher.matches();
     }
 
index f13fb5c56fca248100b894e798c2a6f0b9effd7e..3bd4a87b9c7e569bb20f7e497803bf2b2350c5e2 100644 (file)
@@ -320,6 +320,18 @@ public class InterfaceMetaUtils {
         }
     }
 
+    public static boolean isPortConfiguredOnBridge(String portName, BigInteger dpnId, DataBroker broker) {
+        BridgeEntry bridgeEntry = InterfaceMetaUtils.getBridgeEntryFromConfigDS(dpnId, broker);
+        if (bridgeEntry != null && bridgeEntry.getBridgeInterfaceEntry() != null) {
+            for (BridgeInterfaceEntry entry: bridgeEntry.getBridgeInterfaceEntry()) {
+                if (portName.equals(entry.getInterfaceName())) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
     // Cache Util methods
 
     // Start: BridgeEntryCache
index d9a03cff603208aeb1761a73077b263745e5277c..b7333697c32d8d76cce98945bf3face8881d8ec4 100644 (file)
@@ -32,7 +32,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.N
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Callable;
@@ -48,10 +48,10 @@ import java.util.concurrent.Callable;
 
 public class InterfaceInventoryStateListener extends AsyncClusteredDataTreeChangeListenerBase<FlowCapableNodeConnector, InterfaceInventoryStateListener> {
     private static final Logger LOG = LoggerFactory.getLogger(InterfaceInventoryStateListener.class);
-    private DataBroker dataBroker;
-    private IdManagerService idManager;
-    private IMdsalApiManager mdsalApiManager;
-    private AlivenessMonitorService alivenessMonitorService;
+    private final DataBroker dataBroker;
+    private final IdManagerService idManager;
+    private final IMdsalApiManager mdsalApiManager;
+    private final AlivenessMonitorService alivenessMonitorService;
 
     public InterfaceInventoryStateListener(final DataBroker dataBroker, final IdManagerService idManager,
                                            final IMdsalApiManager mdsalApiManager, final AlivenessMonitorService alivenessMonitorService) {
@@ -113,6 +113,16 @@ public class InterfaceInventoryStateListener extends AsyncClusteredDataTreeChang
             if (InterfaceManagerCommonUtils.isNovaOrTunnelPort(portName)) {
                 NodeConnectorId nodeConnectorIdOld = IfmUtil.getNodeConnectorIdFromInterface(portName, dataBroker);
                 if (nodeConnectorIdOld != null && !nodeConnectorId.equals(nodeConnectorIdOld)) {
+                    if (InterfaceManagerCommonUtils.isTunnelPort(portName)) {
+                        BigInteger oldDpnId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorIdOld);
+                        BigInteger newDpnId = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId);
+                        LOG.warn("DPNID changed for tunnel interface {}: old {} new {}", portName, oldDpnId, newDpnId);
+                        if(InterfaceMetaUtils.isPortConfiguredOnBridge(portName, oldDpnId, dataBroker) ||
+                                !InterfaceMetaUtils.isPortConfiguredOnBridge(portName, newDpnId, dataBroker)) {
+                            // Remove old interface only it wasn't configured through us and new one is.
+                            return;
+                        }
+                    }
                     LOG.debug("Triggering NodeConnector Remove Event for the interface: {}, {}, {}", portName, nodeConnectorId, nodeConnectorIdOld);
                     remove(nodeConnectorId, nodeConnectorIdOld, fcNodeConnectorNew, portName, false);
                     //Adding a delay of 10sec for VM migration, so applications can process remove and add events
@@ -142,7 +152,7 @@ public class InterfaceInventoryStateListener extends AsyncClusteredDataTreeChang
     }
 
     private String getDpnPrefixedPortName(NodeConnectorId nodeConnectorId, String portName) {
-        portName = (IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId)).toString() +
+        portName = IfmUtil.getDpnFromNodeConnectorId(nodeConnectorId).toString() +
                 IfmConstants.OF_URI_SEPARATOR +
                 portName;
         return portName;
@@ -188,10 +198,10 @@ public class InterfaceInventoryStateListener extends AsyncClusteredDataTreeChang
     }
 
     private class InterfaceStateUpdateWorker implements Callable {
-        private InstanceIdentifier<FlowCapableNodeConnector> key;
+        private final InstanceIdentifier<FlowCapableNodeConnector> key;
         private final FlowCapableNodeConnector fcNodeConnectorOld;
         private final FlowCapableNodeConnector fcNodeConnectorNew;
-        private String interfaceName;
+        private final String interfaceName;
 
 
         public InterfaceStateUpdateWorker(InstanceIdentifier<FlowCapableNodeConnector> key,