Stale ExternalIps in vpn-instance-op-data 76/84276/8
authorChetan Arakere Gowdru <chetan.arakere@altencalsoftlabs.com>
Mon, 9 Sep 2019 11:22:13 +0000 (16:52 +0530)
committerAbhinav Gupta <abhinav.gupta@ericsson.com>
Wed, 27 Nov 2019 04:52:36 +0000 (04:52 +0000)
Description:
Becuase of stale SNAT ExternalIPs peristed in vpn-instance-op-data DS,
the InternetVPN been kept in pending_delete state which resulted in
stale table=21 flows post clean-up.

Changes are done to handle removal of this stale entries from
vpn-instance-op-data DS for NAT Ips.

Change-Id: Iede3ca51201b9d6ee4cc2caa1dcecd40b08860a3
Signed-off-by: Chetan Arakere Gowdru <chetan.arakere@altencalsoftlabs.com>
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/ha/SnatNodeEventListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java

index d9206d99d1c3948562e98f1bf70d4753eb0f2740..19d86bb5befe76e1797822fc1209e30e972fedd4 100644 (file)
@@ -21,6 +21,7 @@ import org.opendaylight.serviceutils.tools.mdsal.listener.AbstractClusteredAsync
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.config.rev170206.NatserviceConfig;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
@@ -34,23 +35,32 @@ import org.slf4j.LoggerFactory;
 public class SnatNodeEventListener  extends AbstractClusteredAsyncDataTreeChangeListener<Node> {
     private static final Logger LOG = LoggerFactory.getLogger(SnatNodeEventListener.class);
     private final NatSwitchCache  centralizedSwitchCache;
+    private final NatserviceConfig.NatMode natMode;
 
     @Inject
     public SnatNodeEventListener(final DataBroker dataBroker,
-            final NatSwitchCache centralizedSwitchCache) {
+            final NatSwitchCache centralizedSwitchCache,
+            final NatserviceConfig config) {
 
         super(dataBroker,new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier
                 .create(Nodes.class).child(Node.class)),
                 Executors.newSingleThreadExecutor());
         this.centralizedSwitchCache = centralizedSwitchCache;
+        if (config != null) {
+            this.natMode = config.getNatMode();
+        } else {
+            this.natMode = NatserviceConfig.NatMode.Controller;
+        }
     }
 
     @Override
     public void remove(Node dataObjectModification) {
-        NodeKey nodeKey = dataObjectModification.key();
-        Uint64 dpnId = MDSALUtil.getDpnIdFromNodeName(nodeKey.getId());
-        LOG.info("Dpn removed {}", dpnId);
-        centralizedSwitchCache.removeSwitch(dpnId);
+        if (natMode == NatserviceConfig.NatMode.Conntrack) {
+            NodeKey nodeKey = dataObjectModification.key();
+            Uint64 dpnId = MDSALUtil.getDpnIdFromNodeName(nodeKey.getId());
+            LOG.info("Dpn removed {}", dpnId);
+            centralizedSwitchCache.removeSwitch(dpnId);
+        }
     }
 
     @Override
@@ -61,9 +71,11 @@ public class SnatNodeEventListener  extends AbstractClusteredAsyncDataTreeChange
 
     @Override
     public void add(Node dataObjectModification) {
-        NodeKey nodeKey = dataObjectModification.key();
-        Uint64 dpnId = MDSALUtil.getDpnIdFromNodeName(nodeKey.getId());
-        LOG.info("Dpn added {}", dpnId);
-        centralizedSwitchCache.addSwitch(dpnId);
+        if (natMode == NatserviceConfig.NatMode.Conntrack) {
+            NodeKey nodeKey = dataObjectModification.key();
+            Uint64 dpnId = MDSALUtil.getDpnIdFromNodeName(nodeKey.getId());
+            LOG.info("Dpn added {}", dpnId);
+            centralizedSwitchCache.addSwitch(dpnId);
+        }
     }
 }
