Add deleting lock to K8sJujuConnector 03/12003/2
authorDavid Garcia <david.garcia@canonical.com>
Thu, 5 May 2022 07:46:06 +0000 (09:46 +0200)
committerDavid Garcia <david.garcia@canonical.com>
Thu, 5 May 2022 14:59:58 +0000 (16:59 +0200)
- Minor fix in delete_lock
- bug 2017

Change-Id: Ic2f66eeee7967f0d7789428abb4b288c7bb90f36
Signed-off-by: David Garcia <david.garcia@canonical.com>
n2vc/k8s_juju_conn.py
n2vc/n2vc_juju_conn.py

index fb15be7..2529480 100644 (file)
@@ -78,6 +78,7 @@ class K8sJujuConnector(K8sConnector):
         db_uri = EnvironConfig(prefixes=["OSMLCM_", "OSMMON_"]).get("database_uri")
         self._store = MotorStore(db_uri)
         self.loading_libjuju = asyncio.Lock(loop=self.loop)
+        self.uninstall_locks = {}
 
         self.log.debug("K8S Juju connector initialized")
         # TODO: Remove these commented lines:
@@ -497,18 +498,30 @@ class K8sJujuConnector(K8sConnector):
         """
 
         self.log.debug("[uninstall] Destroying model")
-        libjuju = await self._get_libjuju(kwargs.get("vca_id"))
 
-        await libjuju.destroy_model(kdu_instance, total_timeout=3600)
+        will_not_delete = False
+        if kdu_instance not in self.uninstall_locks:
+            self.uninstall_locks[kdu_instance] = asyncio.Lock(loop=self.loop)
+        delete_lock = self.uninstall_locks[kdu_instance]
+
+        while delete_lock.locked():
+            will_not_delete = True
+            await asyncio.sleep(0.1)
+
+        if will_not_delete:
+            self.log.info("Model {} deleted by another worker.".format(kdu_instance))
+            return True
+
+        try:
+            async with delete_lock:
+                libjuju = await self._get_libjuju(kwargs.get("vca_id"))
 
-        # self.log.debug("[uninstall] Model destroyed and disconnecting")
-        # await controller.disconnect()
+                await libjuju.destroy_model(kdu_instance, total_timeout=3600)
+        finally:
+            self.uninstall_locks.pop(kdu_instance)
 
+        self.log.debug(f"[uninstall] Model {kdu_instance} destroyed")
         return True
-        # TODO: Remove these commented lines
-        # if not self.authenticated:
-        #     self.log.debug("[uninstall] Connecting to controller")
-        #     await self.login(cluster_uuid)
 
     async def exec_primitive(
         self,
index f077b40..fb36809 100644 (file)
@@ -794,8 +794,9 @@ class N2VCJujuConnector(N2VCConnector):
         will_not_delete = False
         if namespace not in self.delete_namespace_locks:
             self.delete_namespace_locks[namespace] = asyncio.Lock(loop=self.loop)
+        delete_lock = self.delete_namespace_locks[namespace]
 
-        while self.delete_namespace_locks[namespace].locked():
+        while delete_lock.locked():
             will_not_delete = True
             await asyncio.sleep(0.1)
 
@@ -804,7 +805,7 @@ class N2VCJujuConnector(N2VCConnector):
             return
 
         try:
-            async with self.delete_namespace_locks[namespace]:
+            async with delete_lock:
                 libjuju = await self._get_libjuju(vca_id)
 
                 # check arguments