X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=n2vc%2Fk8s_helm3_conn.py;h=b267c75fd679e0f1b999c5d0af9ca530861ce4f5;hb=1db89e8567575739cd5de523bb05c50777e1aca3;hp=4baadae203a35455cd3b6bd9729535339f34ae7c;hpb=5f069332606e512f74791c6497af40326b611344;p=osm%2FN2VC.git diff --git a/n2vc/k8s_helm3_conn.py b/n2vc/k8s_helm3_conn.py index 4baadae..b267c75 100644 --- a/n2vc/k8s_helm3_conn.py +++ b/n2vc/k8s_helm3_conn.py @@ -20,6 +20,7 @@ # contact with: nfvlabs@tid.es ## from typing import Union +from shlex import quote import os import yaml @@ -258,7 +259,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector): ) command = "{} --kubeconfig={} get namespaces -o=yaml".format( - self.kubectl_command, paths["kube_config"] + self.kubectl_command, quote(paths["kube_config"]) ) output, _rc = await self._local_async_exec( command=command, raise_exception_on_error=True, env=env @@ -279,7 +280,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector): ) command = "{} --kubeconfig={} create namespace {}".format( - self.kubectl_command, paths["kube_config"], namespace + self.kubectl_command, quote(paths["kube_config"]), quote(namespace) ) _, _rc = await self._local_async_exec( command=command, raise_exception_on_error=True, env=env @@ -297,9 +298,11 @@ class K8sHelm3Connector(K8sHelmBaseConnector): ) command1 = "env KUBECONFIG={} {} get manifest {} --namespace={}".format( - kubeconfig, self._helm_command, kdu_instance, namespace + kubeconfig, self._helm_command, quote(kdu_instance), quote(namespace) + ) + command2 = "{} get --namespace={} -f -".format( + self.kubectl_command, quote(namespace) ) - command2 = "{} get --namespace={} -f -".format(self.kubectl_command, namespace) output, _rc = await self._local_async_exec_pipe( command1, command2, env=env, raise_exception_on_error=True ) @@ -355,8 +358,8 @@ class K8sHelm3Connector(K8sHelmBaseConnector): Args: show_command: the second part of the command (`helm show `) - kdu_model: The name or path of an Helm Chart - repo_url: Helm Chart repository url + kdu_model: The name or path of a Helm Chart + repo_str: Helm Chart repository url version: constraint with specific version of the Chart to use Returns: @@ -364,7 +367,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector): """ inspect_command = "{} show {} {}{} {}".format( - self._helm_command, show_command, kdu_model, repo_str, version + self._helm_command, show_command, quote(kdu_model), repo_str, version ) return inspect_command @@ -373,7 +376,11 @@ class K8sHelm3Connector(K8sHelmBaseConnector): ): get_command = ( "env KUBECONFIG={} {} get {} {} --namespace={} --output yaml".format( - kubeconfig, self._helm_command, get_command, kdu_instance, namespace + kubeconfig, + self._helm_command, + get_command, + quote(kdu_instance), + quote(namespace), ) ) return get_command @@ -398,7 +405,10 @@ class K8sHelm3Connector(K8sHelmBaseConnector): cluster_name=cluster_id, create_if_not_exist=True ) command = "env KUBECONFIG={} {} status {} --namespace={} --output yaml".format( - paths["kube_config"], self._helm_command, kdu_instance, namespace + paths["kube_config"], + self._helm_command, + quote(kdu_instance), + quote(namespace), ) output, rc = await self._local_async_exec( @@ -455,7 +465,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector): # namespace namespace_str = "" if namespace: - namespace_str = "--namespace {}".format(namespace) + namespace_str = "--namespace {}".format(quote(namespace)) # version version_str = "" @@ -467,12 +477,12 @@ class K8sHelm3Connector(K8sHelmBaseConnector): "{params} {timeout} {ns} {model} {ver}".format( kubeconfig=kubeconfig, helm=self._helm_command, - name=kdu_instance, + name=quote(kdu_instance), atomic=atomic_str, params=params_str, timeout=timeout_str, ns=namespace_str, - model=kdu_model, + model=quote(kdu_model), ver=version_str, ) ) @@ -539,6 +549,9 @@ class K8sHelm3Connector(K8sHelmBaseConnector): atomic: bool, timeout: float, kubeconfig: str, + reset_values: bool = False, + reuse_values: bool = True, + reset_then_reuse_values: bool = False, force: bool = False, ) -> str: """Generates the command to upgrade a Helm Chart release @@ -553,6 +566,9 @@ class K8sHelm3Connector(K8sHelmBaseConnector): The --wait flag will be set automatically if --atomic is used timeout (float): The time, in seconds, to wait kubeconfig (str): Kubeconfig file path + reset_values(bool): If set, helm resets values instead of reusing previous values. + reuse_values(bool): If set, helm reuses previous values. + reset_then_reuse_values(bool): If set, helm resets values, then apply the last release's values force (bool): If set, helm forces resource updates through a replacement strategy. This may recreate pods. Returns: str: command to upgrade a Helm Chart release @@ -575,26 +591,35 @@ class K8sHelm3Connector(K8sHelmBaseConnector): # version version_str = "" if version: - version_str = "--version {}".format(version) + version_str = "--version {}".format(quote(version)) # namespace namespace_str = "" if namespace: - namespace_str = "--namespace {}".format(namespace) - + namespace_str = "--namespace {}".format(quote(namespace)) + + # reset, reuse or reset_then_reuse values + on_values_str = "--reuse-values" + if reset_values: + on_values_str = "--reset-values" + elif reuse_values: + on_values_str = "--reuse-values" + elif reset_then_reuse_values: + on_values_str = "--reset-then-reuse-values" command = ( "env KUBECONFIG={kubeconfig} {helm} upgrade {name} {model} {namespace} {atomic} {force}" - "--output yaml {params} {timeout} --reuse-values {ver}" + "--output yaml {params} {timeout} {on_values} {ver}" ).format( kubeconfig=kubeconfig, helm=self._helm_command, - name=kdu_instance, + name=quote(kdu_instance), namespace=namespace_str, atomic=atomic_str, force=force_str, params=params_str, timeout=timeout_str, - model=kdu_model, + model=quote(kdu_model), + on_values=on_values_str, ver=version_str, ) return command @@ -603,14 +628,18 @@ class K8sHelm3Connector(K8sHelmBaseConnector): self, kdu_instance: str, namespace: str, revision: float, kubeconfig: str ) -> str: return "env KUBECONFIG={} {} rollback {} {} --namespace={} --wait".format( - kubeconfig, self._helm_command, kdu_instance, revision, namespace + kubeconfig, + self._helm_command, + quote(kdu_instance), + revision, + quote(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 + kubeconfig, self._helm_command, quote(kdu_instance), quote(namespace) ) def _get_helm_chart_repos_ids(self, cluster_uuid) -> list: