Improve idempotency for podman_container

Fix idempotency issues for containers in pods.
Fix problem with options configured in images, like user, workdir,
etc.
Add tests.

(cherry picked from commit 14aae2b43f)
Change-Id: I5891c573dc969b9e239f65c2ce81404f68b6558e
This commit is contained in:
Sagi Shnaidman 2020-05-11 15:20:17 +03:00
parent c8dc1a7829
commit cd91e7086c
3 changed files with 72 additions and 11 deletions

View File

@ -1265,7 +1265,6 @@ class PodmanDefaults:
self.defaults = {
"blkio_weight": 0,
"cgroups": "default",
"cgroup_parent": "",
"cidfile": "",
"cpus": 0.0,
"cpu_shares": 0,
@ -1295,16 +1294,16 @@ class PodmanDefaults:
"privileged": False,
"rm": False,
"security_opt": [],
"stop_signal": 15,
"tty": False,
"user": "",
"uts": "",
"volume": [],
"workdir": "/",
}
def default_dict(self):
# make here any changes to self.defaults related to podman version
# https://github.com/containers/libpod/pull/5669
if (LooseVersion(self.version) >= LooseVersion('1.8.0')
and LooseVersion(self.version) < LooseVersion('1.9.0')):
self.defaults['cpu_shares'] = 1024
return self.defaults
@ -1389,6 +1388,8 @@ class PodmanContainerDiff:
def diffparam_cgroup_parent(self):
before = self.info['hostconfig']['cgroupparent']
after = self.params['cgroup_parent']
if after is None:
after = before
return self._diff_update_and_compare('cgroup_parent', before, after)
def diffparam_cgroups(self):
@ -1541,6 +1542,8 @@ class PodmanContainerDiff:
def diffparam_ipc(self):
before = self.info['hostconfig']['ipcmode']
after = self.params['ipc']
if self.params['pod'] and not after:
after = before
return self._diff_update_and_compare('ipc', before, after)
def diffparam_label(self):
@ -1590,6 +1593,8 @@ class PodmanContainerDiff:
def diffparam_network(self):
before = [self.info['hostconfig']['networkmode']]
after = self.params['network']
if self.params['pod'] and not self.module.params['network']:
after = before
return self._diff_update_and_compare('network', before, after)
def diffparam_no_hosts(self):
@ -1628,6 +1633,8 @@ class PodmanContainerDiff:
def diffparam_stop_signal(self):
before = self.info['config']['stopsignal']
after = self.params['stop_signal']
if after is None:
after = before
return self._diff_update_and_compare('stop_signal', before, after)
def diffparam_tty(self):
@ -1637,15 +1644,16 @@ class PodmanContainerDiff:
def diffparam_user(self):
before = self.info['config']['user']
if self.module.params['user'] is None and before:
after = self.params['user']
if after is None:
after = before
else:
after = self.params['user']
return self._diff_update_and_compare('user', before, after)
def diffparam_uts(self):
before = self.info['hostconfig']['utsmode']
after = self.params['uts']
if self.params['pod'] and not after:
after = before
return self._diff_update_and_compare('uts', before, after)
def diffparam_volume(self):
@ -1659,18 +1667,24 @@ class PodmanContainerDiff:
volumes.append([m['source'], m['destination']])
before = [":".join(v) for v in volumes]
# Ignore volumes option for idempotency
after = [":".join(v.split(":")[:2]) for v in self.params['volume']]
if self.params['volume'] is not None:
after = [":".join(v.split(":")[:2]) for v in self.params['volume']]
else:
after = before
before, after = sorted(list(set(before))), sorted(list(set(after)))
return self._diff_update_and_compare('volume', before, after)
def diffparam_volumes_from(self):
before = self.info['hostconfig']['volumesfrom'] or []
# Possibly volumesfrom is not in config
before = self.info['hostconfig'].get('volumesfrom', []) or []
after = self.params['volumes_from'] or []
return self._diff_update_and_compare('volumes_from', before, after)
def diffparam_workdir(self):
before = self.info['config']['workingdir']
after = self.params['workdir']
if after is None:
after = before
return self._diff_update_and_compare('workdir', before, after)
def is_different(self):
@ -1773,11 +1787,13 @@ class PodmanContainer:
def get_info(self):
"""Inspect container and gather info about it."""
# pylint: disable=unused-variable
rc, out, err = self.module.run_command(
[self.module.params['executable'], b'container', b'inspect', self.name])
return json.loads(out)[0] if rc == 0 else {}
def _get_podman_version(self):
# pylint: disable=unused-variable
rc, out, err = self.module.run_command(
[self.module.params['executable'], b'--version'])
if rc != 0 or not out or "version" not in out:

View File

@ -264,7 +264,6 @@
BAR: foo
TEST: 1
BOOL: false
group_add: "somegroup"
label:
somelabel: labelvalue
otheralbe: othervalue
@ -382,6 +381,48 @@
that:
- "'podman rm -f testidem' in remove.podman_actions"
- name: Check basic idempotency of pod container
podman_container:
name: testidem-pod
image: docker.io/alpine
state: present
command: sleep 20m
pod: "new:testidempod"
- name: Check basic idempotency of pod container - run it again
podman_container:
name: testidem-pod
image: alpine:latest
state: present
command: sleep 20m
pod: testidempod
register: idem
- name: Check that nothing was changed in pod containers
assert:
that:
- not idem.changed
- name: Run changed pod container (with tty enabled)
podman_container:
name: testidem-pod
image: alpine
state: present
command: sleep 20m
tty: true
pod: testidempod
register: idem1
- name: Check that container is recreated when changed
assert:
that:
- idem1 is changed
- name: Remove container
podman_container:
name: testidem-pod
state: absent
always:
- name: Delete all container leftovers from tests
podman_container:
@ -391,3 +432,6 @@
- "alpine:3.7"
- "container"
- "container2"
- name: Remove pod
shell: podman pod rm -f testidempod

View File

@ -27,6 +27,7 @@
command: podman version
register: p_ver
changed_when: false
become: true
- name: Print podman version
debug: