diff --git a/changelogs/fragments/575-helm-add-support-for-reuse_values-and-reset_values.yml b/changelogs/fragments/575-helm-add-support-for-reuse_values-and-reset_values.yml new file mode 100644 index 0000000000..89abd455ed --- /dev/null +++ b/changelogs/fragments/575-helm-add-support-for-reuse_values-and-reset_values.yml @@ -0,0 +1,3 @@ +--- +minor_changes: + - helm - add reuse_values and reset_values support to helm module (https://github.com/ansible-collections/kubernetes.core/issues/394). diff --git a/plugins/modules/helm.py b/plugins/modules/helm.py index 3d35e07ea4..8c6d5dd14a 100644 --- a/plugins/modules/helm.py +++ b/plugins/modules/helm.py @@ -130,6 +130,21 @@ - json - file version_added: '2.4.0' + reuse_values: + description: + - When upgrading package, specifies wether to reuse the last release's values and merge in any overrides from parameters I(release_values), + I(values_files) or I(set_values). + - If I(reset_values) is set to C(True), this is ignored. + type: bool + required: false + version_added: '2.5.0' + reset_values: + description: + - When upgrading package, reset the values to the ones built into the chart. + type: bool + required: false + default: True + version_added: '2.5.0' #Helm options disable_hook: @@ -310,6 +325,17 @@ enabled: True logging: enabled: True + +# Deploy latest version +- name: Deploy latest version of Grafana chart using reuse_values + kubernetes.core.helm: + name: test + chart_ref: stable/grafana + release_namespace: monitoring + reuse_values: true + values: + replicas: 2 + version: 3e8ec0b2dffa40fb97d5342e4af887de95faa8c61a62480dd7f8aa03dffcf533 """ RETURN = r""" @@ -474,6 +500,8 @@ def deploy( timeout=None, dependency_update=None, set_value_args=None, + reuse_values=None, + reset_values=True, ): """ Install/upgrade/rollback release chart @@ -485,9 +513,11 @@ def deploy( deploy_command += " --dependency-update" else: deploy_command = command + " upgrade -i" # install/upgrade + if reset_values: + deploy_command += " --reset-values" - # Always reset values to keep release_values equal to values released - deploy_command += " --reset-values" + if reuse_values is not None: + deploy_command += " --reuse-values=" + str(reuse_values) if wait: deploy_command += " --wait" @@ -684,6 +714,8 @@ def argument_spec(): skip_crds=dict(type="bool", default=False), history_max=dict(type="int"), set_values=dict(type="list", elements="dict"), + reuse_values=dict(type="bool"), + reset_values=dict(type="bool", default=True), ) ) return arg_spec @@ -734,6 +766,8 @@ def main(): history_max = module.params.get("history_max") timeout = module.params.get("timeout") set_values = module.params.get("set_values") + reuse_values = module.params.get("reuse_values") + reset_values = module.params.get("reset_values") if update_repo_cache: run_repo_update(module) @@ -826,6 +860,8 @@ def main(): history_max=history_max, timeout=timeout, set_value_args=set_value_args, + reuse_values=reuse_values, + reset_values=reset_values, ) changed = True @@ -885,6 +921,8 @@ def main(): timeout=timeout, dependency_update=dependency_update, set_value_args=set_value_args, + reuse_values=reuse_values, + reset_values=reset_values, ) changed = True diff --git a/tests/integration/targets/helm/defaults/main.yml b/tests/integration/targets/helm/defaults/main.yml index ae860ce85d..4c9331c9cf 100644 --- a/tests/integration/targets/helm/defaults/main.yml +++ b/tests/integration/targets/helm/defaults/main.yml @@ -24,3 +24,4 @@ test_namespace: - "helm-local-path-003" - "helm-from-repository" - "helm-from-url" + - "helm-reuse-values" diff --git a/tests/integration/targets/helm/tasks/run_test.yml b/tests/integration/targets/helm/tasks/run_test.yml index 545b25c8ed..82457cde98 100644 --- a/tests/integration/targets/helm/tasks/run_test.yml +++ b/tests/integration/targets/helm/tasks/run_test.yml @@ -25,6 +25,9 @@ - from_repository - from_url +- name: test helm upgrade with reuse_values + include_tasks: test_helm_reuse_values.yml + - name: test helm dependency update include_tasks: test_up_dep.yml diff --git a/tests/integration/targets/helm/tasks/test_helm_reuse_values.yml b/tests/integration/targets/helm/tasks/test_helm_reuse_values.yml new file mode 100644 index 0000000000..9384fd4f4f --- /dev/null +++ b/tests/integration/targets/helm/tasks/test_helm_reuse_values.yml @@ -0,0 +1,75 @@ +--- +- name: Test helm reuse_values + vars: + helm_namespace: "{{ test_namespace[9] }}" + chart_release_values: + replica: + replicaCount: 3 + master: + count: 1 + kind: Deployment + chart_reuse_values: + replica: + replicaCount: 1 + master: + count: 3 + block: + - name: Initial chart installation + helm: + binary_path: "{{ helm_binary }}" + chart_ref: redis + chart_repo_url: https://charts.bitnami.com/bitnami + release_name: test-redis + release_namespace: "{{ helm_namespace }}" + create_namespace: true + release_values: "{{ chart_release_values }}" + register: install + + - name: Get value set as string + helm_info: + binary_path: "{{ helm_binary }}" + release_name: test-redis + release_namespace: "{{ helm_namespace }}" + register: release_value + + - name: Validate that chart values are as expected + assert: + that: + - install is changed + - '"--reuse-values=True" not in install.command' + - release_value["status"]["values"] == chart_release_values + + - name: Upgrade chart using reuse_values=true + helm: + binary_path: "{{ helm_binary }}" + chart_ref: redis + chart_repo_url: https://charts.bitnami.com/bitnami + release_name: test-redis + release_namespace: "{{ helm_namespace }}" + reuse_values: true + reset_values: false + release_values: "{{ chart_reuse_values }}" + register: upgrade + + - name: Get value set as string + helm_info: + binary_path: "{{ helm_binary }}" + release_name: test-redis + release_namespace: "{{ helm_namespace }}" + register: release_value + + - name: Validate that chart values are as expected + assert: + that: + - upgrade is changed + - '"--reuse-values=True" in upgrade.command' + - '"--reset-values" not in upgrade.command' + - release_value["status"]["values"] == chart_release_values | combine(chart_reuse_values, recursive=true) + + always: + - name: Remove helm namespace + k8s: + api_version: v1 + kind: Namespace + name: "{{ helm_namespace }}" + state: absent