From e1e4e7516a0202107e185ff1ae45a0ea01c773a7 Mon Sep 17 00:00:00 2001 From: Sergey <6213510+sshnaidm@users.noreply.github.com> Date: Wed, 22 May 2024 22:08:57 +0300 Subject: [PATCH] Add idempotency for mounts and volumes (#753) Signed-off-by: Sagi Shnaidman --- .../podman/podman_container_lib.py | 46 ++++---- .../tasks/idem_volumes.yml | 100 +++++++++++++++++- 2 files changed, 119 insertions(+), 27 deletions(-) diff --git a/plugins/module_utils/podman/podman_container_lib.py b/plugins/module_utils/podman/podman_container_lib.py index d31e6ba..71beb7b 100644 --- a/plugins/module_utils/podman/podman_container_lib.py +++ b/plugins/module_utils/podman/podman_container_lib.py @@ -1217,6 +1217,9 @@ class PodmanContainerDiff: def diffparam_healthcheck_timeout(self): return self._diff_generic('healthcheck_timeout', '--healthcheck-timeout') + def diffparam_hooks_dir(self): + return self._diff_generic('hooks_dir', '--hooks-dir') + def diffparam_hostname(self): return self._diff_generic('hostname', '--hostname') @@ -1308,6 +1311,9 @@ class PodmanContainerDiff: def diffparam_memory_swappiness(self): return self._diff_generic('memory_swappiness', '--memory-swappiness') + def diffparam_mount(self): + return self._diff_generic('mount', '--mount') + def diffparam_network(self): net_mode_before = self.info['hostconfig']['networkmode'] net_mode_after = '' @@ -1529,32 +1535,22 @@ class PodmanContainerDiff: return "/" return x.replace("//", "/").rstrip("/") - before = self.info['mounts'] - before_local_vols = [] - if before: - volumes = [] - local_vols = [] - for m in before: - if m['type'] != 'volume': - volumes.append( - [ - clean_volume(m['source']), - clean_volume(m['destination']) - ]) - elif m['type'] == 'volume': - local_vols.append( - [m['name'], clean_volume(m['destination'])]) - before = [":".join(v) for v in volumes] - before_local_vols = [":".join(v) for v in local_vols] - if self.params['volume'] is not None: + before = self._createcommand('--volume') + if before == []: + before = None + after = self.params['volume'] + if after is not None: after = [":".join( - [clean_volume(i) for i in v.split(":")[:2]] - ) for v in self.params['volume']] - else: - after = [] - if before_local_vols: - after = list(set(after).difference(before_local_vols)) - before, after = sorted(list(set(before))), sorted(list(set(after))) + [clean_volume(i) for i in v.split(":")[:2]]) for v in self.params['volume']] + if before is not None: + before = [":".join([clean_volume(i) for i in v.split(":")[:2]]) for v in before] + self.module.log("PODMAN Before: %s and After: %s" % (before, after)) + if before is None and after is None: + return self._diff_update_and_compare('volume', before, after) + if after is not None: + after = ",".join(sorted([str(i).lower() for i in after])) + if before: + before = ",".join(sorted([str(i).lower() for i in before])) return self._diff_update_and_compare('volume', before, after) def diffparam_volumes_from(self): diff --git a/tests/integration/targets/podman_container_idempotency/tasks/idem_volumes.yml b/tests/integration/targets/podman_container_idempotency/tasks/idem_volumes.yml index 3fff4e3..26e7040 100644 --- a/tests/integration/targets/podman_container_idempotency/tasks/idem_volumes.yml +++ b/tests/integration/targets/podman_container_idempotency/tasks/idem_volumes.yml @@ -126,7 +126,7 @@ - name: check test9 assert: - that: test9 is not changed + that: test9 is changed - name: Create volumes shell: | @@ -190,7 +190,7 @@ - name: check test13 assert: - that: test13 is not changed + that: test13 is changed - containers.podman.podman_container: executable: "{{ test_executable | default('podman') }}" @@ -253,3 +253,99 @@ - name: check test17 assert: that: test17 is not changed + +- containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + image: alpine + name: idempotency1 + state: present + command: sleep 1h + mounts: + - "type=bind,source=/tmp,destination=/tmp" + register: test18 + +- name: check test18 + assert: + that: test18 is changed + +- containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + image: alpine + name: idempotency1 + state: present + command: sleep 1h + mounts: + - "type=bind,source=/tmp,destination=/tmp" + register: test19 + +- name: check test19 + assert: + that: test19 is not changed + +- containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + image: alpine + name: idempotency1 + state: present + command: sleep 1h + mounts: + - "type=bind,source=/tmp,destination=/tmp" + - "type=bind,source=/var,destination=/var" + volumes: + - /opt:/data + - "local_volume2:/data2" + register: test20 + +- name: check test20 + assert: + that: test20 is changed + +- containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + image: alpine + name: idempotency1 + state: present + command: sleep 1h + mounts: + - "type=bind,source=/tmp,destination=/tmp" + - "type=bind,source=/var,destination=/var" + volumes: + - /opt:/data + - "local_volume2:/data2" + register: test21 + +- name: check test21 + assert: + that: test21 is not changed + +- containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + image: alpine + name: idempotency1 + state: present + command: sleep 1h + mounts: + - "type=bind,source=/tmp,destination=/tmp" + volumes: + - /opt:/data + register: test22 + +- name: check test22 + assert: + that: test22 is changed + +- containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + image: alpine + name: idempotency1 + state: present + command: sleep 1h + mounts: + - "type=bind,source=/tmp,destination=/tmp" + volumes: + - /opt:/data + register: test23 + +- name: check test23 + assert: + that: test23 is not changed