X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;ds=inline;f=n2vc%2Fk8s_juju_conn.py;h=99e868bdf75829bb39642e6ddd38d09b38d7f013;hb=93bee7ea8407c7501daf04190f1bae7947e7d74c;hp=1704ec0cc93c83f24a5ab9c97bbef5276827b1c1;hpb=47f653875c18b0bfe00627de5c554ad5d480ad1d;p=osm%2FN2VC.git diff --git a/n2vc/k8s_juju_conn.py b/n2vc/k8s_juju_conn.py index 1704ec0..99e868b 100644 --- a/n2vc/k8s_juju_conn.py +++ b/n2vc/k8s_juju_conn.py @@ -13,6 +13,7 @@ # limitations under the License. import asyncio +from typing import Union import os import uuid import yaml @@ -77,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: @@ -193,6 +195,9 @@ class K8sJujuConnector(K8sConnector): name: str, url: str, _type: str = "charm", + cert: str = None, + user: str = None, + password: str = None, ): raise MethodNotImplemented() @@ -503,18 +508,54 @@ 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) - # self.log.debug("[uninstall] Model destroyed and disconnecting") - # await controller.disconnect() + 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 upgrade_charm( + self, + ee_id: str = None, + path: str = None, + charm_id: str = None, + charm_type: str = None, + timeout: float = None, + ) -> str: + """This method upgrade charms in VNFs + + Args: + ee_id: Execution environment id + path: Local path to the charm + charm_id: charm-id + charm_type: Charm type can be lxc-proxy-charm, native-charm or k8s-proxy-charm + timeout: (Float) Timeout for the ns update operation + + Returns: + The output of the update operation if status equals to "completed" + """ + raise K8sException( + "KDUs deployed with Juju Bundle do not support charm upgrade" + ) async def exec_primitive( self, @@ -653,7 +694,7 @@ class K8sJujuConnector(K8sConnector): complete_status: bool = False, yaml_format: bool = False, **kwargs, - ) -> dict: + ) -> Union[str, dict]: """Get the status of the KDU Get the current status of the KDU instance. @@ -753,9 +794,7 @@ class K8sJujuConnector(K8sConnector): for application in vcastatus[model_name]["applications"]: # Adding application actions - vcastatus[model_name]["applications"][application][ - "actions" - ] = await libjuju.get_actions(application, kdu_instance) + vcastatus[model_name]["applications"][application]["actions"] = {} # Adding application configs vcastatus[model_name]["applications"][application][ "configs"