From 28e9eb42afc65539f37003f738ea57bce0e010fa Mon Sep 17 00:00:00 2001 From: Suraj Ranjan Date: Thu, 21 Apr 2016 12:09:41 +0530 Subject: [PATCH] Bug 5770: Ensuring proper cleanup of VPNControlpath. 1. Fix to ensure proper cleanup of Config and Oper DS for VPN on removal of VPNs. 2. Fix for delayed release of VPN IDs by ensuring that we release IDs for VPN and VPNInterfaces only when the IDs are removed from respective OpDataStores. Change-Id: Idda295e845af77355c2d7bdf0f60864782a9538c Signed-off-by: Suraj Ranjan Co-Authored-By: Vivekanandan Narasimhan --- .../vpnservice/fibmanager/FibConstants.java | 2 + .../vpnservice/fibmanager/FibManager.java | 49 +++++++---- .../fibmanager/FibManagerProvider.java | 1 + .../vpnservice/fibmanager/FibUtil.java | 25 ++++++ .../vpnservice/VpnInterfaceManager.java | 29 +++---- .../opendaylight/vpnservice/VpnManager.java | 83 +++++++++++-------- .../org/opendaylight/vpnservice/VpnUtil.java | 68 +++++++++++++++ 7 files changed, 191 insertions(+), 66 deletions(-) diff --git a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibConstants.java b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibConstants.java index a2cfc76e..52dc950e 100644 --- a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibConstants.java +++ b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibConstants.java @@ -15,4 +15,6 @@ public class FibConstants { static final BigInteger COOKIE_TUNNEL = new BigInteger("9000000", 16); static final int DEFAULT_FIB_FLOW_PRIORITY = 10; static final String FLOWID_PREFIX = "L3."; + static final String VPN_IDPOOL_NAME = "vpnservices"; + static final String SEPARATOR = "."; } diff --git a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java index 28419440..a1e729f7 100644 --- a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java +++ b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java @@ -56,6 +56,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.instanc import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlan; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.ItmRpcService; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.to.extraroute.Vpn; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.to.extraroute.VpnKey; @@ -93,6 +94,7 @@ public class FibManager extends AbstractDataChangeListener implements private NexthopManager nextHopManager; private ItmRpcService itmManager; private OdlInterfaceRpcService interfaceManager; + private IdManagerService idManager; private static final BigInteger COOKIE_VM_LFIB_TABLE = new BigInteger("8000002", 16); private static final BigInteger COOKIE_VM_FIB_TABLE = new BigInteger("8000003", 16); private static final int DEFAULT_FIB_FLOW_PRIORITY = 10; @@ -140,6 +142,10 @@ public class FibManager extends AbstractDataChangeListener implements this.interfaceManager = ifManager; } + public void setIdManager(IdManagerService idManager) { + this.idManager = idManager; + } + private void registerListener(final DataBroker db) { try { listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, @@ -182,12 +188,13 @@ public class FibManager extends AbstractDataChangeListener implements Preconditions.checkNotNull(vrfEntry, "VrfEntry cannot be null or empty!"); VpnInstanceOpDataEntry vpnInstance = getVpnInstance(vrfTableKey.getRouteDistinguisher()); - Preconditions.checkNotNull(vpnInstance, "Vpn Instance not available!"); - Preconditions.checkNotNull(vpnInstance.getVpnId(), "Vpn Instance with rd " + vpnInstance.getVrfId() + "has null vpnId!"); + Preconditions.checkNotNull(vpnInstance, "Vpn Instance not available " + vrfTableKey.getRouteDistinguisher()); + Preconditions.checkNotNull(vpnInstance.getVpnId(), "Vpn Instance with rd " + vpnInstance.getVrfId() + " has null vpnId!"); Collection vpnToDpnList = vpnInstance.getVpnToDpnList(); Long vpnId = vpnInstance.getVpnId(); - RdToElanOpEntry rdToElanOpEntry = getRdToElanOpEntry(broker, vrfTableKey.getRouteDistinguisher(), + String rd = vrfTableKey.getRouteDistinguisher(); + RdToElanOpEntry rdToElanOpEntry = getRdToElanOpEntry(broker, rd, vrfEntry.getDestPrefix()); if (rdToElanOpEntry!=null) { if (vpnToDpnList!=null) { @@ -198,14 +205,14 @@ public class FibManager extends AbstractDataChangeListener implements return; } BigInteger localDpnId = createLocalFibEntry(vpnInstance.getVpnId(), - vrfTableKey.getRouteDistinguisher(), vrfEntry); + rd, vrfEntry); if (vpnToDpnList != null) { - for (VpnToDpnList curDpn : vpnToDpnList) { - if (!curDpn.getDpnId().equals(localDpnId)) { - createRemoteFibEntry(localDpnId, curDpn.getDpnId(), vpnInstance.getVpnId(), - vrfTableKey, vrfEntry); + for (VpnToDpnList curDpn : vpnToDpnList) { + if (!curDpn.getDpnId().equals(localDpnId)) { + createRemoteFibEntry(localDpnId, curDpn.getDpnId(), vpnInstance.getVpnId(), + vrfTableKey, vrfEntry); + } } - } } } @@ -567,7 +574,11 @@ public class FibManager extends AbstractDataChangeListener implements LOG.trace("Clean up vpn interface {} from dpn {} to vpn {} list.", ifName, prefixInfo.getDpnId(), rd); FibUtil.delete(broker, LogicalDatastoreType.OPERATIONAL, FibUtil.getVpnInterfaceIdentifier(ifName)); - } + } + + FibUtil.releaseId(idManager, FibConstants.VPN_IDPOOL_NAME, + FibUtil.getNextHopLabelKey(rd, vrfEntry.getDestPrefix())); + } private void deleteFibEntries(final InstanceIdentifier identifier, @@ -576,8 +587,12 @@ public class FibManager extends AbstractDataChangeListener implements Preconditions.checkNotNull(vrfTableKey, "VrfTablesKey cannot be null or empty!"); Preconditions.checkNotNull(vrfEntry, "VrfEntry cannot be null or empty!"); + String rd = vrfTableKey.getRouteDistinguisher(); VpnInstanceOpDataEntry vpnInstance = getVpnInstance(vrfTableKey.getRouteDistinguisher()); - Preconditions.checkNotNull(vpnInstance, "Vpn Instance not available!"); + if (vpnInstance == null) { + LOG.debug("VPN Instance for rd {} is not available from VPN Op Instance Datastore", rd); + return; + } Collection vpnToDpnList = vpnInstance.getVpnToDpnList(); RdToElanOpEntry rdToElanOpEntry= getRdToElanOpEntry(broker,vrfTableKey.getRouteDistinguisher(), vrfEntry.getDestPrefix()); @@ -595,16 +610,18 @@ public class FibManager extends AbstractDataChangeListener implements InstanceIdentifier id = getRdToElanOpEntryDataPath(vrfTableKey.getRouteDistinguisher(), vrfEntry.getDestPrefix()); MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL,id); + FibUtil.releaseId(idManager,FibConstants.VPN_IDPOOL_NAME, + FibUtil.getNextHopLabelKey(rd, vrfEntry.getDestPrefix())); return; } BigInteger localDpnId = deleteLocalFibEntry(vpnInstance.getVpnId(), - vrfTableKey.getRouteDistinguisher(), vrfEntry); + vrfTableKey.getRouteDistinguisher(), vrfEntry); if (vpnToDpnList != null) { - for (VpnToDpnList curDpn : vpnToDpnList) { - if (!curDpn.getDpnId().equals(localDpnId)) { - deleteRemoteRoute(localDpnId, curDpn.getDpnId(), vpnInstance.getVpnId(), vrfTableKey, vrfEntry); + for (VpnToDpnList curDpn : vpnToDpnList) { + if (!curDpn.getDpnId().equals(localDpnId)) { + deleteRemoteRoute(localDpnId, curDpn.getDpnId(), vpnInstance.getVpnId(), vrfTableKey, vrfEntry); + } } - } } //The flow/group entry has been deleted from config DS; need to clean up associated operational //DS entries in VPN Op DS, VpnInstanceOpData and PrefixToInterface to complete deletion diff --git a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManagerProvider.java b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManagerProvider.java index 52e8fd94..62f9e711 100644 --- a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManagerProvider.java +++ b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManagerProvider.java @@ -55,6 +55,7 @@ public class FibManagerProvider implements BindingAwareProvider, IFibManager, Au fibManager.setNextHopManager(nexthopManager); fibManager.setITMRpcService(itmManager); fibManager.setInterfaceManager(interfaceManager); + fibManager.setIdManager(idManager); fibNcListener = new FibNodeCapableListener(dataBroker, fibManager); FibRpcService fibRpcService = new FibRpcServiceImpl(dataBroker, mdsalManager, this); rpcRegistration = getRpcProviderRegistry().addRpcImplementation(FibRpcService.class, fibRpcService); diff --git a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibUtil.java b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibUtil.java index 1c134440..0ba7296d 100644 --- a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibUtil.java +++ b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibUtil.java @@ -21,12 +21,19 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.prefix.to._interface.vpn.ids.Prefixes; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList; + +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.ReleaseIdInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.ReleaseIdInputBuilder; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.math.BigInteger; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; public class FibUtil { private static final Logger LOG = LoggerFactory.getLogger(FibUtil.class); @@ -100,6 +107,24 @@ public class FibUtil { new org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.to.extraroute.vpn.ExtrarouteKey(ipPrefix)).build(); } + static String getNextHopLabelKey(String rd, String prefix){ + String key = rd + FibConstants.SEPARATOR + prefix; + return key; + } + + static void releaseId(IdManagerService idManager, String poolName, String idKey) { + ReleaseIdInput idInput = new ReleaseIdInputBuilder().setPoolName(poolName).setIdKey(idKey).build(); + try { + Future> result = idManager.releaseId(idInput); + RpcResult rpcResult = result.get(); + if(!rpcResult.isSuccessful()) { + LOG.warn("RPC Call to Get Unique Id returned with Errors {}", rpcResult.getErrors()); + } + } catch (InterruptedException | ExecutionException e) { + LOG.warn("Exception when getting Unique Id for key {}", idKey, e); + } + } + static final FutureCallback DEFAULT_CALLBACK = new FutureCallback() { public void onSuccess(Void result) { diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java index f128faca..ac639b42 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java @@ -522,9 +522,10 @@ public class VpnInterfaceManager extends AbstractDataChangeListener 0)) { - VpnUtil.asyncUpdate(broker, LogicalDatastoreType.OPERATIONAL, - VpnUtil.getVpnInstanceOpDataIdentifier(rd), - VpnUtil.updateIntfCntInVpnInstOpData(ifCnt - 1, rd), VpnUtil.DEFAULT_CALLBACK); - } - // Vpn Interface removed => No more adjacencies from it. // Hence clean up interface from vpn-dpn-interface list. Adjacency adjacency = del.getAugmentation(Adjacencies.class).getAdjacency().get(0); @@ -851,6 +843,15 @@ public class VpnInterfaceManager extends AbstractDataChangeListener 0)) { + VpnUtil.asyncUpdate(broker, LogicalDatastoreType.OPERATIONAL, + VpnUtil.getVpnInstanceOpDataIdentifier(rd), + VpnUtil.updateIntfCntInVpnInstOpData(ifCnt - 1, rd), VpnUtil.DEFAULT_CALLBACK); + } } } else { LOG.error("rd not retrievable as vpninstancetovpnid for vpn {} is absent, trying rd as ", vpnName, vpnName); diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java index b41225ce..e5d7a44a 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java @@ -115,16 +115,20 @@ public class VpnManager extends AbstractDataChangeListener implemen this.vpnInterfaceManager = vpnInterfaceManager; } - private void waitForOpDataRemoval(String id, long timeout) { + private void waitForOpRemoval(String id, long timeout) { //wait till DCN for update on VPN Instance Op Data signals that vpn interfaces linked to this vpn instance is zero Runnable notifyTask = new VpnNotifyTask(); synchronized (id.intern()) { - vpnOpMap.put(id, notifyTask); - synchronized (notifyTask) { - try { - notifyTask.wait(timeout); - } catch (InterruptedException e) { + try { + vpnOpMap.put(id, notifyTask); + synchronized (notifyTask) { + try { + notifyTask.wait(timeout); + } catch (InterruptedException e) { + } } + } finally { + vpnOpMap.remove(id); } } @@ -134,23 +138,8 @@ public class VpnManager extends AbstractDataChangeListener implemen protected void remove(InstanceIdentifier identifier, VpnInstance del) { LOG.trace("Remove VPN event key: {}, value: {}", identifier, del); String vpnName = del.getVpnInstanceName(); - String rd = del.getIpv4Family().getRouteDistinguisher(); - -// //Clean up vpn Interface -// InstanceIdentifier vpnInterfacesId = InstanceIdentifier.builder(VpnInterfaces.class).build(); -// Optional optionalVpnInterfaces = read(LogicalDatastoreType.OPERATIONAL, vpnInterfacesId); -// -// if(optionalVpnInterfaces.isPresent()) { -// List vpnInterfaces = optionalVpnInterfaces.get().getVpnInterface(); -// for(VpnInterface vpnInterface : vpnInterfaces) { -// if(vpnInterface.getVpnInstanceName().equals(vpnName)) { -// LOG.debug("VpnInterface {} will be removed from VPN {}", vpnInterface.getName(), vpnName); -// vpnInterfaceManager.remove( -// VpnUtil.getVpnInterfaceIdentifier(vpnInterface.getName()), vpnInterface); -// } -// } -// } + long vpnId = VpnUtil.getVpnId(broker, vpnName); //TODO(vpnteam): Entire code would need refactoring to listen only on the parent object - VPNInstance Optional vpnOpValue = null; @@ -176,39 +165,54 @@ public class VpnManager extends AbstractDataChangeListener implemen if (timeout > VpnConstants.MAX_WAIT_TIME_IN_MILLISECONDS) { timeout = VpnConstants.MAX_WAIT_TIME_IN_MILLISECONDS; } - LOG.trace("VPNInstance removal interface count at {} for for rd {}, vpnname {}", + LOG.trace("VPNInstance removal count of interface at {} for for rd {}, vpnname {}", intfCount, rd, vpnName); } LOG.trace("VPNInstance removal thread waiting for {} seconds for rd {}, vpnname {}", (timeout/1000), rd, vpnName); if ((rd != null) && (!rd.isEmpty())) { - waitForOpDataRemoval(rd, timeout); + waitForOpRemoval(rd, timeout); } else { - waitForOpDataRemoval(vpnName, timeout); + waitForOpRemoval(vpnName, timeout); } LOG.trace("Returned out of waiting for Op Data removal for rd {}, vpnname {}", rd, vpnName); } - - InstanceIdentifier - vpnIdentifier = VpnUtil.getVpnInstanceToVpnIdIdentifier(vpnName); - delete(LogicalDatastoreType.CONFIGURATION, vpnIdentifier); + // Clean up VpnInstanceToVpnId from Config DS + VpnUtil.removeVpnInstanceToVpnId(broker, vpnName); LOG.trace("Removed vpnIdentifier for rd{} vpnname {}", rd, vpnName); - if (rd !=null) { - + if (rd != null) { try { bgpManager.deleteVrf(rd); } catch (Exception e) { - LOG.error("Exception when removing VRF from BGP", e); + LOG.error("Exception when removing VRF from BGP for RD {} in VPN {} exception " + e, rd, vpnName); } - delete(LogicalDatastoreType.OPERATIONAL, VpnUtil.getVpnInstanceOpDataIdentifier(rd)); + // Clean up VPNExtraRoutes Operational DS + VpnUtil.removeVpnExtraRouteForVpn(broker, rd); + + // Clean up VPNInstanceOpDataEntry + VpnUtil.removeVpnOpInstance(broker, rd); } else { + // Clean up FIB Entries Config DS + VpnUtil.removeVrfTableForVpn(broker, vpnName); + + // Clean up VPNExtraRoutes Operational DS + VpnUtil.removeVpnExtraRouteForVpn(broker, vpnName); - delete(LogicalDatastoreType.OPERATIONAL, VpnUtil.getVpnInstanceOpDataIdentifier(vpnName)); + // Clean up VPNInstanceOpDataEntry + VpnUtil.removeVpnOpInstance(broker, vpnName); } + // Clean up PrefixToInterface Operational DS + VpnUtil.removePrefixToInterfaceForVpnId(broker, vpnId); + + // Clean up L3NextHop Operational DS + VpnUtil.removeL3nexthopForVpnId(broker, vpnId); + + // Release the ID used for this VPN back to IdManager + VpnUtil.releaseId(idManager, VpnConstants.VPN_IDPOOL_NAME, vpnName); } @@ -237,14 +241,20 @@ public class VpnManager extends AbstractDataChangeListener implemen if(rd == null) { + VpnInstanceOpDataEntryBuilder builder = new VpnInstanceOpDataEntryBuilder(); + builder.setVrfId(value.getVpnInstanceName()).setVpnId(vpnId); + builder.setVpnInterfaceCount(0L); syncWrite(LogicalDatastoreType.OPERATIONAL, VpnUtil.getVpnInstanceOpDataIdentifier(value.getVpnInstanceName()), - VpnUtil.getVpnInstanceOpDataBuilder(value.getVpnInstanceName(), vpnId), DEFAULT_CALLBACK); + builder.build(), DEFAULT_CALLBACK); } else { + VpnInstanceOpDataEntryBuilder builder = new VpnInstanceOpDataEntryBuilder(); + builder.setVrfId(rd).setVpnId(vpnId); + builder.setVpnInterfaceCount(0L); syncWrite(LogicalDatastoreType.OPERATIONAL, VpnUtil.getVpnInstanceOpDataIdentifier(rd), - VpnUtil.getVpnInstanceOpDataBuilder(rd, vpnId), DEFAULT_CALLBACK); + builder.build(), DEFAULT_CALLBACK); List vpnTargetList = config.getVpnTargets().getVpnTarget(); @@ -468,6 +478,7 @@ public class VpnManager extends AbstractDataChangeListener implemen private void notifyTaskIfRequired(String vpnName) { Runnable notifyTask = vpnOpMap.remove(vpnName); if (notifyTask == null) { + LOG.trace("VpnInstanceOpListener update: No Notify Task queued for vpnName {}", vpnName); return; } executorService.execute(notifyTask); diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java index 76ad366f..50c5eef4 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java @@ -61,6 +61,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.E import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.elan.dpn.interfaces.ElanDpnInterfacesList; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.elan.dpn.interfaces.ElanDpnInterfacesListKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.elan.dpn.interfaces.elan.dpn.interfaces.list.DpnInterfaces; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.FibEntries; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTables; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTablesKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdPools; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.id.pools.IdPool; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.id.pools.IdPoolKey; @@ -73,6 +76,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.IfIndexesInterfaceMap; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterface; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._if.indexes._interface.map.IfIndexInterfaceKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.L3nexthop; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.VpnNexthops; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.l3nexthop.VpnNexthopsKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.NeutronPortData; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data.PortFixedipToPortName; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.neutronvpn.rev150602.neutron.port.data.PortFixedipToPortNameKey; @@ -457,4 +463,66 @@ public class VpnUtil { return false; } + public static void removePrefixToInterfaceForVpnId(DataBroker broker, long vpnId) { + try { + // Clean up PrefixToInterface Operational DS + delete(broker, LogicalDatastoreType.OPERATIONAL, + InstanceIdentifier.builder(PrefixToInterface.class).child(VpnIds.class, new VpnIdsKey(vpnId)).build(), + DEFAULT_CALLBACK); + } catch (Exception e) { + LOG.error("Exception during cleanup of PrefixToInterface for VPN ID {}", vpnId, e); + } + } + + public static void removeVpnExtraRouteForVpn(DataBroker broker, String vpnName) { + try { + // Clean up VPNExtraRoutes Operational DS + delete(broker, LogicalDatastoreType.OPERATIONAL, + InstanceIdentifier.builder(VpnToExtraroute.class).child(Vpn.class, new VpnKey(vpnName)).build(), + DEFAULT_CALLBACK); + } catch (Exception e) { + LOG.error("Exception during cleanup of VPNToExtraRoute for VPN {}", vpnName, e); + } + } + + public static void removeVpnOpInstance(DataBroker broker, String vpnName) { + try { + // Clean up VPNInstanceOpDataEntry + delete(broker, LogicalDatastoreType.OPERATIONAL, getVpnInstanceOpDataIdentifier(vpnName), + DEFAULT_CALLBACK); + } catch (Exception e) { + LOG.error("Exception during cleanup of VPNInstanceOpDataEntry for VPN {}", vpnName, e); + } + } + + public static void removeVpnInstanceToVpnId(DataBroker broker, String vpnName) { + try { + delete(broker, LogicalDatastoreType.CONFIGURATION, getVpnInstanceToVpnIdIdentifier(vpnName), + DEFAULT_CALLBACK); + } catch (Exception e) { + LOG.error("Exception during clean up of VpnInstanceToVpnId for VPN {}", vpnName, e); + } + } + + public static void removeVrfTableForVpn(DataBroker broker, String vpnName) { + // Clean up FIB Entries Config DS + try { + delete(broker, LogicalDatastoreType.CONFIGURATION, + InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(vpnName)).build(), + DEFAULT_CALLBACK); + } catch (Exception e) { + LOG.error("Exception during clean up of VrfTable from FIB for VPN {}", vpnName, e); + } + } + + public static void removeL3nexthopForVpnId(DataBroker broker, long vpnId) { + try { + // Clean up L3NextHop Operational DS + delete(broker, LogicalDatastoreType.OPERATIONAL, + InstanceIdentifier.builder(L3nexthop.class).child(VpnNexthops.class, new VpnNexthopsKey(vpnId)).build(), + DEFAULT_CALLBACK); + } catch (Exception e) { + LOG.error("Exception during cleanup of L3NextHop for VPN ID {}", vpnId, e); + } + } } \ No newline at end of file -- 2.36.6