Give a warning when removing a cloud that does not exist
[osm/N2VC.git] / n2vc / k8s_helm3_conn.py
index 72ba062..68ad37e 100644 (file)
@@ -42,6 +42,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector):
             helm_command: str = "/usr/bin/helm3",
             log: object = None,
             on_update_db=None,
+            vca_config: dict = None,
     ):
         """
         Initializes helm connector for helm v3
@@ -61,10 +62,70 @@ class K8sHelm3Connector(K8sHelmBaseConnector):
                                       fs=fs,
                                       kubectl_command=kubectl_command,
                                       helm_command=helm_command,
-                                      on_update_db=on_update_db)
+                                      on_update_db=on_update_db,
+                                      vca_config=vca_config)
 
         self.log.info("K8S Helm3 connector initialized")
 
+    async def install(
+            self,
+            cluster_uuid: str,
+            kdu_model: str,
+            kdu_instance: str,
+            atomic: bool = True,
+            timeout: float = 300,
+            params: dict = None,
+            db_dict: dict = None,
+            kdu_name: str = None,
+            namespace: str = None,
+    ):
+        _, cluster_id = self._get_namespace_cluster_id(cluster_uuid)
+        self.log.debug("installing {} in cluster {}".format(kdu_model, cluster_id))
+
+        # sync local dir
+        self.fs.sync(from_path=cluster_id)
+
+        # init env, paths
+        paths, env = self._init_paths_env(
+            cluster_name=cluster_id, create_if_not_exist=True
+        )
+
+        # for helm3 if namespace does not exist must create it
+        if namespace and namespace != "kube-system":
+            if not await self._namespace_exists(cluster_id, namespace):
+                try:
+                    await self._create_namespace(cluster_id, namespace)
+                except Exception as e:
+                    if not await self._namespace_exists(cluster_id, namespace):
+                        err_msg = (
+                            "namespace {} does not exist in cluster_id {} "
+                            "error message: ".format(
+                                namespace, e
+                            )
+                        )
+                        self.log.error(err_msg)
+                        raise K8sException(err_msg)
+
+        await self._install_impl(
+            cluster_id,
+            kdu_model,
+            paths,
+            env,
+            kdu_instance,
+            atomic=atomic,
+            timeout=timeout,
+            params=params,
+            db_dict=db_dict,
+            kdu_name=kdu_name,
+            namespace=namespace,
+        )
+
+        # sync fs
+        self.fs.reverse_sync(from_path=cluster_id)
+
+        self.log.debug("Returning kdu_instance {}".format(kdu_instance))
+        return True
+
     async def inspect_kdu(self, kdu_model: str, repo_url: str = None) -> str:
 
         self.log.debug(
@@ -157,8 +218,16 @@ class K8sHelm3Connector(K8sHelmBaseConnector):
 
         return paths, env
 
-    async def _get_namespaces(self,
-                              cluster_id: str):
+    async def _namespace_exists(self, cluster_id, namespace) -> bool:
+        self.log.debug(
+            "checking if namespace {} exists cluster_id {}".format(
+                namespace, cluster_id
+            )
+        )
+        namespaces = await self._get_namespaces(cluster_id)
+        return namespace in namespaces if namespaces else False
+
+    async def _get_namespaces(self, cluster_id: str):
 
         self.log.debug("get namespaces cluster_id {}".format(cluster_id))
 
@@ -242,7 +311,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector):
         else:
             await self.repo_add(cluster_uuid,
                                 "stable",
-                                "https://kubernetes-charts.storage.googleapis.com/")
+                                self._stable_repo_url)
 
         # Returns False as no software needs to be uninstalled
         return False
@@ -407,3 +476,15 @@ class K8sHelm3Connector(K8sHelmBaseConnector):
 
         return "{} uninstall {} --namespace={}".format(
             self._helm_command, kdu_instance, namespace)
+
+    def _get_helm_chart_repos_ids(self, cluster_uuid) -> list:
+        repo_ids = []
+        cluster_filter = {"_admin.helm-chart-v3.id": cluster_uuid}
+        cluster = self.db.get_one("k8sclusters", cluster_filter)
+        if cluster:
+            repo_ids = cluster.get("_admin").get("helm_chart_repos") or []
+            return repo_ids
+        else:
+            raise K8sException(
+                "k8cluster with helm-id : {} not found".format(cluster_uuid)
+            )