Controller based SNAT traffic fail after upgrade 97/72197/15
authorShaik Zakir <shaikzakir119@gmail.com>
Wed, 23 May 2018 13:02:52 +0000 (18:32 +0530)
committerSam Hague <shague@redhat.com>
Fri, 3 Aug 2018 21:00:14 +0000 (21:00 +0000)
Description: It's been observed certain below NAT config DS are not
populated properly during upgrade resulting in SNAT traffic failure.

1. ext-vpn missing in external-networks.
2. router-id-name data missing.

Changes are done to update the above NAT DS properly during upgrade.

Issue: NETVIRT-1280

Change-Id: Idfd1e4a44c646bedc15f0c3e24401418065feda0
Signed-off-by: shaik <shaik.b@altencalsoftlabs.com>
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronPortChangeListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronRouterChangeListener.java
neutronvpn/impl/src/main/java/org/opendaylight/netvirt/neutronvpn/NeutronvpnManager.java

index 49d54141cf17146a4dda94ffe1a1315a9a0cb03f..a7d56e6596ffed61bae20139602d7d9770c54fba 100644 (file)
@@ -528,15 +528,7 @@ public final class NatUtil {
     }
 
     public static String getRouterName(DataBroker broker, Long routerId) {
-        InstanceIdentifier<RouterIds> id = buildRouterIdentifier(routerId);
-        String routerName = SingleTransactionDataBroker
-                .syncReadOptionalAndTreatReadFailedExceptionAsAbsentOptional(broker, LogicalDatastoreType.CONFIGURATION,
-                        id)
-                .toJavaUtil().map(RouterIds::getRouterName).orElse(null);
-        if (routerName == null) {
-            routerName = getVpnInstanceFromVpnIdentifier(broker, routerId);
-        }
-        return routerName;
+        return getVpnInstanceFromVpnIdentifier(broker, routerId);
     }
 
     static InstanceIdentifier<VpnInstanceOpDataEntry> getVpnInstanceOpDataIdentifier(String vrfId) {
index f313e1921db67dc463328c05b339dbc9c5bdfc0a..38113ad0ab4f1431c14f364d699907bcf9f8c629 100644 (file)
@@ -338,7 +338,10 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<P
                             routerPort.getUuid().getValue(), vpnId.getValue());
                 }
                 nvpnManager.addToNeutronRouterInterfacesMap(routerId, routerPort.getUuid().getValue());
