From 8faf4736aa6616bcd89ed2fccb84db85e1e48693 Mon Sep 17 00:00:00 2001 From: Tanmay Agrawal Date: Sun, 23 Aug 2020 22:20:05 +0530 Subject: [PATCH] Make subnetroute label and flow management more robust This fix is intended to address two major problems: a. Increasing number of stale flows in table 20 for subnetroute specific labels. b. Address stale flows in table 20 that always appears during bulk migration (or) bulk evacuation. Due to various events like Port UP/DOWN , VM migration etc , NH-DPN election is triggered for a given subnet. This leads to update in the SubnetRoute FIB entry. Suspicion is that it leads to un-necessary flow creation. Since SubnetRoute flows are programmed on all DPNs whereever there is a VPN presnce, its decided not to allocated label everytime there is some event(like Port UP/DOWN) and update the FIB entry. To minimize stale flow creation, MPLS label will be created only once during subnet-addition and deleted when subnet is deleted. Signed-off-by: Tanmay Agrawal Change-Id: I5f1c057554eb2a1e331d87fe3f8feca99f67e57c --- .../netvirt/fibmanager/FibManagerImpl.java | 20 +- .../netvirt/fibmanager/VrfEntryListener.java | 299 +----------------- .../OSGI-INF/blueprint/fibmanager.xml | 3 - .../netvirt/vpnmanager/VpnConstants.java | 1 + .../vpnmanager/VpnOpStatusListener.java | 58 ++-- .../vpnmanager/VpnSubnetRouteHandler.java | 152 +++++---- .../netvirt/vpnmanager/VpnUtil.java | 199 ++++++------ .../populator/impl/L3vpnPopulator.java | 13 +- 8 files changed, 228 insertions(+), 517 deletions(-) diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java index 196e107134..101d606231 100755 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java @@ -11,7 +11,6 @@ import com.google.common.base.Preconditions; import com.google.common.util.concurrent.FutureCallback; import io.netty.util.concurrent.GlobalEventExecutor; import java.util.List; -import java.util.Optional; import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.inject.Singleton; @@ -22,8 +21,6 @@ import org.opendaylight.mdsal.binding.util.TypedWriteTransaction; import org.opendaylight.netvirt.fibmanager.api.IFibManager; 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; @@ -41,18 +38,15 @@ public class FibManagerImpl implements IFibManager { private final VrfEntryListener vrfEntryListener; private IVpnManager vpnmanager; private final FibUtil fibUtil; - private final InterVpnLinkCache interVpnLinkCache; @Inject public FibManagerImpl(final NexthopManager nexthopManager, final VrfEntryListener vrfEntryListener, final BundleContext bundleContext, - final FibUtil fibUtil, - final InterVpnLinkCache interVpnLinkCache) { + final FibUtil fibUtil) { this.nexthopManager = nexthopManager; this.vrfEntryListener = vrfEntryListener; this.fibUtil = fibUtil; - this.interVpnLinkCache = interVpnLinkCache; GlobalEventExecutor.INSTANCE.execute(() -> { ServiceTracker tracker = null; @@ -189,17 +183,7 @@ public class FibManagerImpl implements IFibManager { public void removeInterVPNLinkRouteFlows(final String interVpnLinkName, final boolean isVpnFirstEndPoint, final VrfEntry vrfEntry) { - Optional optInterVpnLink = interVpnLinkCache.getInterVpnLinkByName(interVpnLinkName); - if (!optInterVpnLink.isPresent()) { - LOG.warn("Could not find InterVpnLink with name {}. InterVpnLink route flows wont be removed", - interVpnLinkName); - return; - } - InterVpnLinkDataComposite interVpnLink = optInterVpnLink.get(); - String vpnName = isVpnFirstEndPoint ? interVpnLink.getFirstEndpointVpnUuid().get() - : interVpnLink.getSecondEndpointVpnUuid().get(); - - vrfEntryListener.removeInterVPNLinkRouteFlows(interVpnLink, vpnName, vrfEntry); + //No Op } @Override diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java index 3c08ede1d4..15c369e40b 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java @@ -24,7 +24,6 @@ import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -60,7 +59,6 @@ import org.opendaylight.genius.mdsalutil.matches.MatchMetadata; import org.opendaylight.genius.mdsalutil.matches.MatchMplsLabel; import org.opendaylight.genius.mdsalutil.matches.MatchTunnelId; import org.opendaylight.genius.utils.JvmGlobalLocks; -import org.opendaylight.genius.utils.ServiceIndex; import org.opendaylight.genius.utils.batching.SubTransaction; import org.opendaylight.infrautils.jobcoordinator.JobCoordinator; import org.opendaylight.infrautils.utils.concurrent.Executors; @@ -82,8 +80,6 @@ import org.opendaylight.netvirt.fibmanager.api.FibHelper; import org.opendaylight.netvirt.fibmanager.api.RouteOrigin; import org.opendaylight.netvirt.vpnmanager.api.VpnExtraRouteHelper; import org.opendaylight.netvirt.vpnmanager.api.VpnHelper; -import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkCache; -import org.opendaylight.netvirt.vpnmanager.api.intervpnlink.InterVpnLinkDataComposite; import org.opendaylight.serviceutils.tools.listener.AbstractAsyncDataTreeChangeListener; import org.opendaylight.serviceutils.upgrade.UpgradeState; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; @@ -94,8 +90,6 @@ 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.FlowBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries; @@ -121,7 +115,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.to.extraroutes.vpn.extra.routes.Routes; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.adjacency.list.Adjacency; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.l3vpn.rev200204.adjacency.list.AdjacencyBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.InterVpnLinkState.State; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; import org.opendaylight.yangtools.yang.common.Uint32; @@ -153,7 +146,6 @@ public class VrfEntryListener extends AbstractAsyncDataTreeChangeListener closeables = new CopyOnWriteArrayList<>(); private final UpgradeState upgradeState; private final DataTreeEventCallbackRegistrar eventCallbacks; @@ -167,7 +159,6 @@ public class VrfEntryListener extends AbstractAsyncDataTreeChangeListener optVpnUuid = fibUtil.getVpnNameFromRd(rd); - if (optVpnUuid.isPresent()) { - String vpnUuid = optVpnUuid.get(); - InterVpnLinkDataComposite interVpnLink = interVpnLinkCache.getInterVpnLinkByVpnId(vpnUuid).orElse(null); - if (interVpnLink != null) { - LOG.debug("InterVpnLink {} found in Cache linking Vpn {}", interVpnLink.getInterVpnLinkName(), vpnUuid); - FibUtil.getFirstNextHopAddress(vrfEntry).ifPresent(routeNexthop -> { - if (interVpnLink.isIpAddrTheOtherVpnEndpoint(routeNexthop, vpnUuid)) { - // This is an static route that points to the other endpoint of an InterVpnLink - // In that case, we should add another entry in FIB table pointing to LPortDispatcher table. - installIVpnLinkSwitchingFlows(interVpnLink, vpnUuid, vrfEntry, vpnId); - installInterVpnRouteInLFib(interVpnLink, vpnUuid, vrfEntry, etherType); - } - }); - } - } } void refreshFibTables(String rd, String prefix) { @@ -537,32 +520,6 @@ public class VrfEntryListener extends AbstractAsyncDataTreeChangeListener { - List nextHopAddressList = FibHelper.getNextHopListFromRoutePaths(vrfEntry); - final LabelRouteInfoKey lriKey = new LabelRouteInfoKey(label); - final ReentrantLock lock = lockFor(lriKey); - lock.lock(); - try { - LabelRouteInfo lri = getLabelRouteInfo(lriKey); - if (isPrefixAndNextHopPresentInLri(vrfEntry.getDestPrefix(), nextHopAddressList, lri)) { - - if (RouteOrigin.value(vrfEntry.getOrigin()) == RouteOrigin.SELF_IMPORTED) { - Optional vpnInstanceOpDataEntryOptional = - fibUtil.getVpnInstanceOpData(rd); - if (vpnInstanceOpDataEntryOptional.isPresent()) { - String vpnInstanceName = vpnInstanceOpDataEntryOptional.get().getVpnInstanceName(); - if (!lri.getVpnInstanceList().contains(vpnInstanceName)) { - updateVpnReferencesInLri(lri, vpnInstanceName, false); - } - } - } - LOG.debug("SUBNETROUTE: installSubnetRouteInFib: Fetched labelRouteInfo for label {} interface {}" - + " and got dpn {}", label, lri.getVpnInterfaceName(), lri.getDpnId()); - } - } finally { - lock.unlock(); - } - }); final List instructions = new ArrayList<>(); Uint64 subnetRouteMeta = Uint64.valueOf(BigInteger.valueOf(elanTag).shiftLeft(24) .or(BigInteger.valueOf(vpnId.longValue()).shiftLeft(1))); @@ -644,135 +601,6 @@ public class VrfEntryListener extends AbstractAsyncDataTreeChangeListener optLportTag = interVpnLink.getEndpointLportTagByVpnName(vpnName); - if (!optLportTag.isPresent()) { - LOG.warn("Could not retrieve lportTag for VPN {} endpoint in InterVpnLink {}", vpnName, interVpnLinkName); - return; - } - - Long lportTag = optLportTag.get().toJava(); - Uint32 label = FibUtil.getLabelFromRoutePaths(vrfEntry).orElse(null); - if (label == null) { - LOG.error("Could not find label in vrfEntry=[prefix={} routePaths={}]. LFIB entry for InterVpnLink skipped", - vrfEntry.getDestPrefix(), vrfEntry.getRoutePaths()); - return; - } - List actionsInfos = Collections.singletonList(new ActionPopMpls(etherType)); - List instructions = Arrays.asList( - new InstructionApplyActions(actionsInfos), - new InstructionWriteMetadata(MetaDataUtil.getMetaDataForLPortDispatcher(lportTag.intValue(), - ServiceIndex.getIndex(NwConstants.L3VPN_SERVICE_NAME, - NwConstants.L3VPN_SERVICE_INDEX)), - MetaDataUtil.getMetaDataMaskForLPortDispatcher()), - new InstructionGotoTable(NwConstants.L3_INTERFACE_TABLE)); - List interVpnNextHopList = FibHelper.getNextHopListFromRoutePaths(vrfEntry); - List targetDpns = interVpnLink.getEndpointDpnsByVpnName(vpnName); - - for (Uint64 dpId : targetDpns) { - LOG.debug("Installing flow: VrfEntry=[prefix={} label={} nexthop={}] dpn {} for InterVpnLink {} in LFIB", - vrfEntry.getDestPrefix(), label, interVpnNextHopList, dpId, interVpnLink.getInterVpnLinkName()); - - makeLFibTableEntry(dpId, label, instructions, LFIB_INTERVPN_PRIORITY, NwConstants.ADD_FLOW, - /*writeTx*/null); - } - } - - - /* - * Installs the flows in FIB table that, for a given route, do the switching from one VPN to the other. - */ - private void installIVpnLinkSwitchingFlows(final InterVpnLinkDataComposite interVpnLink, final String vpnUuid, - final VrfEntry vrfEntry, Uint32 vpnTag) { - Preconditions.checkNotNull(interVpnLink, "InterVpnLink cannot be null"); - Preconditions.checkArgument(vrfEntry.getRoutePaths() != null - && vrfEntry.getRoutePaths().size() == 1); - String destination = vrfEntry.getDestPrefix(); - String nextHop = new ArrayList(vrfEntry.getRoutePaths().values()).get(0).getNexthopAddress(); - String interVpnLinkName = interVpnLink.getInterVpnLinkName(); - - // After having received a static route, we should check if the vpn is part of an inter-vpn-link. - // In that case, we should populate the FIB table of the VPN pointing to LPortDisptacher table - // using as metadata the LPortTag associated to that vpn in the inter-vpn-link. - if (interVpnLink.getState().orElse(State.Error) != State.Active) { - LOG.warn("Route to {} with nexthop={} cannot be installed because the interVpnLink {} is not active", - destination, nextHop, interVpnLinkName); - return; - } - - Optional optOtherEndpointLportTag = interVpnLink.getOtherEndpointLportTagByVpnName(vpnUuid); - if (!optOtherEndpointLportTag.isPresent()) { - LOG.warn("Could not find suitable LportTag for the endpoint opposite to vpn {} in interVpnLink {}", - vpnUuid, interVpnLinkName); - return; - } - - List targetDpns = interVpnLink.getEndpointDpnsByVpnName(vpnUuid); - if (targetDpns.isEmpty()) { - LOG.warn("Could not find DPNs for endpoint opposite to vpn {} in interVpnLink {}", - vpnUuid, interVpnLinkName); - return; - } - - String[] values = destination.split("/"); - String destPrefixIpAddress = values[0]; - int prefixLength = values.length == 1 ? 0 : Integer.parseInt(values[1]); - - List matches = new ArrayList<>(); - matches.add(new MatchMetadata(MetaDataUtil.getVpnIdMetadata(vpnTag.longValue()), - MetaDataUtil.METADATA_MASK_VRFID)); - matches.add(MatchEthernetType.IPV4); - - if (prefixLength != 0) { - matches.add(new MatchIpv4Destination(destPrefixIpAddress, Integer.toString(prefixLength))); - } - - List instructions = - Arrays.asList(new InstructionWriteMetadata( - MetaDataUtil.getMetaDataForLPortDispatcher(optOtherEndpointLportTag.get().intValue(), - ServiceIndex.getIndex(NwConstants.L3VPN_SERVICE_NAME, NwConstants - .L3VPN_SERVICE_INDEX)), - MetaDataUtil.getMetaDataMaskForLPortDispatcher()).buildInstruction(0), - new InstructionGotoTable(NwConstants.L3_INTERFACE_TABLE).buildInstruction(1)); - Map instructionsMap = new HashMap(); - int instructionKey = 0; - for (Instruction instructionObj : instructions) { - instructionsMap.put(new InstructionKey(++instructionKey), instructionObj); - } - - int priority = DEFAULT_FIB_FLOW_PRIORITY + prefixLength; - String flowRef = getInterVpnFibFlowRef(interVpnLinkName, destination, nextHop); - Flow flowEntity = MDSALUtil.buildFlowNew(NwConstants.L3_FIB_TABLE, flowRef, priority, flowRef, 0, 0, - COOKIE_VM_FIB_TABLE, matches, instructionsMap); - - LOG.trace("Installing flow in FIB table for vpn {} interVpnLink {} nextHop {} key {}", - vpnUuid, interVpnLink.getInterVpnLinkName(), nextHop, flowRef); - - for (Uint64 dpId : targetDpns) { - - LOG.debug("Installing flow: VrfEntry=[prefix={} route-paths={}] dpn {} for InterVpnLink {} in FIB", - vrfEntry.getDestPrefix(), vrfEntry.getRoutePaths(), - dpId, interVpnLink.getInterVpnLinkName()); - - mdsalManager.installFlow(dpId, flowEntity); - } - } - private List createLocalFibEntry(Uint32 vpnId, String rd, VrfEntry vrfEntry, int etherType) { List returnLocalDpnId = new ArrayList<>(); String localNextHopIP = vrfEntry.getDestPrefix(); @@ -1002,12 +830,12 @@ public class VrfEntryListener extends AbstractAsyncDataTreeChangeListener tx) { if (lri == null) { return true; } - LOG.debug("deleting LRI : for label {} vpninstancename {}", lri.getLabel(), vpnInstanceName); InstanceIdentifier lriId = InstanceIdentifier.builder(LabelRouteMap.class) .child(LabelRouteInfo.class, new LabelRouteInfoKey(lri.getLabel())).build(); @@ -1537,7 +1365,6 @@ public class VrfEntryListener extends AbstractAsyncDataTreeChangeListener optionalLabel = FibUtil.getLabelFromRoutePaths(vrfEntry); - List nextHopAddressList = FibHelper.getNextHopListFromRoutePaths(vrfEntry); String vpnName = fibUtil.getVpnNameFromId(vpnInstance.getVpnId()); if (subnetRoute != null) { long elanTag = subnetRoute.getElantag().toJava(); @@ -1564,37 +1391,6 @@ public class VrfEntryListener extends AbstractAsyncDataTreeChangeListener { - final LabelRouteInfoKey lriKey = new LabelRouteInfoKey(label); - final ReentrantLock lock = lockFor(lriKey); - lock.lock(); - try { - LabelRouteInfo lri = getLabelRouteInfo(lriKey); - if (isPrefixAndNextHopPresentInLri(vrfEntry.getDestPrefix(), nextHopAddressList, lri)) { - Optional vpnInstanceOpDataEntryOptional = - fibUtil.getVpnInstanceOpData(rd); - String vpnInstanceName = ""; - if (vpnInstanceOpDataEntryOptional.isPresent()) { - vpnInstanceName = vpnInstanceOpDataEntryOptional.get().getVpnInstanceName(); - } - boolean lriRemoved = this.deleteLabelRouteInfo(lri, vpnInstanceName, null); - if (lriRemoved) { - String parentRd = lri.getParentVpnRd(); - fibUtil.releaseId(FibConstants.VPN_IDPOOL_NAME, FibUtil.getNextHopLabelKey( - parentRd, vrfEntry.getDestPrefix())); - LOG.trace("SUBNETROUTE: deleteFibEntries: Released subnetroute label {} for rd {} prefix {}" - + " as labelRouteInfo cleared", label, rd, vrfEntry.getDestPrefix()); - } - } else { - fibUtil.releaseId(FibConstants.VPN_IDPOOL_NAME, FibUtil.getNextHopLabelKey( - rd, vrfEntry.getDestPrefix())); - LOG.trace("SUBNETROUTE: deleteFibEntries: Released subnetroute label {} for rd {} prefix {}", - label, rd, vrfEntry.getDestPrefix()); - } - } finally { - lock.unlock(); - } - }); return; } @@ -1653,25 +1449,6 @@ public class VrfEntryListener extends AbstractAsyncDataTreeChangeListener optVpnUuid = fibUtil.getVpnNameFromRd(rd); - if (optVpnUuid.isPresent()) { - String vpnUuid = optVpnUuid.get(); - FibUtil.getFirstNextHopAddress(vrfEntry).ifPresent(routeNexthop -> { - Optional optInterVpnLink = interVpnLinkCache.getInterVpnLinkByVpnId(vpnUuid); - if (optInterVpnLink.isPresent()) { - InterVpnLinkDataComposite interVpnLink = optInterVpnLink.get(); - if (interVpnLink.isIpAddrTheOtherVpnEndpoint(routeNexthop, vpnUuid)) { - // This is route that points to the other endpoint of an InterVpnLink - // In that case, we should look for the FIB table pointing to - // LPortDispatcher table and remove it. - removeInterVPNLinkRouteFlows(interVpnLink, vpnUuid, vrfEntry); - } - } - }); - } - } private void makeLFibTableEntry(Uint64 dpId, Uint32 label, @Nullable List instructions, @@ -2058,11 +1835,6 @@ public class VrfEntryListener extends AbstractAsyncDataTreeChangeListener targetDpns = interVpnLink.getEndpointDpnsByVpnName(vpnName); - - if (targetDpns.isEmpty()) { - LOG.warn("Could not find DPNs for VPN {} in InterVpnLink {}", vpnName, interVpnLinkName); - return; - } - - java.util.Optional optNextHop = FibUtil.getFirstNextHopAddress(vrfEntry); - java.util.Optional optLabel = FibUtil.getLabelFromRoutePaths(vrfEntry); - - // delete from FIB - // - optNextHop.ifPresent(nextHop -> { - String flowRef = getInterVpnFibFlowRef(interVpnLinkName, vrfEntry.getDestPrefix(), nextHop); - FlowKey flowKey = new FlowKey(new FlowId(flowRef)); - Flow flow = new FlowBuilder().withKey(flowKey).setId(new FlowId(flowRef)) - .setTableId(NwConstants.L3_FIB_TABLE).setFlowName(flowRef).build(); - - LOG.trace("Removing flow in FIB table for interVpnLink {} key {}", interVpnLinkName, flowRef); - for (Uint64 dpId : targetDpns) { - LOG.debug("Removing flow: VrfEntry=[prefix={} nexthop={}] dpn {} for InterVpnLink {} in FIB", - vrfEntry.getDestPrefix(), nextHop, dpId, interVpnLinkName); - - mdsalManager.removeFlow(dpId, flow); - } - }); - - // delete from LFIB - // - optLabel.ifPresent(label -> { - LOG.trace("Removing flow in FIB table for interVpnLink {}", interVpnLinkName); - - LoggingFutures.addErrorLogging(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx -> { - for (Uint64 dpId : targetDpns) { - LOG.debug("Removing flow: VrfEntry=[prefix={} label={}] dpn {} for InterVpnLink {} in LFIB", - vrfEntry.getDestPrefix(), label, dpId, interVpnLinkName); - makeLFibTableEntry(dpId, label, /*instructions*/null, LFIB_INTERVPN_PRIORITY, - NwConstants.DEL_FLOW, tx); - } - }), LOG, "Error removing flows"); - }); - } - private static boolean isPrefixAndNextHopPresentInLri(String prefix, List nextHopAddressList, LabelRouteInfo lri) { return lri != null && Objects.equals(lri.getPrefix(), prefix) diff --git a/fibmanager/impl/src/main/resources/OSGI-INF/blueprint/fibmanager.xml b/fibmanager/impl/src/main/resources/OSGI-INF/blueprint/fibmanager.xml index 0d79bee7ed..45f38374cf 100644 --- a/fibmanager/impl/src/main/resources/OSGI-INF/blueprint/fibmanager.xml +++ b/fibmanager/impl/src/main/resources/OSGI-INF/blueprint/fibmanager.xml @@ -15,9 +15,6 @@ availability="optional"/> - identifier, - VpnInstanceOpDataEntry original, VpnInstanceOpDataEntry update) { + VpnInstanceOpDataEntry original, VpnInstanceOpDataEntry update) { LOG.info("update: Processing update for vpn {} with rd {}", update.getVpnInstanceName(), update.getVrfId()); if (update.getVpnState() == VpnInstanceOpDataEntry.VpnState.PendingDelete && vpnFootprintService.isVpnFootPrintCleared(update)) { @@ -120,31 +120,31 @@ public class VpnOpStatusListener extends AbstractAsyncDataTreeChangeListener operationalFuture = txRunner.callWithNewWriteOnlyTransactionAndSubmit( - Datastore.OPERATIONAL, operTx -> { - // Clean up VPNExtraRoutes Operational DS + Datastore.OPERATIONAL, operTx -> { + // Clean up VPNExtraRoutes Operational DS if (rds != null && VpnUtil.isBgpVpn(vpnName, primaryRd)) { if (update.getType() == VpnInstanceOpDataEntry.Type.L2) { rds.parallelStream().forEach(rd -> bgpManager.deleteVrf( - rd, false, AddressFamily.L2VPN)); + rd, false, AddressFamily.L2VPN)); } if (update.getIpAddressFamilyConfigured() - == VpnInstanceOpDataEntry.IpAddressFamilyConfigured.Ipv4) { + == VpnInstanceOpDataEntry.IpAddressFamilyConfigured.Ipv4) { rds.parallelStream().forEach(rd -> bgpManager.deleteVrf( - rd, false, AddressFamily.IPV4)); + rd, false, AddressFamily.IPV4)); } if (update.getIpAddressFamilyConfigured() - == VpnInstanceOpDataEntry.IpAddressFamilyConfigured.Ipv6) { + == VpnInstanceOpDataEntry.IpAddressFamilyConfigured.Ipv6) { rds.parallelStream().forEach(rd -> bgpManager.deleteVrf( - rd, false, AddressFamily.IPV6)); + rd, false, AddressFamily.IPV6)); } if (update.getIpAddressFamilyConfigured() - == VpnInstanceOpDataEntry.IpAddressFamilyConfigured.Ipv4AndIpv6) { + == VpnInstanceOpDataEntry.IpAddressFamilyConfigured.Ipv4AndIpv6) { rds.parallelStream() - .forEach(rd -> bgpManager.deleteVrf( - rd, false, AddressFamily.IPV4)); + .forEach(rd -> bgpManager.deleteVrf( + rd, false, AddressFamily.IPV4)); rds.parallelStream() - .forEach(rd -> bgpManager.deleteVrf( - rd, false, AddressFamily.IPV6)); + .forEach(rd -> bgpManager.deleteVrf( + rd, false, AddressFamily.IPV6)); } } InstanceIdentifier vpnToExtraroute = @@ -152,7 +152,7 @@ public class VpnOpStatusListener extends AbstractAsyncDataTreeChangeListener optVpnToExtraroute = Optional.empty(); try { optVpnToExtraroute = SingleTransactionDataBroker.syncReadOptional(dataBroker, - LogicalDatastoreType.OPERATIONAL, vpnToExtraroute); + LogicalDatastoreType.OPERATIONAL, vpnToExtraroute); } catch (InterruptedException | ExecutionException e) { LOG.error("update: Failed to read VpnToExtraRoute for vpn {}", vpnName); } @@ -162,7 +162,7 @@ public class VpnOpStatusListener extends AbstractAsyncDataTreeChangeListener optPrefixToIntf = Optional.empty(); try { optPrefixToIntf = SingleTransactionDataBroker.syncReadOptional(dataBroker, @@ -195,8 +195,8 @@ public class VpnOpStatusListener extends AbstractAsyncDataTreeChangeListener { - // Clean up VpnInstanceToVpnId from Config DS + Datastore.CONFIGURATION, confTx -> { + // Clean up VpnInstanceToVpnId from Config DS VpnUtil.removeVpnIdToVpnInstance(vpnId, confTx); VpnUtil.removeVpnInstanceToVpnId(vpnName, confTx); LOG.trace("Removed vpnIdentifier for rd{} vpnname {}", primaryRd, vpnName); @@ -212,8 +212,8 @@ public class VpnOpStatusListener extends AbstractAsyncDataTreeChangeListener vpnTargetMap = update.getVpnTargets().getVpnTarget(); @@ -259,7 +259,7 @@ public class VpnOpStatusListener extends AbstractAsyncDataTreeChangeListener { @@ -272,7 +272,7 @@ public class VpnOpStatusListener extends AbstractAsyncDataTreeChangeListener importRTList = rd.equals(primaryRd) ? irtList : emptyList(); LOG.info("VpnOpStatusListener.update: updating BGPVPN for vpn {} with RD {}" - + " Type is {}, IPtype is {}, iRT {}", vpnName, primaryRd, update.getType(), + + " Type is {}, IPtype is {}, iRT {}", vpnName, primaryRd, update.getType(), update.getIpAddressFamilyConfigured(), importRTList); int ipValue = VpnUtil.getIpFamilyValueToRemove(original,update); switch (ipValue) { @@ -311,7 +311,7 @@ public class VpnOpStatusListener extends AbstractAsyncDataTreeChangeListener identifier, - final VpnInstanceOpDataEntry value) { + final VpnInstanceOpDataEntry value) { LOG.debug("add: Ignoring vpn Op {} with rd {}", value.getVpnInstanceName(), value.getVrfId()); } @@ -339,8 +339,12 @@ public class VpnOpStatusListener extends AbstractAsyncDataTreeChangeListener subOpIdentifier = null; Optional optionalSubs = null; + Uint32 label; - Preconditions.checkNotNull(subnetId, LOGGING_PREFIX + " onSubnetAddedToVpn: SubnetId cannot be null or empty!"); + Preconditions.checkNotNull(subnetId, + LOGGING_PREFIX + " onSubnetAddedToVpn: SubnetId cannot be null or empty!"); Preconditions.checkNotNull(subnetIp, LOGGING_PREFIX + " onSubnetAddedToVpn: SubnetPrefix cannot be null or empty!"); - Preconditions.checkNotNull(elanTag, LOGGING_PREFIX + " onSubnetAddedToVpn: ElanTag cannot be null or empty!"); + Preconditions.checkNotNull(elanTag, + LOGGING_PREFIX + " onSubnetAddedToVpn: ElanTag cannot be null or empty!"); if (subnetmap.getVpnId() == null) { LOG.error("onSubnetAddedToVpn: VpnId {} for subnet {} not found, bailing out", subnetmap.getVpnId(), @@ -134,28 +136,15 @@ public class VpnSubnetRouteHandler { //TODO(vivek): Change this to use more granularized lock at subnetId level try { vpnUtil.lockSubnet(subnetId.getValue()); - // Please check if subnetId belongs to an External Network - InstanceIdentifier subMapid = - InstanceIdentifier.builder(Subnetmaps.class).child(Subnetmap.class, - new SubnetmapKey(subnetId)).build(); - Optional sm = SingleTransactionDataBroker.syncReadOptional(dataBroker, - LogicalDatastoreType.CONFIGURATION, subMapid); - if (!sm.isPresent()) { - LOG.error("{} onSubnetAddedToVpn: Unable to retrieve subnetmap entry for subnet {} IP {}" - + " vpnName {}", LOGGING_PREFIX, subnetId, subnetIp, vpnName); - return; - } - subMap = sm.get(); - if (isBgpVpn) { InstanceIdentifier netsIdentifier = InstanceIdentifier.builder(ExternalNetworks.class) - .child(Networks.class, new NetworksKey(subMap.getNetworkId())).build(); + .child(Networks.class, new NetworksKey(subnetmap.getNetworkId())).build(); Optional optionalNets = SingleTransactionDataBroker.syncReadOptional(dataBroker, LogicalDatastoreType.CONFIGURATION, netsIdentifier); if (optionalNets.isPresent()) { LOG.info("{} onSubnetAddedToVpn: subnet {} with IP {} is an external subnet on external " + "network {}, so ignoring this for SubnetRoute on vpn {}", LOGGING_PREFIX, - subnetId.getValue(), subnetIp, subMap.getNetworkId().getValue(), vpnName); + subnetId.getValue(), subnetIp, subnetmap.getNetworkId().getValue(), vpnName); return; } } @@ -180,11 +169,20 @@ public class VpnSubnetRouteHandler { + " subnet {} subnetIp {} ", LOGGING_PREFIX, vpnName, subnetId.getValue(), subnetIp); return; } + //Allocate MPLS label for subnet-route at the time SubnetOpDataEntry creation + label = vpnUtil.getUniqueId(VpnConstants.VPN_IDPOOL_NAME, + VpnUtil.getNextHopLabelKey(primaryRd, subnetIp)); + if (label == VpnConstants.INVALID_ID) { + LOG.error("onSubnetAddedToVpn: Unable to retrieve label for rd {}, subnetIp {}", + primaryRd, subnetIp); + return; + } subOpBuilder.setVrfId(primaryRd); subOpBuilder.setVpnName(vpnName); subOpBuilder.setSubnetToDpn(new ArrayList<>()); subOpBuilder.setRouteAdvState(TaskState.Idle); subOpBuilder.setElanTag(elanTag); + subOpBuilder.setLabel(label); Long l3Vni = vpnInstanceOpData.getL3vni() != null ? vpnInstanceOpData.getL3vni().toJava() : 0L; subOpBuilder.setL3vni(l3Vni); subOpEntry = subOpBuilder.build(); @@ -195,7 +193,7 @@ public class VpnSubnetRouteHandler { } catch (TransactionCommitFailedException e) { LOG.error("{} Creation of SubnetOpDataEntry for subnet {} failed ", LOGGING_PREFIX, subnetId.getValue(), e); - // The second part of this method depends on subMap being non-null so fail fast here. + // The second part of this method depends on subnetmap being non-null so fail fast here. return; } catch (RuntimeException e) { //TODO: Avoid this LOG.error("{} onSubnetAddedToVpn: Unable to handle subnet {} with ip {} added to vpn {}", LOGGING_PREFIX, @@ -219,7 +217,7 @@ public class VpnSubnetRouteHandler { subOpIdentifier); subOpBuilder = new SubnetOpDataEntryBuilder(optionalSubs.get()) .withKey(new SubnetOpDataEntryKey(subnetId)); - List portList = subMap.getPortList(); + List portList = subnetmap.getPortList(); if (portList != null) { for (Uuid port : portList) { Interface intfState = InterfaceUtils.getInterfaceStateFromOperDS(dataBroker,port.getValue()); @@ -229,7 +227,7 @@ public class VpnSubnetRouteHandler { } catch (Exception e) { LOG.error("{} onSubnetAddedToVpn: Unable to obtain dpnId for interface {}," + " subnetroute inclusion for this interface for subnet {} subnetIp {} " - + "vpn {} failed with exception", LOGGING_PREFIX, port.getValue(), + + "vpn {} failed with exception", LOGGING_PREFIX, port.getValue(), subnetId.getValue(), subnetIp, vpnName, e); continue; } @@ -260,7 +258,7 @@ public class VpnSubnetRouteHandler { } } electNewDpnForSubnetRoute(subOpBuilder, null /* oldDpnId */, subnetId, - subMap.getNetworkId(), isBgpVpn); + subnetmap.getNetworkId(), isBgpVpn, label); subOpEntry = subOpBuilder.build(); SingleTransactionDataBroker.syncUpdate(dataBroker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpEntry, VpnUtil.SINGLE_TRANSACTION_BROKER_NO_RETRY); @@ -329,36 +327,24 @@ public class VpnSubnetRouteHandler { + " vpnName {} rd {} TaskState {}", LOGGING_PREFIX, subnetId.getValue(), optionalSubs.get().getSubnetCidr(), optionalSubs.get().getVpnName(), optionalSubs.get().getVrfId(), optionalSubs.get().getRouteAdvState()); - /* If subnet is deleted (or if its removed from VPN), the ports that are DOWN on that subnet - * will continue to be stale in portOpData DS, as subDpnList used for portOpData removal will - * contain only ports that are UP. So here we explicitly cleanup the ports of the subnet by - * going through the list of ports on the subnet - */ - InstanceIdentifier subMapid = - InstanceIdentifier.builder(Subnetmaps.class).child(Subnetmap.class, - new SubnetmapKey(subnetId)).build(); - Optional sm = SingleTransactionDataBroker.syncReadOptional(dataBroker, - LogicalDatastoreType.CONFIGURATION, subMapid); - if (!sm.isPresent()) { - LOG.error("{} onSubnetDeletedFromVpn: Stale ports removal: Unable to retrieve subnetmap entry" - + " for subnet {} subnetIp {} vpnName {}", LOGGING_PREFIX, subnetId.getValue(), - optionalSubs.get().getSubnetCidr(), optionalSubs.get().getVpnName()); - } else { - Subnetmap subMap = sm.get(); - List portList = subMap.getPortList(); - if (portList != null) { - for (Uuid port : portList) { - InstanceIdentifier portOpIdentifier = - InstanceIdentifier.builder(PortOpData.class).child(PortOpDataEntry.class, - new PortOpDataEntryKey(port.getValue())).build(); - LOG.trace("{} onSubnetDeletedFromVpn: Deleting portOpData entry for port {}" - + " from subnet {} subnetIp {} vpnName {} TaskState {}", - LOGGING_PREFIX, port.getValue(), subnetId.getValue(), - optionalSubs.get().getSubnetCidr(), optionalSubs.get().getVpnName(), - optionalSubs.get().getRouteAdvState()); - SingleTransactionDataBroker.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, - portOpIdentifier, VpnUtil.SINGLE_TRANSACTION_BROKER_NO_RETRY); - } + /* If subnet is deleted (or if its removed from VPN), the ports that are DOWN on that subnet + * will continue to be stale in portOpData DS, as subDpnList used for portOpData removal will + * contain only ports that are UP. So here we explicitly cleanup the ports of the subnet by + * going through the list of ports on the subnet + */ + List portList = subnetmap.getPortList(); + if (portList != null) { + for (Uuid port : portList) { + InstanceIdentifier portOpIdentifier = + InstanceIdentifier.builder(PortOpData.class).child(PortOpDataEntry.class, + new PortOpDataEntryKey(port.getValue())).build(); + LOG.trace("{} onSubnetDeletedFromVpn: Deleting portOpData entry for port {}" + + " from subnet {} subnetIp {} vpnName {} TaskState {}", + LOGGING_PREFIX, port.getValue(), subnetId.getValue(), + optionalSubs.get().getSubnetCidr(), optionalSubs.get().getVpnName(), + optionalSubs.get().getRouteAdvState()); + SingleTransactionDataBroker.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, + portOpIdentifier, VpnUtil.SINGLE_TRANSACTION_BROKER_NO_RETRY); } } @@ -371,6 +357,12 @@ public class VpnSubnetRouteHandler { deleteSubnetRouteFromFib(rd, subnetIp, vpnName, isBgpVpn); SingleTransactionDataBroker.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, VpnUtil.SINGLE_TRANSACTION_BROKER_NO_RETRY); + int releasedLabel = vpnUtil.releaseId(VpnConstants.VPN_IDPOOL_NAME, + VpnUtil.getNextHopLabelKey(rd, subnetIp)); + if (releasedLabel == VpnConstants.INVALID_LABEL) { + LOG.error("onSubnetDeletedFromVpn: Unable to release label for key {}", + VpnUtil.getNextHopLabelKey(rd, subnetIp)); + } LOG.info("{} onSubnetDeletedFromVpn: Removed subnetopdataentry successfully from Datastore" + " for subnet {} subnetIp {} vpnName {} rd {}", LOGGING_PREFIX, subnetId.getValue(), subnetIp, vpnName, rd); @@ -444,6 +436,7 @@ public class VpnSubnetRouteHandler { String subnetIp = optionalSubs.get().getSubnetCidr(); String rd = optionalSubs.get().getVrfId(); String routeAdvState = optionalSubs.get().getRouteAdvState().toString(); + Uint32 label = optionalSubs.get().getLabel(); LOG.info("{} onPortAddedToSubnet: Port {} being added to subnet {} subnetIp {} vpnName {} rd {} " + "TaskState {}", LOGGING_PREFIX, portId.getValue(), subnetId.getValue(), subnetIp, vpnName, rd, routeAdvState); @@ -494,7 +487,7 @@ public class VpnSubnetRouteHandler { if (subOpBuilder.getNhDpnId() == null) { // No nexthop selected yet, elect one now electNewDpnForSubnetRoute(subOpBuilder, null /* oldDpnId */, subnetId, - subnetmap.getNetworkId(), true); + subnetmap.getNetworkId(), true, label); } else if (!VpnUtil.isExternalSubnetVpn(subnetOpDataEntry.getVpnName(), subnetId.getValue())) { // Already nexthop has been selected, only publishing to bgp required, so publish to bgp getNexthopTepAndPublishRoute(subOpBuilder, subnetId); @@ -567,7 +560,8 @@ public class VpnSubnetRouteHandler { subOpBuilder.getSubnetCidr(), subOpBuilder.getVpnName(), subOpBuilder.getVrfId()); // last port on this DPN, so we need to elect the new NHDpnId electNewDpnForSubnetRoute(subOpBuilder, nhDpnId, subnetId, subnetmap.getNetworkId(), - !VpnUtil.isExternalSubnetVpn(subnetOpDataEntry.getVpnName(), subnetId.getValue())); + !VpnUtil.isExternalSubnetVpn(subnetOpDataEntry.getVpnName(), subnetId.getValue()), + subOpBuilder.getLabel()); SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpBuilder.build(), VpnUtil.SINGLE_TRANSACTION_BROKER_NO_RETRY); LOG.info("{} onPortRemovedFromSubnet: Updated subnetopdataentry to OP Datastore" @@ -628,11 +622,12 @@ public class VpnSubnetRouteHandler { List subnetToDpnList = concat(new ArrayList(subnetOpDataEntry .nonnullSubnetToDpn().values()), subDpn); subOpBuilder.setSubnetToDpn(getSubnetToDpnMap(subnetToDpnList)); + Uint32 label = optionalSubs.get().getLabel(); if (subOpBuilder.getRouteAdvState() != TaskState.Advertised) { if (subOpBuilder.getNhDpnId() == null) { // No nexthop selected yet, elect one now electNewDpnForSubnetRoute(subOpBuilder, null /* oldDpnId */, subnetId, - null /*networkId*/, !isExternalSubnetVpn); + null /*networkId*/, !isExternalSubnetVpn, label); } else if (!isExternalSubnetVpn) { // Already nexthop has been selected, only publishing to bgp required, so publish to bgp getNexthopTepAndPublishRoute(subOpBuilder, subnetId); @@ -707,7 +702,8 @@ public class VpnSubnetRouteHandler { subOpBuilder.getSubnetCidr(), subOpBuilder.getVpnName(), subOpBuilder.getVrfId()); // last port on this DPN, so we need to elect the new NHDpnId electNewDpnForSubnetRoute(subOpBuilder, dpnId, subnetId, null /*networkId*/, - !VpnUtil.isExternalSubnetVpn(subnetOpDataEntry.getVpnName(), subnetId.getValue())); + !VpnUtil.isExternalSubnetVpn(subnetOpDataEntry.getVpnName(), subnetId.getValue()), + subOpBuilder.getLabel()); SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpBuilder.build(), VpnUtil.SINGLE_TRANSACTION_BROKER_NO_RETRY); LOG.info("{} onInterfaceDown: Updated subnetopdataentry for subnet {} subnetIp {} vpnName {}" @@ -754,12 +750,13 @@ public class VpnSubnetRouteHandler { optionalSubs.get().getLastAdvState(), dpnId.toString()); SubnetOpDataEntry subOpEntry = optionalSubs.get(); SubnetOpDataEntryBuilder subOpBuilder = new SubnetOpDataEntryBuilder(subOpEntry); + Uint32 label = optionalSubs.get().getLabel(); boolean isExternalSubnetVpn = VpnUtil.isExternalSubnetVpn(subOpEntry.getVpnName(), subnetId.getValue()); if (subOpBuilder.getRouteAdvState() != TaskState.Advertised) { if (subOpBuilder.getNhDpnId() == null) { // No nexthop selected yet, elect one now electNewDpnForSubnetRoute(subOpBuilder, null /* oldDpnId */, subnetId, - null /*networkId*/, !isExternalSubnetVpn); + null /*networkId*/, !isExternalSubnetVpn, label); } else if (!isExternalSubnetVpn) { // Already nexthop has been selected, only publishing to bgp required, so publish to bgp getNexthopTepAndPublishRoute(subOpBuilder, subnetId); @@ -813,8 +810,10 @@ public class VpnSubnetRouteHandler { SubnetOpDataEntry subOpEntry = null; SubnetOpDataEntryBuilder subOpBuilder = new SubnetOpDataEntryBuilder(optionalSubs.get()); Uint64 nhDpnId = subOpBuilder.getNhDpnId(); + Uint32 label = optionalSubs.get().getLabel(); if (nhDpnId != null && nhDpnId.equals(dpnId)) { - electNewDpnForSubnetRoute(subOpBuilder, dpnId, subnetId, null /*networkId*/, true); + electNewDpnForSubnetRoute(subOpBuilder, dpnId, subnetId, null /*networkId*/, true, + label); subOpEntry = subOpBuilder.build(); SingleTransactionDataBroker.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpEntry, VpnUtil.SINGLE_TRANSACTION_BROKER_NO_RETRY); @@ -862,7 +861,7 @@ public class VpnSubnetRouteHandler { subOpBuilder.setLastAdvState(subOpBuilder.getRouteAdvState()).setRouteAdvState(TaskState.Advertised); } catch (Exception e) { LOG.error("{} publishSubnetRouteToBgp: Subnet route not advertised for subnet {} subnetIp {} vpn {} rd {}" - + " with dpnid {}", LOGGING_PREFIX, subOpBuilder.getSubnetId().getValue(), + + " with dpnid {}", LOGGING_PREFIX, subOpBuilder.getSubnetId().getValue(), subOpBuilder.getSubnetCidr(), subOpBuilder.getVpnName(), subOpBuilder.getVrfId(), nextHopIp, e); } } @@ -876,7 +875,8 @@ public class VpnSubnetRouteHandler { LOG.warn("Unable to find nexthopip for rd {} subnetroute subnetip {} for dpnid {}", subOpBuilder.getVrfId(), subOpBuilder.getSubnetCidr(), subOpBuilder.getNhDpnId().toString()); - electNewDpnForSubnetRoute(subOpBuilder, null /* oldDpnId */, subnetId, null /*networkId*/, true); + electNewDpnForSubnetRoute(subOpBuilder, null /* oldDpnId */, subnetId, null /*networkId*/, + true, subOpBuilder.getLabel()); } } @@ -923,6 +923,7 @@ public class VpnSubnetRouteHandler { return true; } + @SuppressFBWarnings private Uint32 getLabel(String rd, String subnetIp) { Uint32 label = vpnUtil.getUniqueId(VpnConstants.VPN_IDPOOL_NAME, VpnUtil.getNextHopLabelKey(rd, subnetIp)); LOG.trace("{} getLabel: Allocated subnetroute label {} for rd {} prefix {}", LOGGING_PREFIX, label, rd, @@ -966,7 +967,7 @@ public class VpnSubnetRouteHandler { // TODO Clean up the exception handling @SuppressWarnings("checkstyle:IllegalCatch") private void electNewDpnForSubnetRoute(SubnetOpDataEntryBuilder subOpBuilder, @Nullable Uint64 oldDpnId, - Uuid subnetId, Uuid networkId, boolean isBgpVpn) { + Uuid subnetId, Uuid networkId, boolean isBgpVpn, Uint32 label) { boolean isRouteAdvertised = false; String rd = subOpBuilder.getVrfId(); String subnetIp = subOpBuilder.getSubnetCidr(); @@ -974,12 +975,11 @@ public class VpnSubnetRouteHandler { long elanTag = subOpBuilder.getElanTag().toJava(); boolean isAlternateDpnSelected = false; Uint32 l3vni = Uint32.ZERO; - Uint32 label = Uint32.ZERO; String networkName = networkId != null ? networkId.getValue() : null; - LOG.info("{} electNewDpnForSubnetRoute: Handling subnet {} subnetIp {} vpn {} rd {} TaskState {}" - + " lastTaskState {}", LOGGING_PREFIX, subnetId.getValue(), subnetIp, subOpBuilder.getVpnName(), - subOpBuilder.getVrfId(), subOpBuilder.getRouteAdvState(), subOpBuilder.getLastAdvState()); + LOG.info("{} electNewDpnForSubnetRoute: Handling subnet {} subnetIp {} vpn {} rd {} label {} TaskState {}" + + " lastTaskState {}", LOGGING_PREFIX, subnetId.getValue(), subnetIp, subOpBuilder.getVpnName(), + subOpBuilder.getVrfId(), label, subOpBuilder.getRouteAdvState(), subOpBuilder.getLastAdvState()); if (!isBgpVpn) { // Non-BGPVPN as it stands here represents use-case of External Subnets of VLAN-Provider-Network // TODO(Tomer): Pulling in both external and internal VLAN-Provider-Network need to be @@ -987,7 +987,6 @@ public class VpnSubnetRouteHandler { if (VpnUtil.isL3VpnOverVxLan(subOpBuilder.getL3vni())) { l3vni = subOpBuilder.getL3vni(); } else { - label = getLabel(rd, subnetIp); subOpBuilder.setLabel(label); } isRouteAdvertised = addSubnetRouteToFib(rd, subnetIp, null /* nhDpnId */, null /* nhTepIp */, @@ -996,8 +995,8 @@ public class VpnSubnetRouteHandler { subOpBuilder.setRouteAdvState(TaskState.Advertised); } else { LOG.error("{} electNewDpnForSubnetRoute: Unable to find TepIp for subnet {} subnetip {} vpnName {}" - + " rd {}, attempt next dpn", LOGGING_PREFIX, subnetId.getValue(), subnetIp, - vpnName, rd); + + " rd {}, attempt next dpn", LOGGING_PREFIX, subnetId.getValue(), subnetIp, + vpnName, rd); subOpBuilder.setRouteAdvState(TaskState.PendingAdvertise); } return; @@ -1033,8 +1032,8 @@ public class VpnSubnetRouteHandler { //If no alternate Dpn is selected as nextHopDpn, withdraw the subnetroute if it had a nextHop already. if (isRouteAdvertised(subOpBuilder) && oldDpnId != null) { LOG.info("{} electNewDpnForSubnetRoute: No alternate DPN available for subnet {} subnetIp {} vpn {}" - + " rd {} Prefix withdrawn from BGP", LOGGING_PREFIX, subnetId.getValue(), subnetIp, vpnName, - rd); + + " rd {} Prefix withdrawn from BGP", LOGGING_PREFIX, subnetId.getValue(), subnetIp, + vpnName, rd); // Withdraw route from BGP for this subnet boolean routeWithdrawn = deleteSubnetRouteFromFib(rd, subnetIp, vpnName, isBgpVpn); //subOpBuilder.setNhDpnId(Uint64.valueOf(null)); @@ -1043,8 +1042,8 @@ public class VpnSubnetRouteHandler { subOpBuilder.setRouteAdvState(TaskState.Withdrawn); } else { LOG.error("{} electNewDpnForSubnetRoute: Withdrawing NextHopDPN {} for subnet {} subnetIp {}" - + " vpn {} rd {} from BGP failed", LOGGING_PREFIX, oldDpnId, subnetId.getValue(), - subnetIp, vpnName, rd); + + " vpn {} rd {} from BGP failed", LOGGING_PREFIX, oldDpnId, subnetId.getValue(), + subnetIp, vpnName, rd); subOpBuilder.setRouteAdvState(TaskState.PendingWithdraw); } } @@ -1054,7 +1053,6 @@ public class VpnSubnetRouteHandler { if (VpnUtil.isL3VpnOverVxLan(subOpBuilder.getL3vni())) { l3vni = subOpBuilder.getL3vni(); } else { - label = getLabel(rd, subnetIp); subOpBuilder.setLabel(label); } //update the VRF entry for the subnetroute. diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java index 5780bafd77..60ae473850 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java @@ -320,9 +320,9 @@ public final class VpnUtil { } static InstanceIdentifier getVpnInterfaceOpDataEntryIdentifier(String vpnInterfaceName, - String vpnName) { + String vpnName) { return InstanceIdentifier.builder(VpnInterfaceOpData.class).child(VpnInterfaceOpDataEntry.class, - new VpnInterfaceOpDataEntryKey(vpnInterfaceName, vpnName)).build(); + new VpnInterfaceOpDataEntryKey(vpnInterfaceName, vpnName)).build(); } static InstanceIdentifier getVpnInstanceIdentifier(String vpnName) { @@ -347,7 +347,7 @@ public final class VpnUtil { Optional getVpnInterfaceOpDataEntry(String vpnInterfaceName, String vpnName) { InstanceIdentifier id = getVpnInterfaceOpDataEntryIdentifier(vpnInterfaceName, - vpnName); + vpnName); Optional vpnInterfaceOpDataEntry = read(LogicalDatastoreType.OPERATIONAL, id); return vpnInterfaceOpDataEntry; @@ -363,15 +363,16 @@ public final class VpnUtil { } static Prefixes getPrefixToInterface(Uint64 dpId, String vpnInterfaceName, String ipPrefix, - Uuid networkId, NetworkType networkType, Long segmentationId, Prefixes.PrefixCue prefixCue) { + Uuid networkId, NetworkType networkType, Long segmentationId, + Prefixes.PrefixCue prefixCue) { return new PrefixesBuilder().setDpnId(dpId).setVpnInterfaceName( - vpnInterfaceName).setIpAddress(ipPrefix)//.setSubnetId(subnetId) + vpnInterfaceName).setIpAddress(ipPrefix)//.setSubnetId(subnetId) .setNetworkId(networkId).setNetworkType(networkType).setSegmentationId(segmentationId) .setPrefixCue(prefixCue).build(); } static Prefixes getPrefixToInterface(Uint64 dpId, String vpnInterfaceName, String ipPrefix, - Prefixes.PrefixCue prefixCue) { + Prefixes.PrefixCue prefixCue) { return new PrefixesBuilder().setDpnId(dpId).setVpnInterfaceName(vpnInterfaceName).setIpAddress(ipPrefix) .setPrefixCue(prefixCue).build(); } @@ -432,7 +433,7 @@ public final class VpnUtil { @Nullable public VpnInstance getVpnInstance(String vpnInstanceName) { InstanceIdentifier id = InstanceIdentifier.builder(VpnInstances.class).child(VpnInstance.class, - new VpnInstanceKey(vpnInstanceName)).build(); + new VpnInstanceKey(vpnInstanceName)).build(); Optional vpnInstance = read(LogicalDatastoreType.CONFIGURATION, id); return vpnInstance.isPresent() ? vpnInstance.get() : null; } @@ -463,9 +464,9 @@ public final class VpnUtil { Optional dpnInVpn = read(LogicalDatastoreType.OPERATIONAL, dpnToVpnId); return dpnInVpn.isPresent() && dpnInVpn.get().getVpnInterfaces() != null ? new ArrayList(dpnInVpn.get() - .getVpnInterfaces().values()) - : emptyList(); + .data.vpn.instance.op.data.entry.vpn.to.dpn.list.VpnInterfaces>(dpnInVpn.get() + .getVpnInterfaces().values()) + : emptyList(); } @NonNull @@ -480,8 +481,8 @@ public final class VpnUtil { // TODO: why check VrfTables if we later go for the specific VrfEntry? if (vrfTable != null) { InstanceIdentifier vrfEntryId = - InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)).child( - VrfEntry.class, new VrfEntryKey(ipPrefix)).build(); + InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)).child( + VrfEntry.class, new VrfEntryKey(ipPrefix)).build(); Optional vrfEntry = read(LogicalDatastoreType.CONFIGURATION, vrfEntryId); if (vrfEntry.isPresent()) { return vrfEntry.get(); @@ -561,17 +562,21 @@ public final class VpnUtil { return Uint32.ZERO; } - void releaseId(String poolName, String idKey) { + Integer releaseId(String poolName, String idKey) { ReleaseIdInput idInput = new ReleaseIdInputBuilder().setPoolName(poolName).setIdKey(idKey).build(); try { - RpcResult rpcResult = idManager.releaseId(idInput).get(); - if (!rpcResult.isSuccessful()) { - LOG.error("releaseId: RPC Call to release Id for key {} from pool {} returned with Errors {}", - idKey, poolName, rpcResult.getErrors()); + Future> result = idManager.releaseId(idInput); + if (result == null || result.get() == null || !result.get().isSuccessful()) { + LOG.error("releaseId: RPC Call to release Id from pool {} with key {} returned with Errors {}", + poolName, idKey, + (result != null && result.get() != null) ? result.get().getErrors() : "RpcResult is null"); + } else { + return result.get().getResult().getIdValues().get(0).intValue(); } } catch (InterruptedException | ExecutionException e) { LOG.error("releaseId: Exception when releasing Id for key {} from pool {}", idKey, poolName, e); } + return VpnConstants.INVALID_IDMAN_ID; } public static String getNextHopLabelKey(String rd, String prefix) { @@ -593,7 +598,7 @@ public final class VpnUtil { return read(LogicalDatastoreType.CONFIGURATION, VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpnName)) .map(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911 .vpn.instance.to.vpn.id.VpnInstance::getVpnId) - .orElse(VpnConstants.INVALID_ID); + .orElse(VpnConstants.INVALID_ID); } /** @@ -604,7 +609,7 @@ public final class VpnUtil { */ public String getVpnRd(String vpnName) { Optional vpnInstance = read(LogicalDatastoreType.CONFIGURATION, + .VpnInstance> vpnInstance = read(LogicalDatastoreType.CONFIGURATION, VpnOperDsUtils.getVpnInstanceToVpnIdIdentifier(vpnName)); String rd = null; if (vpnInstance.isPresent()) { @@ -624,7 +629,7 @@ public final class VpnUtil { List getVpnRdsFromVpnInstanceConfig(String vpnName) { InstanceIdentifier id = InstanceIdentifier.builder(VpnInstances.class) - .child(VpnInstance.class, new VpnInstanceKey(vpnName)).build(); + .child(VpnInstance.class, new VpnInstanceKey(vpnName)).build(); Optional vpnInstance = read(LogicalDatastoreType.CONFIGURATION, id); return vpnInstance.isPresent() ? getListOfRdsFromVpnInstance(vpnInstance.get()) : new ArrayList<>(); } @@ -637,13 +642,13 @@ public final class VpnUtil { */ public void removeVrfEntriesByOrigin(String rd, RouteOrigin origin) { InstanceIdentifier vpnVrfTableIid = - InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)).build(); + InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)).build(); Optional vrfTablesOpc = read(LogicalDatastoreType.CONFIGURATION, vpnVrfTableIid); if (vrfTablesOpc.isPresent()) { VrfTables vrfTables = vrfTablesOpc.get(); LoggingFutures.addErrorLogging( new ManagedNewTransactionRunnerImpl(dataBroker).callWithNewWriteOnlyTransactionAndSubmit( - Datastore.CONFIGURATION, tx -> { + Datastore.CONFIGURATION, tx -> { for (VrfEntry vrfEntry : vrfTables.nonnullVrfEntry().values()) { if (origin == RouteOrigin.value(vrfEntry.getOrigin())) { tx.delete(vpnVrfTableIid.child(VrfEntry.class, vrfEntry.key())); @@ -655,7 +660,7 @@ public final class VpnUtil { public List findVrfEntriesByNexthop(String rd, String nexthop) { InstanceIdentifier vpnVrfTableIid = - InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)).build(); + InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)).build(); Optional vrfTablesOpc = read(LogicalDatastoreType.CONFIGURATION, vpnVrfTableIid); List matches = new ArrayList<>(); if (vrfTablesOpc.isPresent()) { @@ -671,10 +676,10 @@ public final class VpnUtil { public void removeVrfEntries(String rd, List vrfEntries) { InstanceIdentifier vpnVrfTableIid = - InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)).build(); + InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)).build(); LoggingFutures.addErrorLogging( new ManagedNewTransactionRunnerImpl(dataBroker).callWithNewWriteOnlyTransactionAndSubmit( - Datastore.CONFIGURATION, tx -> { + Datastore.CONFIGURATION, tx -> { for (VrfEntry vrfEntry : vrfEntries) { tx.delete(vpnVrfTableIid.child(VrfEntry.class, vrfEntry.key())); } @@ -689,7 +694,7 @@ public final class VpnUtil { bgpManager.withdrawPrefix(rd, vrfEntry.getDestPrefix()); } catch (Exception e) { LOG.error("withdrawRoutes: Could not withdraw route to {} with route-paths {} in VpnRd {}", - vrfEntry.getDestPrefix(), vrfEntry.getRoutePaths(), rd); + vrfEntry.getDestPrefix(), vrfEntry.getRoutePaths(), rd); } }); } @@ -735,17 +740,17 @@ public final class VpnUtil { static org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.id.to.vpn.instance.VpnIds getVpnIdToVpnInstance(Uint32 vpnId, String vpnName, String rd, boolean isExternalVpn) { return new org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.id.to.vpn.instance - .VpnIdsBuilder().setVpnId(vpnId).setVpnInstanceName(vpnName).setVrfId(rd).setExternalVpn(isExternalVpn) + .VpnIdsBuilder().setVpnId(vpnId).setVpnInstanceName(vpnName).setVrfId(rd).setExternalVpn(isExternalVpn) .build(); } static InstanceIdentifier getVpnIdToVpnInstanceIdentifier(Uint32 vpnId) { + .vpn.instance.VpnIds> getVpnIdToVpnInstanceIdentifier(Uint32 vpnId) { return InstanceIdentifier.builder(VpnIdToVpnInstance.class).child(org.opendaylight.yang.gen.v1.urn - .opendaylight.netvirt.l3vpn.rev130911.vpn.id.to.vpn.instance.VpnIds.class, + .opendaylight.netvirt.l3vpn.rev130911.vpn.id.to.vpn.instance.VpnIds.class, new org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.id.to.vpn.instance - .VpnIdsKey(vpnId)).build(); + .VpnIdsKey(vpnId)).build(); } /** @@ -758,10 +763,10 @@ public final class VpnUtil { String getVpnName(Uint32 vpnId) { InstanceIdentifier id = getVpnIdToVpnInstanceIdentifier(vpnId); + .instance.VpnIds> id = getVpnIdToVpnInstanceIdentifier(vpnId); Optional - vpnInstance - = read(LogicalDatastoreType.CONFIGURATION, id); + vpnInstance + = read(LogicalDatastoreType.CONFIGURATION, id); String vpnName = null; if (vpnInstance.isPresent()) { vpnName = vpnInstance.get().getVpnInstanceName(); @@ -771,7 +776,7 @@ public final class VpnUtil { public static InstanceIdentifier getVpnInstanceOpDataIdentifier(String rd) { return InstanceIdentifier.builder(VpnInstanceOpData.class) - .child(VpnInstanceOpDataEntry.class, new VpnInstanceOpDataEntryKey(rd)).build(); + .child(VpnInstanceOpDataEntry.class, new VpnInstanceOpDataEntryKey(rd)).build(); } @Nullable @@ -801,8 +806,8 @@ public final class VpnUtil { if (optConfiguredVpnInterface.isPresent()) { VpnInterface cfgVpnInterface = optConfiguredVpnInterface.get(); java.util.Optional> optVpnInstanceList = - java.util.Optional.ofNullable( - new ArrayList(cfgVpnInterface.nonnullVpnInstanceNames().values())); + java.util.Optional.ofNullable( + new ArrayList(cfgVpnInterface.nonnullVpnInstanceNames().values())); if (optVpnInstanceList.isPresent()) { List vpnList = new ArrayList<>(); for (VpnInstanceNames vpnInstance : optVpnInstanceList.get()) { @@ -819,14 +824,14 @@ public final class VpnUtil { } static final FutureCallback DEFAULT_CALLBACK = - new FutureCallback() { + new FutureCallback() { @Override - public void onSuccess(Void result) { + public void onSuccess(Void result) { LOG.debug("Success in Datastore operation"); } @Override - public void onFailure(Throwable error) { + public void onFailure(Throwable error) { LOG.error("Error in Datastore operation", error); } @@ -880,7 +885,7 @@ public final class VpnUtil { static InstanceIdentifier getInterfaceInfoEntriesOperationalDataPath(long interfaceTag) { return InstanceIdentifier.builder(IfIndexesInterfaceMap.class).child(IfIndexInterface.class, - new IfIndexInterfaceKey((int) interfaceTag)).build(); + new IfIndexInterfaceKey((int) interfaceTag)).build(); } @Nullable @@ -895,13 +900,13 @@ public final class VpnUtil { static InstanceIdentifier getElanInfoEntriesOperationalDataPath(long elanTag) { return InstanceIdentifier.builder(ElanTagNameMap.class).child(ElanTagName.class, - new ElanTagNameKey(elanTag)).build(); + new ElanTagNameKey(elanTag)).build(); } static void removePrefixToInterfaceForVpnId(Uint32 vpnId, @NonNull TypedWriteTransaction operTx) { // Clean up PrefixToInterface Operational DS operTx.delete(InstanceIdentifier.builder( - PrefixToInterface.class).child(VpnIds.class, new VpnIdsKey(vpnId)).build()); + PrefixToInterface.class).child(VpnIds.class, new VpnIdsKey(vpnId)).build()); } static void removeVpnExtraRouteForVpn(String vpnName, @NonNull TypedWriteTransaction operTx) { @@ -926,7 +931,7 @@ public final class VpnUtil { static void removeL3nexthopForVpnId(Uint32 vpnId, @NonNull TypedWriteTransaction operTx) { // Clean up L3NextHop Operational DS operTx.delete(InstanceIdentifier.builder(L3nexthop.class).child( - VpnNexthops.class, new VpnNexthopsKey(vpnId)).build()); + VpnNexthops.class, new VpnNexthopsKey(vpnId)).build()); } void scheduleVpnInterfaceForRemoval(String interfaceName, Uint64 dpnId, String vpnInstanceName, @@ -934,9 +939,9 @@ public final class VpnUtil { InstanceIdentifier interfaceId = getVpnInterfaceOpDataEntryIdentifier(interfaceName, vpnInstanceName); VpnInterfaceOpDataEntry interfaceToUpdate = - new VpnInterfaceOpDataEntryBuilder().withKey(new VpnInterfaceOpDataEntryKey(interfaceName, - vpnInstanceName)).setName(interfaceName).setDpnId(dpnId).setVpnInstanceName(vpnInstanceName) - .build(); + new VpnInterfaceOpDataEntryBuilder().withKey(new VpnInterfaceOpDataEntryKey(interfaceName, + vpnInstanceName)).setName(interfaceName).setDpnId(dpnId).setVpnInstanceName(vpnInstanceName) + .build(); if (writeOperTxn != null) { writeOperTxn.mergeParentStructureMerge(interfaceId, interfaceToUpdate); } else { @@ -945,7 +950,7 @@ public final class VpnUtil { } public void createLearntVpnVipToPort(String vpnName, String fixedIp, String portName, String macAddress, - TypedWriteTransaction writeOperTxn) { + TypedWriteTransaction writeOperTxn) { final InstanceIdentifier id = buildLearntVpnVipToPortIdentifier(vpnName, fixedIp); final ReentrantLock lock = lockFor(vpnName, fixedIp); lock.lock(); @@ -968,7 +973,7 @@ public final class VpnUtil { } static InstanceIdentifier buildLearntVpnVipToPortIdentifier(String vpnName, - String fixedIp) { + String fixedIp) { return InstanceIdentifier.builder(LearntVpnVipToPortData.class).child(LearntVpnVipToPort.class, new LearntVpnVipToPortKey(fixedIp, vpnName)).build(); } @@ -985,14 +990,14 @@ public final class VpnUtil { MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, id); } LOG.debug("removeLearntVpnVipToPort: Deleted LearntVpnVipToPort entry for fixedIp: {}, vpn {}", - fixedIp, vpnName); + fixedIp, vpnName); } finally { lock.unlock(); } } public static void removeVpnPortFixedIpToPort(DataBroker broker, String vpnName, String fixedIp, - @Nullable TypedWriteTransaction writeConfigTxn) { + @Nullable TypedWriteTransaction writeConfigTxn) { final InstanceIdentifier id = buildVpnPortipToPortIdentifier(vpnName, fixedIp); final ReentrantLock lock = lockFor(vpnName, fixedIp); lock.lock(); @@ -1003,7 +1008,7 @@ public final class VpnUtil { MDSALUtil.syncDelete(broker, LogicalDatastoreType.CONFIGURATION, id); } LOG.debug("removeVpnPortFixedIpToPort: Deleted VpnPortipToPort entry for fixedIp: {}, vpn {}", - fixedIp, vpnName); + fixedIp, vpnName); } finally { lock.unlock(); } @@ -1035,7 +1040,7 @@ public final class VpnUtil { } public void removeLearntVpnVipToPortEvent(String eventId, - @Nullable TypedWriteTransaction writeOperTxn) { + @Nullable TypedWriteTransaction writeOperTxn) { InstanceIdentifier id = buildLearntVpnVipToPortEventIdentifier(eventId); if (writeOperTxn != null) { writeOperTxn.delete(id); @@ -1063,7 +1068,7 @@ public final class VpnUtil { .augmentation(Adjacencies.class).child(Adjacency.class, new AdjacencyKey(ip)).build(); MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, adjacencyIdentifier); LOG.info("removeMipAdjAndLearntIp: Successfully Deleted Adjacency {} from interface {} vpn {}", ip, - vpnInterface, vpnName); + vpnInterface, vpnName); } InstanceIdentifier id = buildLearntVpnVipToPortIdentifier(vpnName, prefix); MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, id); @@ -1137,7 +1142,7 @@ public final class VpnUtil { @Nullable public static VpnPortipToPort getNeutronPortFromVpnPortFixedIp(TypedReadTransaction confTx, - String vpnName, String fixedIp) { + String vpnName, String fixedIp) { InstanceIdentifier id = buildVpnPortipToPortIdentifier(vpnName, fixedIp); try { return confTx.read(id).get().orElse(null); @@ -1246,7 +1251,7 @@ public final class VpnUtil { Subnet neutronSubnet = neutronVpnService.getNeutronSubnet(externalIp.getSubnetId()); if (neutronSubnet == null) { LOG.warn("Failed to retrieve subnet {} referenced by router {}", - externalIp.getSubnetId(), routerData); + externalIp.getSubnetId(), routerData); continue; } if (NWUtil.isIpAddressInRange(IpAddressBuilder.getDefaultInstance(extIp), @@ -1266,7 +1271,7 @@ public final class VpnUtil { @Nullable Networks getExternalNetwork(Uuid networkId) { InstanceIdentifier netsIdentifier = InstanceIdentifier.builder(ExternalNetworks.class) - .child(Networks.class, new NetworksKey(networkId)).build(); + .child(Networks.class, new NetworksKey(networkId)).build(); Optional optionalNets = read(LogicalDatastoreType.CONFIGURATION, netsIdentifier); return optionalNets.isPresent() ? optionalNets.get() : null; } @@ -1295,7 +1300,7 @@ public final class VpnUtil { Routers getExternalRouter(TypedReadTransaction tx, String routerId) throws ExecutionException, InterruptedException { InstanceIdentifier id = InstanceIdentifier.builder(ExtRouters.class).child(Routers.class, - new RoutersKey(routerId)).build(); + new RoutersKey(routerId)).build(); return tx.read(id).get().orElse(null); } @@ -1304,11 +1309,11 @@ public final class VpnUtil { } FlowEntity buildL3vpnGatewayFlow(Uint64 dpId, String gwMacAddress, Uint32 vpnId, - Uint32 subnetVpnId) { + Uint32 subnetVpnId) { List mkMatches = new ArrayList<>(); Subnetmap smap = null; mkMatches.add(new MatchMetadata(MetaDataUtil.getVpnIdMetadata(vpnId.longValue()), - MetaDataUtil.METADATA_MASK_VRFID)); + MetaDataUtil.METADATA_MASK_VRFID)); mkMatches.add(new MatchEthernetDestination(new MacAddress(gwMacAddress))); List mkInstructions = new ArrayList<>(); mkInstructions.add(new InstructionGotoTable(NwConstants.L3_FIB_TABLE)); @@ -1337,14 +1342,15 @@ public final class VpnUtil { static String getL3VpnGatewayFlowRef(short l3GwMacTable, Uint64 dpId, Uint32 vpnId, String gwMacAddress, Uint32 subnetVpnId) { return gwMacAddress + NwConstants.FLOWID_SEPARATOR + vpnId + NwConstants.FLOWID_SEPARATOR + dpId - + NwConstants.FLOWID_SEPARATOR + l3GwMacTable + NwConstants.FLOWID_SEPARATOR + subnetVpnId; + + NwConstants.FLOWID_SEPARATOR + l3GwMacTable + NwConstants.FLOWID_SEPARATOR + subnetVpnId; } void lockSubnet(String subnetId) { // We set the total wait time for lock to be obtained at 9 seconds since GC pauses can be upto 8 seconds //in scale setups. TryLockInput input = - new TryLockInputBuilder().setLockName(subnetId).setTime(9000L).setTimeUnit(TimeUnits.Milliseconds).build(); + new TryLockInputBuilder().setLockName(subnetId).setTime(9000L) + .setTimeUnit(TimeUnits.Milliseconds).build(); Future> result = lockManager.tryLock(input); try { if (result != null && result.get().isSuccessful()) { @@ -1408,10 +1414,10 @@ public final class VpnUtil { Optional gatewayMac = Optional.empty(); Uint32 vpnId = getVpnId(macEntry.getVpnName()); InstanceIdentifier - vpnIdsInstanceIdentifier = VpnUtil.getVpnIdToVpnInstanceIdentifier(vpnId); + .instance.VpnIds> + vpnIdsInstanceIdentifier = VpnUtil.getVpnIdToVpnInstanceIdentifier(vpnId); Optional - vpnIdsOptional = read(LogicalDatastoreType.CONFIGURATION, vpnIdsInstanceIdentifier); + vpnIdsOptional = read(LogicalDatastoreType.CONFIGURATION, vpnIdsInstanceIdentifier); if (!vpnIdsOptional.isPresent()) { LOG.error("getGWMacAddressFromInterface: VPN {} not configured", vpnId); return gatewayMac; @@ -1434,9 +1440,9 @@ public final class VpnUtil { TypedReadWriteTransaction writeInvTxn, int addOrRemove, String gwMac) throws ExecutionException, InterruptedException { InstanceIdentifier vpnIdsInstanceIdentifier = getVpnIdToVpnInstanceIdentifier(vpnId); + .VpnIds> vpnIdsInstanceIdentifier = getVpnIdToVpnInstanceIdentifier(vpnId); Optional vpnIdsOptional = writeInvTxn.read(vpnIdsInstanceIdentifier).get(); + .VpnIds> vpnIdsOptional = writeInvTxn.read(vpnIdsInstanceIdentifier).get(); if (vpnIdsOptional.isPresent() && vpnIdsOptional.get().isExternalVpn()) { if (gwMac == null) { LOG.error("setupGwMacIfExternalVpn: Failed to get gwMacAddress for interface {} on dpn {} vpn {}", @@ -1491,7 +1497,7 @@ public final class VpnUtil { static InstanceIdentifier buildSubnetmapIdentifier(Uuid subnetId) { return InstanceIdentifier.builder(Subnetmaps.class) - .child(Subnetmap.class, new SubnetmapKey(subnetId)).build(); + .child(Subnetmap.class, new SubnetmapKey(subnetId)).build(); } @@ -1618,8 +1624,8 @@ public final class VpnUtil { LOG.debug("getVpnInterfaceOpDataEntryAdjacencyIdentifier intfName {}, vpnName {}, ipAddress {}", intfName, vpnName, ipAddress); return InstanceIdentifier.builder(VpnInterfaceOpData.class) - .child(VpnInterfaceOpDataEntry.class, new VpnInterfaceOpDataEntryKey(intfName, vpnName)) - .augmentation(AdjacenciesOp.class).child(Adjacency.class, new AdjacencyKey(ipAddress)).build(); + .child(VpnInterfaceOpDataEntry.class, new VpnInterfaceOpDataEntryKey(intfName, vpnName)) + .augmentation(AdjacenciesOp.class).child(Adjacency.class, new AdjacencyKey(ipAddress)).build(); } public static List getIpsListFromExternalIps(List externalIps) { @@ -1633,14 +1639,14 @@ public final class VpnUtil { void bindService(final String vpnInstanceName, final String interfaceName, boolean isTunnelInterface) { jobCoordinator.enqueueJob(interfaceName, () -> Collections.singletonList(txRunner.callWithNewReadWriteTransactionAndSubmit( - Datastore.CONFIGURATION, tx -> { + Datastore.CONFIGURATION, tx -> { BoundServices serviceInfo = isTunnelInterface - ? VpnUtil.getBoundServicesForTunnelInterface(vpnInstanceName, interfaceName) - : getBoundServicesForVpnInterface(vpnInstanceName, interfaceName); + ? VpnUtil.getBoundServicesForTunnelInterface(vpnInstanceName, interfaceName) + : getBoundServicesForVpnInterface(vpnInstanceName, interfaceName); tx.mergeParentStructurePut(InterfaceUtils.buildServiceId(interfaceName, - ServiceIndex.getIndex(NwConstants.L3VPN_SERVICE_NAME, - NwConstants.L3VPN_SERVICE_INDEX)), - serviceInfo); + ServiceIndex.getIndex(NwConstants.L3VPN_SERVICE_NAME, + NwConstants.L3VPN_SERVICE_INDEX)), + serviceInfo); })), SystemPropertyReader.getDataStoreJobCoordinatorMaxRetries()); } @@ -1650,7 +1656,7 @@ public final class VpnUtil { final Uint32 vpnId = getVpnId(vpnName); List actions = Collections.singletonList( new ActionRegLoad(0, VpnConstants.VPN_REG_ID, 0, VpnConstants.VPN_ID_LENGTH, vpnId.longValue()) - .buildAction()); + .buildAction()); instructions.add(MDSALUtil.buildApplyActionsInstruction(actions, ++instructionKey)); instructions.add( MDSALUtil.buildAndGetWriteMetadaInstruction(MetaDataUtil.getVpnIdMetadata(vpnId.longValue()), @@ -1681,11 +1687,11 @@ public final class VpnUtil { if (!isInterfaceStateDown) { jobCoordinator.enqueueJob(vpnInterfaceName, () -> Collections.singletonList(txRunner.callWithNewWriteOnlyTransactionAndSubmit( - Datastore.CONFIGURATION, tx -> - tx.delete(InterfaceUtils.buildServiceId(vpnInterfaceName, - ServiceIndex.getIndex(NwConstants.L3VPN_SERVICE_NAME, - NwConstants.L3VPN_SERVICE_INDEX))))), - SystemPropertyReader.getDataStoreJobCoordinatorMaxRetries()); + Datastore.CONFIGURATION, tx -> + tx.delete(InterfaceUtils.buildServiceId(vpnInterfaceName, + ServiceIndex.getIndex(NwConstants.L3VPN_SERVICE_NAME, + NwConstants.L3VPN_SERVICE_INDEX))))), + SystemPropertyReader.getDataStoreJobCoordinatorMaxRetries()); } } @@ -1700,11 +1706,11 @@ public final class VpnUtil { org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.subnets.@Nullable Subnets getExternalSubnet(Uuid subnetId) { InstanceIdentifier subnetsIdentifier = InstanceIdentifier.builder(ExternalSubnets.class) + .Subnets> subnetsIdentifier = InstanceIdentifier.builder(ExternalSubnets.class) .child(org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.subnets .Subnets.class, new SubnetsKey(subnetId)).build(); Optional - optionalSubnets = read(LogicalDatastoreType.CONFIGURATION, subnetsIdentifier); + optionalSubnets = read(LogicalDatastoreType.CONFIGURATION, subnetsIdentifier); return optionalSubnets.isPresent() ? optionalSubnets.get() : null; } @@ -1741,7 +1747,7 @@ public final class VpnUtil { } public static boolean isEligibleForBgp(@Nullable String rd, @Nullable String vpnName, @Nullable Uint64 dpnId, - @Nullable String networkName) { + @Nullable String networkName) { if (rd != null) { if (rd.equals(vpnName)) { return false; @@ -1828,8 +1834,8 @@ public final class VpnUtil { }; Predicate matchRTs = input -> { Iterable commonRTs = - intersection(getRts(vpnInstanceOpDataEntry, VpnTarget.VrfRTType.ExportExtcommunity), - getRts(input, VpnTarget.VrfRTType.ImportExtcommunity)); + intersection(getRts(vpnInstanceOpDataEntry, VpnTarget.VrfRTType.ExportExtcommunity), + getRts(input, VpnTarget.VrfRTType.ImportExtcommunity)); return Iterators.size(commonRTs.iterator()) > 0; }; vpnsToImportRoute = getAllVpnInstanceOpData().stream().filter(excludeVpn).filter(matchRTs) @@ -1921,16 +1927,16 @@ public final class VpnUtil { return false; } InstanceIdentifier id = InstanceIdentifier.builder(VpnInstanceOpData.class) - .child(VpnInstanceOpDataEntry.class, new VpnInstanceOpDataEntryKey(primaryRd)).build(); + .child(VpnInstanceOpDataEntry.class, new VpnInstanceOpDataEntryKey(primaryRd)).build(); Optional vpnInstanceOpDataEntryOptional = read(LogicalDatastoreType.OPERATIONAL, id); if (!vpnInstanceOpDataEntryOptional.isPresent()) { LOG.error("isBgpVpnInternet VPN {}." - + "VpnInstanceOpDataEntry not found", vpnName); + + "VpnInstanceOpDataEntry not found", vpnName); return false; } LOG.debug("isBgpVpnInternet VPN {} Successfully VpnInstanceOpDataEntry.getBgpvpnType {}", - vpnName, vpnInstanceOpDataEntryOptional.get().getBgpvpnType()); + vpnName, vpnInstanceOpDataEntryOptional.get().getBgpvpnType()); if (vpnInstanceOpDataEntryOptional.get().getBgpvpnType() == VpnInstanceOpDataEntry.BgpvpnType.InternetBGPVPN) { return true; } @@ -2018,7 +2024,7 @@ public final class VpnUtil { * @param vpnName the vpn name */ void removeRouterPortFromElanDpnListForVlanInAllDpn(String elanInstanceName, - String routerInterfacePortId, String vpnName) { + String routerInterfacePortId, String vpnName) { Map elanInstanceRouterPortMap = getElanInstanceRouterPortMap(vpnName); elanInstanceRouterPortMap.put(elanInstanceName, routerInterfacePortId); Set dpnList = getDpnInElan(elanInstanceRouterPortMap); @@ -2077,7 +2083,7 @@ public final class VpnUtil { } void removeRouterPortFromElanDpn(String elanInstanceName, String routerInterfacePortId, - String vpnName, Uint64 dpnId) { + String vpnName, Uint64 dpnId) { InstanceIdentifier elanDpnInterfaceId = getElanDpnInterfaceOperationalDataPath( elanInstanceName,dpnId); final ReentrantLock lock = JvmGlobalLocks.getLockForString(elanInstanceName); @@ -2250,7 +2256,7 @@ public final class VpnUtil { } public static InstanceIdentifier getElanDpnInterfaceOperationalDataPath(String elanInstanceName, - Uint64 dpId) { + Uint64 dpId) { return InstanceIdentifier.builder(ElanDpnInterfaces.class) .child(ElanDpnInterfacesList.class, new ElanDpnInterfacesListKey(elanInstanceName)) .child(DpnInterfaces.class, new DpnInterfacesKey(dpId)).build(); @@ -2275,7 +2281,8 @@ public final class VpnUtil { } public static void sendNeighborSolicationToOfGroup(Ipv6NdUtilService ipv6NdUtilService, Ipv6Address srcIpv6Address, - MacAddress srcMac, Ipv6Address dstIpv6Address, Long ofGroupId, Uint64 dpId) { + MacAddress srcMac, Ipv6Address dstIpv6Address, Long ofGroupId, + Uint64 dpId) { SendNeighborSolicitationToOfGroupInput input = new SendNeighborSolicitationToOfGroupInputBuilder() .setSourceIpv6(srcIpv6Address).setSourceLlAddress(srcMac).setTargetIpAddress(dstIpv6Address) .setOfGroupId(ofGroupId).setDpId(dpId).build(); @@ -2367,7 +2374,7 @@ public final class VpnUtil { } static InstanceIdentifier getAssociatedSubnetIdentifier(String rt, RouteTarget.RtType rtType, - String cidr) { + String cidr) { return InstanceIdentifier.builder(SubnetsAssociatedToRouteTargets.class).child(RouteTarget.class, new RouteTargetKey(rt, rtType)).child(AssociatedSubnet.class, new AssociatedSubnetKey(cidr)).build(); } @@ -2521,8 +2528,8 @@ public final class VpnUtil { // TODO Clean up the exception handling @SuppressWarnings("checkstyle:IllegalCatch") public void createVpnPortFixedIpToPort(String vpnName, String fixedIp, - String portName, boolean isLearntIp, String macAddress, - WriteTransaction writeConfigTxn) { + String portName, boolean isLearntIp, String macAddress, + WriteTransaction writeConfigTxn) { InstanceIdentifier id = buildVpnPortipToPortIdentifier(vpnName, fixedIp); VpnPortipToPortBuilder builder = new VpnPortipToPortBuilder().withKey(new VpnPortipToPortKey(fixedIp, vpnName)) .setVpnName(vpnName).setPortFixedip(fixedIp).setPortName(portName) diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnPopulator.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnPopulator.java index 4ea91ee7c5..55988797ed 100644 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnPopulator.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/populator/impl/L3vpnPopulator.java @@ -85,7 +85,6 @@ public abstract class L3vpnPopulator implements VpnPopulator { Uint32 label = Uint32.valueOf(input.getLabel()); Uint32 l3vni = Uint32.valueOf(input.getL3vni()); Uint32 elantag = Uint32.valueOf(input.getElanTag()); - Uint64 dpnId = input.getDpnId(); String networkName = input.getNetworkName(); String gwMacAddress = input.getGatewayMac(); SubnetRoute route = new SubnetRouteBuilder().setElantag(elantag).build(); @@ -124,9 +123,6 @@ public abstract class L3vpnPopulator implements VpnPopulator { //Will be handled appropriately with the iRT patch for EVPN if (input.getEncapType().equals(VrfEntryBase.EncapType.Mplsgre)) { - Uint32 vpnId = vpnUtil.getVpnId(vpnName); - addToLabelMapper(label, dpnId, prefix, Collections.singletonList(nextHop), vpnId, null, - elantag, true, rd); List vpnsToImportRoute = vpnUtil.getVpnsImportingMyRoute(vpnName); if (vpnsToImportRoute.size() > 0) { VrfEntry importingVrfEntry = FibHelper.getVrfEntryBuilder(prefix, label, nextHop, @@ -141,7 +137,7 @@ public abstract class L3vpnPopulator implements VpnPopulator { .setVrfEntry(importingVrfEntryList).build(); vpnUtil.syncUpdate(LogicalDatastoreType.CONFIGURATION, importingVrfTableId, importingVrfTable); LOG.info("SUBNETROUTE: addSubnetRouteFibEntryToDS: Exported route rd {} prefix {} nexthop {}" - + " label {} to vpn {} importingRd {}", rd, prefix, nextHop, label, + + " label {} to vpn {} importingRd {}", rd, prefix, nextHop, label, vpnInstance.getVpnInstanceName(), importingRd); } } @@ -173,7 +169,7 @@ public abstract class L3vpnPopulator implements VpnPopulator { if (dpnId != null) { LabelRouteInfoBuilder lriBuilder = new LabelRouteInfoBuilder(); lriBuilder.setLabel(label).setDpnId(dpnId).setPrefix(prefix).setNextHopIpList(nextHopIpList) - .setParentVpnid(vpnId).setIsSubnetRoute(isSubnetRoute); + .setParentVpnid(vpnId).setIsSubnetRoute(isSubnetRoute); if (elanTag != null) { lriBuilder.setElanTag(elanTag); } else { @@ -198,11 +194,12 @@ public abstract class L3vpnPopulator implements VpnPopulator { .child(LabelRouteInfo.class, new LabelRouteInfoKey(label)).build(); tx.mergeParentStructureMerge(lriIid, lri); LOG.info("addToLabelMapper: Added label route info to label {} prefix {} nextHopList {} vpnId {}" - + " interface {} rd {} elantag {}", labelStr, prefix, nextHopIpList, vpnId, + + " interface {} rd {} elantag {}", labelStr, prefix, nextHopIpList, vpnId, vpnInterfaceName, rd, elanTag); } else { LOG.warn("addToLabelMapper: Can't add entry to label map for label {} prefix {} nextHopList {}" - + " vpnId {} interface {} rd {} elantag {}, dpnId is null", labelStr, prefix, nextHopIpList, + + " vpnId {} interface {} rd {} elantag {}, dpnId is null", + labelStr, prefix, nextHopIpList, vpnId, vpnInterfaceName, rd, elanTag); } }), LOG, "addToLabelMapper"); -- 2.36.6