diff --git a/changelogs/fragments/20240228-fix-helm-diff-with-reuse-values.yml b/changelogs/fragments/20240228-fix-helm-diff-with-reuse-values.yml new file mode 100644 index 0000000000..b38c103c35 --- /dev/null +++ b/changelogs/fragments/20240228-fix-helm-diff-with-reuse-values.yml @@ -0,0 +1,3 @@ +--- +bugfixes: + - helm - use ``reuse-values`` when running ``helm diff`` command (https://github.com/ansible-collections/kubernetes.core/issues/680). diff --git a/plugins/modules/helm.py b/plugins/modules/helm.py index 11f323c4b1..da27fef946 100644 --- a/plugins/modules/helm.py +++ b/plugins/modules/helm.py @@ -640,6 +640,8 @@ def helmdiff_check( chart_repo_url=None, post_renderer=False, set_value_args=None, + reuse_values=None, + reset_values=True, ): """ Use helm diff to determine if a release would change by upgrading a chart. @@ -653,7 +655,7 @@ def helmdiff_check( if chart_version is not None: cmd += " " + "--version=" + chart_version if not replace: - cmd += " " + "--reset-values" + cmd += " " + "--reset-values=" + str(reset_values) if post_renderer: cmd += " --post-renderer=" + post_renderer @@ -671,6 +673,9 @@ def helmdiff_check( if set_value_args: cmd += " " + set_value_args + if reuse_values: + cmd += " --reuse-values" + rc, out, err = module.run_helm_command(cmd) return (len(out.strip()) > 0, out.strip()) @@ -901,6 +906,8 @@ def main(): chart_repo_url, post_renderer, set_value_args, + reuse_values=reuse_values, + reset_values=reset_values, ) if would_change and module._diff: opt_result["diff"] = {"prepared": prepared} diff --git a/tests/integration/targets/helm_diff/files/test-chart-reuse-values/Chart.yaml b/tests/integration/targets/helm_diff/files/test-chart-reuse-values/Chart.yaml new file mode 100644 index 0000000000..c3681dba0f --- /dev/null +++ b/tests/integration/targets/helm_diff/files/test-chart-reuse-values/Chart.yaml @@ -0,0 +1,24 @@ +apiVersion: v2 +name: chart-reuse-values +description: A Helm chart for Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "1.16.0" diff --git a/tests/integration/targets/helm_diff/files/test-chart-reuse-values/templates/configmap.yaml b/tests/integration/targets/helm_diff/files/test-chart-reuse-values/templates/configmap.yaml new file mode 100644 index 0000000000..bb97476061 --- /dev/null +++ b/tests/integration/targets/helm_diff/files/test-chart-reuse-values/templates/configmap.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: cmap +data: + ansible_version: {{ .Values.ansible_version }} + python_version: {{ .Values.python_version }} diff --git a/tests/integration/targets/helm_diff/files/test-chart-reuse-values/values.yaml b/tests/integration/targets/helm_diff/files/test-chart-reuse-values/values.yaml new file mode 100644 index 0000000000..05062120fe --- /dev/null +++ b/tests/integration/targets/helm_diff/files/test-chart-reuse-values/values.yaml @@ -0,0 +1,2 @@ +ansible_version: 2.16 +python_version: 3.9 diff --git a/tests/integration/targets/helm_diff/tasks/main.yml b/tests/integration/targets/helm_diff/tasks/main.yml index f7df479031..6d38eba69b 100644 --- a/tests/integration/targets/helm_diff/tasks/main.yml +++ b/tests/integration/targets/helm_diff/tasks/main.yml @@ -299,3 +299,5 @@ name: "{{ helm_namespace }}" state: absent ignore_errors: yes + +- include_tasks: reuse_values.yml diff --git a/tests/integration/targets/helm_diff/tasks/reuse_values.yml b/tests/integration/targets/helm_diff/tasks/reuse_values.yml new file mode 100644 index 0000000000..349e3f79ec --- /dev/null +++ b/tests/integration/targets/helm_diff/tasks/reuse_values.yml @@ -0,0 +1,78 @@ +--- +- name: Create temporary directory for helm chart + tempfile: + suffix: .helm + state: directory + register: helm_dir + +- name: Test helm diff functionality + vars: + test_chart_path: "{{ helm_dir.path }}/chart" + helm_namespace: "helm-reuse-values-001" + test_release_name: "myrelease" + + block: + + - name: Install helm diff + helm_plugin: + binary_path: "{{ helm_binary }}" + state: present + plugin_path: https://github.com/databus23/helm-diff + plugin_version: 3.9.4 + + - name: Copy test chart + copy: + src: "test-chart-reuse-values" + dest: "{{ test_chart_path }}" + + - name: Create helm release + kubernetes.core.helm: + state: present + binary_path: "{{ helm_binary }}" + chart_ref: "{{ test_chart_path }}" + release_name: "{{ test_release_name }}" + release_namespace: "{{ helm_namespace }}" + create_namespace: true + release_values: + ansible_version: devel + python_version: 3.11 + wait: true + + - name: Upgrade helm release + kubernetes.core.helm: + binary_path: "{{ helm_binary }}" + chart_ref: "{{ test_chart_path }}" + reset_values: false + reuse_values: true + release_name: "{{ test_release_name }}" + release_namespace: "{{ helm_namespace }}" + values: + ansible_version: devel + register: helm_upgrade + + - name: Ensure task did not reported change + assert: + that: + - helm_upgrade is not changed + + always: + - name: Remove temporary directory + file: + path: "{{ helm_dir.path }}" + state: absent + ignore_errors: true + + - name: Uninstall helm diff + helm_plugin: + binary_path: "{{ helm_binary }}" + state: absent + plugin_name: diff + ignore_errors: true + + - name: Remove helm namespace + k8s: + api_version: v1 + kind: Namespace + name: "{{ helm_namespace }}" + state: absent + ignore_errors: true