Skip to content

Commit

Permalink
Fix pod for Podman v5
Browse files Browse the repository at this point in the history
Signed-off-by: Sagi Shnaidman <[email protected]>
  • Loading branch information
sshnaidm committed Apr 7, 2024
1 parent 75c4834 commit cb74414
Show file tree
Hide file tree
Showing 3 changed files with 172 additions and 66 deletions.
1 change: 0 additions & 1 deletion plugins/module_utils/podman/podman_container_lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -1247,7 +1247,6 @@ def compose(p, h):
[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])
Expand Down
20 changes: 18 additions & 2 deletions plugins/module_utils/podman/podman_pod_lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ def addparam_network_aliases(self, c):
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']]
Expand Down Expand Up @@ -465,23 +465,32 @@ def diffparam_network(self):
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']
if '--network' in cr_com:
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:
Expand All @@ -492,6 +501,11 @@ def diffparam_network(self):
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)

Expand All @@ -507,6 +521,8 @@ def compose(p, h):
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
Expand Down
217 changes: 154 additions & 63 deletions tests/integration/targets/podman_pod/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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 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 - 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 slirp4netns
containers.podman.podman_container:
executable: "{{ test_executable | default('podman') }}"
name: container1
image: alpine
command: top
pod: pod2
state: started
register: slip4net_cont

- name: Check that slirp4netns is idempotent
assert:
that:
- slip4net_pod is not changed
- slip4net_cont is not changed

- 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: 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 slirp4netns tests for podman < 5
when: podman_version < 5
block:

- 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 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 - 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 slirp4netns
containers.podman.podman_container:
executable: "{{ test_executable | default('podman') }}"
name: container1
image: alpine
command: top
pod: pod2
state: started
register: slip4net_cont

- name: Check that slirp4netns is idempotent
assert:
that:
- slip4net_pod is not changed
- slip4net_cont is not changed

- 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: 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:

Expand Down

0 comments on commit cb74414

Please sign in to comment.