Pin pylint version to 3.1.1 in tox.ini
[osm/LCM.git] / osm_lcm / vim_sdn.py
index 41a16e5..a464993 100644 (file)
@@ -22,7 +22,6 @@ import logging
 import logging.handlers
 from osm_lcm import ROclient
 from osm_lcm.lcm_utils import LcmException, LcmBase, deep_get
-from n2vc.k8s_helm_conn import K8sHelmConnector
 from n2vc.k8s_helm3_conn import K8sHelm3Connector
 from n2vc.k8s_juju_conn import K8sJujuConnector
 from n2vc.n2vc_juju_conn import N2VCJujuConnector
@@ -46,7 +45,7 @@ class VimLcm(LcmBase):
         ),
     }
 
-    def __init__(self, msg, lcm_tasks, config, loop):
+    def __init__(self, msg, lcm_tasks, config):
         """
         Init, Connect to database, filesystem storage, and messaging
         :param config: two level dictionary with configuration. Top level should contain 'database', 'storage',
@@ -54,14 +53,12 @@ class VimLcm(LcmBase):
         """
 
         self.logger = logging.getLogger("lcm.vim")
-        self.loop = loop
         self.lcm_tasks = lcm_tasks
         self.ro_config = config["RO"]
 
         super().__init__(msg, self.logger)
 
     async def create(self, vim_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, 'op_id' is None, and lock_HA() will do nothing.
@@ -112,7 +109,7 @@ class VimLcm(LcmBase):
             db_vim_update["_admin.deployed.RO"] = None
             db_vim_update["_admin.detailed-status"] = step
             self.update_db_2("vim_accounts", vim_id, db_vim_update)
-            RO = ROclient.ROClient(self.loop, **self.ro_config)
+            RO = ROclient.ROClient(**self.ro_config)
             vim_RO = deepcopy(vim_content)
             vim_RO.pop("_id", None)
             vim_RO.pop("_admin", None)
@@ -214,7 +211,6 @@ class VimLcm(LcmBase):
             self.lcm_tasks.remove("vim_account", vim_id, order_id)
 
     async def edit(self, vim_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, and the HA check always returns True
@@ -272,7 +268,7 @@ class VimLcm(LcmBase):
 
                 RO_vim_id = db_vim["_admin"]["deployed"]["RO"]
                 step = "Editing vim at RO"
-                RO = ROclient.ROClient(self.loop, **self.ro_config)
+                RO = ROclient.ROClient(**self.ro_config)
                 vim_RO = deepcopy(vim_content)
                 vim_RO.pop("_id", None)
                 vim_RO.pop("_admin", None)
@@ -370,7 +366,6 @@ class VimLcm(LcmBase):
             self.lcm_tasks.remove("vim_account", vim_id, order_id)
 
     async def delete(self, vim_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, and the HA check always returns True
@@ -397,7 +392,7 @@ class VimLcm(LcmBase):
                     and db_vim["_admin"]["deployed"].get("RO")
                 ):
                     RO_vim_id = db_vim["_admin"]["deployed"]["RO"]
-                    RO = ROclient.ROClient(self.loop, **self.ro_config)
+                    RO = ROclient.ROClient(**self.ro_config)
                     step = "Detaching vim from RO tenant"
                     try:
                         await RO.detach("vim_account", RO_vim_id)
@@ -468,7 +463,7 @@ class WimLcm(LcmBase):
     # values that are encrypted at wim config because they are passwords
     wim_config_encrypted = ()
 
-    def __init__(self, msg, lcm_tasks, config, loop):
+    def __init__(self, msg, lcm_tasks, config):
         """
         Init, Connect to database, filesystem storage, and messaging
         :param config: two level dictionary with configuration. Top level should contain 'database', 'storage',
@@ -476,14 +471,12 @@ class WimLcm(LcmBase):
         """
 
         self.logger = logging.getLogger("lcm.vim")
-        self.loop = loop
         self.lcm_tasks = lcm_tasks
         self.ro_config = config["RO"]
 
         super().__init__(msg, self.logger)
 
     async def create(self, wim_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'wim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, 'op_id' is None, and lock_HA() will do nothing.
@@ -506,7 +499,7 @@ class WimLcm(LcmBase):
             step = "Creating wim at RO"
             db_wim_update["_admin.detailed-status"] = step
             self.update_db_2("wim_accounts", wim_id, db_wim_update)
-            RO = ROclient.ROClient(self.loop, **self.ro_config)
+            RO = ROclient.ROClient(**self.ro_config)
             wim_RO = deepcopy(wim_content)
             wim_RO.pop("_id", None)
             wim_RO.pop("_admin", None)
@@ -600,7 +593,6 @@ class WimLcm(LcmBase):
             self.lcm_tasks.remove("wim_account", wim_id, order_id)
 
     async def edit(self, wim_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'wim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, and the HA check always returns True
@@ -628,10 +620,9 @@ class WimLcm(LcmBase):
                 and db_wim["_admin"].get("deployed")
                 and db_wim["_admin"]["deployed"].get("RO")
             ):
-
                 RO_wim_id = db_wim["_admin"]["deployed"]["RO"]
                 step = "Editing wim at RO"
-                RO = ROclient.ROClient(self.loop, **self.ro_config)
+                RO = ROclient.ROClient(**self.ro_config)
                 wim_RO = deepcopy(wim_content)
                 wim_RO.pop("_id", None)
                 wim_RO.pop("_admin", None)
@@ -721,7 +712,6 @@ class WimLcm(LcmBase):
             self.lcm_tasks.remove("wim_account", wim_id, order_id)
 
     async def delete(self, wim_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, and the HA check always returns True
@@ -748,7 +738,7 @@ class WimLcm(LcmBase):
                 and db_wim["_admin"]["deployed"].get("RO")
             ):
                 RO_wim_id = db_wim["_admin"]["deployed"]["RO"]
-                RO = ROclient.ROClient(self.loop, **self.ro_config)
+                RO = ROclient.ROClient(**self.ro_config)
                 step = "Detaching wim from RO tenant"
                 try:
                     await RO.detach("wim_account", RO_wim_id)
@@ -816,7 +806,7 @@ class WimLcm(LcmBase):
 
 
 class SdnLcm(LcmBase):
-    def __init__(self, msg, lcm_tasks, config, loop):
+    def __init__(self, msg, lcm_tasks, config):
         """
         Init, Connect to database, filesystem storage, and messaging
         :param config: two level dictionary with configuration. Top level should contain 'database', 'storage',
@@ -824,14 +814,12 @@ class SdnLcm(LcmBase):
         """
 
         self.logger = logging.getLogger("lcm.sdn")
-        self.loop = loop
         self.lcm_tasks = lcm_tasks
         self.ro_config = config["RO"]
 
         super().__init__(msg, self.logger)
 
     async def create(self, sdn_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'sdn_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, 'op_id' is None, and lock_HA() will do nothing.
@@ -856,7 +844,7 @@ class SdnLcm(LcmBase):
             db_sdn_update["_admin.detailed-status"] = step
             self.update_db_2("sdns", sdn_id, db_sdn_update)
 
-            RO = ROclient.ROClient(self.loop, **self.ro_config)
+            RO = ROclient.ROClient(**self.ro_config)
             sdn_RO = deepcopy(sdn_content)
             sdn_RO.pop("_id", None)
             sdn_RO.pop("_admin", None)
@@ -912,7 +900,6 @@ class SdnLcm(LcmBase):
             self.lcm_tasks.remove("sdn", sdn_id, order_id)
 
     async def edit(self, sdn_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'sdn_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, and the HA check always returns True
@@ -940,7 +927,7 @@ class SdnLcm(LcmBase):
                 and db_sdn["_admin"]["deployed"].get("RO")
             ):
                 RO_sdn_id = db_sdn["_admin"]["deployed"]["RO"]
-                RO = ROclient.ROClient(self.loop, **self.ro_config)
+                RO = ROclient.ROClient(**self.ro_config)
                 step = "Editing sdn at RO"
                 sdn_RO = deepcopy(sdn_content)
                 sdn_RO.pop("_id", None)
@@ -994,7 +981,6 @@ class SdnLcm(LcmBase):
             self.lcm_tasks.remove("sdn", sdn_id, order_id)
 
     async def delete(self, sdn_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, and the HA check always returns True
@@ -1021,7 +1007,7 @@ class SdnLcm(LcmBase):
                 and db_sdn["_admin"]["deployed"].get("RO")
             ):
                 RO_sdn_id = db_sdn["_admin"]["deployed"]["RO"]
-                RO = ROclient.ROClient(self.loop, **self.ro_config)
+                RO = ROclient.ROClient(**self.ro_config)
                 step = "Deleting sdn from RO"
                 try:
                     await RO.delete("sdn", RO_sdn_id)
@@ -1078,7 +1064,7 @@ class SdnLcm(LcmBase):
 class K8sClusterLcm(LcmBase):
     timeout_create = 300
 
-    def __init__(self, msg, lcm_tasks, config, loop):
+    def __init__(self, msg, lcm_tasks, config):
         """
         Init, Connect to database, filesystem storage, and messaging
         :param config: two level dictionary with configuration. Top level should contain 'database', 'storage',
@@ -1086,21 +1072,11 @@ class K8sClusterLcm(LcmBase):
         """
 
         self.logger = logging.getLogger("lcm.k8scluster")
-        self.loop = loop
         self.lcm_tasks = lcm_tasks
         self.vca_config = config["VCA"]
 
         super().__init__(msg, self.logger)
 
-        self.helm2_k8scluster = K8sHelmConnector(
-            kubectl_command=self.vca_config.get("kubectlpath"),
-            helm_command=self.vca_config.get("helmpath"),
-            log=self.logger,
-            on_update_db=None,
-            db=self.db,
-            fs=self.fs,
-        )
-
         self.helm3_k8scluster = K8sHelm3Connector(
             kubectl_command=self.vca_config.get("kubectlpath"),
             helm_command=self.vca_config.get("helm3path"),
@@ -1114,20 +1090,17 @@ class K8sClusterLcm(LcmBase):
             kubectl_command=self.vca_config.get("kubectlpath"),
             juju_command=self.vca_config.get("jujupath"),
             log=self.logger,
-            loop=self.loop,
             on_update_db=None,
             db=self.db,
             fs=self.fs,
         )
 
         self.k8s_map = {
-            "helm-chart": self.helm2_k8scluster,
             "helm-chart-v3": self.helm3_k8scluster,
             "juju-bundle": self.juju_k8scluster,
         }
 
     async def create(self, k8scluster_content, order_id):
-
         op_id = k8scluster_content.pop("op_id", None)
         if not self.lcm_tasks.lock_HA("k8scluster", "create", op_id):
             return
@@ -1160,7 +1133,6 @@ class K8sClusterLcm(LcmBase):
             # for backwards compatibility and all-false case
             if not any(k8s_deploy_methods.values()):
                 k8s_deploy_methods = {
-                    "helm-chart": True,
                     "juju-bundle": True,
                     "helm-chart-v3": True,
                 }
@@ -1299,8 +1271,33 @@ class K8sClusterLcm(LcmBase):
                 self.logger.error(logging_text + "Cannot update database: {}".format(e))
             self.lcm_tasks.remove("k8scluster", k8scluster_id, order_id)
 
-    async def delete(self, k8scluster_content, order_id):
+    async def edit(self, k8scluster_content, order_id):
+        op_id = k8scluster_content.pop("op_id", None)
+        if not self.lcm_tasks.lock_HA("k8scluster", "edit", op_id):
+            return
+
+        k8scluster_id = k8scluster_content["_id"]
+
+        logging_text = "Task k8scluster_edit={} ".format(k8scluster_id)
+        self.logger.debug(logging_text + "Enter")
+
+        # TODO the implementation is pending and will be part of a new feature
+        # It will support rotation of certificates, update of credentials and K8S API endpoint
+        # At the moment the operation is set as completed
+
+        operation_state = "COMPLETED"
+        operation_details = "Not implemented"
+
+        self.lcm_tasks.unlock_HA(
+            "k8scluster",
+            "edit",
+            op_id,
+            operationState=operation_state,
+            detailed_status=operation_details,
+        )
+        self.lcm_tasks.remove("k8scluster", k8scluster_id, order_id)
 
+    async def delete(self, k8scluster_content, order_id):
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, 'op_id' is None, and lock_HA() will do nothing.
@@ -1320,7 +1317,6 @@ class K8sClusterLcm(LcmBase):
             step = "Getting k8scluster='{}' from db".format(k8scluster_id)
             self.logger.debug(logging_text + step)
             db_k8scluster = self.db.get_one("k8sclusters", {"_id": k8scluster_id})
-            k8s_hc_id = deep_get(db_k8scluster, ("_admin", "helm-chart", "id"))
             k8s_h3c_id = deep_get(db_k8scluster, ("_admin", "helm-chart-v3", "id"))
             k8s_jb_id = deep_get(db_k8scluster, ("_admin", "juju-bundle", "id"))
 
@@ -1339,20 +1335,8 @@ class K8sClusterLcm(LcmBase):
                 db_k8scluster_update["_admin.juju-bundle.id"] = None
                 db_k8scluster_update["_admin.juju-bundle.operationalState"] = "DISABLED"
 
-            if k8s_hc_id:
-                step = "Removing helm-chart '{}'".format(k8s_hc_id)
-                uninstall_sw = (
-                    deep_get(db_k8scluster, ("_admin", "helm-chart", "created"))
-                    or False
-                )
-                cluster_removed = await self.helm2_k8scluster.reset(
-                    cluster_uuid=k8s_hc_id, uninstall_sw=uninstall_sw
-                )
-                db_k8scluster_update["_admin.helm-chart.id"] = None
-                db_k8scluster_update["_admin.helm-chart.operationalState"] = "DISABLED"
-
             if k8s_h3c_id:
-                step = "Removing helm-chart-v3 '{}'".format(k8s_hc_id)
+                step = "Removing helm-chart-v3 '{}'".format(k8s_h3c_id)
                 uninstall_sw = (
                     deep_get(db_k8scluster, ("_admin", "helm-chart-v3", "created"))
                     or False
@@ -1366,16 +1350,16 @@ class K8sClusterLcm(LcmBase):
                 ] = "DISABLED"
 
             # Try to remove from cluster_inserted to clean old versions
-            if k8s_hc_id and cluster_removed:
+            if k8s_h3c_id and cluster_removed:
                 step = "Removing k8scluster='{}' from k8srepos".format(k8scluster_id)
                 self.logger.debug(logging_text + step)
                 db_k8srepo_list = self.db.get_list(
-                    "k8srepos", {"_admin.cluster-inserted": k8s_hc_id}
+                    "k8srepos", {"_admin.cluster-inserted": k8s_h3c_id}
                 )
                 for k8srepo in db_k8srepo_list:
                     try:
                         cluster_list = k8srepo["_admin"]["cluster-inserted"]
-                        cluster_list.remove(k8s_hc_id)
+                        cluster_list.remove(k8s_h3c_id)
                         self.update_db_2(
                             "k8srepos",
                             k8srepo["_id"],
@@ -1437,7 +1421,7 @@ class K8sClusterLcm(LcmBase):
 class VcaLcm(LcmBase):
     timeout_create = 30
 
-    def __init__(self, msg, lcm_tasks, config, loop):
+    def __init__(self, msg, lcm_tasks, config):
         """
         Init, Connect to database, filesystem storage, and messaging
         :param config: two level dictionary with configuration. Top level should contain 'database', 'storage',
@@ -1445,15 +1429,12 @@ class VcaLcm(LcmBase):
         """
 
         self.logger = logging.getLogger("lcm.vca")
-        self.loop = loop
         self.lcm_tasks = lcm_tasks
 
         super().__init__(msg, self.logger)
 
         # create N2VC connector
-        self.n2vc = N2VCJujuConnector(
-            log=self.logger, loop=self.loop, fs=self.fs, db=self.db
-        )
+        self.n2vc = N2VCJujuConnector(log=self.logger, fs=self.fs, db=self.db)
 
     def _get_vca_by_id(self, vca_id: str) -> dict:
         db_vca = self.db.get_one("vca", {"_id": vca_id})
@@ -1619,7 +1600,6 @@ class VcaLcm(LcmBase):
             self.lcm_tasks.remove("vca", vca_id, order_id)
 
     async def delete(self, vca_content, order_id):
-
         # HA tasks and backward compatibility:
         # If "vim_content" does not include "op_id", we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, "op_id" is None, and lock_HA() will do nothing.
@@ -1674,7 +1654,7 @@ class VcaLcm(LcmBase):
 
 
 class K8sRepoLcm(LcmBase):
-    def __init__(self, msg, lcm_tasks, config, loop):
+    def __init__(self, msg, lcm_tasks, config):
         """
         Init, Connect to database, filesystem storage, and messaging
         :param config: two level dictionary with configuration. Top level should contain 'database', 'storage',
@@ -1682,13 +1662,12 @@ class K8sRepoLcm(LcmBase):
         """
 
         self.logger = logging.getLogger("lcm.k8srepo")
-        self.loop = loop
         self.lcm_tasks = lcm_tasks
         self.vca_config = config["VCA"]
 
         super().__init__(msg, self.logger)
 
-        self.k8srepo = K8sHelmConnector(
+        self.k8srepo = K8sHelm3Connector(
             kubectl_command=self.vca_config.get("kubectlpath"),
             helm_command=self.vca_config.get("helmpath"),
             fs=self.fs,
@@ -1698,7 +1677,6 @@ class K8sRepoLcm(LcmBase):
         )
 
     async def create(self, k8srepo_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, 'op_id' is None, and lock_HA() will do nothing.
@@ -1763,7 +1741,6 @@ class K8sRepoLcm(LcmBase):
             self.lcm_tasks.remove("k8srepo", k8srepo_id, order_id)
 
     async def delete(self, k8srepo_content, order_id):
-
         # HA tasks and backward compatibility:
         # If 'vim_content' does not include 'op_id', we a running a legacy NBI version.
         # In such a case, HA is not supported by NBI, 'op_id' is None, and lock_HA() will do nothing.