From cb74414e506436595a140599c884af8dcbba349f Mon Sep 17 00:00:00 2001 From: Sagi Shnaidman Date: Mon, 8 Apr 2024 01:05:01 +0300 Subject: [PATCH] Fix pod for Podman v5 Signed-off-by: Sagi Shnaidman --- .../podman/podman_container_lib.py | 1 - plugins/module_utils/podman/podman_pod_lib.py | 20 +- .../targets/podman_pod/tasks/main.yml | 203 +++++++++++++----- 3 files changed, 165 insertions(+), 59 deletions(-) diff --git a/plugins/module_utils/podman/podman_container_lib.py b/plugins/module_utils/podman/podman_container_lib.py index 63e19c1..e1d1ede 100644 --- a/plugins/module_utils/podman/podman_container_lib.py +++ b/plugins/module_utils/podman/podman_container_lib.py @@ -1247,7 +1247,6 @@ class PodmanContainerDiff: [str(h["hostport"]), p.replace('/tcp', '')] ).strip(":") if h['hostip'] == '0.0.0.0' and LooseVersion(self.version) >= LooseVersion('5.0.0'): - self.module.log("PODMAN NNNNET %s" % s) return s if h['hostip']: return ":".join([h['hostip'], s]) diff --git a/plugins/module_utils/podman/podman_pod_lib.py b/plugins/module_utils/podman/podman_pod_lib.py index bef0a9d..2058190 100644 --- a/plugins/module_utils/podman/podman_pod_lib.py +++ b/plugins/module_utils/podman/podman_pod_lib.py @@ -267,7 +267,7 @@ class PodmanPodModuleParams: return c def addparam_no_hosts(self, c): - return c + ["=".join('--no-hosts', self.params['no_hosts'])] + return c + ["=".join(['--no-hosts', self.params['no_hosts']])] def addparam_pid(self, c): return c + ['--pid', self.params['pid']] @@ -465,6 +465,7 @@ class PodmanPodDiff: if before == ['podman']: before = [] after = self.params['network'] or [] + after = [i.lower() for i in after] # Special case for options for slirp4netns rootless networking from v2 if net_mode_before == 'slirp4netns' and 'createcommand' in self.info: cr_com = self.info['createcommand'] @@ -472,16 +473,24 @@ class PodmanPodDiff: cr_net = cr_com[cr_com.index('--network') + 1].lower() if 'slirp4netns:' in cr_net: before = [cr_net] + if net_mode_before == 'pasta' and 'createcommand' in self.info: + cr_com = self.info['createcommand'] + if '--network' in cr_com: + cr_net = cr_com[cr_com.index('--network') + 1].lower() + if 'pasta:' in cr_net: + before = [cr_net] # Currently supported only 'host' and 'none' network modes idempotency - if after in [['bridge'], ['host'], ['slirp4netns']]: + if after in [['bridge'], ['host'], ['slirp4netns'], ['pasta']]: net_mode_after = after[0] if net_mode_after and not before: # Remove differences between v1 and v2 net_mode_after = net_mode_after.replace('bridge', 'default') net_mode_after = net_mode_after.replace('slirp4netns', 'default') + net_mode_after = net_mode_after.replace('pasta', 'default') net_mode_before = net_mode_before.replace('bridge', 'default') net_mode_before = net_mode_before.replace('slirp4netns', 'default') + net_mode_before = net_mode_before.replace('pasta', 'default') return self._diff_update_and_compare('network', net_mode_before, net_mode_after) # For 4.4.0+ podman versions with no network specified if not net_mode_after and net_mode_before == 'slirp4netns' and not after: @@ -492,6 +501,11 @@ class PodmanPodDiff: net_mode_after = 'bridge' if before == ['bridge']: after = ['bridge'] + # For pasta networking for Podman v5 + if not net_mode_after and net_mode_before == 'pasta' and not after: + net_mode_after = 'pasta' + if before == ['pasta']: + after = ['pasta'] before, after = sorted(list(set(before))), sorted(list(set(after))) return self._diff_update_and_compare('network', before, after) @@ -507,6 +521,8 @@ class PodmanPodDiff: s = ":".join( [str(h["hostport"]), p.replace('/tcp', '')] ).strip(":") + if h['hostip'] == '0.0.0.0' and LooseVersion(self.version) >= LooseVersion('5.0.0'): + return s if h['hostip']: return ":".join([h['hostip'], s]) return s diff --git a/tests/integration/targets/podman_pod/tasks/main.yml b/tests/integration/targets/podman_pod/tasks/main.yml index abee175..d33e949 100644 --- a/tests/integration/targets/podman_pod/tasks/main.yml +++ b/tests/integration/targets/podman_pod/tasks/main.yml @@ -15,6 +15,21 @@ podman_version: 2 when: podman_v.stdout is version('2.0.0', '>=') + - name: Set podman version to 3 + set_fact: + podman_version: 3 + when: podman_v.stdout is version('3.0.0', '>=') + + - name: Set podman version to 4 + set_fact: + podman_version: 4 + when: podman_v.stdout is version('4.0.0', '>=') + + - name: Set podman version to 5 + set_fact: + podman_version: 5 + when: podman_v.stdout is version('5.0.0', '>=') + - name: Discover cgroups version shell: podman info | grep cgroupVersion | awk {'print $2'} register: cgroups @@ -153,6 +168,7 @@ pod6_info.pod['State']['status'] == 'Exited') or (pod6_info.pod['State']['status'] is not defined and pod6_info.pod['State'] == 'Exited') + when: podman_version < 5 - name: Start pod containers.podman.podman_pod: @@ -826,69 +842,144 @@ that: - not podsys2_stat.stat.exists|bool - - name: Run pod2 with network slirp4netns - containers.podman.podman_pod: - executable: "{{ test_executable | default('podman') }}" - name: pod2 - state: started - network: slirp4netns:outbound_addr=10.10.10.46 + - name: Run slirp4netns tests for podman < 5 + when: podman_version < 5 + block: - - name: Run container1 in pod - containers.podman.podman_container: - executable: "{{ test_executable | default('podman') }}" - name: container1 - image: alpine - command: top - pod: pod2 - state: started + - name: Run pod2 with network slirp4netns + containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" + name: pod2 + state: started + network: slirp4netns:outbound_addr=10.10.10.46 - - name: Run pod2 with network slirp4netns - again - containers.podman.podman_pod: - executable: "{{ test_executable | default('podman') }}" - name: pod2 - state: started - network: slirp4netns:outbound_addr=10.10.10.46 - register: slip4net_pod + - name: Run container1 in pod + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container1 + image: alpine + command: top + pod: pod2 + state: started - - name: Run container1 in pod slirp4netns - containers.podman.podman_container: - executable: "{{ test_executable | default('podman') }}" - name: container1 - image: alpine - command: top - pod: pod2 - state: started - register: slip4net_cont + - name: Run pod2 with network slirp4netns - again + containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" + name: pod2 + state: started + network: slirp4netns:outbound_addr=10.10.10.46 + register: slip4net_pod - - name: Check that slirp4netns is idempotent - assert: - that: - - slip4net_pod is not changed - - slip4net_cont is not changed + - name: Run container1 in pod slirp4netns + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container1 + image: alpine + command: top + pod: pod2 + state: started + register: slip4net_cont - - name: Run pod2 with different network slirp4netns - containers.podman.podman_pod: - executable: "{{ test_executable | default('podman') }}" - name: pod2 - state: started - network: slirp4netns:outbound_addr=10.10.10.47 - register: slip4net_pod2 + - name: Check that slirp4netns is idempotent + assert: + that: + - slip4net_pod is not changed + - slip4net_cont is not changed - - name: Run container1 in different pod slirp4netns - containers.podman.podman_container: - executable: "{{ test_executable | default('podman') }}" - name: container1 - image: alpine - command: top - pod: pod2 - state: started - register: slip4net_cont2 + - name: Run pod2 with different network slirp4netns + containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" + name: pod2 + state: started + network: slirp4netns:outbound_addr=10.10.10.47 + register: slip4net_pod2 - - name: Check that slirp4netns is idempotent and changed - assert: - that: - - slip4net_pod2 is changed - - slip4net_cont2 is changed + - name: Run container1 in different pod slirp4netns + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container1 + image: alpine + command: top + pod: pod2 + state: started + register: slip4net_cont2 + + - name: Check that slirp4netns is idempotent and changed + assert: + that: + - slip4net_pod2 is changed + - slip4net_cont2 is changed + + - name: Run pasta tests for podman >= 5 + when: podman_version >= 5 + block: + + - name: Run pod2 with network pasta + containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" + name: pod2 + state: started + network: + - "pasta:-4,-t,8007,-u,4443,-T,3000" + + - name: Run container1 in pod + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container1 + image: alpine + command: top + pod: pod2 + state: started + + - name: Run pod2 with network pasta - again + containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" + name: pod2 + state: started + network: + - "pasta:-4,-t,8007,-u,4443,-T,3000" + register: pasta_pod + + - name: Run container1 in pod pasta + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container1 + image: alpine + command: top + pod: pod2 + state: started + register: pasta_cont + + - name: Check that pasta is idempotent + assert: + that: + - pasta_pod is not changed + - pasta_cont is not changed + + - name: Run pod2 with different network pasta + containers.podman.podman_pod: + executable: "{{ test_executable | default('podman') }}" + name: pod2 + state: started + network: + - "pasta:-4,-t,8008,-u,4443,-T,3000" + register: pasta_pod2 + + - name: Run container1 in different pod slirp4netns + containers.podman.podman_container: + executable: "{{ test_executable | default('podman') }}" + name: container1 + image: alpine + command: top + pod: pod2 + state: started + register: pasta_cont2 + + - name: Check that slirp4netns is idempotent and changed + assert: + that: + - pasta_pod2 is changed + - pasta_cont2 is changed always: