Bug 8188: L3VNI without configured UC handled for EVPN 60/54560/12
authorkarthikeyan <karthikeyan.k@altencalsoftlabs.com>
Sat, 8 Apr 2017 17:21:57 +0000 (22:51 +0530)
committerKarthikeyan Krishnan <karthikeyan.k@altencalsoftlabs.com>
Wed, 19 Apr 2017 08:52:17 +0000 (08:52 +0000)
Problem Description:
==================
L3VNI without configured in Internet VPN needs to be handled for EVPN in
NAT feature.
Currently Internet(External) VPN with L3VNI use case only handled for
external VXLAN network (EVPN) in NAT feature.

Internet(External) VPN without L3VNI use case also needs to be handled for
external VXLAN in NAT feature. Since Openstack Operator may configure L3VNI or
may not configure L3VNI.

Solution:
=========
Unconfigured of L3VNI value in Internet(External) VPN, will carve-out
the L3VNI value from OpenDaylight VXLAN VNI Pool to use SNAT and DNAT
flows.
The following UCs are handled based on the L3VNI configured/unconfigured
for GRE and VXLAN provider type.

Ext-Net-Type || Internet-VPN-L3VNI || External and Internal VXLAN uses
===============================================================================
GRE           Configured          Ignore L3VNI, allocate VNI from pool and
                                  use it for Intra-DC only
--------------------------------------------------------------------------------
GRE           Not Configured      A VNI taken from ODL Pool and used for
                                  Intra-DC communication
---------------------------------------------------------------------------------
VXLAN         Configured          Internet-VPN-L3VNI used for both
                                  Intra-Inter-DC communication
---------------------------------------------------------------------------------
VXLAN         Not Configured      A VNI taken from ODL Pool and used for both intra-
                                  inter-DC communication
---------------------------------------------------------------------------------

Note: If VNI value is unable to get from ODL VNI Pool, router-id will be
used as tunnel-id for external network provider type as VXLAN

Change-Id: I3c3f21e026303edf7eb2ad88bfd33622523085f0
Signed-off-by: karthikeyan <karthikeyan.k@altencalsoftlabs.com>
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnDnatFlowProgrammer.java
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnNaptSwitchHA.java
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/EvpnSnatFlowProgrammer.java
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ExternalRoutersListener.java
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatOverVxlanUtil.java
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTunnelInterfaceStateListener.java
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VpnFloatingIpHandler.java

index 299f3e273eaa3b53ffb3d641a1006e1b3790cb9c..21b859a5b16941e79c16c9ada805a31378500b74 100644 (file)
@@ -44,6 +44,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.
 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.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fib.rpc.rev160121.CreateFibEntryInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fib.rpc.rev160121.CreateFibEntryInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fib.rpc.rev160121.FibRpcService;
@@ -66,6 +67,7 @@ public class EvpnDnatFlowProgrammer {
     private final IFibManager fibManager;
     private final FibRpcService fibService;
     private final IVpnManager vpnManager;
+    private final IdManagerService idManager;
     private static final BigInteger COOKIE_TUNNEL = new BigInteger("9000000", 16);
 
     @Inject
@@ -73,13 +75,15 @@ public class EvpnDnatFlowProgrammer {
                            final IBgpManager bgpManager,
                            final IFibManager fibManager,
                            final FibRpcService fibService,
-                           final IVpnManager vpnManager) {
+                           final IVpnManager vpnManager,
+                           final IdManagerService idManager) {
         this.dataBroker = dataBroker;
         this.mdsalManager = mdsalManager;
         this.bgpManager = bgpManager;
         this.fibManager = fibManager;
         this.fibService = fibService;
         this.vpnManager = vpnManager;
+        this.idManager = idManager;
     }
 
     public void onAddFloatingIp(final BigInteger dpnId, final String routerName, final String vpnName,
@@ -100,16 +104,23 @@ public class EvpnDnatFlowProgrammer {
      *    (DC-GW is responding back to FIP VM) {DNAT Reverse traffic})
      *
      */
-        long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
-        if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
-            LOG.error("NAT Service : Unable to retrieve L3VNI value for Floating IP {} ", externalIp);
-            return;
-        }
         long vpnId = NatUtil.getVpnId(dataBroker, vpnName);
         if (vpnId == NatConstants.INVALID_ID) {
-            LOG.warn("NAT Service : Invalid Vpn Id is found for Vpn Name {}", vpnName);
+            LOG.error("NAT Service : Invalid Vpn Id is found for Vpn Name {}", vpnName);
+            return;
+        }
+        long routerId = NatUtil.getVpnId(dataBroker, routerName);
+        if (routerId == NatConstants.INVALID_ID) {
+            LOG.error("Unable to get RouterId from RouterName {}", routerName);
             return;
         }
+        long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
+        if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
+            LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+                    + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue with installing "
+                    + "DNAT flows for FloatingIp {}", vpnName, rd, externalIp);
+            l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
+        }
         FloatingIPListener.updateOperationalDS(dataBroker, routerName, interfaceName, NatConstants.DEFAULT_LABEL_VALUE,
                 internalIp, externalIp);
         //Inform to FIB and BGP
@@ -142,7 +153,7 @@ public class EvpnDnatFlowProgrammer {
                     Collections.singleton(externalIp),
                     floatingIpPortMacAddress, dpnId, networkId, writeTx, NwConstants.ADD_FLOW);
         }
-
+        final long finalL3Vni = l3Vni;
         Futures.addCallback(futureVxlan, new FutureCallback<RpcResult<Void>>() {
 
             @Override
@@ -165,7 +176,7 @@ public class EvpnDnatFlowProgrammer {
                  /* Install the Flow table INTERNAL_TUNNEL_TABLE (table=36)-> PDNAT_TABLE (table=25) for SNAT to DNAT
                   * reverse traffic for Non-FIP VM on DPN1 to FIP VM on DPN2
                   */
-                    makeTunnelTableEntry(dpnId, l3Vni, instructions);
+                    makeTunnelTableEntry(dpnId, finalL3Vni, instructions);
 
                  /* Install the flow L3_GW_MAC_TABLE (table=19)-> PDNAT_TABLE (table=25)
                   * (DNAT reverse traffic: If the traffic is Initiated from DC-GW to FIP VM (DNAT forward traffic))
@@ -203,7 +214,8 @@ public class EvpnDnatFlowProgrammer {
     }
 
     public void onRemoveFloatingIp(final BigInteger dpnId, final String vpnName, final String externalIp,
-                                       final String floatingIpInterface, final String floatingIpPortMacAddress) {
+                                   final String floatingIpInterface, final String floatingIpPortMacAddress,
+                                   final String routerName) {
     /*
      *  1) Remove the flow INTERNAL_TUNNEL_TABLE (table=36)-> PDNAT_TABLE (table=25) (SNAT VM on DPN1 is
      *     responding back to FIP VM on DPN2) {SNAT to DNAT traffic on different Hypervisor}
@@ -220,16 +232,23 @@ public class EvpnDnatFlowProgrammer {
             LOG.error("NAT Service : Could not retrieve RD value from VPN Name {}  ", vpnName);
             return;
         }
-        long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
-        if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
-            LOG.error("NAT Service : Could not retrieve L3VNI value from RD {} in ", rd);
-            return;
-        }
         long vpnId = NatUtil.getVpnId(dataBroker, vpnName);
         if (vpnId == NatConstants.INVALID_ID) {
-            LOG.warn("NAT Service : Invalid Vpn Id is found for Vpn Name {}", vpnName);
+            LOG.error("NAT Service : Invalid Vpn Id is found for Vpn Name {}", vpnName);
             return;
         }
+        long routerId = NatUtil.getVpnId(dataBroker, routerName);
+        if (routerId == NatConstants.INVALID_ID) {
+            LOG.error("Unable to get RouterId from RouterName {}", routerName);
+            return;
+        }
+        long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
+        if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
+            LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+                    + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue with installing "
+                    + "DNAT flows for FloatingIp {}", vpnName, rd, externalIp);
+            l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
+        }
         //Remove Prefix from BGP
         NatUtil.removePrefixFromBGP(dataBroker, bgpManager, fibManager, rd, externalIp + "/32", vpnName, LOG);
 
@@ -238,6 +257,7 @@ public class EvpnDnatFlowProgrammer {
                 .setSourceDpid(dpnId).setIpAddress(externalIp + "/32").setServiceId(l3Vni).build();
         Future<RpcResult<Void>> future = fibService.removeFibEntry(input);
         ListenableFuture<RpcResult<Void>> futureVxlan = JdkFutureAdapters.listenInPoolThread(future);
+        final long finalL3Vni = l3Vni;
         Futures.addCallback(futureVxlan, new FutureCallback<RpcResult<Void>>() {
 
             @Override
@@ -257,7 +277,7 @@ public class EvpnDnatFlowProgrammer {
                       */
                     if (!NatUtil.isFloatingIpPresentForDpn(dataBroker, dpnId, rd, vpnName, externalIp)) {
                         //Remove the flow for INTERNAL_TUNNEL_TABLE (table=36)-> PDNAT_TABLE (table=25)
-                        removeTunnelTableEntry(dpnId, l3Vni);
+                        removeTunnelTableEntry(dpnId, finalL3Vni);
                     }
                     //Remove the flow for L3_GW_MAC_TABLE (table=19)-> PDNAT_TABLE (table=25)
                     NatEvpnUtil.removeL3GwMacTableEntry(dpnId, vpnId, floatingIpPortMacAddress, mdsalManager);
index f69bc74dfdf5c2c192bb9400b16021907099ddab..061e5b48fe82902c5d48e52a2b56b5622654ec37 100644 (file)
@@ -54,8 +54,10 @@ public class EvpnNaptSwitchHA {
         }
         long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
         if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
-            LOG.error("NAT Service : Could not retrieve L3VNI value from RD {} ", rd);
-            return;
+            LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+                    + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
+                    + "NAT flows", vpnName, rd);
+            l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
         }
         String gwMacAddress = NatUtil.getExtGwMacAddFromRouterId(dataBroker, routerId);
         if (gwMacAddress == null) {
index 412032d7e0aed0c5774c00021b3cede35e43bf86..9cb58a657498f8d68bde3652d01ef4293fbeed43 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,16 +38,19 @@ public class EvpnSnatFlowProgrammer {
     private final IMdsalApiManager mdsalManager;
     private final IBgpManager bgpManager;
     private final IFibManager fibManager;
+    private final IdManagerService idManager;
     private static final BigInteger COOKIE_TUNNEL = new BigInteger("9000000", 16);
 
     @Inject
     public EvpnSnatFlowProgrammer(final DataBroker dataBroker, final IMdsalApiManager mdsalManager,
                            final IBgpManager bgpManager,
-                           final IFibManager fibManager) {
+                           final IFibManager fibManager,
+                           final IdManagerService idManager) {
         this.dataBroker = dataBroker;
         this.mdsalManager = mdsalManager;
         this.bgpManager = bgpManager;
         this.fibManager = fibManager;
+        this.idManager = idManager;
     }
 
     public void evpnAdvToBgpAndInstallFibAndTsFlows(final BigInteger dpnId, final short tableId,
@@ -76,8 +80,10 @@ public class EvpnSnatFlowProgrammer {
         //get l3Vni value for external VPN
         long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
         if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
-            LOG.error("NAT Service : Unable to retrieve L3VNI value for External IP {}", externalIp);
-            return;
+            LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+                    + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue with installing "
+                    + "SNAT flows for External Fixed IP {}", vpnName, rd, externalIp);
+            l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
         }
         /* As of now neither SNAT nor DNAT will use macaddress while advertising to FIB and BGP instead
          * use only gwMacAddress. Hence default value of macAddress is null
@@ -127,9 +133,9 @@ public class EvpnSnatFlowProgrammer {
             LOG.error("NAT Service : Could not retrieve RD value from VPN Name {}  ", vpnName);
             return;
         }
-        long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
-        if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
-            LOG.error("NAT Service : Could not retrieve L3VNI value from RD {} in ", rd);
+        long vpnId = NatUtil.getVpnId(dataBroker, vpnName);
+        if (vpnId == NatConstants.INVALID_ID) {
+            LOG.warn("NAT Service : Invalid Vpn Id is found for Vpn Name {}", vpnName);
             return;
         }
         String gwMacAddress = NatUtil.getExtGwMacAddFromRouterId(dataBroker, routerId);
@@ -137,9 +143,12 @@ public class EvpnSnatFlowProgrammer {
             LOG.error("NAT Service : Unable to Get External Gateway MAC address for External Router ID {} ", routerId);
             return;
         }
-        long vpnId = NatUtil.getVpnId(dataBroker, vpnName);
-        if (vpnId == NatConstants.INVALID_ID) {
-            LOG.warn("NAT Service : Invalid Vpn Id is found for Vpn Name {}", vpnName);
+        long l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
+        if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
+            LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+                    + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue with installing "
+                    + "SNAT flows for External Fixed IP {}", vpnName, rd, externalIp);
+            l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
         }
         //remove INTERNAL_TUNNEL_TABLE (table=36)-> INBOUND_NAPT_TABLE (table=44) flow
         removeTunnelTableEntry(dpnId, l3Vni);
index 063b20959440971654a31dd11cbf5188497f4b91..bb18171ced5fff1111b7525bd838ac2145d89ed7 100644 (file)
@@ -316,13 +316,10 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                 primarySwitchId, routerName);
             return primarySwitchId;
         }
-
         // Validating and creating VNI pool during when NAPT switch is selected.
         // With Assumption this might be the first NAT service comes up.
-        if (nvpnManager.getEnforceOpenstackSemanticsConfig()) {
-            NatOverVxlanUtil.validateAndCreateVxlanVniPool(dataBroker, nvpnManager,
-                    idManager, NatConstants.ODL_VNI_POOL_NAME);
-        }
+        NatOverVxlanUtil.validateAndCreateVxlanVniPool(dataBroker, nvpnManager,
+                idManager, NatConstants.ODL_VNI_POOL_NAME);
         primarySwitchId = naptSwitchSelector.selectNewNAPTSwitch(routerName);
         LOG.debug("NAT Service : Primary NAPT switch DPN ID {}", primarySwitchId);
         if (primarySwitchId == null || primarySwitchId.equals(BigInteger.ZERO)) {
@@ -1584,9 +1581,7 @@ public class ExternalRoutersListener extends AsyncDataTreeChangeListenerBase<Rou
                 handleRouterGwFlows(router, primarySwitchId, NwConstants.DEL_FLOW);
                 List<String> externalIps = NatUtil.getExternalIpsForRouter(dataBroker, routerId);
                 handleDisableSnat(router, networkUuid, externalIps, true, null, primarySwitchId);
-                if (nvpnManager.getEnforceOpenstackSemanticsConfig()) {
-                    NatOverVxlanUtil.releaseVNI(routerName, idManager);
-                }
+                NatOverVxlanUtil.releaseVNI(routerName, idManager);
             }
         }
     }
index e7d94b77b61c69af76332645725858ae84a8facd..29fafc40efd30f7e50308987219b52b34e2464e1 100644 (file)
@@ -41,8 +41,8 @@ public class NatOverVxlanUtil {
     public static BigInteger getInternetVpnVni(IdManagerService idManager, String vpnUuid, long vpnid) {
         BigInteger internetVpnVni = getVNI(vpnUuid, idManager);
         if (internetVpnVni.longValue() == -1) {
-            LOG.warn("NAT Service : Unable to obtain Router VNI from VNI POOL for router {}."
-                    + "Router ID will be used as tun_id", vpnUuid);
+            LOG.warn("NAT Service : Unable to obtain Internet Vpn VNI from VNI POOL for Vpn {}."
+                    + "Will use tunnel_id {} as Internet VNI", vpnUuid, vpnid);
             return BigInteger.valueOf(vpnid);
         }
         return internetVpnVni;
@@ -68,7 +68,7 @@ public class NatOverVxlanUtil {
                 return BigInteger.valueOf(rpcResult.getResult().getIdValue());
             }
         } catch (NullPointerException | InterruptedException | ExecutionException e) {
-            LOG.error("NAT Service : getVNI Exception {}", e);
+            LOG.error("NAT Service : Exception in get VNI for key {}", vniKey, e);
         }
         return BigInteger.valueOf(-1);
     }
@@ -84,7 +84,7 @@ public class NatOverVxlanUtil {
                         vniKey, rpcResult.getErrors());
             }
         } catch (NullPointerException | InterruptedException | ExecutionException e) {
-            LOG.error("NAT Service : getVNI Exception {}", e);
+            LOG.error("NAT Service : Exception in release VNI for Key {}", vniKey, e);
         }
     }
 
index 95ebed3e8388b2db3a074db3de841f3560f3a908..d1c4c0a929cfe43bf0647eec1c5cc76313e5749b 100644 (file)
@@ -641,6 +641,12 @@ public class NatTunnelInterfaceStateListener
             gwMacAddress = NatUtil.getExtGwMacAddFromRouterId(dataBroker, routerId);
             //get l3Vni value for external VPN
             l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
+            if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
+                LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+                        + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
+                        + "NAT flows", vpnName, rd);
+                l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, externalVpnName, routerId).longValue();
+            }
             //Create writeTx Object
             writeTx = dataBroker.newWriteOnlyTransaction();
         }
@@ -761,6 +767,12 @@ public class NatTunnelInterfaceStateListener
             gwMacAddress = NatUtil.getExtGwMacAddFromRouterId(dataBroker, routerId);
             //get l3Vni value for external VPN
             l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
+            if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
+                LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+                        + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
+                        + "NAT flows", vpnName, rd);
+                l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
+            }
             //Create writeTx Object
             writeTx = dataBroker.newWriteOnlyTransaction();
         }
@@ -952,6 +964,11 @@ public class NatTunnelInterfaceStateListener
     private void hndlTepDelForDnatInEachRtr(RoutersList router, BigInteger tepDeletedDpnId) {
         //DNAT : Withdraw the routes from the BGP
         String routerName = router.getRouter();
+        long routerId = NatUtil.getVpnId(dataBroker, routerName);
+        if (routerId == NatConstants.INVALID_ID) {
+            LOG.warn("Unable to get RouterId from RouterName {}", routerName);
+            return;
+        }
         LOG.debug("NAT Service : DNAT -> Trying to clear routes to the Floating IP associated to the router {}",
             routerName);
 
@@ -982,8 +999,10 @@ public class NatTunnelInterfaceStateListener
             //get l3Vni value for external VPN
             l3Vni = NatEvpnUtil.getL3Vni(dataBroker, rd);
             if (l3Vni == NatConstants.DEFAULT_L3VNI_VALUE) {
-                LOG.error("NAT Service : Unable to retrieve L3VNI value for RD {}", rd);
-                return;
+                LOG.debug("NAT Service : L3VNI value is not configured in Internet VPN {} and RD {} "
+                        + "Carve-out L3VNI value from OpenDaylight VXLAN VNI Pool and continue to installing "
+                        + "NAT flows", vpnName, rd);
+                l3Vni = NatOverVxlanUtil.getInternetVpnVni(idManager, vpnName, routerId).longValue();
             }
         }
         List<Ports> interfaces = routerPorts.getPorts();
index c17fba7e32fb2de08a94e71306bb287950ecc1d2..ee7975c58dbeb7fb6ac289d9c0735a3567336eda 100644 (file)
@@ -147,6 +147,8 @@ public class VpnFloatingIpHandler implements FloatingIPHandler {
         if (provType == null) {
             return;
         }
+        NatOverVxlanUtil.validateAndCreateVxlanVniPool(dataBroker, nvpnManager, idManager,
+                NatConstants.ODL_VNI_POOL_NAME);
         if (provType == ProviderTypes.VXLAN) {
             Uuid floatingIpInterface = NatEvpnUtil.getFloatingIpInterfaceIdFromFloatingIpId(dataBroker, floatingIpId);
             evpnDnatFlowProgrammer.onAddFloatingIp(dpnId, routerId, vpnName, internalIp, externalIp, networkId,
@@ -156,12 +158,6 @@ public class VpnFloatingIpHandler implements FloatingIPHandler {
             }
             return;
         }
-
-        if (nvpnManager.getEnforceOpenstackSemanticsConfig()) {
-            NatOverVxlanUtil.validateAndCreateVxlanVniPool(dataBroker, nvpnManager,
-                    idManager, NatConstants.ODL_VNI_POOL_NAME);
-        }
-
         GenerateVpnLabelInput labelInput = new GenerateVpnLabelInputBuilder().setVpnName(vpnName)
             .setIpPrefix(externalIp).build();
         Future<RpcResult<GenerateVpnLabelOutput>> labelFuture = vpnService.generateVpnLabel(labelInput);
@@ -281,7 +277,7 @@ public class VpnFloatingIpHandler implements FloatingIPHandler {
         if (provType == ProviderTypes.VXLAN) {
             Uuid floatingIpInterface = NatEvpnUtil.getFloatingIpInterfaceIdFromFloatingIpId(dataBroker, floatingIpId);
             evpnDnatFlowProgrammer.onRemoveFloatingIp(dpnId, vpnName, externalIp, floatingIpInterface.getValue(),
-                    floatingIpPortMacAddress);
+                    floatingIpPortMacAddress, routerId);
             return;
         }
         cleanupFibEntries(dpnId, vpnName, externalIp, label);