Table 21 ecmp flow not updated correctly 25/86325/8
authorAmitesh Soni <amitesh.soni@ericsson.com>
Tue, 10 Dec 2019 12:07:19 +0000 (17:37 +0530)
committerKarthikeyan Krishnan <karthikeyangceb007@gmail.com>
Mon, 17 Feb 2020 15:32:08 +0000 (15:32 +0000)
Description: When BGP neigbhor is added, quagga advertises routes towards
that DC-GW. If GRE tunnel towards that dc-gw is not configured, table 21
flows are not updated correctly.

Signed-off-by: Amitesh Soni <amitesh.soni@ericsson.com>
Change-Id: I6f54f7d4005dde7f2d05f53a05a27bf2b34a8cbb

fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/FibHelper.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelInterfaceStateListener.java

index 5f05dc2410e83a0e380c7e9112f3faeb6156178e..8d6e822072be7531792e50e03387a8328926dd19 100644 (file)
@@ -35,6 +35,7 @@ import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
 import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
 
 public final class FibHelper {
     private FibHelper() {
@@ -281,4 +282,8 @@ public final class FibHelper {
         }
         return bb;
     }
+
+    public static String getJobKeyForDcGwLoadBalancingGroup(Uint64 dpnId) {
+        return new StringBuilder().append("NextHopManager").append(dpnId).toString();
+    }
 }
index e08a34c54c70823ea9885fe7f87a4c4d3de56b0e..cd6f51460915407c7ba8f3f3db2ff1bc2009fdf8 100644 (file)
@@ -60,6 +60,7 @@ import org.opendaylight.genius.mdsalutil.actions.ActionSetFieldVlanVid;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
+import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.L3VPNTransportTypes;
 import org.opendaylight.netvirt.vpnmanager.api.VpnExtraRouteHelper;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.L2vlan;
@@ -151,7 +152,6 @@ public class NexthopManager implements AutoCloseable {
     private static final long WAIT_TIME_TO_ACQUIRE_LOCK = 3000L;
     private static final int SELECT_GROUP_WEIGHT = 1;
     private static final int RETRY_COUNT = 6;
-    private static final String NEXTHOPMANAGER_JOB_KEY_PREFIX = "NextHopManager";
 
     private final DataBroker dataBroker;
     private final ManagedNewTransactionRunner txRunner;
@@ -1072,7 +1072,7 @@ public class NexthopManager implements AutoCloseable {
 
     public void createDcGwLoadBalancingGroup(Uint64 dpnId, String destinationIp,
                                              Class<? extends TunnelTypeBase> tunnelType) {
-        jobCoordinator.enqueueJob(getJobKey(dpnId), () -> {
+        jobCoordinator.enqueueJob(FibHelper.getJobKeyForDcGwLoadBalancingGroup(dpnId), () -> {
             List<ListenableFuture<Void>> futures = new ArrayList<>();
             futures.add(txRunner.callWithNewReadWriteTransactionAndSubmit(OPERATIONAL, operationalTx -> {
                 synchronized (getDcGateWaySyncKey(destinationIp)) {
@@ -1114,10 +1114,6 @@ public class NexthopManager implements AutoCloseable {
         }, RETRY_COUNT);
     }
 
-    private String getJobKey(Uint64 dpnId) {
-        return new StringBuilder().append(NEXTHOPMANAGER_JOB_KEY_PREFIX).append(dpnId).toString();
-    }
-
     private String getDcGateWaySyncKey(String destinationIp) {
         String mutex = new StringBuilder().append("L3vpncDcGateWay").append(destinationIp).toString();
         return mutex.intern();
@@ -1177,7 +1173,7 @@ public class NexthopManager implements AutoCloseable {
      */
     public void removeDcGwLoadBalancingGroup(Uint64 dpnId,
             String destinationIp) {
-        jobCoordinator.enqueueJob(getJobKey(dpnId), () -> {
+        jobCoordinator.enqueueJob(FibHelper.getJobKeyForDcGwLoadBalancingGroup(dpnId), () -> {
             List<String> availableDcGws = fibUtil.getL3VpnDcGateWays();
             if (availableDcGws.contains(destinationIp)) {
                 availableDcGws.remove(destinationIp);
@@ -1222,7 +1218,7 @@ public class NexthopManager implements AutoCloseable {
      */
     public void updateDcGwLoadBalancingGroup(Uint64 dpnId, String destinationIp,
             boolean isTunnelUp, Class<? extends TunnelTypeBase> tunnelType) {
-        jobCoordinator.enqueueJob(getJobKey(dpnId), () -> {
+        jobCoordinator.enqueueJob(FibHelper.getJobKeyForDcGwLoadBalancingGroup(dpnId), () -> {
             List<String> availableDcGws = fibUtil.getL3VpnDcGateWays();
             if (availableDcGws.contains(destinationIp)) {
                 availableDcGws.remove(destinationIp);
index 19c68d4c60a0d0fc64292f4c45ca006ed9c21af2..1a8e46fb6f8ade2478bc4a40ee5ceb0893aaf779 100644 (file)
@@ -16,6 +16,7 @@ import com.google.common.base.Strings;
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -39,6 +40,7 @@ import org.opendaylight.genius.infra.ManagedNewTransactionRunnerImpl;
 import org.opendaylight.genius.mdsalutil.NwConstants;
 import org.opendaylight.genius.utils.JvmGlobalLocks;
 import org.opendaylight.infrautils.jobcoordinator.JobCoordinator;
+import org.opendaylight.netvirt.fibmanager.api.FibHelper;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.vpnmanager.api.InterfaceUtils;
 import org.opendaylight.netvirt.vpnmanager.api.VpnExtraRouteHelper;
@@ -94,6 +96,7 @@ public class TunnelInterfaceStateListener extends AsyncDataTreeChangeListenerBas
     private final VpnSubnetRouteHandler vpnSubnetRouteHandler;
     private final JobCoordinator jobCoordinator;
     private final VpnUtil vpnUtil;
+    private static final int RETRY_COUNT = 3;
 
     protected enum UpdateRouteAction {
         ADVERTISE_ROUTE, WITHDRAW_ROUTE
@@ -417,6 +420,24 @@ public class TunnelInterfaceStateListener extends AsyncDataTreeChangeListenerBas
                     }
                 }
             }
+            /*
+             * Program the BGP routes of all the VPNs which have footprint on the source DPN.
+             *
+             * DC-GW LB groups are programmed in DJC Jobs, so DJC with same key is used here to make sure
+             * groups are programmed first, then only BGP routes are programmed.
+             */
+            jobCoordinator.enqueueJob(FibHelper.getJobKeyForDcGwLoadBalancingGroup(srcDpnId), () -> {
+                listVpnName.forEach(vpnName -> {
+                    Uint32 vpnId = vpnUtil.getVpnId(vpnName);
+                    final String vrfId = vpnIdRdMap.get(vpnId);
+                    if ((tunnelAction == TunnelAction.TUNNEL_EP_ADD)
+                            && (tunTypeVal == VpnConstants.ITMTunnelLocType.External.getValue())) {
+                        fibManager.populateExternalRoutesOnDpn(srcDpnId, vpnId, vrfId,
+                                srcTepIp, destTepIp);
+                    }
+                });
+                return Collections.emptyList();
+            },RETRY_COUNT);
         } catch (RuntimeException e) {
             LOG.error("handleTunnelEventForDpn: Unable to handle the tunnel event for srcDpnId {} srcTepIp {}"
                     + " remoteDpnId {} destTepIp {}", srcDpnId, srcTepIp, remoteDpnId, destTepIp, e);