Supply correct tunnel type to retrieve tunnel interface name 59/72459/6
authoreupakir <kiran.n.upadhyaya@ericsson.com>
Wed, 30 May 2018 06:55:03 +0000 (12:25 +0530)
committerSam Hague <shague@redhat.com>
Mon, 11 Jun 2018 20:46:51 +0000 (20:46 +0000)
A recent change in ITM RPC has changed the API to retrieve the tunnel
interface name. It now fetches the interface name based on the tunnel-type
provided by the called insteady of hardcoding the tunnel type to
MplsOverGRE.
L3VPN was always sending tunnel type as VxLAN when calling this RPC.
The BGP routes were not being translated to flows.
The fix supplies the correct tunnel-type to the RPC based on the encap
type of fibEntry

Change-Id: Id5159ce8bc1ff686defe9121c8b4b7edfd809bbf
Signed-off-by: eupakir <kiran.n.upadhyaya@ericsson.com>
fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/IFibManager.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/BaseVrfEntryHandler.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelInterfaceStateListener.java

index 4984f89bfcfafc031123641cc950ce8e95973673..93570177cd9ccc02b85ca10eb3fa2ec8f9b103d2 100644 (file)
@@ -14,6 +14,7 @@ import java.math.BigInteger;
 import java.util.List;
 
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.RouterInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
 
@@ -73,8 +74,9 @@ public interface IFibManager {
                                       boolean isVpnFirstEndPoint,
                                       VrfEntry vrfEntry);
 
-    void programDcGwLoadBalancingGroup(List<String> availableDcGws, BigInteger dpnId,
-            String destinationIp, int addRemoveOrUpdate, boolean isTunnelUp);
+    void programDcGwLoadBalancingGroup(List<String> availableDcGws, BigInteger dpnId, String destinationIp,
+                                       int addRemoveOrUpdate, boolean isTunnelUp,
+                                       Class<? extends TunnelTypeBase> tunnelType);
 
     void refreshVrfEntry(String rd, String prefix);
 }
index a0fabd57b98bae093101bb6526dae21d39ae39cb..0625b0ee4b19392b811b39db120d549721fab782 100644 (file)
@@ -67,6 +67,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.ta
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeMplsOverGre;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeVxlan;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
@@ -152,8 +153,10 @@ public class BaseVrfEntryHandler implements AutoCloseable {
         List<String> prefixIpList;
         LOG.trace("resolveAdjacency called with remotedDpnId {}, vpnId{}, VrfEntry {}",
                 remoteDpnId, vpnId, vrfEntry);
+        final Class<? extends TunnelTypeBase> tunnelType;
         try {
             if (RouteOrigin.value(vrfEntry.getOrigin()) != RouteOrigin.BGP) {
+                tunnelType = TunnelTypeVxlan.class;
                 List<String> usedRds = VpnExtraRouteHelper.getUsedRds(dataBroker, vpnId, vrfEntry.getDestPrefix());
                 List<Routes> vpnExtraRoutes = VpnExtraRouteHelper.getAllVpnExtraRoutes(dataBroker,
                         fibUtil.getVpnNameFromId(vpnId), usedRds, vrfEntry.getDestPrefix());
@@ -185,13 +188,18 @@ public class BaseVrfEntryHandler implements AutoCloseable {
                 }
             } else {
                 prefixIpList = Collections.singletonList(vrfEntry.getDestPrefix());
+                if (vrfEntry.getEncapType() == VrfEntry.EncapType.Mplsgre) {
+                    tunnelType = TunnelTypeMplsOverGre.class;
+                } else {
+                    tunnelType = TunnelTypeVxlan.class;
+                }
             }
 
             for (String prefixIp : prefixIpList) {
                 if (routePaths == null || routePaths.isEmpty()) {
                     LOG.trace("Processing Destination IP {} without NextHop IP", prefixIp);
                     AdjacencyResult adjacencyResult = nextHopManager.getRemoteNextHopPointer(remoteDpnId, vpnId,
-                            prefixIp, null);
+                            prefixIp, null, tunnelType);
                     addAdjacencyResultToList(adjacencyList, adjacencyResult);
                     continue;
                 }
@@ -200,7 +208,7 @@ public class BaseVrfEntryHandler implements AutoCloseable {
                             LOG.debug("NextHop IP for destination {} is {}", prefixIp,
                                     routePath.getNexthopAddress());
                             return nextHopManager.getRemoteNextHopPointer(remoteDpnId, vpnId,
-                                    prefixIp, routePath.getNexthopAddress());
+                                    prefixIp, routePath.getNexthopAddress(), tunnelType);
                         })
                         .filter(adjacencyResult -> adjacencyResult != null && !adjacencyList.contains(adjacencyResult))
                         .distinct()
