Add blueprint wiring for elanmanager
[netvirt.git] / vpnservice / elanmanager / elanmanager-impl / src / main / java / org / opendaylight / netvirt / elan / internal / ElanInstanceManager.java
index e8fa7952c8c4b9a9bbc0677f38489eacbd073593..49e16ff2e972ee1e6f8b7feea0ed2434e71f6ac2 100644 (file)
@@ -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<ElanInstance,ElanInstanceManager> implements AutoCloseable {
-
-    private  ElanServiceProvider elanServiceProvider = null;
-    private static volatile ElanInstanceManager elanInstanceManager = null;
+public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase<ElanInstance, ElanInstanceManager>
+        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<ElanInstance> identifier, ElanInstance deletedElan) {
         logger.trace("Remove ElanInstance - Key: {}, value: {}", identifier, deletedElan);
+        List<ListenableFuture<Void>> 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<String> elanInterfaces =  existingElan.getElanInterfaces();
+            List<String> elanInterfaces = existingElan.getElanInterfaces();
             if (elanInterfaces != null && !elanInterfaces.isEmpty()) {
                 for (String elanInterfaceName : elanInterfaces) {
-                    InstanceIdentifier<ElanInterface> 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<ElanInterface> 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<ElanIns
             return;
         } else if (update.getElanTag() == null) {
             // update the elan-Instance with new properties
-            WriteTransaction tx = elanServiceProvider.getBroker().newWriteOnlyTransaction();
-            ElanUtils.updateOperationalDataStore(elanServiceProvider.getBroker(), elanServiceProvider.getIdManager(),
-                update, new ArrayList<String>(), tx);
-            ElanUtils.waitForTransactionToComplete(tx);
+            WriteTransaction tx = broker.newWriteOnlyTransaction();
+            elanUtils.updateOperationalDataStore(broker, idManager,
+                    update, new ArrayList<String>(), tx);
+            elanUtils.waitForTransactionToComplete(tx);
             return;
         }
-        elanServiceProvider.getElanInterfaceManager().handleunprocessedElanInterfaces(update);
+        elanInterfaceManager.handleunprocessedElanInterfaces(update);
     }
 
     @Override
     protected void add(InstanceIdentifier<ElanInstance> 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<String>(), tx);
-            ElanUtils.waitForTransactionToComplete(tx);
+            WriteTransaction tx = broker.newWriteOnlyTransaction();
+            elanUtils.updateOperationalDataStore(broker, idManager,
+                    elanInstanceAdded, new ArrayList<String>(), tx);
+            elanUtils.waitForTransactionToComplete(tx);
         }
     }
 
     public ElanInstance getElanInstanceByName(String elanInstanceName) {
         InstanceIdentifier<ElanInstance> elanIdentifierId = getElanInstanceConfigurationDataPath(elanInstanceName);
-        Optional<ElanInstance> elanInstance = ElanUtils.read(elanServiceProvider.getBroker(), LogicalDatastoreType.CONFIGURATION, elanIdentifierId);
+        Optional<ElanInstance> elanInstance = elanUtils.read(broker,
+                LogicalDatastoreType.CONFIGURATION, elanIdentifierId);
         if (elanInstance.isPresent()) {
             return elanInstance.get();
         }
@@ -120,20 +148,23 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase<ElanIns
 
     public List<DpnInterfaces> getElanDPNByName(String elanInstanceName) {
         InstanceIdentifier<ElanDpnInterfacesList> elanIdentifier = getElanDpnOperationDataPath(elanInstanceName);
-        Optional<ElanDpnInterfacesList> elanInstance = ElanUtils.read(elanServiceProvider.getBroker(), LogicalDatastoreType.OPERATIONAL, elanIdentifier);
+        Optional<ElanDpnInterfacesList> 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<ElanDpnInterfacesList> 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<ElanInstance> 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<ElanIns
     protected ElanInstanceManager getDataTreeChangeListener() {
         return this;
     }
-
 }