SNAT External Fixed IPs flow missing 26/81926/6
authorChetan Arakere Gowdru <chetan.arakere@altencalsoftlabs.com>
Wed, 24 Apr 2019 05:57:49 +0000 (11:27 +0530)
committerChetan Arakere Gowdru <chetan.arakere@altencalsoftlabs.com>
Tue, 21 May 2019 13:05:43 +0000 (13:05 +0000)
Issue : NETVIRT-1591

This Patch addresses the update of external-ips(change of external ip as
part of update request) to advertize and program all SNAT related flows
for the new external Ips.

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

index b262e4d4cca093ab5fbeb98abf750c8587e423fb..1168ffec2b0c67c126840eee009219116bddbbbc 100644 (file)
@@ -29,6 +29,8 @@ import org.opendaylight.infrautils.utils.concurrent.ListenableFutures;
 import org.opendaylight.netvirt.natservice.api.SnatServiceManager;
 import org.opendaylight.netvirt.natservice.internal.NatConstants;
 import org.opendaylight.netvirt.natservice.internal.NatUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.config.rev170206.NatserviceConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.config.rev170206.NatserviceConfig.NatMode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.NaptSwitches;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ext.routers.Routers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.napt.switches.RouterToNaptSwitch;
@@ -50,10 +52,11 @@ public class SnatCentralizedSwitchChangeListener
     private final SnatServiceManager snatServiceManger;
     private final NatDataUtil natDataUtil;
     private final DataTreeEventCallbackRegistrar eventCallbacks;
+    private final NatMode natMode;
 
     @Inject
     public SnatCentralizedSwitchChangeListener(final DataBroker dataBroker,
-            final SnatServiceManager snatServiceManger, NatDataUtil natDataUtil,
+            final SnatServiceManager snatServiceManger, NatDataUtil natDataUtil, final NatserviceConfig config,
             final DataTreeEventCallbackRegistrar dataTreeEventCallbackRegistrar) {
         super(RouterToNaptSwitch.class, SnatCentralizedSwitchChangeListener.class);
         this.dataBroker = dataBroker;
@@ -61,6 +64,12 @@ public class SnatCentralizedSwitchChangeListener
         this.snatServiceManger = snatServiceManger;
         this.natDataUtil = natDataUtil;
         this.eventCallbacks = dataTreeEventCallbackRegistrar;
+        if (config != null) {
+            this.natMode = config.getNatMode();
+        } else {
+            LOG.info("NAT mode configured default as Controller as config is missing");
+            this.natMode = NatMode.Controller;
+        }
     }
 
     @Override