-                nvpnNatManager.handleSubnetsForExternalRouter(routerId);
+                jobCoordinator.enqueueJob(routerId.toString(), () -> {
+                    nvpnNatManager.handleSubnetsForExternalRouter(routerId);
+                    return Collections.emptyList();
+                });
                 ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION,
                     confTx -> {
                         String portInterfaceName = createOfPortInterface(routerPort, confTx);
@@ -406,7 +409,10 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<P
                     nvpnManager.removeFromNeutronRouterInterfacesMap(routerId, routerPort.getUuid().getValue());
                     deleteElanInterface(routerPort.getUuid().getValue(), confTx);
                     deleteOfPortInterface(routerPort, confTx);
-                    nvpnNatManager.handleSubnetsForExternalRouter(routerId);
+                    jobCoordinator.enqueueJob(routerId.toString(), () -> {
+                        nvpnNatManager.handleSubnetsForExternalRouter(routerId);
+                        return Collections.emptyList();
+                    });
                     if (vpnInstanceIpVersionRemoved) {
                         neutronvpnUtils.updateVpnInstanceWithIpFamily(vpnId.getValue(), vpnInstanceIpVersionToRemove,
                                 false);
@@ -464,8 +470,10 @@ public class NeutronPortChangeListener extends AsyncDataTreeChangeListenerBase<P
 
     private void setupGwMac(Router router, Port routerGwPort, Uuid routerId) {
         gwMacResolver.sendArpRequestsToExtGateways(router);
-        setExternalGwMac(routerGwPort, routerId);
-
+        jobCoordinator.enqueueJob(routerId.toString(), () -> {
+            setExternalGwMac(routerGwPort, routerId);
+            return Collections.emptyList();
+        });
     }
 
     private void setExternalGwMac(Port routerGwPort, Uuid routerId) {
index e054a855f78789a504db73334591b0fe37cb2afe..f7c367c42da77b0b5991c5a78770b5e460c75220 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.netvirt.neutronvpn;
 
 import com.google.common.base.Optional;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import javax.annotation.PostConstruct;
@@ -18,6 +19,7 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.l3.attributes.Routes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.l3.rev150712.routers.attributes.Routers;
@@ -38,18 +40,21 @@ public class NeutronRouterChangeListener extends AsyncDataTreeChangeListenerBase
     private final NeutronvpnNatManager nvpnNatManager;
     private final NeutronSubnetGwMacResolver gwMacResolver;
     private final NeutronvpnUtils neutronvpnUtils;
+    private final JobCoordinator jobCoordinator;
 
     @Inject
     public NeutronRouterChangeListener(final DataBroker dataBroker, final NeutronvpnManager neutronvpnManager,
                                        final NeutronvpnNatManager neutronvpnNatManager,
                                        final NeutronSubnetGwMacResolver gwMacResolver,
-                                       final NeutronvpnUtils neutronvpnUtils) {
+                                       final NeutronvpnUtils neutronvpnUtils,
+                                       final JobCoordinator jobCoordinator) {
         super(Router.class, NeutronRouterChangeListener.class);
         this.dataBroker = dataBroker;
         nvpnManager = neutronvpnManager;
         nvpnNatManager = neutronvpnNatManager;
         this.gwMacResolver = gwMacResolver;
         this.neutronvpnUtils = neutronvpnUtils;
+        this.jobCoordinator = jobCoordinator;
     }
 
     @Override
@@ -76,7 +81,10 @@ public class NeutronRouterChangeListener extends AsyncDataTreeChangeListenerBase
         neutronvpnUtils.addToRouterCache(input);
         // Create internal VPN
         nvpnManager.createL3InternalVpn(input.getUuid(), null, null, null, null, null, input.getUuid(), null);
-        nvpnNatManager.handleExternalNetworkForRouter(null, input);
+        jobCoordinator.enqueueJob(input.getUuid().toString(), () -> {
+            nvpnNatManager.handleExternalNetworkForRouter(null, input);
+            return Collections.emptyList();
+        });
         gwMacResolver.sendArpRequestsToExtGateways(input);
     }
 
@@ -90,7 +98,10 @@ public class NeutronRouterChangeListener extends AsyncDataTreeChangeListenerBase
         if (input.getExternalGatewayInfo() != null) {
             Uuid extNetId = input.getExternalGatewayInfo().getExternalNetworkId();
             List<ExternalFixedIps> externalFixedIps = input.getExternalGatewayInfo().getExternalFixedIps();
-            nvpnNatManager.removeExternalNetworkFromRouter(extNetId, input, externalFixedIps);
+            jobCoordinator.enqueueJob(input.getUuid().toString(), () -> {
+                nvpnNatManager.removeExternalNetworkFromRouter(extNetId, input, externalFixedIps);
+                return Collections.emptyList();
+            });
         }
         //NOTE: Pass an empty routerSubnetIds list, as router interfaces
         //will be removed from VPN by invocations from NeutronPortChangeListener
@@ -136,7 +147,10 @@ public class NeutronRouterChangeListener extends AsyncDataTreeChangeListenerBase
             handleChangedRoutes(vpnId, newRoutes, NwConstants.ADD_FLOW);
         }
 
-        nvpnNatManager.handleExternalNetworkForRouter(original, update);
+        jobCoordinator.enqueueJob(update.getUuid().toString(), () -> {
+            nvpnNatManager.handleExternalNetworkForRouter(original, update);
+            return Collections.emptyList();
+        });
         gwMacResolver.sendArpRequestsToExtGateways(update);
     }
 
index ebf370d56d84599eeeb0d2e9065c6a3006de172e..1bd1742f781a298e5f84675afe3d091fb5d4ed0f 100644 (file)
@@ -2435,14 +2435,14 @@ public class NeutronvpnManager implements NeutronvpnService, AutoCloseable, Even
     }
 
     private boolean associateExtNetworkToVpn(@Nonnull Uuid vpnId, @Nonnull Network extNet) {
+        if (!addExternalNetworkToVpn(extNet, vpnId)) {
+            return false;
+        }
         VpnInstanceOpDataEntry vpnOpDataEntry = neutronvpnUtils.getVpnInstanceOpDataEntryFromVpnId(vpnId.getValue());
         if (vpnOpDataEntry == null) {
             LOG.error("associateExtNetworkToVpn: can not find VpnOpDataEntry for VPN {}", vpnId.getValue());
             return false;
         }
-        if (!addExternalNetworkToVpn(extNet, vpnId)) {
-            return false;
-        }
         if (!vpnOpDataEntry.getBgpvpnType().equals(BgpvpnType.BGPVPNInternet)) {
             LOG.info("associateExtNetworkToVpn: set type {} for VPN {}", BgpvpnType.BGPVPNInternet, vpnId.getValue());
             neutronvpnUtils.updateVpnInstanceOpWithType(BgpvpnType.BGPVPNInternet, vpnId);