X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FN2VC.git;a=blobdiff_plain;f=n2vc%2Fk8s_helm3_conn.py;h=787be0361568fbb71fd755df3fe9e7991a5b9307;hp=5bbd39b63b5c4e6e5d7a0ba38b34ab368562a5f1;hb=60a3a96717d7c36ba7a65573da59a6bc039f5e28;hpb=f4c2ac82b78811a16582cc8eb90c6fe69dadd3f0 diff --git a/n2vc/k8s_helm3_conn.py b/n2vc/k8s_helm3_conn.py index 5bbd39b..787be03 100644 --- a/n2vc/k8s_helm3_conn.py +++ b/n2vc/k8s_helm3_conn.py @@ -19,6 +19,7 @@ # For those usages not covered by the Apache License, Version 2.0 please # contact with: nfvlabs@tid.es ## +from typing import Union import os import yaml @@ -117,9 +118,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector): if not await self._namespace_exists(cluster_id, namespace): err_msg = ( "namespace {} does not exist in cluster_id {} " - "error message: ".format( - namespace, e - ) + "error message: ".format(namespace, e) ) self.log.error(err_msg) raise K8sException(err_msg) @@ -145,7 +144,6 @@ class K8sHelm3Connector(K8sHelmBaseConnector): return True async def inspect_kdu(self, kdu_model: str, repo_url: str = None) -> str: - self.log.debug( "inspect kdu_model {} from (optional) repo: {}".format(kdu_model, repo_url) ) @@ -246,7 +244,6 @@ class K8sHelm3Connector(K8sHelmBaseConnector): 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)) # init config, env @@ -268,7 +265,6 @@ class K8sHelm3Connector(K8sHelmBaseConnector): return namespaces async def _create_namespace(self, cluster_id: str, namespace: str): - self.log.debug(f"create namespace: {cluster_id} for cluster_id: {namespace}") # init config, env @@ -286,15 +282,16 @@ 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( @@ -329,7 +326,6 @@ class K8sHelm3Connector(K8sHelmBaseConnector): pass async def _instances_list(self, cluster_id: str): - # init paths, env paths, env = self._init_paths_env( cluster_name=cluster_id, create_if_not_exist=True @@ -359,10 +355,9 @@ class K8sHelm3Connector(K8sHelmBaseConnector): cluster_id: str, kdu_instance: str, namespace: str = None, + yaml_format: bool = False, show_error_log: bool = False, - return_text: bool = False, - ): - + ) -> Union[str, dict]: self.log.debug( "status of kdu_instance: {}, namespace: {} ".format(kdu_instance, namespace) ) @@ -374,8 +369,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( @@ -385,7 +380,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector): env=env, ) - if return_text: + if yaml_format: return str(output) if rc != 0: @@ -396,11 +391,18 @@ class K8sHelm3Connector(K8sHelmBaseConnector): # remove field 'notes' and manifest try: del data.get("info")["notes"] - del data["manifest"] except KeyError: pass - # unable to parse 'resources' as currently it is not included in helm3 + # parse the manifest to a list of dictionaries + if "manifest" in data: + manifest_str = data.get("manifest") + manifest_docs = yaml.load_all(manifest_str, Loader=yaml.SafeLoader) + + data["manifest"] = [] + for doc in manifest_docs: + data["manifest"].append(doc) + return data def _get_install_command( @@ -412,8 +414,8 @@ class K8sHelm3Connector(K8sHelmBaseConnector): version: str, atomic: bool, timeout: float, + kubeconfig: str, ) -> str: - timeout_str = "" if timeout: timeout_str = "--timeout {}s".format(timeout) @@ -433,8 +435,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, @@ -456,8 +459,8 @@ class K8sHelm3Connector(K8sHelmBaseConnector): version: str, atomic: bool, timeout: float, + kubeconfig: str, ) -> str: - timeout_str = "" if timeout: timeout_str = "--timeout {}s".format(timeout) @@ -478,31 +481,33 @@ 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: - - return "{} uninstall {} --namespace={}".format( - self._helm_command, kdu_instance, namespace + def _get_uninstall_command( + self, kdu_instance: str, namespace: str, kubeconfig: str + ) -> str: + return "env KUBECONFIG={} {} uninstall {} --namespace={}".format( + kubeconfig, self._helm_command, kdu_instance, namespace ) def _get_helm_chart_repos_ids(self, cluster_uuid) -> list: