From 0a2060ce3db8e457c732c83b87030923cbac6e11 Mon Sep 17 00:00:00 2001 From: Pedro Escaleira Date: Thu, 7 Jul 2022 22:18:35 +0100 Subject: [PATCH] Bug 2104 fixed - Added the --reuse-values flag to the upgrade command; - Also, removed the duplicated code from the _get_upgrade_scale_command method, and not this method only calls the _get_upgrade_command to get the command to upgrade/scale the Helm Chart Change-Id: I8bda5450f1f9bd5e2b9771f284e1b904b82fb3df Signed-off-by: Pedro Escaleira --- n2vc/k8s_helm3_conn.py | 72 +++++++++++++++----------- n2vc/k8s_helm_base_conn.py | 36 +++++++++++-- n2vc/k8s_helm_conn.py | 70 +++++++++++++++---------- n2vc/tests/unit/test_k8s_helm3_conn.py | 6 +-- n2vc/tests/unit/test_k8s_helm_conn.py | 7 +-- 5 files changed, 125 insertions(+), 66 deletions(-) diff --git a/n2vc/k8s_helm3_conn.py b/n2vc/k8s_helm3_conn.py index 0a8f7e0..d828da2 100644 --- a/n2vc/k8s_helm3_conn.py +++ b/n2vc/k8s_helm3_conn.py @@ -496,25 +496,24 @@ class K8sHelm3Connector(K8sHelmBaseConnector): resource_name: str, kubeconfig: str, ) -> str: + """Generates the command to scale a Helm Chart release - timeout_str = "" - if timeout: - timeout_str = "--timeout {}s".format(timeout) - - # atomic - atomic_str = "" - if atomic: - atomic_str = "--atomic" - - # version - version_str = "" - if version: - version_str = "--version {}".format(version) + Args: + kdu_model (str): Kdu model name, corresponding to the Helm local location or repository + kdu_instance (str): KDU instance, corresponding to the Helm Chart release in question + namespace (str): Namespace where this KDU instance is deployed + scale (int): Scale count + version (str): Constraint with specific version of the Chart to use + atomic (bool): If set, upgrade process rolls back changes made in case of failed upgrade. + The --wait flag will be set automatically if --atomic is used + replica_str (str): The key under resource_name key where the scale count is stored + timeout (float): The time, in seconds, to wait + resource_name (str): The KDU's resource to scale + kubeconfig (str): Kubeconfig file path - # namespace - namespace_str = "" - if namespace: - namespace_str = "--namespace {}".format(namespace) + Returns: + str: command to scale a Helm Chart release + """ # scale if resource_name: @@ -524,21 +523,16 @@ class K8sHelm3Connector(K8sHelmBaseConnector): scale_str = self._params_to_set_option(scale_dict) - command = ( - "env KUBECONFIG={kubeconfig} {helm} upgrade {name} {model} {namespace} {atomic} --output yaml {scale} " - "{timeout} {ver}" - ).format( - helm=self._helm_command, - name=kdu_instance, - namespace=namespace_str, - atomic=atomic_str, - scale=scale_str, - timeout=timeout_str, - model=kdu_model, - ver=version_str, + return self._get_upgrade_command( + kdu_model=kdu_model, + kdu_instance=kdu_instance, + namespace=namespace, + params_str=scale_str, + version=version, + atomic=atomic, + timeout=timeout, kubeconfig=kubeconfig, ) - return command def _get_upgrade_command( self, @@ -551,6 +545,22 @@ class K8sHelm3Connector(K8sHelmBaseConnector): timeout: float, kubeconfig: str, ) -> str: + """Generates the command to upgrade a Helm Chart release + + Args: + kdu_model (str): Kdu model name, corresponding to the Helm local location or repository + kdu_instance (str): KDU instance, corresponding to the Helm Chart release in question + namespace (str): Namespace where this KDU instance is deployed + params_str (str): Params used to upgrade the Helm Chart release + version (str): Constraint with specific version of the Chart to use + atomic (bool): If set, upgrade process rolls back changes made in case of failed upgrade. + The --wait flag will be set automatically if --atomic is used + timeout (float): The time, in seconds, to wait + kubeconfig (str): Kubeconfig file path + + Returns: + str: command to upgrade a Helm Chart release + """ timeout_str = "" if timeout: @@ -573,7 +583,7 @@ class K8sHelm3Connector(K8sHelmBaseConnector): command = ( "env KUBECONFIG={kubeconfig} {helm} upgrade {name} {model} {namespace} {atomic} " - "--output yaml {params} {timeout} {ver}" + "--output yaml {params} {timeout} --reuse-values {ver}" ).format( kubeconfig=kubeconfig, helm=self._helm_command, diff --git a/n2vc/k8s_helm_base_conn.py b/n2vc/k8s_helm_base_conn.py index 6ddf118..e89d6fa 100644 --- a/n2vc/k8s_helm_base_conn.py +++ b/n2vc/k8s_helm_base_conn.py @@ -1325,7 +1325,24 @@ class K8sHelmBaseConnector(K8sConnector): resource_name, kubeconfig, ) -> str: - """Obtain command to be executed to upgrade the indicated instance.""" + """Generates the command to scale a Helm Chart release + + Args: + kdu_model (str): Kdu model name, corresponding to the Helm local location or repository + kdu_instance (str): KDU instance, corresponding to the Helm Chart release in question + namespace (str): Namespace where this KDU instance is deployed + scale (int): Scale count + version (str): Constraint with specific version of the Chart to use + atomic (bool): If set, upgrade process rolls back changes made in case of failed upgrade. + The --wait flag will be set automatically if --atomic is used + replica_str (str): The key under resource_name key where the scale count is stored + timeout (float): The time, in seconds, to wait + resource_name (str): The KDU's resource to scale + kubeconfig (str): Kubeconfig file path + + Returns: + str: command to scale a Helm Chart release + """ @abc.abstractmethod def _get_upgrade_command( @@ -1339,8 +1356,21 @@ class K8sHelmBaseConnector(K8sConnector): timeout, kubeconfig, ) -> str: - """ - Obtain command to be executed to upgrade the indicated instance + """Generates the command to upgrade a Helm Chart release + + Args: + kdu_model (str): Kdu model name, corresponding to the Helm local location or repository + kdu_instance (str): KDU instance, corresponding to the Helm Chart release in question + namespace (str): Namespace where this KDU instance is deployed + params_str (str): Params used to upgrade the Helm Chart release + version (str): Constraint with specific version of the Chart to use + atomic (bool): If set, upgrade process rolls back changes made in case of failed upgrade. + The --wait flag will be set automatically if --atomic is used + timeout (float): The time, in seconds, to wait + kubeconfig (str): Kubeconfig file path + + Returns: + str: command to upgrade a Helm Chart release """ @abc.abstractmethod diff --git a/n2vc/k8s_helm_conn.py b/n2vc/k8s_helm_conn.py index 5fe624b..cd440a9 100644 --- a/n2vc/k8s_helm_conn.py +++ b/n2vc/k8s_helm_conn.py @@ -654,20 +654,24 @@ class K8sHelmConnector(K8sHelmBaseConnector): resource_name: str, kubeconfig: str, ) -> str: - - timeout_str = "" - if timeout: - timeout_str = "--timeout {}s".format(timeout) - - # atomic - atomic_str = "" - if atomic: - atomic_str = "--atomic" - - # version - version_str = "" - if version: - version_str = "--version {}".format(version) + """Generates the command to scale a Helm Chart release + + Args: + kdu_model (str): Kdu model name, corresponding to the Helm local location or repository + kdu_instance (str): KDU instance, corresponding to the Helm Chart release in question + namespace (str): Namespace where this KDU instance is deployed + scale (int): Scale count + version (str): Constraint with specific version of the Chart to use + atomic (bool): If set, upgrade process rolls back changes made in case of failed upgrade. + The --wait flag will be set automatically if --atomic is used + replica_str (str): The key under resource_name key where the scale count is stored + timeout (float): The time, in seconds, to wait + resource_name (str): The KDU's resource to scale + kubeconfig (str): Kubeconfig file path + + Returns: + str: command to scale a Helm Chart release + """ # scale if resource_name: @@ -677,19 +681,16 @@ class K8sHelmConnector(K8sHelmBaseConnector): scale_str = self._params_to_set_option(scale_dict) - command = ( - "env KUBECONFIG={kubeconfig} {helm} upgrade {atomic} --output yaml {scale} {timeout} {name} {model} {ver}" - ).format( - helm=self._helm_command, - name=kdu_instance, - atomic=atomic_str, - scale=scale_str, - timeout=timeout_str, - model=kdu_model, - ver=version_str, + return self._get_upgrade_command( + kdu_model=kdu_model, + kdu_instance=kdu_instance, + namespace=namespace, + params_str=scale_str, + version=version, + atomic=atomic, + timeout=timeout, kubeconfig=kubeconfig, ) - return command def _get_upgrade_command( self, @@ -702,6 +703,22 @@ class K8sHelmConnector(K8sHelmBaseConnector): timeout, kubeconfig, ) -> str: + """Generates the command to upgrade a Helm Chart release + + Args: + kdu_model (str): Kdu model name, corresponding to the Helm local location or repository + kdu_instance (str): KDU instance, corresponding to the Helm Chart release in question + namespace (str): Namespace where this KDU instance is deployed + params_str (str): Params used to upgrade the Helm Chart release + version (str): Constraint with specific version of the Chart to use + atomic (bool): If set, upgrade process rolls back changes made in case of failed upgrade. + The --wait flag will be set automatically if --atomic is used + timeout (float): The time, in seconds, to wait + kubeconfig (str): Kubeconfig file path + + Returns: + str: command to upgrade a Helm Chart release + """ timeout_str = "" if timeout: @@ -718,7 +735,8 @@ class K8sHelmConnector(K8sHelmBaseConnector): version_str = "--version {}".format(version) command = ( - "env KUBECONFIG={kubeconfig} {helm} upgrade {atomic} --output yaml {params} {timeout} {name} {model} {ver}" + "env KUBECONFIG={kubeconfig} {helm} upgrade {atomic} --output yaml {params} {timeout} " + "--reuse-values {name} {model} {ver}" ).format( kubeconfig=kubeconfig, helm=self._helm_command, diff --git a/n2vc/tests/unit/test_k8s_helm3_conn.py b/n2vc/tests/unit/test_k8s_helm3_conn.py index 131b5c4..86b2790 100644 --- a/n2vc/tests/unit/test_k8s_helm3_conn.py +++ b/n2vc/tests/unit/test_k8s_helm3_conn.py @@ -293,7 +293,7 @@ class TestK8sHelm3Conn(asynctest.TestCase): "env KUBECONFIG=./tmp/helm3_cluster_id/.kube/config " "/usr/bin/helm3 upgrade stable-openldap-0005399828 stable/openldap " "--namespace testk8s --atomic --output yaml --timeout 300s " - "--version 1.2.3" + "--reuse-values --version 1.2.3" ) self.helm_conn._local_async_exec.assert_called_with( command=command, env=self.env, raise_exception_on_error=False @@ -349,7 +349,7 @@ class TestK8sHelm3Conn(asynctest.TestCase): "env KUBECONFIG=./tmp/helm3_cluster_id/.kube/config " "/usr/bin/helm3 upgrade stable-openldap-0005399828 stable/openldap " "--namespace testk8s --atomic --output yaml --set replicaCount=2 --timeout 1800s " - "--version 1.2.3" + "--reuse-values --version 1.2.3" ) self.helm_conn._local_async_exec.assert_called_once_with( command=command, env=self.env, raise_exception_on_error=False @@ -368,7 +368,7 @@ class TestK8sHelm3Conn(asynctest.TestCase): "env KUBECONFIG=./tmp/helm3_cluster_id/.kube/config " "/usr/bin/helm3 upgrade stable-openldap-0005399828 stable/openldap " "--namespace testk8s --atomic --output yaml --set dummy-app.replicas=3 --timeout 1800s " - "--version 1.2.3" + "--reuse-values --version 1.2.3" ) self.helm_conn._local_async_exec.assert_called_with( command=command, env=self.env, raise_exception_on_error=False diff --git a/n2vc/tests/unit/test_k8s_helm_conn.py b/n2vc/tests/unit/test_k8s_helm_conn.py index 5112363..f43b24b 100644 --- a/n2vc/tests/unit/test_k8s_helm_conn.py +++ b/n2vc/tests/unit/test_k8s_helm_conn.py @@ -226,7 +226,8 @@ class TestK8sHelmConn(asynctest.TestCase): ) command = ( "env KUBECONFIG=./tmp/helm_cluster_id/.kube/config /usr/bin/helm upgrade " - "--atomic --output yaml --timeout 300 stable-openldap-0005399828 stable/openldap --version 1.2.3" + "--atomic --output yaml --timeout 300 --reuse-values stable-openldap-0005399828 stable/openldap " + "--version 1.2.3" ) self.helm_conn._local_async_exec.assert_called_with( command=command, env=self.env, raise_exception_on_error=False @@ -281,7 +282,7 @@ class TestK8sHelmConn(asynctest.TestCase): command = ( "env KUBECONFIG=./tmp/helm_cluster_id/.kube/config " "/usr/bin/helm upgrade --atomic --output yaml --set replicaCount=2 " - "--timeout 1800s stable-openldap-0005399828 stable/openldap " + "--timeout 1800 --reuse-values stable-openldap-0005399828 stable/openldap " "--version 1.2.3" ) self.helm_conn._local_async_exec.assert_called_once_with( @@ -301,7 +302,7 @@ class TestK8sHelmConn(asynctest.TestCase): command = ( "env KUBECONFIG=./tmp/helm_cluster_id/.kube/config " "/usr/bin/helm upgrade --atomic --output yaml --set dummy-app.replicas=3 " - "--timeout 1800s stable-openldap-0005399828 stable/openldap " + "--timeout 1800 --reuse-values stable-openldap-0005399828 stable/openldap " "--version 1.2.3" ) self.helm_conn._local_async_exec.assert_called_with( -- 2.17.1