From 6ff5f87c21a790210227088e9be49de72cf77f5d Mon Sep 17 00:00:00 2001 From: "david.bidorff@gmail.com" Date: Sat, 18 Jan 2025 09:37:30 +0100 Subject: [PATCH 1/4] add reset_then_reuse_values support to helm module --- ...lm-add-reset_then_reuse_values-support.yml | 3 + docs/kubernetes.core.helm_module.rst | 21 ++++ plugins/modules/helm.py | 40 +++++++ .../targets/helm/tasks/run_test.yml | 3 + .../test_helm_reset_then_reuse_values.yml | 75 +++++++++++++ .../targets/helm_diff/tasks/main.yml | 2 + .../tasks/reset_then_reuse_values.yml | 102 ++++++++++++++++++ 7 files changed, 246 insertions(+) create mode 100644 changelogs/fragments/800-helm-add-reset_then_reuse_values-support.yml create mode 100644 tests/integration/targets/helm/tasks/test_helm_reset_then_reuse_values.yml create mode 100644 tests/integration/targets/helm_diff/tasks/reset_then_reuse_values.yml diff --git a/changelogs/fragments/800-helm-add-reset_then_reuse_values-support.yml b/changelogs/fragments/800-helm-add-reset_then_reuse_values-support.yml new file mode 100644 index 0000000000..0db6456d2d --- /dev/null +++ b/changelogs/fragments/800-helm-add-reset_then_reuse_values-support.yml @@ -0,0 +1,3 @@ +--- +minor_changes: + - helm - add reset_then_reuse_values support to helm module (https://github.com/ansible-collections/kubernetes.core/issues/803). diff --git a/docs/kubernetes.core.helm_module.rst b/docs/kubernetes.core.helm_module.rst index ffa05e98b1..ddb3e87b37 100644 --- a/docs/kubernetes.core.helm_module.rst +++ b/docs/kubernetes.core.helm_module.rst @@ -476,6 +476,27 @@ Parameters
If reset_values is set to True, this is ignored.
+ + +
+ reset_then_reuse_values + +
+ boolean +
+
added in 5.1.0
+ + + + + +
When upgrading package, reset the values to the ones built into the chart, apply the last release's values and merge in any overrides from parameters release_values, values_files or set_values.
+
If reset_values or reuse_values is set to True, this is ignored.
+ +
diff --git a/plugins/modules/helm.py b/plugins/modules/helm.py index 6e48cbbe68..a94746a964 100644 --- a/plugins/modules/helm.py +++ b/plugins/modules/helm.py @@ -145,6 +145,16 @@ required: false default: True version_added: 3.0.0 + reset_then_reuse_values: + description: + - When upgrading package, reset the values to the ones built into the chart, apply the last release's values and merge in any overrides from + parameters O(release_values), O(values_files) or O(set_values). + - If O(reset_values) or O(reuse_values) is set to V(True), this is ignored. + - This feature requires helm diff >= 3.9.12. + type: bool + required: false + default: False + version_added: 5.1.0 #Helm options disable_hook: @@ -509,6 +519,7 @@ def deploy( set_value_args=None, reuse_values=None, reset_values=True, + reset_then_reuse_values=False, ): """ Install/upgrade/rollback release chart @@ -526,6 +537,15 @@ def deploy( if reuse_values is not None: deploy_command += " --reuse-values=" + str(reuse_values) + if reset_then_reuse_values: + helm_version = module.get_helm_version() + if LooseVersion(helm_version) < LooseVersion("3.14.0"): + module.warn( + "helm support option --reset-then-reuse-values starting release >= 3.14.0" + ) + else: + deploy_command += " --reset-then-reuse-values" + if wait: deploy_command += " --wait" if wait_timeout is not None: @@ -642,6 +662,7 @@ def helmdiff_check( set_value_args=None, reuse_values=None, reset_values=True, + reset_then_reuse_values=False, ): """ Use helm diff to determine if a release would change by upgrading a chart. @@ -676,6 +697,20 @@ def helmdiff_check( if reuse_values: cmd += " --reuse-values" + if reset_then_reuse_values: + helm_diff_version = get_plugin_version("diff") + helm_version = module.get_helm_version() + if LooseVersion(helm_diff_version) < LooseVersion("3.9.12"): + module.warn( + "helm diff support option --reset-then-reuse-values starting release >= 3.9.12" + ) + elif LooseVersion(helm_version) < LooseVersion("3.14.0"): + module.warn( + "helm support option --reset-then-reuse-values starting release >= 3.14.0" + ) + else: + cmd += " --reset-then-reuse-values" + rc, out, err = module.run_helm_command(cmd) return (len(out.strip()) > 0, out.strip()) @@ -735,6 +770,7 @@ def argument_spec(): set_values=dict(type="list", elements="dict"), reuse_values=dict(type="bool"), reset_values=dict(type="bool", default=True), + reset_then_reuse_values=dict(type="bool", default=False), ) ) return arg_spec @@ -787,6 +823,7 @@ def main(): set_values = module.params.get("set_values") reuse_values = module.params.get("reuse_values") reset_values = module.params.get("reset_values") + reset_then_reuse_values = module.params.get("reset_then_reuse_values") if update_repo_cache: run_repo_update(module) @@ -883,6 +920,7 @@ def main(): set_value_args=set_value_args, reuse_values=reuse_values, reset_values=reset_values, + reset_then_reuse_values=reset_then_reuse_values, ) changed = True @@ -908,6 +946,7 @@ def main(): set_value_args, reuse_values=reuse_values, reset_values=reset_values, + reset_then_reuse_values=reset_then_reuse_values, ) if would_change and module._diff: opt_result["diff"] = {"prepared": prepared} @@ -943,6 +982,7 @@ def main(): set_value_args=set_value_args, reuse_values=reuse_values, reset_values=reset_values, + reset_then_reuse_values=reset_then_reuse_values, ) changed = True diff --git a/tests/integration/targets/helm/tasks/run_test.yml b/tests/integration/targets/helm/tasks/run_test.yml index 76d55b22ca..522122306d 100644 --- a/tests/integration/targets/helm/tasks/run_test.yml +++ b/tests/integration/targets/helm/tasks/run_test.yml @@ -28,6 +28,9 @@ - name: test helm upgrade with reuse_values include_tasks: test_helm_reuse_values.yml +- name: test helm upgrade with reset_then_reuse_values + include_tasks: test_helm_reset_then_reuse_values.yml + - name: test helm dependency update include_tasks: test_up_dep.yml diff --git a/tests/integration/targets/helm/tasks/test_helm_reset_then_reuse_values.yml b/tests/integration/targets/helm/tasks/test_helm_reset_then_reuse_values.yml new file mode 100644 index 0000000000..982ad1030c --- /dev/null +++ b/tests/integration/targets/helm/tasks/test_helm_reset_then_reuse_values.yml @@ -0,0 +1,75 @@ +--- +- name: Test helm reset_then_reuse_values + vars: + helm_namespace: "{{ test_namespace[9] }}" + chart_release_values: + replica: + replicaCount: 3 + master: + count: 1 + kind: Deployment + chart_reset_then_reuse_values: + replica: + replicaCount: 1 + master: + count: 3 + block: + - name: Initial chart installation + helm: + binary_path: "{{ helm_binary }}" + chart_ref: oci://registry-1.docker.io/bitnamicharts/redis + 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 + - '"--reset-then-reuse-values" not in install.command' + - release_value["status"]["values"] == chart_release_values + + - name: Upgrade chart using reset_then_reuse_values=true + helm: + binary_path: "{{ helm_binary }}" + chart_ref: oci://registry-1.docker.io/bitnamicharts/redis + release_name: test-redis + release_namespace: "{{ helm_namespace }}" + reuse_values: false + reset_values: false + reset_then_reuse_values: true + release_values: "{{ chart_reset_then_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 + - '"--reset-then-reuse-values" in upgrade.command' + - '"--reuse-values" not in upgrade.command' + - '"--reset-values" not in upgrade.command' + - release_value["status"]["values"] == chart_release_values | combine(chart_reset_then_reuse_values, recursive=true) + + always: + - name: Remove helm namespace + k8s: + api_version: v1 + kind: Namespace + name: "{{ helm_namespace }}" + state: absent diff --git a/tests/integration/targets/helm_diff/tasks/main.yml b/tests/integration/targets/helm_diff/tasks/main.yml index c2228e9afd..afad7b992a 100644 --- a/tests/integration/targets/helm_diff/tasks/main.yml +++ b/tests/integration/targets/helm_diff/tasks/main.yml @@ -324,3 +324,5 @@ ignore_errors: true - include_tasks: reuse_values.yml + +- include_tasks: reset_then_reuse_values.yml diff --git a/tests/integration/targets/helm_diff/tasks/reset_then_reuse_values.yml b/tests/integration/targets/helm_diff/tasks/reset_then_reuse_values.yml new file mode 100644 index 0000000000..af30cd5c6e --- /dev/null +++ b/tests/integration/targets/helm_diff/tasks/reset_then_reuse_values.yml @@ -0,0 +1,102 @@ +--- +- 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 }}/test-chart-reuse-values" + test_release_name: "myrelease" + + block: + - name: Install helm diff + kubernetes.core.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 + ansible.builtin.copy: + src: "test-chart-reuse-values" + dest: "{{ helm_dir.path }}" + + - name: Delete existing namespace + kubernetes.core.k8s: + state: absent + wait: true + kind: Namespace + name: "{{ helm_namespace }}" + ignore_errors: true + + - 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 + phase: ci + wait: true + + - name: Upgrade helm release (reset_values=false and reuse_values=false and reset_then_reuse_values=true) + kubernetes.core.helm: + binary_path: "{{ helm_binary }}" + chart_ref: "{{ test_chart_path }}" + reset_values: false + reuse_values: false + reset_then_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 + + - name: Upgrade helm release (reset_then_reuse_values=true with default value for reset_values and reuse_values=false) + kubernetes.core.helm: + binary_path: "{{ helm_binary }}" + chart_ref: "{{ test_chart_path }}" + reuse_values: false + reset_then_reuse_values: true + release_name: "{{ test_release_name }}" + release_namespace: "{{ helm_namespace }}" + values: + ansible_version: devel + register: helm_upgrade + + - name: Ensure task reported change + assert: + that: + - helm_upgrade is changed + + always: + - name: Remove temporary directory + file: + path: "{{ helm_dir.path }}" + state: absent + ignore_errors: true + + - name: Uninstall helm diff + kubernetes.core.helm_plugin: + binary_path: "{{ helm_binary }}" + state: absent + plugin_name: diff + ignore_errors: true + + - name: Remove helm namespace + kubernetes.core.k8s: + api_version: v1 + kind: Namespace + name: "{{ helm_namespace }}" + state: absent + ignore_errors: true From dec094140ff5d0f73d3a4124acec9703d8f10ada Mon Sep 17 00:00:00 2001 From: Yuriy Novostavskiy Date: Sat, 18 Jan 2025 19:32:10 +0200 Subject: [PATCH 2/4] Fix and update Integration test for --reset-then-reuse-values within this commit helm and helm diff plugin updated to versions that suppots --reset-then-reuse-values, fixed a few small CI fault and added tests for older version to ensure warning message. Race condition fixed by using separate namespace. --reset-then-reuse-values flag to 'helm upgrade' supported starting from 3.14.0 ref: https://github.com/helm/helm/releases/tag/v3.14.0, https://github.com/helm/helm/commit/a9d59f946a7b4a19904b6c3a48fec085cbd101d3 --- .../targets/helm/defaults/main.yml | 1 + tests/integration/targets/helm/tasks/main.yml | 2 +- .../test_helm_reset_then_reuse_values.yml | 4 +- .../targets/helm_diff/tasks/main.yml | 2 +- .../tasks/reset_then_reuse_values.yml | 89 ++++++++++++++++++- .../targets/helm_diff/tasks/reuse_values.yml | 1 + .../targets/install_helm/defaults/main.yml | 2 +- 7 files changed, 95 insertions(+), 6 deletions(-) diff --git a/tests/integration/targets/helm/defaults/main.yml b/tests/integration/targets/helm/defaults/main.yml index 39841cce65..2148766e48 100644 --- a/tests/integration/targets/helm/defaults/main.yml +++ b/tests/integration/targets/helm/defaults/main.yml @@ -26,3 +26,4 @@ test_namespace: - "helm-from-url" - "helm-reuse-values" - "helm-chart-with-space-into-name" + - "helm-reset-then-reuse-values" diff --git a/tests/integration/targets/helm/tasks/main.yml b/tests/integration/targets/helm/tasks/main.yml index 79c2832031..9eb7faea10 100644 --- a/tests/integration/targets/helm/tasks/main.yml +++ b/tests/integration/targets/helm/tasks/main.yml @@ -4,4 +4,4 @@ loop_control: loop_var: helm_version with_items: - - "v3.8.0" + - "v3.16.0" diff --git a/tests/integration/targets/helm/tasks/test_helm_reset_then_reuse_values.yml b/tests/integration/targets/helm/tasks/test_helm_reset_then_reuse_values.yml index 982ad1030c..61c281ef86 100644 --- a/tests/integration/targets/helm/tasks/test_helm_reset_then_reuse_values.yml +++ b/tests/integration/targets/helm/tasks/test_helm_reset_then_reuse_values.yml @@ -1,7 +1,7 @@ --- - name: Test helm reset_then_reuse_values vars: - helm_namespace: "{{ test_namespace[9] }}" + helm_namespace: "{{ test_namespace[11] }}" chart_release_values: replica: replicaCount: 3 @@ -62,7 +62,7 @@ that: - upgrade is changed - '"--reset-then-reuse-values" in upgrade.command' - - '"--reuse-values" not in upgrade.command' + - '"--reuse-values " not in upgrade.command' - '"--reset-values" not in upgrade.command' - release_value["status"]["values"] == chart_release_values | combine(chart_reset_then_reuse_values, recursive=true) diff --git a/tests/integration/targets/helm_diff/tasks/main.yml b/tests/integration/targets/helm_diff/tasks/main.yml index afad7b992a..a1f1f81367 100644 --- a/tests/integration/targets/helm_diff/tasks/main.yml +++ b/tests/integration/targets/helm_diff/tasks/main.yml @@ -10,7 +10,7 @@ binary_path: "{{ helm_binary }}" state: present plugin_path: https://github.com/databus23/helm-diff - plugin_version: 3.4.0 + plugin_version: 3.9.13 - name: Copy test chart copy: diff --git a/tests/integration/targets/helm_diff/tasks/reset_then_reuse_values.yml b/tests/integration/targets/helm_diff/tasks/reset_then_reuse_values.yml index af30cd5c6e..58ffa1b994 100644 --- a/tests/integration/targets/helm_diff/tasks/reset_then_reuse_values.yml +++ b/tests/integration/targets/helm_diff/tasks/reset_then_reuse_values.yml @@ -16,7 +16,7 @@ binary_path: "{{ helm_binary }}" state: present plugin_path: https://github.com/databus23/helm-diff - plugin_version: 3.9.4 + plugin_version: 3.9.14 - name: Copy test chart ansible.builtin.copy: @@ -79,6 +79,92 @@ that: - helm_upgrade is changed + # Delete helm and helm diff to install older version + - name: Uninstall helm diff + helm_plugin: + binary_path: "{{ helm_binary }}" + state: absent + plugin_name: diff + ignore_errors: true + + - name: Delete Helm folders + file: + path: /tmp/helm/ + state: absent + + - name: Init Helm folders + file: + path: /tmp/helm + state: directory + + - name: Set Helm old version + set_fact: + helm_archive_name: "helm-v3.8.0-linux-amd64.tar.gz" + helm_diff_old_version: "3.8.0" + + - name: Unarchive Helm binary + unarchive: + src: "https://get.helm.sh/{{ helm_archive_name | default(helm_default_archive_name) }}" + dest: /tmp/helm/ + remote_src: yes + retries: 10 + delay: 5 + register: result + until: result is not failed + + - name: Upgrade helm release (with reset_then_reuse_values=true) + kubernetes.core.helm: + binary_path: "{{ helm_binary }}" + chart_ref: "{{ test_chart_path }}" + reuse_values: false + reset_then_reuse_values: true + release_name: "{{ test_release_name }}" + release_namespace: "{{ helm_namespace }}" + values: + ansible_version: test + register: helm_upgrade + ignore_errors: true + + - name: Debug + debug: + var: helm_upgrade + + - name: Ensure warning for Helm version + assert: + that: + - helm_upgrade.warnings is defined + - "'helm support option --reset-then-reuse-values starting release >= 3.14.0' in helm_upgrade.warnings" + + - name: Install helm diff + helm_plugin: + binary_path: "{{ helm_binary }}" + state: present + plugin_path: https://github.com/databus23/helm-diff + plugin_version: "{{ helm_diff_old_version }}" + + - name: Upgrade helm release (with reset_then_reuse_values=true) + kubernetes.core.helm: + binary_path: "{{ helm_binary }}" + chart_ref: "{{ test_chart_path }}" + reuse_values: false + reset_then_reuse_values: true + release_name: "{{ test_release_name }}" + release_namespace: "{{ helm_namespace }}" + values: + ansible_version: devel + register: helm_upgrade + ignore_errors: true + + - name: Debug + debug: + var: helm_upgrade + + - name: Ensure warning for Helm Diff version + assert: + that: + - helm_upgrade.warnings is defined + - "'helm diff support option --reset-then-reuse-values starting release >= 3.9.12' in helm_upgrade.warnings" + always: - name: Remove temporary directory file: @@ -99,4 +185,5 @@ kind: Namespace name: "{{ helm_namespace }}" state: absent + wait: true ignore_errors: true diff --git a/tests/integration/targets/helm_diff/tasks/reuse_values.yml b/tests/integration/targets/helm_diff/tasks/reuse_values.yml index f2d80a8f4c..8962fe1282 100644 --- a/tests/integration/targets/helm_diff/tasks/reuse_values.yml +++ b/tests/integration/targets/helm_diff/tasks/reuse_values.yml @@ -90,4 +90,5 @@ kind: Namespace name: "{{ helm_namespace }}" state: absent + wait: true ignore_errors: true diff --git a/tests/integration/targets/install_helm/defaults/main.yml b/tests/integration/targets/install_helm/defaults/main.yml index 6161efb680..19c3c29062 100644 --- a/tests/integration/targets/install_helm/defaults/main.yml +++ b/tests/integration/targets/install_helm/defaults/main.yml @@ -1,4 +1,4 @@ --- -helm_version: v3.8.0 +helm_version: v3.16.4 helm_install_path: /tmp/helm helm_default_archive_name: "helm-{{ helm_version }}-{{ ansible_system | lower }}-amd64.tar.gz" From 330af922e7a40d3440edca18a4fb6ac500ca82df Mon Sep 17 00:00:00 2001 From: "david.bidorff@gmail.com" Date: Sun, 19 Jan 2025 12:47:25 +0100 Subject: [PATCH 3/4] reset_then_reuse_values should fail when requirements are not met --- plugins/modules/helm.py | 18 ++++++++++++------ .../tasks/reset_then_reuse_values.yml | 8 ++++---- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/plugins/modules/helm.py b/plugins/modules/helm.py index a94746a964..b423a054ec 100644 --- a/plugins/modules/helm.py +++ b/plugins/modules/helm.py @@ -540,8 +540,10 @@ def deploy( if reset_then_reuse_values: helm_version = module.get_helm_version() if LooseVersion(helm_version) < LooseVersion("3.14.0"): - module.warn( - "helm support option --reset-then-reuse-values starting release >= 3.14.0" + module.fail_json( + msg="reset_then_reuse_values requires helm >= 3.14.0, current version is {0}".format( + helm_version + ) ) else: deploy_command += " --reset-then-reuse-values" @@ -701,12 +703,16 @@ def helmdiff_check( helm_diff_version = get_plugin_version("diff") helm_version = module.get_helm_version() if LooseVersion(helm_diff_version) < LooseVersion("3.9.12"): - module.warn( - "helm diff support option --reset-then-reuse-values starting release >= 3.9.12" + module.fail_json( + msg="reset_then_reuse_values requires helm diff >= 3.9.12, current version is {0}".format( + helm_diff_version + ) ) elif LooseVersion(helm_version) < LooseVersion("3.14.0"): - module.warn( - "helm support option --reset-then-reuse-values starting release >= 3.14.0" + module.fail_json( + msg="reset_then_reuse_values requires helm >= 3.14.0, current version is {0}".format( + helm_version + ) ) else: cmd += " --reset-then-reuse-values" diff --git a/tests/integration/targets/helm_diff/tasks/reset_then_reuse_values.yml b/tests/integration/targets/helm_diff/tasks/reset_then_reuse_values.yml index 58ffa1b994..d86b9583cc 100644 --- a/tests/integration/targets/helm_diff/tasks/reset_then_reuse_values.yml +++ b/tests/integration/targets/helm_diff/tasks/reset_then_reuse_values.yml @@ -132,8 +132,8 @@ - name: Ensure warning for Helm version assert: that: - - helm_upgrade.warnings is defined - - "'helm support option --reset-then-reuse-values starting release >= 3.14.0' in helm_upgrade.warnings" + - helm_upgrade is failed + - '"reset_then_reuse_values requires helm >= 3.14.0, current version is" in helm_upgrade.msg' - name: Install helm diff helm_plugin: @@ -162,8 +162,8 @@ - name: Ensure warning for Helm Diff version assert: that: - - helm_upgrade.warnings is defined - - "'helm diff support option --reset-then-reuse-values starting release >= 3.9.12' in helm_upgrade.warnings" + - helm_upgrade is failed + - '"reset_then_reuse_values requires helm diff >= 3.9.12, current version is" in helm_upgrade.msg' always: - name: Remove temporary directory From e43b30901c4727fe33ec3fc47d9785b4369f6c5a Mon Sep 17 00:00:00 2001 From: Yuriy Novostavskiy Date: Sun, 19 Jan 2025 14:23:50 +0200 Subject: [PATCH 4/4] refactor module fail for helm_diff_version<3.9.12, helm_version<3.14.0 the main idea to check both versions and print both version in single run before this commit a failed two requrement will cause only single version in error message --- plugins/modules/helm.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins/modules/helm.py b/plugins/modules/helm.py index b423a054ec..9ba548b617 100644 --- a/plugins/modules/helm.py +++ b/plugins/modules/helm.py @@ -702,18 +702,18 @@ def helmdiff_check( if reset_then_reuse_values: helm_diff_version = get_plugin_version("diff") helm_version = module.get_helm_version() + fail_msg = "" if LooseVersion(helm_diff_version) < LooseVersion("3.9.12"): - module.fail_json( - msg="reset_then_reuse_values requires helm diff >= 3.9.12, current version is {0}".format( - helm_diff_version - ) + fail_msg = "reset_then_reuse_values requires helm diff >= 3.9.12, current version is {0}\n".format( + helm_diff_version ) - elif LooseVersion(helm_version) < LooseVersion("3.14.0"): - module.fail_json( - msg="reset_then_reuse_values requires helm >= 3.14.0, current version is {0}".format( - helm_version - ) + if LooseVersion(helm_version) < LooseVersion("3.14.0"): + fail_msg += "reset_then_reuse_values requires helm >= 3.14.0, current version is {0}\n".format( + helm_version ) + + if fail_msg: + module.fail_json(msg=fail_msg) else: cmd += " --reset-then-reuse-values"