@@ -78,6 +87,12 @@ public class SnatCentralizedSwitchChangeListener
     @Override
     protected void remove(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch routerToNaptSwitch) {
         LOG.debug("Deleting {}", routerToNaptSwitch);
+        if (natMode == NatMode.Controller) {
+            LOG.info("Do Not Processing this remove() event for (routerName:designatedDpn) {}:{}"
+                    + "configured in Controller Mode",
+                    routerToNaptSwitch.getRouterName(), routerToNaptSwitch.getPrimarySwitchId());
+            return;
+        }
         BigInteger primarySwitchId = routerToNaptSwitch.getPrimarySwitchId();
         Routers router = natDataUtil.getRouter(routerToNaptSwitch.getRouterName());
         if (router != null) {
@@ -93,6 +108,12 @@ public class SnatCentralizedSwitchChangeListener
     protected void update(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch origRouterToNaptSwitch,
             RouterToNaptSwitch updatedRouterToNaptSwitch) {
         LOG.debug("Updating old {} new {}", origRouterToNaptSwitch, updatedRouterToNaptSwitch);
+        if (natMode == NatMode.Controller) {
+            LOG.info("Do Not Processing this update() event for (routerName:designatedDpn) {}:{}"
+                            + "configured in Controller Mode",
+                    updatedRouterToNaptSwitch.getRouterName(), updatedRouterToNaptSwitch.getPrimarySwitchId());
+            return;
+        }
         BigInteger origPrimarySwitchId = origRouterToNaptSwitch.getPrimarySwitchId();
         BigInteger updatedPrimarySwitchId = updatedRouterToNaptSwitch.getPrimarySwitchId();
         ListenableFutures.addErrorLogging(txRunner.callWithNewReadWriteTransactionAndSubmit(CONFIGURATION, confTx -> {
@@ -142,6 +163,12 @@ public class SnatCentralizedSwitchChangeListener
     @Override
     protected void add(InstanceIdentifier<RouterToNaptSwitch> key, RouterToNaptSwitch routerToNaptSwitch) {
         LOG.debug("Adding {}", routerToNaptSwitch);
+        if (natMode == NatMode.Controller) {
+            LOG.info("Do Not Processing this add() event for (routerName:designatedDpn) {}:{}"
+                            + "configured in Controller Mode",
+                    routerToNaptSwitch.getRouterName(), routerToNaptSwitch.getPrimarySwitchId());
+            return;
+        }
         BigInteger primarySwitchId = routerToNaptSwitch.getPrimarySwitchId();
         String routerName = routerToNaptSwitch.getRouterName();
         Routers router = NatUtil.getRoutersFromConfigDS(dataBroker, routerName);
index bfd3b6089b846b7f35a77b3031cf8d95d5eac3cd..bda6a115249de94509b3a91f2f9289027b33bff9 100644 (file)
@@ -345,14 +345,14 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
         // Allocate Primary Napt Switch for this router
         BigInteger primarySwitchId = NatUtil.getPrimaryNaptfromRouterName(dataBroker, routerName);
         if (primarySwitchId != null && !primarySwitchId.equals(BigInteger.ZERO)) {
-            LOG.debug("handleEnableSnat : Primary NAPT switch with DPN ID {} is already elected for router {}",
+            LOG.debug("getPrimaryNaptSwitch : Primary NAPT switch with DPN ID {} is already elected for router {}",
                 primarySwitchId, routerName);
             return primarySwitchId;
         }
         // Allocated an id from VNI pool for the Router.
         natOverVxlanUtil.getRouterVni(routerName, NatConstants.INVALID_ID);
         primarySwitchId = naptSwitchSelector.selectNewNAPTSwitch(routerName);
-        LOG.debug("handleEnableSnat : Primary NAPT switch DPN ID {}", primarySwitchId);
+        LOG.debug("getPrimaryNaptSwitch : Primary NAPT switch DPN ID {}", primarySwitchId);
 
         return primarySwitchId;
     }
@@ -1281,7 +1281,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                             LOG.info("update : SNAT enabled for Router {}", original.getRouterName());
                             addOrDelDefFibRouteToSNAT(routerName, routerId, finalBgpVpnId, bgpVpnUuid,
                                     true, writeFlowInvTx);
-                            handleEnableSnat(original, routerId, dpnId, finalBgpVpnId, removeFlowInvTx);
+                            handleEnableSnat(update, routerId, dpnId, finalBgpVpnId, writeFlowInvTx);
                         }
                     }
                     if (!Objects.equals(original.getExtGwMacAddress(), update.getExtGwMacAddress())) {
@@ -1289,39 +1289,16 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                         NatUtil.installRouterGwFlows(txRunner, vpnManager, update, dpnId, NwConstants.ADD_FLOW);
                     }
 
+                    if (updatedSNATEnabled != originalSNATEnabled) {
+                        LOG.info("update : no need to process external/subnet changes as it's will taken care in "
+                                + "handleDisableSnat/handleEnableSnat");
+                        return;
+                    }
                     //Check if the Update is on External IPs
                     LOG.debug("update : Checking if this is update on External IPs");
                     List<String> originalExternalIps = NatUtil.getIpsListFromExternalIps(original.getExternalIps());
                     List<String> updatedExternalIps = NatUtil.getIpsListFromExternalIps(update.getExternalIps());
 
-                    //Check if the External IPs are added during the update.
-                    Set<String> addedExternalIps = new HashSet<>(updatedExternalIps);
-                    addedExternalIps.removeAll(originalExternalIps);
-                    if (addedExternalIps.size() != 0) {
-                        LOG.debug("update : Start processing of the External IPs addition during the update "
-                                + "operation");
-                        vpnManager.addArpResponderFlowsToExternalNetworkIps(routerName, addedExternalIps,
-                                update.getExtGwMacAddress(), dpnId,
-                                update.getNetworkId());
-
-                        for (String addedExternalIp : addedExternalIps) {
-                /*
-                    1) Do nothing in the IntExtIp model.
-                    2) Initialise the count of the added external IP to 0 in the ExternalCounter model.
-                 */
-                            String[] externalIpParts = NatUtil.getExternalIpAndPrefix(addedExternalIp);
-                            String externalIp = externalIpParts[0];
-                            String externalIpPrefix = externalIpParts[1];
-                            String externalpStr = externalIp + "/" + externalIpPrefix;
-                            LOG.debug("update : Initialise the count mapping of the external IP {} for the "
-                                            + "router ID {} in the ExternalIpsCounter model.",
-                                    externalpStr, routerId);
-                            naptManager.initialiseNewExternalIpCounter(routerId, externalpStr);
-                        }
-                        LOG.debug(
-                                "update : End processing of the External IPs addition during the update operation");
-                    }
-
                     //Check if the External IPs are removed during the update.
                     Set<String> removedExternalIps = new HashSet<>(originalExternalIps);
                     removedExternalIps.removeAll(updatedExternalIps);
@@ -1505,6 +1482,37 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                                 "update : End processing of the External IPs removal during the update operation");
                     }
 
+                    //Check if the External IPs are added during the update.
+                    Set<String> addedExternalIps = new HashSet<>(updatedExternalIps);
+                    addedExternalIps.removeAll(originalExternalIps);
+                    if (addedExternalIps.size() != 0) {
+                        LOG.debug("update : Start processing of the External IPs addition during the update "
+                                + "operation");
+                        vpnManager.addArpResponderFlowsToExternalNetworkIps(routerName, addedExternalIps,
+                                update.getExtGwMacAddress(), dpnId,
+                                update.getNetworkId());
+
+                        for (String addedExternalIp : addedExternalIps) {
+                /*
+                    1) Do nothing in the IntExtIp model.
+                    2) Initialise the count of the added external IP to 0 in the ExternalCounter model.
+                 */
+                            String[] externalIpParts = NatUtil.getExternalIpAndPrefix(addedExternalIp);
+                            String externalIp = externalIpParts[0];
+                            String externalIpPrefix = externalIpParts[1];
+                            String externalpStr = externalIp + "/" + externalIpPrefix;
+                            LOG.debug("update : Initialise the count mapping of the external IP {} for the "
+                                            + "router ID {} in the ExternalIpsCounter model.",
+                                    externalpStr, routerId);
+                            naptManager.initialiseNewExternalIpCounter(routerId, externalpStr);
+                            subnetRegisterMapping(update, routerId);
+                            LOG.info("update : Installing fib flow fo newly added Ips");
+                            handleSnatReverseTraffic(writeFlowInvTx, dpnId, update, routerId, routerName, externalpStr);
+                        }
+                        LOG.debug(
+                                "update : End processing of the External IPs addition during the update operation");
+                    }
+
                     //Check if its Update on subnets
                     LOG.debug("update : Checking if this is update on subnets");
                     List<Uuid> originalSubnetIds = original.getSubnetIds();