X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=n2vc%2Fk8s_helm3_conn.py;h=5544e3c203501c4d585bb424071f580a3519e5aa;hb=5da5ad6c329717680377a24c4030a83f16ff1554;hp=06e57887b2e4e7c251ee15976945e63235bd6e90;hpb=82b591ceed704c798ead2d9104085a08e75b511b;p=osm%2FN2VC.git diff --git a/n2vc/k8s_helm3_conn.py b/n2vc/k8s_helm3_conn.py index 06e5788..5544e3c 100644 --- a/n2vc/k8s_helm3_conn.py +++ b/n2vc/k8s_helm3_conn.py @@ -42,7 +42,6 @@ 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 @@ -64,7 +63,6 @@ class K8sHelm3Connector(K8sHelmBaseConnector): kubectl_command=kubectl_command, helm_command=helm_command, on_update_db=on_update_db, - vca_config=vca_config, ) self.log.info("K8S Helm3 connector initialized") @@ -112,9 +110,17 @@ class K8sHelm3Connector(K8sHelmBaseConnector): # for helm3 if namespace does not exist must create it if namespace and namespace != "kube-system": - namespaces = await self._get_namespaces(cluster_id) - if namespace not in namespaces: - await self._create_namespace(cluster_id, namespace) + 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, @@ -228,6 +234,15 @@ class K8sHelm3Connector(K8sHelmBaseConnector): return paths, env + 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)) @@ -269,15 +284,17 @@ class K8sHelm3Connector(K8sHelmBaseConnector): return _rc - async def _get_services(self, cluster_id: str, kdu_instance: str, namespace: str): + async def _get_services( + self, cluster_id: str, kdu_instance: str, namespace: str, kubeconfig: str + ): # init config, env paths, env = self._init_paths_env( cluster_name=cluster_id, create_if_not_exist=True ) - command1 = "{} get manifest {} --namespace={}".format( - self._helm_command, kdu_instance, namespace + command1 = "env KUBECONFIG={} {} get manifest {} --namespace={}".format( + kubeconfig, self._helm_command, kdu_instance, namespace ) command2 = "{} get --namespace={} -f -".format(self.kubectl_command, namespace) output, _rc = await self._local_async_exec_pipe( @@ -300,12 +317,8 @@ class K8sHelm3Connector(K8sHelmBaseConnector): # If default repo is not included add cluster_uuid = "{}:{}".format(namespace, cluster_id) repo_list = await self.repo_list(cluster_uuid) - for repo in repo_list: - self.log.debug("repo") - if repo["name"] == "stable": - self.log.debug("Default repo already present") - break - else: + stable_repo = [repo for repo in repo_list if repo["name"] == "stable"] + if not stable_repo and self._stable_repo_url: await self.repo_add(cluster_uuid, "stable", self._stable_repo_url) # Returns False as no software needs to be uninstalled @@ -361,8 +374,8 @@ class K8sHelm3Connector(K8sHelmBaseConnector): paths, env = self._init_paths_env( cluster_name=cluster_id, create_if_not_exist=True ) - command = "{} status {} --namespace={} --output yaml".format( - self._helm_command, kdu_instance, namespace + command = "env KUBECONFIG={} {} status {} --namespace={} --output yaml".format( + paths["kube_config"], self._helm_command, kdu_instance, namespace ) output, rc = await self._local_async_exec( @@ -399,6 +412,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector): version: str, atomic: bool, timeout: float, + kubeconfig: str, ) -> str: timeout_str = "" @@ -420,8 +434,9 @@ class K8sHelm3Connector(K8sHelmBaseConnector): version_str = "--version {}".format(version) command = ( - "{helm} install {name} {atomic} --output yaml " + "env KUBECONFIG={kubeconfig} {helm} install {name} {atomic} --output yaml " "{params} {timeout} {ns} {model} {ver}".format( + kubeconfig=kubeconfig, helm=self._helm_command, name=kdu_instance, atomic=atomic_str, @@ -443,6 +458,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector): version: str, atomic: bool, timeout: float, + kubeconfig: str, ) -> str: timeout_str = "" @@ -465,31 +481,34 @@ class K8sHelm3Connector(K8sHelmBaseConnector): namespace_str = "--namespace {}".format(namespace) command = ( - "{helm} upgrade {name} {model} {namespace} {atomic} --output yaml {params} " - "{timeout} {ver}".format( - helm=self._helm_command, - name=kdu_instance, - namespace=namespace_str, - atomic=atomic_str, - params=params_str, - timeout=timeout_str, - model=kdu_model, - ver=version_str, - ) + "env KUBECONFIG={kubeconfig} {helm} upgrade {name} {model} {namespace} {atomic} " + "--output yaml {params} {timeout} {ver}" + ).format( + kubeconfig=kubeconfig, + helm=self._helm_command, + name=kdu_instance, + namespace=namespace_str, + atomic=atomic_str, + params=params_str, + timeout=timeout_str, + model=kdu_model, + ver=version_str, ) return command def _get_rollback_command( - self, kdu_instance: str, namespace: str, revision: float + self, kdu_instance: str, namespace: str, revision: float, kubeconfig: str ) -> str: - return "{} rollback {} {} --namespace={} --wait".format( - self._helm_command, kdu_instance, revision, namespace + return "env KUBECONFIG={} {} rollback {} {} --namespace={} --wait".format( + kubeconfig, self._helm_command, kdu_instance, revision, namespace ) - def _get_uninstall_command(self, kdu_instance: str, namespace: str) -> str: + def _get_uninstall_command( + self, kdu_instance: str, namespace: str, kubeconfig: str + ) -> str: - return "{} uninstall {} --namespace={}".format( - self._helm_command, kdu_instance, namespace + return "env KUBECONFIG={} {} uninstall {} --namespace={}".format( + kubeconfig, self._helm_command, kdu_instance, namespace ) def _get_helm_chart_repos_ids(self, cluster_uuid) -> list: