NETVIRT-1157 Stale flows after clearing gateway info from a router 88/70888/4
authorAswin Suryanarayanan <asuryana@redhat.com>
Thu, 5 Apr 2018 14:31:29 +0000 (20:01 +0530)
committerSam Hague <shague@redhat.com>
Thu, 26 Apr 2018 14:44:43 +0000 (14:44 +0000)
The CentralizedSwitchChangeListener was not able to retrieve the router
object for delete hence added cache for it.

Change-Id: I1a2f10f1667bed3a51275847bba21db39b387e62
Signed-off-by: Aswin Suryanarayanan <asuryana@redhat.com>
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/CentralizedSwitchChangeListener.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/ExternalRouterDataUtil.java [new file with mode: 0644]

index 6164f1af3730beb9b0d812702376e3a32ff9ea70..f3f7008fdb10b85e3b33d3d86a511c612f0389aa 100644 (file)
@@ -1688,8 +1688,6 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                                 routerName);
                         return futures;
                     } else {
-                        NatUtil.installRouterGwFlows(dataBroker, vpnManager, router, primarySwitchId,
-                                NwConstants.DEL_FLOW);
                         Collection<String> externalIps = NatUtil.getExternalIpsForRouter(dataBroker, routerId);
                         handleDisableSnat(router, networkUuid, externalIps, true, null, primarySwitchId,
                                 routerId, removeFlowInvTx);
index 2e0e413d960e01981d0da87321f2ea220cd414ca..e1e605e8acca68368bc25b37cdb6f3ba98d2ecd7 100644 (file)
@@ -45,12 +45,15 @@ public class CentralizedSwitchChangeListener
 
     private final DataBroker dataBroker;
     private final IVpnManager vpnManager;
+    private final ExternalRouterDataUtil externalRouterDataUtil;
 
     @Inject
-    public CentralizedSwitchChangeListener(final DataBroker dataBroker, final IVpnManager vpnManager) {
+    public CentralizedSwitchChangeListener(final DataBroker dataBroker, final IVpnManager vpnManager,
+            ExternalRouterDataUtil externalRouterDataUtil) {
         super(RouterToNaptSwitch.class, CentralizedSwitchChangeListener.class);
         this.dataBroker = dataBroker;
         this.vpnManager = vpnManager;
+        this.externalRouterDataUtil = externalRouterDataUtil;
     }
 
     @Override
@@ -101,7 +104,13 @@ public class CentralizedSwitchChangeListener
     }
 
     private void setupRouterGwFlows(RouterToNaptSwitch routerToNaptSwitch, WriteTransaction writeTx, int addOrRemove) {
-        Routers router = VpnUtil.getExternalRouter(dataBroker, routerToNaptSwitch.getRouterName());
+        Routers router = null;
+        if (addOrRemove == NwConstants.ADD_FLOW) {
+            router = VpnUtil.getExternalRouter(dataBroker, routerToNaptSwitch.getRouterName());
+        }
+        else {
+            router = externalRouterDataUtil.getRouter(routerToNaptSwitch.getRouterName());
+        }
         if (router == null) {
             LOG.warn("No router data found for router id {}", routerToNaptSwitch.getRouterName());
             return;
@@ -123,12 +132,14 @@ public class CentralizedSwitchChangeListener
             vpnManager.addArpResponderFlowsToExternalNetworkIps(routerName,
                     VpnUtil.getIpsListFromExternalIps(router.getExternalIps()),
                     extGwMacAddress, primarySwitchId, extNetworkId, writeTx);
+            externalRouterDataUtil.addtoRouterMap(router);
         } else {
             vpnManager.removeRouterGwMacFlow(routerName, extGwMacAddress, primarySwitchId, extNetworkId,
                     subnetVpnName.getValue(), writeTx);
             vpnManager.removeArpResponderFlowsToExternalNetworkIps(routerName,
                     VpnUtil.getIpsListFromExternalIps(router.getExternalIps()),
                     extGwMacAddress, primarySwitchId, extNetworkId);
+            externalRouterDataUtil.removeFromRouterMap(router);
         }
     }
 }
diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/ExternalRouterDataUtil.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/ExternalRouterDataUtil.java
new file mode 100644 (file)
index 0000000..31f2ff9
--- /dev/null
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2018 Red Hat, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.netvirt.vpnmanager;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import javax.inject.Singleton;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
+
+@Singleton
+public class ExternalRouterDataUtil {
+
+    private final Map<String,Routers> routerMap = new ConcurrentHashMap<>();
+
+    public void addtoRouterMap(Routers router) {
+        routerMap.put(router.getRouterName(), router);
+    }
+
+    public void updateRouterMap(Routers router) {
+        routerMap.put(router.getRouterName(), router);
+    }
+
+    public void removeFromRouterMap(Routers router) {
+        routerMap.remove(router.getRouterName());
+    }
+
+    public Routers getRouter(String routerId) {
+        return routerMap.get(routerId);
+    }
+}