From a865df358ed617dc25eb13582eaf772c92756335 Mon Sep 17 00:00:00 2001 From: Vinh Nguyen Date: Mon, 5 Mar 2018 18:14:56 -0800 Subject: [PATCH] NETVIRT-1080 : Fix PNF discovery failure after FIP detached 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 --- .../internal/AbstractSnatService.java | 6 +++++- .../internal/ConntrackBasedSnatService.java | 19 +++++++++++++++++-- .../FlatVlanConntrackBasedSnatService.java | 6 ++++-- .../internal/SnatServiceImplFactory.java | 11 ++++++++--- .../VxlanGreConntrackBasedSnatService.java | 6 ++++-- 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java index 3049a6b337..b63e987ff8 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java @@ -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() { diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ConntrackBasedSnatService.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ConntrackBasedSnatService.java index f3fba78062..2ebc9f629f 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ConntrackBasedSnatService.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/ConntrackBasedSnatService.java @@ -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 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 diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FlatVlanConntrackBasedSnatService.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FlatVlanConntrackBasedSnatService.java index 486bf7daa7..e20b5d0c90 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FlatVlanConntrackBasedSnatService.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/FlatVlanConntrackBasedSnatService.java @@ -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 diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatServiceImplFactory.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatServiceImplFactory.java index a57264c604..73c8b81cb5 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatServiceImplFactory.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/SnatServiceImplFactory.java @@ -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; } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VxlanGreConntrackBasedSnatService.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VxlanGreConntrackBasedSnatService.java index a3598dc1e5..d62987328a 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VxlanGreConntrackBasedSnatService.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VxlanGreConntrackBasedSnatService.java @@ -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; } -- 2.36.6