From 6e04b20bf48c59697c69bdd766da327f5f406012 Mon Sep 17 00:00:00 2001 From: nishipy <41185206+nishipy@users.noreply.github.com> Date: Thu, 28 Mar 2024 20:31:56 +0900 Subject: [PATCH] Update the logic for deleting pods/containers in podman_play (#727) * Add test case for deleting pod with podman_play Signed-off-by: nishipy * Update test case for deleting pod with podman_play Signed-off-by: nishipy * Add tear_down_pods() for Podman 3.4.0 or later Signed-off-by: nishipy --------- Signed-off-by: nishipy --- plugins/modules/podman_play.py | 34 ++++++++++++++++--- .../targets/podman_play/tasks/main.yml | 23 +++++++++++++ 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/plugins/modules/podman_play.py b/plugins/modules/podman_play.py index d142880..270ec14 100644 --- a/plugins/modules/podman_play.py +++ b/plugins/modules/podman_play.py @@ -187,6 +187,7 @@ except ImportError: HAS_YAML = False from ansible.module_utils.basic import AnsibleModule # noqa: F402 +from ansible_collections.containers.podman.plugins.module_utils.podman.common import LooseVersion, get_podman_version class PodmanKubeManagement: @@ -196,6 +197,7 @@ class PodmanKubeManagement: self.actions = [] self.executable = executable self.command = [self.executable, 'play', 'kube'] + self.version = get_podman_version(module) creds = [] # pod_name = extract_pod_name(module.params['kube_file']) if self.module.params['annotation']: @@ -244,6 +246,22 @@ class PodmanKubeManagement: self.module.log('PODMAN-PLAY-KUBE rc: %s' % rc) return rc, out, err + def tear_down_pods(self): + ''' + Tear down the pod and contaiers by using --down option in kube play + which is supported since Podman 3.4.0 + ''' + changed = False + kube_file = self.module.params['kube_file'] + + rc, out, err = self._command_run([self.executable, "kube", "play", "--down", kube_file]) + if rc != 0: + self.module.fail_json(msg="Failed to delete Pod with %s" % (kube_file)) + else: + changed = True + + return changed, out, err + def discover_pods(self): pod_name = '' if self.module.params['kube_file']: @@ -292,8 +310,12 @@ class PodmanKubeManagement: return changed, out_all, err_all def pod_recreate(self): - pods = self.discover_pods() - self.remove_associated_pods(pods) + if self.version is not None and LooseVersion(self.version) >= LooseVersion('3.4.0'): + self.tear_down_pods() + else: + pods = self.discover_pods() + self.remove_associated_pods(pods) + # Create a pod rc, out, err = self._command_run(self.command) if rc != 0: @@ -357,8 +379,12 @@ def main(): module.params['executable'], required=True) manage = PodmanKubeManagement(module, executable) if module.params['state'] == 'absent': - pods = manage.discover_pods() - changed, out, err = manage.remove_associated_pods(pods) + if manage.version is not None and LooseVersion(manage.version) > LooseVersion('3.4.0'): + manage.module.log(msg="version: %s, kube file %s" % (manage.version, manage.module.params['kube_file'])) + changed, out, err = manage.tear_down_pods() + else: + pods = manage.discover_pods() + changed, out, err = manage.remove_associated_pods(pods) else: changed, out, err = manage.play() results = { diff --git a/tests/integration/targets/podman_play/tasks/main.yml b/tests/integration/targets/podman_play/tasks/main.yml index 984b355..2482815 100644 --- a/tests/integration/targets/podman_play/tasks/main.yml +++ b/tests/integration/targets/podman_play/tasks/main.yml @@ -107,6 +107,29 @@ that: - info1['pods'][0]['State'] == 'Running' + - name: Remove pods created by kube play + containers.podman.podman_play: + executable: "{{ test_executable | default('podman') }}" + kube_file: /tmp/play3.yaml + state: absent + register: remove_pod + + - name: Check if the pod was removed as expected + assert: + that: + - remove_pod is changed + + - name: Get deleted pod info + containers.podman.podman_pod_info: + executable: "{{ test_executable | default('podman') }}" + name: web-deploy-pod + register: nonexist + + - name: Check if the result is as expected + assert: + that: + - nonexist.pods == [] + always: - name: Delete all pods leftovers from tests