Add deleting lock to K8sJujuConnector
- Minor fix in delete_lock
- bug 2016
Change-Id: Ic2f66eeee7967f0d7789428abb4b288c7bb90f36
Signed-off-by: David Garcia <david.garcia@canonical.com>
diff --git a/n2vc/k8s_juju_conn.py b/n2vc/k8s_juju_conn.py
index c27449b..737cac6 100644
--- a/n2vc/k8s_juju_conn.py
+++ b/n2vc/k8s_juju_conn.py
@@ -78,6 +78,7 @@
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:
@@ -507,18 +508,30 @@
"""
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]
- # self.log.debug("[uninstall] Model destroyed and disconnecting")
- # await controller.disconnect()
+ 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"))
+
+ 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,
diff --git a/n2vc/n2vc_juju_conn.py b/n2vc/n2vc_juju_conn.py
index f077b40..fb36809 100644
--- a/n2vc/n2vc_juju_conn.py
+++ b/n2vc/n2vc_juju_conn.py
@@ -794,8 +794,9 @@
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 @@
return
try:
- async with self.delete_namespace_locks[namespace]:
+ async with delete_lock:
libjuju = await self._get_libjuju(vca_id)
# check arguments