X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=vpnservice%2Felanmanager%2Felanmanager-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetvirt%2Felan%2Finternal%2FElanInstanceManager.java;h=49e16ff2e972ee1e6f8b7feea0ed2434e71f6ac2;hb=7d07e7946bceb79860432f8ec19f4aea51cd1a97;hp=e8fa7952c8c4b9a9bbc0677f38489eacbd073593;hpb=d791fb8df8fa520398b14fdfd8fd0ec875b31a1e;p=netvirt.git diff --git a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java index e8fa7952c8..49e16ff2e9 100644 --- a/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java +++ b/vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java @@ -8,15 +8,22 @@ package org.opendaylight.netvirt.elan.internal; +import com.google.common.base.Optional; +import com.google.common.util.concurrent.ListenableFuture; + import java.util.ArrayList; import java.util.List; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase; +import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo; import org.opendaylight.netvirt.elan.utils.ElanConstants; import org.opendaylight.netvirt.elan.utils.ElanUtils; -import org.opendaylight.genius.interfacemanager.globals.InterfaceInfo; +import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.etree.rev160614.EtreeInstance; +import org.opendaylight.controller.md.sal.binding.api.DataBroker; +import org.opendaylight.genius.interfacemanager.interfaces.IInterfaceManager; +import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanDpnInterfaces; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.ElanInstances; import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.elan.rev150602.elan.dpn.interfaces.ElanDpnInterfacesList; @@ -30,56 +37,76 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.base.Optional; - -public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase implements AutoCloseable { - - private ElanServiceProvider elanServiceProvider = null; - private static volatile ElanInstanceManager elanInstanceManager = null; +public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase + implements AutoCloseable { private static final Logger logger = LoggerFactory.getLogger(ElanInstanceManager.class); - private ElanInstanceManager(ElanServiceProvider elanServiceProvider) { - super(ElanInstance.class,ElanInstanceManager.class); - this.elanServiceProvider = elanServiceProvider; + private final DataBroker broker; + private final IdManagerService idManager; + private final ElanInterfaceManager elanInterfaceManager; + private final IInterfaceManager interfaceManager; + private final ElanUtils elanUtils; + + public ElanInstanceManager(final DataBroker dataBroker, final IdManagerService managerService, + final ElanInterfaceManager elanInterfaceManager, + final IInterfaceManager interfaceManager, ElanUtils elanUtils) { + super(ElanInstance.class, ElanInstanceManager.class); + this.broker = dataBroker; + this.idManager = managerService; + this.elanInterfaceManager = elanInterfaceManager; + this.interfaceManager = interfaceManager; + this.elanUtils = elanUtils; } - public static ElanInstanceManager getElanInstanceManager(ElanServiceProvider elanServiceProvider) { - if (elanInstanceManager == null) { - synchronized (ElanInstanceManager.class) { - if (elanInstanceManager == null) { - elanInstanceManager = new ElanInstanceManager(elanServiceProvider); - } - } - } - return elanInstanceManager; + public void init() { + registerListener(LogicalDatastoreType.CONFIGURATION, broker); } @Override protected void remove(InstanceIdentifier identifier, ElanInstance deletedElan) { logger.trace("Remove ElanInstance - Key: {}, value: {}", identifier, deletedElan); + List> futures = new ArrayList<>(); String elanName = deletedElan.getElanInstanceName(); - //check the elan Instance present in the Operational DataStore - Elan existingElan = ElanUtils.getElanByName(elanName); + // check the elan Instance present in the Operational DataStore + Elan existingElan = elanUtils.getElanByName(elanName); long elanTag = deletedElan.getElanTag(); - //Cleaning up the existing Elan Instance + // Cleaning up the existing Elan Instance if (existingElan != null) { - List elanInterfaces = existingElan.getElanInterfaces(); + List elanInterfaces = existingElan.getElanInterfaces(); if (elanInterfaces != null && !elanInterfaces.isEmpty()) { for (String elanInterfaceName : elanInterfaces) { - InstanceIdentifier elanInterfaceId = ElanUtils.getElanInterfaceConfigurationDataPathId(elanInterfaceName); - InterfaceInfo interfaceInfo = elanServiceProvider.getInterfaceManager().getInterfaceInfo(elanInterfaceName); - elanServiceProvider.getElanInterfaceManager().removeElanInterface(deletedElan, elanInterfaceName, interfaceInfo, false); - ElanUtils.delete(elanServiceProvider.getBroker(), LogicalDatastoreType.CONFIGURATION, elanInterfaceId); + InstanceIdentifier elanInterfaceId = elanUtils + .getElanInterfaceConfigurationDataPathId(elanInterfaceName); + InterfaceInfo interfaceInfo = interfaceManager.getInterfaceInfo(elanInterfaceName); + elanInterfaceManager.removeElanInterface(futures, deletedElan, elanInterfaceName, + interfaceInfo, false); + elanUtils.delete(broker, LogicalDatastoreType.CONFIGURATION, + elanInterfaceId); } } - ElanUtils.delete(elanServiceProvider.getBroker(), LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanInstanceOperationalDataPath(elanName)); - ElanUtils.delete(elanServiceProvider.getBroker(), LogicalDatastoreType.OPERATIONAL, getElanDpnOperationDataPath(elanName)); - ElanUtils.delete(elanServiceProvider.getBroker(), LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanInfoEntriesOperationalDataPath(elanTag)); + elanUtils.delete(broker, LogicalDatastoreType.OPERATIONAL, + elanUtils.getElanInstanceOperationalDataPath(elanName)); + elanUtils.delete(broker, LogicalDatastoreType.OPERATIONAL, + getElanDpnOperationDataPath(elanName)); + elanUtils.delete(broker, LogicalDatastoreType.OPERATIONAL, + elanUtils.getElanInfoEntriesOperationalDataPath(elanTag)); } // Release tag - ElanUtils.releaseId( elanServiceProvider.getIdManager(), ElanConstants.ELAN_ID_POOL_NAME, elanName); + elanUtils.releaseId(idManager, ElanConstants.ELAN_ID_POOL_NAME, elanName); + if (deletedElan.getAugmentation(EtreeInstance.class) != null) { + removeEtreeInstance(deletedElan); + } + } + + private void removeEtreeInstance(ElanInstance deletedElan) { + // Release leaves tag + elanUtils.releaseId(idManager, ElanConstants.ELAN_ID_POOL_NAME, + deletedElan.getElanInstanceName() + ElanConstants.LEAVES_POSTFIX); + elanUtils.delete(broker, LogicalDatastoreType.OPERATIONAL, + elanUtils.getElanInfoEntriesOperationalDataPath( + deletedElan.getAugmentation(EtreeInstance.class).getEtreeLeafTagVal().getValue())); } @Override @@ -89,29 +116,30 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase(), tx); - ElanUtils.waitForTransactionToComplete(tx); + WriteTransaction tx = broker.newWriteOnlyTransaction(); + elanUtils.updateOperationalDataStore(broker, idManager, + update, new ArrayList(), tx); + elanUtils.waitForTransactionToComplete(tx); return; } - elanServiceProvider.getElanInterfaceManager().handleunprocessedElanInterfaces(update); + elanInterfaceManager.handleunprocessedElanInterfaces(update); } @Override protected void add(InstanceIdentifier identifier, ElanInstance elanInstanceAdded) { - Elan elanInfo = ElanUtils.getElanByName(elanInstanceAdded.getElanInstanceName()); + Elan elanInfo = elanUtils.getElanByName(elanInstanceAdded.getElanInstanceName()); if (elanInfo == null) { - WriteTransaction tx = elanServiceProvider.getBroker().newWriteOnlyTransaction(); - ElanUtils.updateOperationalDataStore(elanServiceProvider.getBroker(), elanServiceProvider.getIdManager(), elanInstanceAdded, - new ArrayList(), tx); - ElanUtils.waitForTransactionToComplete(tx); + WriteTransaction tx = broker.newWriteOnlyTransaction(); + elanUtils.updateOperationalDataStore(broker, idManager, + elanInstanceAdded, new ArrayList(), tx); + elanUtils.waitForTransactionToComplete(tx); } } public ElanInstance getElanInstanceByName(String elanInstanceName) { InstanceIdentifier elanIdentifierId = getElanInstanceConfigurationDataPath(elanInstanceName); - Optional elanInstance = ElanUtils.read(elanServiceProvider.getBroker(), LogicalDatastoreType.CONFIGURATION, elanIdentifierId); + Optional elanInstance = elanUtils.read(broker, + LogicalDatastoreType.CONFIGURATION, elanIdentifierId); if (elanInstance.isPresent()) { return elanInstance.get(); } @@ -120,20 +148,23 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase getElanDPNByName(String elanInstanceName) { InstanceIdentifier elanIdentifier = getElanDpnOperationDataPath(elanInstanceName); - Optional elanInstance = ElanUtils.read(elanServiceProvider.getBroker(), LogicalDatastoreType.OPERATIONAL, elanIdentifier); + Optional elanInstance = elanUtils.read(broker, + LogicalDatastoreType.OPERATIONAL, elanIdentifier); if (elanInstance.isPresent()) { - ElanDpnInterfacesList elanDPNs = elanInstance.get(); + ElanDpnInterfacesList elanDPNs = elanInstance.get(); return elanDPNs.getDpnInterfaces(); } return null; } private InstanceIdentifier getElanDpnOperationDataPath(String elanInstanceName) { - return InstanceIdentifier.builder(ElanDpnInterfaces.class).child(ElanDpnInterfacesList.class, new ElanDpnInterfacesListKey(elanInstanceName)).build(); + return InstanceIdentifier.builder(ElanDpnInterfaces.class) + .child(ElanDpnInterfacesList.class, new ElanDpnInterfacesListKey(elanInstanceName)).build(); } private InstanceIdentifier getElanInstanceConfigurationDataPath(String elanInstanceName) { - return InstanceIdentifier.builder(ElanInstances.class).child(ElanInstance.class, new ElanInstanceKey(elanInstanceName)).build(); + return InstanceIdentifier.builder(ElanInstances.class) + .child(ElanInstance.class, new ElanInstanceKey(elanInstanceName)).build(); } @Override @@ -145,5 +176,4 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase