NETVIRT-1080 : Fix PNF discovery failure after FIP detached 02/69102/9
authorVinh Nguyen <vinh.nguyen@hcl.com>
Tue, 6 Mar 2018 02:14:56 +0000 (18:14 -0800)
committerSam Hague <shague@redhat.com>
Tue, 15 May 2018 14:18:59 +0000 (14:18 +0000)
Problem:
  In conntrack NAT mode, deleting last FIP port on dpn also
  deleting the PNF flow entries ion the OVS node.
Solution:
  The problem is caused by missing ExternalFixedIP entry
  in the vpn-to-dpn-list for the external subnet on the
  NAPT switch. The existence of this entry will prevent
  deleting the PNF flows when the FIP is disassociated.
  The patch fix the problem by adding/deleting the
  ExternalFixedIP entry when the external subnet is
  associated/disassociated with the router.

Change-Id: Ib46e860448138c6808105573ae4c52be0bc2b437
Signed-off-by: Vinh Nguyen <vinh.nguyen@hcl.com>
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ConntrackBasedSnatService.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FlatVlanConntrackBasedSnatService.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatServiceImplFactory.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VxlanGreConntrackBasedSnatService.java

index 3049a6b337c0257d6388c5976b79355b324f7f45..b63e987ff8da0cf973f06c3c3a84144843cb6808 100644 (file)
@@ -36,6 +36,7 @@ import org.opendaylight.genius.mdsalutil.matches.MatchIpv4Destination;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.netvirt.natservice.api.SnatServiceListener;
+import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
 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.genius.idmanager.rev160406.AllocateIdInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInputBuilder;