index ec005fab647161be798c8ba7aa3ee252704680cb..ab855d0482c496ac21df5a26011d9bcf9ccbf89c 100755 (executable)
@@ -22,6 +22,7 @@ import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache;
 import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComposite;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.TunnelTypeBase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.RouterInterface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
 import org.osgi.framework.BundleContext;
@@ -197,10 +198,11 @@ public class FibManagerImpl implements IFibManager {
     }
 
     @Override
-    public void programDcGwLoadBalancingGroup(List<String> availableDcGws, BigInteger dpnId,
-            String destinationIp, int addRemoveOrUpdate, boolean isTunnelUp) {
+    public void programDcGwLoadBalancingGroup(List<String> availableDcGws, BigInteger dpnId, String destinationIp,
+                                              int addRemoveOrUpdate, boolean isTunnelUp,
+                                              Class<? extends TunnelTypeBase> tunnelType) {
         nexthopManager.programDcGwLoadBalancingGroup(availableDcGws, dpnId, destinationIp,
-            addRemoveOrUpdate, isTunnelUp);
+            addRemoveOrUpdate, isTunnelUp, tunnelType);
     }
 
     @Override
index c273476e225a4ae94048df915374d6f341f5995b..e48ae68369503dc388764ed462eabf3ce33eab7d 100644 (file)
@@ -333,14 +333,15 @@ public class NexthopManager implements AutoCloseable {
     }
 
     protected String getTunnelInterfaceName(BigInteger srcDpId, org.opendaylight.yang.gen.v1.urn.ietf.params
-        .xml.ns.yang.ietf.inet.types.rev130715.IpAddress dstIp) {
-        Class<? extends TunnelTypeBase> tunType = getReqTunType(getReqTransType().toUpperCase(Locale.getDefault()));
+        .xml.ns.yang.ietf.inet.types.rev130715.IpAddress dstIp, Class<? extends TunnelTypeBase> tunnelType) {
         Future<RpcResult<GetInternalOrExternalInterfaceNameOutput>> result;
         try {
+            LOG.debug("Trying to fetch tunnel interface name for source dpn {} destIp {} tunType {}", srcDpId,
+                    dstIp.getValue(), tunnelType.getName());
             result = itmManager.getInternalOrExternalInterfaceName(new GetInternalOrExternalInterfaceNameInputBuilder()
                 .setSourceDpid(srcDpId)
                 .setDestinationIp(dstIp)
-                .setTunnelType(tunType)
+                .setTunnelType(tunnelType)
                 .build());
             RpcResult<GetInternalOrExternalInterfaceNameOutput> rpcResult = result.get();
             if (!rpcResult.isSuccessful()) {
@@ -527,7 +528,7 @@ public class NexthopManager implements AutoCloseable {
     }
 
     public AdjacencyResult getRemoteNextHopPointer(BigInteger remoteDpnId, long vpnId, String prefixIp,
-            String nextHopIp) {
+            String nextHopIp, Class<? extends TunnelTypeBase> tunnelType) {
         String egressIfName = null;
         LOG.trace("getRemoteNextHopPointer: input [remoteDpnId {}, vpnId {}, prefixIp {}, nextHopIp {} ]", remoteDpnId,
             vpnId, prefixIp, nextHopIp);
@@ -542,7 +543,7 @@ public class NexthopManager implements AutoCloseable {
         }
 
         if (Tunnel.class.equals(egressIfType)) {
-            egressIfName = getTunnelRemoteNextHopPointer(remoteDpnId, nextHopIp);
+            egressIfName = getTunnelRemoteNextHopPointer(remoteDpnId, nextHopIp, tunnelType);
         } else {
             egressIfName = getExtPortRemoteNextHopPointer(remoteDpnId, elanInstance);
         }
@@ -713,13 +714,14 @@ public class NexthopManager implements AutoCloseable {
 
     // TODO Clean up the exception handling
     @SuppressWarnings("checkstyle:IllegalCatch")
-    private String getTunnelRemoteNextHopPointer(BigInteger remoteDpnId, String nextHopIp) {
+    private String getTunnelRemoteNextHopPointer(BigInteger remoteDpnId, String nextHopIp,
+                                                 Class<? extends TunnelTypeBase> tunnelType) {
         if (nextHopIp != null && !nextHopIp.isEmpty()) {
             try {
                 // here use the config for tunnel type param
                 return getTunnelInterfaceName(remoteDpnId,
                     org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder
-                        .getDefaultInstance(nextHopIp));
+                        .getDefaultInstance(nextHopIp), tunnelType);
             } catch (Exception ex) {
                 LOG.error("Error while retrieving nexthop pointer for nexthop {} remoteDpn {}",
                         nextHopIp, remoteDpnId, ex);
@@ -902,7 +904,7 @@ public class NexthopManager implements AutoCloseable {
             // There would be only one nexthop address for a VM ip which would be the tep Ip
             String tepIp = tepIpAddresses.get(0);
             AdjacencyResult adjacencyResult = getRemoteNextHopPointer(dpnId, vpnId,
-                    vrfEntry.getDestPrefix(), tepIp);
+                    vrfEntry.getDestPrefix(), tepIp, TunnelTypeVxlan.class);
             if (adjacencyResult == null) {
                 return;
             }
@@ -970,7 +972,8 @@ public class NexthopManager implements AutoCloseable {
         return listBucketInfo;
     }
 
-    public void createDcGwLoadBalancingGroup(List<String> availableDcGws, BigInteger dpnId, String destinationIp) {
+    public void createDcGwLoadBalancingGroup(List<String> availableDcGws, BigInteger dpnId, String destinationIp,
+                                             Class<? extends TunnelTypeBase> tunnelType) {
         Preconditions.checkNotNull(availableDcGws, "There are no dc-gws present");
         int noOfDcGws = availableDcGws.size();
         if (noOfDcGws == 1) {
@@ -982,8 +985,8 @@ public class NexthopManager implements AutoCloseable {
         Long groupId = createNextHopPointer(groupIdKey);
         List<Bucket> listBucket = new ArrayList<>();
         for (int index = 0; index < noOfDcGws; index++) {
-            if (isTunnelUp(availableDcGws.get(index), dpnId)) {
-                listBucket.add(buildBucketForDcGwLbGroup(availableDcGws.get(index), dpnId, index));
+            if (isTunnelUp(availableDcGws.get(index), dpnId, tunnelType)) {
+                listBucket.add(buildBucketForDcGwLbGroup(availableDcGws.get(index), dpnId, index, tunnelType));
             }
         }
         Group group = MDSALUtil.buildGroup(groupId, groupIdKey, GroupTypes.GroupSelect,
@@ -997,8 +1000,8 @@ public class NexthopManager implements AutoCloseable {
         LOG.trace("LB group {} towards DC-GW installed on dpn {}. Group - {}", groupIdKey, dpnId, group);
     }
 
-    private boolean isTunnelUp(String dcGwIp, BigInteger dpnId) {
-        String tunnelName = getTunnelRemoteNextHopPointer(dpnId, dcGwIp);
+    private boolean isTunnelUp(String dcGwIp, BigInteger dpnId, Class<? extends TunnelTypeBase> tunnelType) {
+        String tunnelName = getTunnelRemoteNextHopPointer(dpnId, dcGwIp, tunnelType);
         if (tunnelName != null) {
             InstanceIdentifier<StateTunnelList> tunnelStateId =
                     InstanceIdentifier.builder(TunnelsState.class).child(
@@ -1085,7 +1088,7 @@ public class NexthopManager implements AutoCloseable {
      * The bucket is directly removed/added based on the operational status of the tunnel.
      */
     public void updateDcGwLoadBalancingGroup(List<String> availableDcGws,
-            BigInteger dpnId, String destinationIp, boolean isTunnelUp) {
+            BigInteger dpnId, String destinationIp, boolean isTunnelUp, Class<? extends TunnelTypeBase> tunnelType) {
         Preconditions.checkNotNull(availableDcGws, "There are no dc-gws present");
         ListenableFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(confTx -> {
             // TODO : Place the logic to construct all possible DC-GW combination here.
@@ -1104,7 +1107,7 @@ public class NexthopManager implements AutoCloseable {
                 final String groupId = nexthops.getGroupId();
                 final long groupIdValue = Long.parseLong(groupId);
                 if (isTunnelUp) {
-                    Bucket bucket = buildBucketForDcGwLbGroup(destinationIp, dpnId, bucketId);
+                    Bucket bucket = buildBucketForDcGwLbGroup(destinationIp, dpnId, bucketId, tunnelType);
                     LOG.trace("Added bucket {} to group {} on dpn {}.", bucket, groupId, dpnId);
                     mdsalApiManager.addBucketToTx(dpnId, groupIdValue, bucket , confTx);
                 } else {
@@ -1115,15 +1118,15 @@ public class NexthopManager implements AutoCloseable {
         }), LOG, "Error updating load-balancing group");
     }
 
-    private Bucket buildBucketForDcGwLbGroup(String ipAddress, BigInteger dpnId,
-            int index) {
+    private Bucket buildBucketForDcGwLbGroup(String ipAddress, BigInteger dpnId, int index,
+                                             Class<? extends TunnelTypeBase> tunnelType) {
         List<Action> listAction = new ArrayList<>();
         // ActionKey 0 goes to mpls label.
         int actionKey = 1;
         listAction.add(new ActionPushMpls().buildAction());
         listAction.add(new ActionRegMove(actionKey++, FibConstants.NXM_REG_MAPPING
                 .get(index), 0, 19).buildAction());
-        String tunnelInterfaceName = getTunnelInterfaceName(dpnId, new IpAddress(ipAddress.toCharArray()));
+        String tunnelInterfaceName = getTunnelInterfaceName(dpnId, new IpAddress(ipAddress.toCharArray()), tunnelType);
         List<Action> egressActions = getEgressActions(tunnelInterfaceName, actionKey++);
         if (!egressActions.isEmpty()) {
             listAction.addAll(getEgressActions(tunnelInterfaceName, actionKey++));
@@ -1135,14 +1138,15 @@ public class NexthopManager implements AutoCloseable {
                 MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP);
     }
 
-    public void programDcGwLoadBalancingGroup(List<String> availableDcGws, BigInteger dpnId,
-            String destinationIp, int addRemoveOrUpdate, boolean isTunnelUp) {
+    public void programDcGwLoadBalancingGroup(List<String> availableDcGws, BigInteger dpnId, String destinationIp,
+                                              int addRemoveOrUpdate, boolean isTunnelUp,
+                                              Class<? extends TunnelTypeBase> tunnelType) {
         if (NwConstants.ADD_FLOW == addRemoveOrUpdate) {
-            createDcGwLoadBalancingGroup(availableDcGws, dpnId, destinationIp);
+            createDcGwLoadBalancingGroup(availableDcGws, dpnId, destinationIp, tunnelType);
         } else if (NwConstants.DEL_FLOW == addRemoveOrUpdate) {
             removeOrUpdateDcGwLoadBalancingGroup(availableDcGws, dpnId, destinationIp);
         } else if (NwConstants.MOD_FLOW == addRemoveOrUpdate) {
-            updateDcGwLoadBalancingGroup(availableDcGws, dpnId, destinationIp, isTunnelUp);
+            updateDcGwLoadBalancingGroup(availableDcGws, dpnId, destinationIp, isTunnelUp, tunnelType);
         }
     }
 }
index a3946919d12295fa878126df2ad646e385f2dfde..a048da9916dfd3b652f22788394136cef8c25b0f 100644 (file)
@@ -551,7 +551,8 @@ public class TunnelInterfaceStateListener extends AsyncDataTreeChangeListenerBas
         List<String> availableDcGws = getDcGwIps();
         BigInteger dpId = new BigInteger(tunnelState.getSrcInfo().getTepDeviceId());
         boolean isTunnelUp = TunnelOperStatus.Up == tunnelState.getOperState();
-        fibManager.programDcGwLoadBalancingGroup(availableDcGws, dpId, dcGwIpAddress, addOrRemove, isTunnelUp);
+        fibManager.programDcGwLoadBalancingGroup(availableDcGws, dpId, dcGwIpAddress, addOrRemove, isTunnelUp,
+                tunnelState.getTransportType());
     }
 
     private List<String> getDcGwIps() {