index 46755841fd90bc6f4c119e79c5b0680be2baee73..16f390f98001ea35d68d5cb6d9de25e8c43d4103 100644 (file)
@@ -2333,6 +2333,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
         }
         final Uint32 label = tempLabel;
         final String externalIp = NatUtil.validateAndAddNetworkMask(extIp);
+        RemoveFibEntryInput input = null;
         if (extNwProvType == ProviderTypes.FLAT || extNwProvType == ProviderTypes.VLAN) {
             LOG.debug("delFibTsAndReverseTraffic : Using extSubnetId as vpnName for FLAT/VLAN use-cases");
             Routers extRouter = NatUtil.getRoutersFromConfigDS(dataBroker, routerName);
@@ -2347,9 +2348,19 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
             }
         }
         final String externalVpn = vpnName;
-        RemoveFibEntryInput input = new RemoveFibEntryInputBuilder().setVpnName(externalVpn)
+        if (label != null && label.toJava() <= 0) {
+            LOG.error("delFibTsAndReverseTraffic : Label not found for externalIp {} with router id {}",
+                extIp, routerId);
+            input = new RemoveFibEntryInputBuilder().setVpnName(vpnName)
+                .setSourceDpid(dpnId).setIpAddress(externalIp)
+                .setIpAddressSource(RemoveFibEntryInput.IpAddressSource.ExternalFixedIP).build();
+        } else {
+            input = new RemoveFibEntryInputBuilder().setVpnName(vpnName)
                 .setSourceDpid(dpnId).setIpAddress(externalIp).setServiceId(label)
                 .setIpAddressSource(RemoveFibEntryInput.IpAddressSource.ExternalFixedIP).build();
+            removeTunnelTableEntry(dpnId, label, removeFlowInvTx);
+            removeLFibTableEntry(dpnId, label, removeFlowInvTx);
+        }
         ListenableFuture<RpcResult<RemoveFibEntryOutput>> future = fibService.removeFibEntry(input);
 
         removeTunnelTableEntry(dpnId, label, removeFlowInvTx);
@@ -2362,7 +2373,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
             ListenableFuture<RpcResult<RemoveVpnLabelOutput>> labelFuture =
                 Futures.transformAsync(future, result -> {
                     //Release label
-                    if (result.isSuccessful()) {
+                    if (result.isSuccessful() && label != null && label.toJava() > 0) {
                         NatUtil.removePreDnatToSnatTableEntry(removeFlowInvTx, mdsalManager, dpnId);
                         RemoveVpnLabelInput labelInput = new RemoveVpnLabelInputBuilder()
                             .setVpnName(externalVpn).setIpPrefix(externalIp).build();
@@ -2546,6 +2557,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
         LOG.info("clearBgpRoutes : Informing BGP to remove route for externalIP {} of vpn {}", externalIp, vpnName);
         String rd = NatUtil.getVpnRd(dataBroker, vpnName);
         NatUtil.removePrefixFromBGP(bgpManager, fibManager, rd, externalIp, vpnName);
+        NatUtil.deletePrefixToInterface(dataBroker, NatUtil.getVpnId(dataBroker, vpnName), externalIp);
     }
 
     private void removeTunnelTableEntry(Uint64 dpnId, Uint32 serviceId,
index 1aedfb56754f516ee24a3123d8420dfd978c821c..991d44ff6f621c20f7ac4e4a3b89039d2abffa6d 100644 (file)
@@ -892,7 +892,7 @@ public final class NatUtil {
                             .prefix.to._interface.VpnIdsKey(vpnId)).child(Prefixes.class, new PrefixesKey(ipPrefix))
                     .build());
         } catch (TransactionCommitFailedException e) {
-            LOG.error("addPrefixToInterface : Failed to write prefxi-to-interface for vpn-id {}",
+            LOG.error("deletePrefixToInterface : Failed to delete prefxi-to-interface for vpn-id {}",
                     vpnId, e);
         }
     }