X-Git-Url: https://osm.etsi.org/gitweb/?p=osm%2FN2VC.git;a=blobdiff_plain;f=n2vc%2Fk8s_helm3_conn.py;h=787be0361568fbb71fd755df3fe9e7991a5b9307;hp=8954c8a564e636db92168ea1d9871949de11dbbd;hb=60a3a96717d7c36ba7a65573da59a6bc039f5e28;hpb=25a1392579da2e8e4789e0b8f35abbaa372fde08 diff --git a/n2vc/k8s_helm3_conn.py b/n2vc/k8s_helm3_conn.py index 8954c8a..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 @@ -97,24 +98,24 @@ class K8sHelm3Connector(K8sHelmBaseConnector): :return: True if successful """ - - self.log.debug("installing {} in cluster {}".format(kdu_model, cluster_uuid)) + _, 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_uuid) + self.fs.sync(from_path=cluster_id) # init env, paths paths, env = self._init_paths_env( - cluster_name=cluster_uuid, create_if_not_exist=True + 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_uuid, namespace): + if not await self._namespace_exists(cluster_id, namespace): try: - await self._create_namespace(cluster_uuid, namespace) + await self._create_namespace(cluster_id, namespace) except Exception as e: - if not await self._namespace_exists(cluster_uuid, namespace): + if not await self._namespace_exists(cluster_id, namespace): err_msg = ( "namespace {} does not exist in cluster_id {} " "error message: ".format(namespace, e) @@ -123,7 +124,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector): raise K8sException(err_msg) await self._install_impl( - cluster_uuid, + cluster_id, kdu_model, paths, env, @@ -137,13 +138,12 @@ class K8sHelm3Connector(K8sHelmBaseConnector): ) # sync fs - self.fs.reverse_sync(from_path=cluster_uuid) + 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( "inspect kdu_model {} from (optional) repo: {}".format(kdu_model, repo_url) ) @@ -244,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 @@ -266,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 @@ -287,7 +285,6 @@ class K8sHelm3Connector(K8sHelmBaseConnector): 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 @@ -314,10 +311,12 @@ class K8sHelm3Connector(K8sHelmBaseConnector): if namespace not in namespaces: await self._create_namespace(cluster_id, namespace) - repo_list = await self.repo_list(cluster_id) + # If default repo is not included add + cluster_uuid = "{}:{}".format(namespace, cluster_id) + repo_list = await self.repo_list(cluster_uuid) 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_id, "stable", self._stable_repo_url) + await self.repo_add(cluster_uuid, "stable", self._stable_repo_url) # Returns False as no software needs to be uninstalled return False @@ -327,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 @@ -357,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) ) @@ -383,7 +380,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector): env=env, ) - if return_text: + if yaml_format: return str(output) if rc != 0: @@ -394,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,7 +416,6 @@ class K8sHelm3Connector(K8sHelmBaseConnector): timeout: float, kubeconfig: str, ) -> str: - timeout_str = "" if timeout: timeout_str = "--timeout {}s".format(timeout) @@ -458,7 +461,6 @@ class K8sHelm3Connector(K8sHelmBaseConnector): timeout: float, kubeconfig: str, ) -> str: - timeout_str = "" if timeout: timeout_str = "--timeout {}s".format(timeout) @@ -504,7 +506,6 @@ class K8sHelm3Connector(K8sHelmBaseConnector): 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 )