@@ -69,11 +70,13 @@ public abstract class AbstractSnatService implements SnatServiceListener {
     protected final ItmRpcService itmManager;
     protected final OdlInterfaceRpcService odlInterfaceRpcService;
     protected final IInterfaceManager interfaceManager;
+    protected final IVpnFootprintService vpnFootprintService;
 
     protected AbstractSnatService(final DataBroker dataBroker, final IMdsalApiManager mdsalManager,
                                   final ItmRpcService itmManager, final OdlInterfaceRpcService odlInterfaceRpcService,
                                   final IdManagerService idManager, final NAPTSwitchSelector naptSwitchSelector,
-                                  final IInterfaceManager interfaceManager) {
+                                  final IInterfaceManager interfaceManager,
+                                  final IVpnFootprintService vpnFootprintService) {
         this.dataBroker = dataBroker;
         this.mdsalManager = mdsalManager;
         this.itmManager = itmManager;
@@ -81,6 +84,7 @@ public abstract class AbstractSnatService implements SnatServiceListener {
         this.idManager = idManager;
         this.naptSwitchSelector = naptSwitchSelector;
         this.odlInterfaceRpcService = odlInterfaceRpcService;
+        this.vpnFootprintService = vpnFootprintService;
     }
 
     protected DataBroker getDataBroker() {
index f3fba7806258c3625a291de0f2a508fc55487bd6..2ebc9f629fe8a1260a452dc56ae5ec5f70822044 100644 (file)
@@ -7,9 +7,12 @@
  */
 package org.opendaylight.netvirt.natservice.internal;
 
+import com.google.common.base.Optional;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.ActionInfo;
@@ -31,13 +34,16 @@ import org.opendaylight.genius.mdsalutil.matches.MatchIpv4Destination;
 import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.genius.mdsalutil.nxmatches.NxMatchCtState;
+import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 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.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.vpn.to.dpn.list.IpAddresses;
 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.ext.routers.routers.ExternalIps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.subnets.Subnets;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.types.rev160517.IpPrefixOrAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.NxActionNatFlags;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowjava.nx.action.rev140421.NxActionNatRangePresent;
@@ -57,9 +63,9 @@ public abstract class ConntrackBasedSnatService extends AbstractSnatService {
     public ConntrackBasedSnatService(DataBroker dataBroker, IMdsalApiManager mdsalManager, ItmRpcService itmManager,
                                      IdManagerService idManager, NAPTSwitchSelector naptSwitchSelector,
                                      OdlInterfaceRpcService odlInterfaceRpcService,
-                                     IInterfaceManager interfaceManager) {
+                                     IInterfaceManager interfaceManager, IVpnFootprintService vpnFootprintService) {
         super(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService, idManager, naptSwitchSelector,
-                interfaceManager);
+                interfaceManager, vpnFootprintService);
     }
 
     @Override
@@ -98,6 +104,15 @@ public abstract class ConntrackBasedSnatService extends AbstractSnatService {
         installInboundEntry(dpnId, routerId, externalIp, elanId, extSubnetId, addOrRemove);
         installNaptPfibEntry(dpnId, routerId, addOrRemove);
 
+        String fibExternalIp = NatUtil.validateAndAddNetworkMask(externalIp);
+        Optional<Subnets> externalSubnet = NatUtil.getOptionalExternalSubnets(dataBroker, externalSubnetId);
+        if (externalSubnet.isPresent()) {
+            String externalVpn =  externalSubnetId.getValue();
+            String vpnRd = NatUtil.getVpnRd(dataBroker, externalVpn);
+            vpnFootprintService.updateVpnToDpnMapping(dpnId, externalVpn, vpnRd, null /* interfaceName*/,
+                new ImmutablePair<>(IpAddresses.IpAddressSource.ExternalFixedIP, fibExternalIp),
+                addOrRemove == NwConstants.ADD_FLOW);
+        }
     }
 
     @Override
index 486bf7daa753697b1f82d96308cd0f039199d9c4..e20b5d0c90b2bbf3f1938903290219433214e175 100644 (file)
@@ -12,6 +12,7 @@ import java.math.BigInteger;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager;
 import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
@@ -27,9 +28,10 @@ public class FlatVlanConntrackBasedSnatService extends ConntrackBasedSnatService
     public FlatVlanConntrackBasedSnatService(DataBroker dataBroker, IMdsalApiManager mdsalManager,
                                              ItmRpcService itmManager, OdlInterfaceRpcService odlInterfaceRpcService,
                                              IdManagerService idManager, NAPTSwitchSelector naptSwitchSelector,
-                                             IInterfaceManager interfaceManager) {
+                                             IInterfaceManager interfaceManager,
+                                             IVpnFootprintService vpnFootprintService) {
         super(dataBroker, mdsalManager, itmManager, idManager, naptSwitchSelector,
-                odlInterfaceRpcService, interfaceManager);
+                odlInterfaceRpcService, interfaceManager, vpnFootprintService);
     }
 
     @Override
index a57264c604b0888c63edc858a6737693c46ed281..73c8b81cb56d61868839f7582ce5f3f55fe2b05e 100644 (file)
@@ -15,6 +15,7 @@ import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.infrautils.inject.AbstractLifecycle;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.netvirt.neutronvpn.interfaces.INeutronVpnManager;
+import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
@@ -39,6 +40,7 @@ public class SnatServiceImplFactory extends AbstractLifecycle {
     private final ExternalRoutersListener externalRouterListener;
     private final IElanService elanManager;
     private final IInterfaceManager interfaceManager;
+    private final IVpnFootprintService vpnFootprintService;
 
     @Inject
     public SnatServiceImplFactory(final DataBroker dataBroker, final IMdsalApiManager mdsalManager,
@@ -50,7 +52,8 @@ public class SnatServiceImplFactory extends AbstractLifecycle {
                                   final INeutronVpnManager nvpnManager,
                                   final ExternalRoutersListener externalRouterListener,
                                   final IElanService elanManager,
-                                  final IInterfaceManager interfaceManager) {
+                                  final IInterfaceManager interfaceManager,
+                                  final IVpnFootprintService vpnFootprintService) {
         this.dataBroker = dataBroker;
         this.mdsalManager = mdsalManager;
         this.itmManager = itmManager;
@@ -66,6 +69,7 @@ public class SnatServiceImplFactory extends AbstractLifecycle {
         this.externalRouterListener = externalRouterListener;
         this.elanManager = elanManager;
         this.interfaceManager = interfaceManager;
+        this.vpnFootprintService = vpnFootprintService;
     }
 
     @Override
@@ -82,7 +86,7 @@ public class SnatServiceImplFactory extends AbstractLifecycle {
 
         if (natMode == NatMode.Conntrack) {
             return new FlatVlanConntrackBasedSnatService(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService,
-                    idManager, naptSwitchSelector, interfaceManager);
+                    idManager, naptSwitchSelector, interfaceManager, vpnFootprintService);
         }
         return null;
     }
@@ -93,7 +97,8 @@ public class SnatServiceImplFactory extends AbstractLifecycle {
             NatOverVxlanUtil.validateAndCreateVxlanVniPool(dataBroker, nvpnManager, idManager,
                     NatConstants.ODL_VNI_POOL_NAME);
             return new VxlanGreConntrackBasedSnatService(dataBroker, mdsalManager, itmManager, odlInterfaceRpcService,
-                    idManager, naptSwitchSelector, externalRouterListener, elanManager, interfaceManager);
+                    idManager, naptSwitchSelector, externalRouterListener, elanManager, interfaceManager,
+                    vpnFootprintService);
         }
         return null;
     }
index a3598dc1e5ffed8266495c5946a16ff8b20dc5c1..d62987328aa438b71cbca5cf61cf2ab8affe1ecf 100644 (file)
@@ -39,6 +39,7 @@ import org.opendaylight.genius.mdsalutil.matches.MatchMetadata;
 import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId;
 import org.opendaylight.genius.mdsalutil.nxmatches.NxMatchCtState;
 import org.opendaylight.netvirt.elanmanager.api.IElanService;
+import org.opendaylight.netvirt.vpnmanager.api.IVpnFootprintService;
 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.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
@@ -63,9 +64,10 @@ public class VxlanGreConntrackBasedSnatService extends ConntrackBasedSnatService
                                              ItmRpcService itmManager, OdlInterfaceRpcService odlInterfaceRpcService,
                                              IdManagerService idManager, NAPTSwitchSelector naptSwitchSelector,
                                              ExternalRoutersListener externalRouterListener, IElanService elanManager,
-                                             IInterfaceManager interfaceManager) {
+                                             IInterfaceManager interfaceManager,
+                                             IVpnFootprintService vpnFootprintService) {
         super(dataBroker, mdsalManager, itmManager, idManager, naptSwitchSelector, odlInterfaceRpcService,
-                interfaceManager);
+                interfaceManager, vpnFootprintService);
         this.externalRouterListener = externalRouterListener;
         this.elanManager = elanManager;
     }