Merge "Update podman_container from the collection" into stable/train
This commit is contained in:
commit
e6dcd0d4b9
|
@ -15,6 +15,7 @@
|
||||||
# under the License.
|
# under the License.
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
import json # noqa: F402
|
import json # noqa: F402
|
||||||
|
import shlex # noqa: F402
|
||||||
from distutils.version import LooseVersion # noqa: F402
|
from distutils.version import LooseVersion # noqa: F402
|
||||||
|
|
||||||
from ansible.module_utils._text import to_bytes, to_native # noqa: F402
|
from ansible.module_utils._text import to_bytes, to_native # noqa: F402
|
||||||
|
@ -53,7 +54,7 @@ ARGUMENTS_SPEC_CONTAINER = dict(
|
||||||
cpuset_mems=dict(type='str'),
|
cpuset_mems=dict(type='str'),
|
||||||
detach=dict(type='bool', default=True),
|
detach=dict(type='bool', default=True),
|
||||||
debug=dict(type='bool', default=False),
|
debug=dict(type='bool', default=False),
|
||||||
detach_keys=dict(type='str'),
|
detach_keys=dict(type='str', no_log=False),
|
||||||
device=dict(type='list', elements='str'),
|
device=dict(type='list', elements='str'),
|
||||||
device_read_bps=dict(type='list'),
|
device_read_bps=dict(type='list'),
|
||||||
device_read_iops=dict(type='list'),
|
device_read_iops=dict(type='list'),
|
||||||
|
@ -71,7 +72,7 @@ ARGUMENTS_SPEC_CONTAINER = dict(
|
||||||
'exposed', 'exposed_ports']),
|
'exposed', 'exposed_ports']),
|
||||||
force_restart=dict(type='bool', default=False,
|
force_restart=dict(type='bool', default=False,
|
||||||
aliases=['restart']),
|
aliases=['restart']),
|
||||||
gidmap=dict(type='str'),
|
gidmap=dict(type='list', elements='str'),
|
||||||
group_add=dict(type='list', aliases=['groups']),
|
group_add=dict(type='list', aliases=['groups']),
|
||||||
healthcheck=dict(type='str'),
|
healthcheck=dict(type='str'),
|
||||||
healthcheck_interval=dict(type='str'),
|
healthcheck_interval=dict(type='str'),
|
||||||
|
@ -95,7 +96,11 @@ ARGUMENTS_SPEC_CONTAINER = dict(
|
||||||
log_level=dict(
|
log_level=dict(
|
||||||
type='str',
|
type='str',
|
||||||
choices=["debug", "info", "warn", "error", "fatal", "panic"]),
|
choices=["debug", "info", "warn", "error", "fatal", "panic"]),
|
||||||
log_opt=dict(type='str', aliases=['log_options']),
|
log_opt=dict(type='dict', aliases=['log_options'],
|
||||||
|
options=dict(
|
||||||
|
max_size=dict(type='str'),
|
||||||
|
path=dict(type='str'),
|
||||||
|
tag=dict(type='str'))),
|
||||||
mac_address=dict(type='str'),
|
mac_address=dict(type='str'),
|
||||||
memory=dict(type='str'),
|
memory=dict(type='str'),
|
||||||
memory_reservation=dict(type='str'),
|
memory_reservation=dict(type='str'),
|
||||||
|
@ -127,10 +132,10 @@ ARGUMENTS_SPEC_CONTAINER = dict(
|
||||||
subgidname=dict(type='str'),
|
subgidname=dict(type='str'),
|
||||||
subuidname=dict(type='str'),
|
subuidname=dict(type='str'),
|
||||||
sysctl=dict(type='dict'),
|
sysctl=dict(type='dict'),
|
||||||
systemd=dict(type='bool'),
|
systemd=dict(type='str'),
|
||||||
tmpfs=dict(type='dict'),
|
tmpfs=dict(type='dict'),
|
||||||
tty=dict(type='bool'),
|
tty=dict(type='bool'),
|
||||||
uidmap=dict(type='list'),
|
uidmap=dict(type='list', elements='str'),
|
||||||
ulimit=dict(type='list', aliases=['ulimits']),
|
ulimit=dict(type='list', aliases=['ulimits']),
|
||||||
user=dict(type='str'),
|
user=dict(type='str'),
|
||||||
userns=dict(type='str', aliases=['userns_mode']),
|
userns=dict(type='str', aliases=['userns_mode']),
|
||||||
|
@ -337,7 +342,9 @@ class PodmanModuleParams:
|
||||||
return c
|
return c
|
||||||
|
|
||||||
def addparam_gidmap(self, c):
|
def addparam_gidmap(self, c):
|
||||||
return c + ['--gidmap', self.params['gidmap']]
|
for gidmap in self.params['gidmap']:
|
||||||
|
c += ['--gidmap', gidmap]
|
||||||
|
return c
|
||||||
|
|
||||||
def addparam_group_add(self, c):
|
def addparam_group_add(self, c):
|
||||||
for g in self.params['group_add']:
|
for g in self.params['group_add']:
|
||||||
|
@ -405,7 +412,14 @@ class PodmanModuleParams:
|
||||||
return c + ['--log-driver', self.params['log_driver']]
|
return c + ['--log-driver', self.params['log_driver']]
|
||||||
|
|
||||||
def addparam_log_opt(self, c):
|
def addparam_log_opt(self, c):
|
||||||
return c + ['--log-opt', self.params['log_opt']]
|
for k, v in self.params['log_opt'].items():
|
||||||
|
if v is not None:
|
||||||
|
c += ['--log-opt',
|
||||||
|
b"=".join([to_bytes(k.replace('max_size', 'max-size'),
|
||||||
|
errors='surrogate_or_strict'),
|
||||||
|
to_bytes(v,
|
||||||
|
errors='surrogate_or_strict')])]
|
||||||
|
return c
|
||||||
|
|
||||||
def addparam_log_level(self, c):
|
def addparam_log_level(self, c):
|
||||||
return c + ['--log-level', self.params['log_level']]
|
return c + ['--log-level', self.params['log_level']]
|
||||||
|
@ -508,7 +522,7 @@ class PodmanModuleParams:
|
||||||
return c
|
return c
|
||||||
|
|
||||||
def addparam_systemd(self, c):
|
def addparam_systemd(self, c):
|
||||||
return c + ['--systemd=%s' % self.params['systemd']]
|
return c + ['--systemd=%s' % str(self.params['systemd']).lower()]
|
||||||
|
|
||||||
def addparam_tmpfs(self, c):
|
def addparam_tmpfs(self, c):
|
||||||
for tmpfs in self.params['tmpfs'].items():
|
for tmpfs in self.params['tmpfs'].items():
|
||||||
|
@ -610,6 +624,8 @@ class PodmanDefaults:
|
||||||
self.defaults['ipc'] = "private"
|
self.defaults['ipc'] = "private"
|
||||||
self.defaults['uts'] = "private"
|
self.defaults['uts'] = "private"
|
||||||
self.defaults['pid'] = "private"
|
self.defaults['pid'] = "private"
|
||||||
|
if (LooseVersion(self.version) >= LooseVersion('3.0.0')):
|
||||||
|
self.defaults['log_level'] = "warning"
|
||||||
return self.defaults
|
return self.defaults
|
||||||
|
|
||||||
|
|
||||||
|
@ -623,10 +639,7 @@ class PodmanContainerDiff:
|
||||||
self.image_info = lower_keys(image_info)
|
self.image_info = lower_keys(image_info)
|
||||||
self.params = self.defaultize()
|
self.params = self.defaultize()
|
||||||
self.diff = {'before': {}, 'after': {}}
|
self.diff = {'before': {}, 'after': {}}
|
||||||
self.non_idempotent = {
|
self.non_idempotent = {}
|
||||||
'env_file', # We can't get env vars from file to check
|
|
||||||
'env_host',
|
|
||||||
}
|
|
||||||
|
|
||||||
def defaultize(self):
|
def defaultize(self):
|
||||||
params_with_defaults = {}
|
params_with_defaults = {}
|
||||||
|
@ -674,21 +687,27 @@ class PodmanContainerDiff:
|
||||||
|
|
||||||
def diffparam_cap_add(self):
|
def diffparam_cap_add(self):
|
||||||
before = self.info['effectivecaps'] or []
|
before = self.info['effectivecaps'] or []
|
||||||
|
before = [i.lower() for i in before]
|
||||||
after = []
|
after = []
|
||||||
if self.module_params['cap_add'] is not None:
|
if self.module_params['cap_add'] is not None:
|
||||||
after += ["cap_" + i.lower()
|
for cap in self.module_params['cap_add']:
|
||||||
for i in self.module_params['cap_add']]
|
cap = cap.lower()
|
||||||
|
cap = cap if cap.startswith('cap_') else 'cap_' + cap
|
||||||
|
after.append(cap)
|
||||||
after += before
|
after += before
|
||||||
before, after = sorted(list(set(before))), sorted(list(set(after)))
|
before, after = sorted(list(set(before))), sorted(list(set(after)))
|
||||||
return self._diff_update_and_compare('cap_add', before, after)
|
return self._diff_update_and_compare('cap_add', before, after)
|
||||||
|
|
||||||
def diffparam_cap_drop(self):
|
def diffparam_cap_drop(self):
|
||||||
before = self.info['effectivecaps'] or []
|
before = self.info['effectivecaps'] or []
|
||||||
|
before = [i.lower() for i in before]
|
||||||
after = before[:]
|
after = before[:]
|
||||||
if self.module_params['cap_drop'] is not None:
|
if self.module_params['cap_drop'] is not None:
|
||||||
for c in ["cap_" + i.lower() for i in self.module_params['cap_drop']]:
|
for cap in self.module_params['cap_drop']:
|
||||||
if c in after:
|
cap = cap.lower()
|
||||||
after.remove(c)
|
cap = cap if cap.startswith('cap_') else 'cap_' + cap
|
||||||
|
if cap in after:
|
||||||
|
after.remove(cap)
|
||||||
before, after = sorted(list(set(before))), sorted(list(set(after)))
|
before, after = sorted(list(set(before))), sorted(list(set(after)))
|
||||||
return self._diff_update_and_compare('cap_drop', before, after)
|
return self._diff_update_and_compare('cap_drop', before, after)
|
||||||
|
|
||||||
|
@ -718,9 +737,7 @@ class PodmanContainerDiff:
|
||||||
before = self.info['config']['cmd']
|
before = self.info['config']['cmd']
|
||||||
after = self.params['command']
|
after = self.params['command']
|
||||||
if isinstance(after, str):
|
if isinstance(after, str):
|
||||||
after = [i.lower() for i in after.split()]
|
after = shlex.split(after)
|
||||||
elif isinstance(after, list):
|
|
||||||
after = [i.lower() for i in after]
|
|
||||||
return self._diff_update_and_compare('command', before, after)
|
return self._diff_update_and_compare('command', before, after)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -809,10 +826,7 @@ class PodmanContainerDiff:
|
||||||
for i in env_before}
|
for i in env_before}
|
||||||
after = before.copy()
|
after = before.copy()
|
||||||
if self.params['env']:
|
if self.params['env']:
|
||||||
after.update({
|
after.update(self.params['env'])
|
||||||
k: v
|
|
||||||
for k, v in self.params['env'].items()
|
|
||||||
})
|
|
||||||
return self._diff_update_and_compare('env', before, after)
|
return self._diff_update_and_compare('env', before, after)
|
||||||
|
|
||||||
def diffparam_etc_hosts(self):
|
def diffparam_etc_hosts(self):
|
||||||
|
@ -877,7 +891,7 @@ class PodmanContainerDiff:
|
||||||
after = self.image_info.get('labels') or {}
|
after = self.image_info.get('labels') or {}
|
||||||
if self.params['label']:
|
if self.params['label']:
|
||||||
after.update({
|
after.update({
|
||||||
str(k).lower(): str(v).lower()
|
str(k).lower(): str(v)
|
||||||
for k, v in self.params['label'].items()
|
for k, v in self.params['label'].items()
|
||||||
})
|
})
|
||||||
return self._diff_update_and_compare('label', before, after)
|
return self._diff_update_and_compare('label', before, after)
|
||||||
|
@ -896,15 +910,55 @@ class PodmanContainerDiff:
|
||||||
after = self.params['log_level']
|
after = self.params['log_level']
|
||||||
return self._diff_update_and_compare('log_level', before, after)
|
return self._diff_update_and_compare('log_level', before, after)
|
||||||
|
|
||||||
# Parameter has limited idempotency, unable to guess the default log_path
|
# Parameter has limited idempotency
|
||||||
def diffparam_log_opt(self):
|
def diffparam_log_opt(self):
|
||||||
before = self.info['logpath']
|
before, after = {}, {}
|
||||||
if self.module_params['log_opt'] in [None, '']:
|
# Log path
|
||||||
after = before
|
path_before = None
|
||||||
else:
|
if 'logpath' in self.info:
|
||||||
after = self.params['log_opt'].split("=")[1]
|
path_before = self.info['logpath']
|
||||||
|
# For Podman v3
|
||||||
|
if ('logconfig' in self.info['hostconfig']
|
||||||
|
and 'path' in self.info['hostconfig']['logconfig']):
|
||||||
|
path_before = self.info['hostconfig']['logconfig']['path']
|
||||||
|
if path_before is not None:
|
||||||
|
if (self.module_params['log_opt']
|
||||||
|
and 'path' in self.module_params['log_opt']
|
||||||
|
and self.module_params['log_opt']['path'] is not None):
|
||||||
|
path_after = self.params['log_opt']['path']
|
||||||
|
else:
|
||||||
|
path_after = path_before
|
||||||
|
if path_before != path_after:
|
||||||
|
before.update({'log-path': path_before})
|
||||||
|
after.update({'log-path': path_after})
|
||||||
|
# Log tag
|
||||||
|
tag_before = None
|
||||||
|
if 'logtag' in self.info:
|
||||||
|
tag_before = self.info['logtag']
|
||||||
|
# For Podman v3
|
||||||
|
if ('logconfig' in self.info['hostconfig']
|
||||||
|
and 'tag' in self.info['hostconfig']['logconfig']):
|
||||||
|
tag_before = self.info['hostconfig']['logconfig']['tag']
|
||||||
|
if tag_before is not None:
|
||||||
|
if (self.module_params['log_opt']
|
||||||
|
and 'tag' in self.module_params['log_opt']
|
||||||
|
and self.module_params['log_opt']['tag'] is not None):
|
||||||
|
tag_after = self.params['log_opt']['tag']
|
||||||
|
else:
|
||||||
|
tag_after = ''
|
||||||
|
if tag_before != tag_after:
|
||||||
|
before.update({'log-tag': tag_before})
|
||||||
|
after.update({'log-tag': tag_after})
|
||||||
return self._diff_update_and_compare('log_opt', before, after)
|
return self._diff_update_and_compare('log_opt', before, after)
|
||||||
|
|
||||||
|
def diffparam_mac_address(self):
|
||||||
|
before = str(self.info['networksettings']['macaddress'])
|
||||||
|
if self.module_params['mac_address'] is not None:
|
||||||
|
after = self.params['mac_address']
|
||||||
|
else:
|
||||||
|
after = before
|
||||||
|
return self._diff_update_and_compare('mac_address', before, after)
|
||||||
|
|
||||||
def diffparam_memory(self):
|
def diffparam_memory(self):
|
||||||
before = str(self.info['hostconfig']['memory'])
|
before = str(self.info['hostconfig']['memory'])
|
||||||
after = self.params['memory']
|
after = self.params['memory']
|
||||||
|
@ -929,6 +983,16 @@ class PodmanContainerDiff:
|
||||||
net_mode_before = self.info['hostconfig']['networkmode']
|
net_mode_before = self.info['hostconfig']['networkmode']
|
||||||
net_mode_after = ''
|
net_mode_after = ''
|
||||||
before = list(self.info['networksettings'].get('networks', {}))
|
before = list(self.info['networksettings'].get('networks', {}))
|
||||||
|
# Remove default 'podman' network in v3 for comparison
|
||||||
|
if before == ['podman']:
|
||||||
|
before = []
|
||||||
|
# Special case for options for slirp4netns rootless networking from v2
|
||||||
|
if net_mode_before == 'slirp4netns' and 'createcommand' in self.info['config']:
|
||||||
|
cr_com = self.info['config']['createcommand']
|
||||||
|
if '--network' in cr_com:
|
||||||
|
cr_net = cr_com[cr_com.index('--network') + 1].lower()
|
||||||
|
if 'slirp4netns:' in cr_net:
|
||||||
|
before = [cr_net]
|
||||||
after = self.params['network'] or []
|
after = self.params['network'] or []
|
||||||
# If container is in pod and no networks are provided
|
# If container is in pod and no networks are provided
|
||||||
if not self.module_params['network'] and self.params['pod']:
|
if not self.module_params['network'] and self.params['pod']:
|
||||||
|
@ -950,6 +1014,9 @@ class PodmanContainerDiff:
|
||||||
|
|
||||||
def diffparam_no_hosts(self):
|
def diffparam_no_hosts(self):
|
||||||
before = not bool(self.info['hostspath'])
|
before = not bool(self.info['hostspath'])
|
||||||
|
# For newer verions of Podman
|
||||||
|
if 'resolvconfpath' in self.info:
|
||||||
|
before = not bool(self.info['resolvconfpath'])
|
||||||
after = self.params['no_hosts']
|
after = self.params['no_hosts']
|
||||||
if self.params['network'] == ['none']:
|
if self.params['network'] == ['none']:
|
||||||
after = True
|
after = True
|
||||||
|
@ -972,18 +1039,27 @@ class PodmanContainerDiff:
|
||||||
|
|
||||||
# TODO(sshnaidm) Need to add port ranges support
|
# TODO(sshnaidm) Need to add port ranges support
|
||||||
def diffparam_publish(self):
|
def diffparam_publish(self):
|
||||||
|
def compose(p, h):
|
||||||
|
s = ":".join(
|
||||||
|
[str(h["hostport"]), p.replace('/tcp', '')]
|
||||||
|
).strip(":")
|
||||||
|
if h['hostip']:
|
||||||
|
return ":".join([h['hostip'], s])
|
||||||
|
return s
|
||||||
|
|
||||||
ports = self.info['hostconfig']['portbindings']
|
ports = self.info['hostconfig']['portbindings']
|
||||||
before = [":".join([
|
before = []
|
||||||
j[0]['hostip'],
|
for port, hosts in ports.items():
|
||||||
str(j[0]["hostport"]),
|
for h in hosts:
|
||||||
i.replace('/tcp', '')
|
before.append(compose(port, h))
|
||||||
]).strip(':') for i, j in ports.items()]
|
|
||||||
after = self.params['publish'] or []
|
after = self.params['publish'] or []
|
||||||
if self.params['publish_all']:
|
if self.params['publish_all']:
|
||||||
image_ports = self.image_info['config'].get('exposedports', {})
|
image_ports = self.image_info['config'].get('exposedports', {})
|
||||||
if image_ports:
|
if image_ports:
|
||||||
after += list(image_ports.keys())
|
after += list(image_ports.keys())
|
||||||
after = [i.replace("/tcp", "") for i in after]
|
after = [
|
||||||
|
i.replace("/tcp", "").replace("[", "").replace("]", "")
|
||||||
|
for i in after]
|
||||||
# No support for port ranges yet
|
# No support for port ranges yet
|
||||||
for ports in after:
|
for ports in after:
|
||||||
if "-" in ports:
|
if "-" in ports:
|
||||||
|
@ -1037,7 +1113,8 @@ class PodmanContainerDiff:
|
||||||
"sigwinch": "28",
|
"sigwinch": "28",
|
||||||
"sigio": "29",
|
"sigio": "29",
|
||||||
"sigpwr": "30",
|
"sigpwr": "30",
|
||||||
"sigsys": "31"
|
"sigsys": "31",
|
||||||
|
"sigrtmin+3": "37"
|
||||||
}
|
}
|
||||||
before = str(self.info['config']['stopsignal'])
|
before = str(self.info['config']['stopsignal'])
|
||||||
if not before.isdigit():
|
if not before.isdigit():
|
||||||
|
@ -1094,6 +1171,8 @@ class PodmanContainerDiff:
|
||||||
def diffparam_volume(self):
|
def diffparam_volume(self):
|
||||||
def clean_volume(x):
|
def clean_volume(x):
|
||||||
'''Remove trailing and double slashes from volumes.'''
|
'''Remove trailing and double slashes from volumes.'''
|
||||||
|
if not x.rstrip("/"):
|
||||||
|
return "/"
|
||||||
return x.replace("//", "/").rstrip("/")
|
return x.replace("//", "/").rstrip("/")
|
||||||
|
|
||||||
before = self.info['mounts']
|
before = self.info['mounts']
|
||||||
|
|
|
@ -268,7 +268,9 @@ options:
|
||||||
type: dict
|
type: dict
|
||||||
env_file:
|
env_file:
|
||||||
description:
|
description:
|
||||||
- Read in a line delimited file of environment variables
|
- Read in a line delimited file of environment variables. Doesn't support
|
||||||
|
idempotency. If users changes the file with environment variables it's
|
||||||
|
on them to recreate the container.
|
||||||
type: path
|
type: path
|
||||||
env_host:
|
env_host:
|
||||||
description:
|
description:
|
||||||
|
@ -302,7 +304,8 @@ options:
|
||||||
gidmap:
|
gidmap:
|
||||||
description:
|
description:
|
||||||
- Run the container in a new user namespace using the supplied mapping.
|
- Run the container in a new user namespace using the supplied mapping.
|
||||||
type: str
|
type: list
|
||||||
|
elements: str
|
||||||
group_add:
|
group_add:
|
||||||
description:
|
description:
|
||||||
- Add additional groups to run as
|
- Add additional groups to run as
|
||||||
|
@ -437,11 +440,27 @@ options:
|
||||||
log_opt:
|
log_opt:
|
||||||
description:
|
description:
|
||||||
- Logging driver specific options. Used to set the path to the container
|
- Logging driver specific options. Used to set the path to the container
|
||||||
log file. For example log_opt
|
log file.
|
||||||
"path=/var/log/container/mycontainer.json"
|
type: dict
|
||||||
type: str
|
|
||||||
aliases:
|
aliases:
|
||||||
- log_options
|
- log_options
|
||||||
|
suboptions:
|
||||||
|
path:
|
||||||
|
description:
|
||||||
|
- Specify a path to the log file (e.g. /var/log/container/mycontainer.json).
|
||||||
|
type: str
|
||||||
|
required: false
|
||||||
|
max_size:
|
||||||
|
description:
|
||||||
|
- Specify a max size of the log file (e.g 10mb).
|
||||||
|
type: str
|
||||||
|
required: false
|
||||||
|
tag:
|
||||||
|
description:
|
||||||
|
- Specify a custom log tag for the container.
|
||||||
|
type: str
|
||||||
|
required: false
|
||||||
|
|
||||||
mac_address:
|
mac_address:
|
||||||
description:
|
description:
|
||||||
- Specify a MAC address for the container, for example
|
- Specify a MAC address for the container, for example
|
||||||
|
@ -629,7 +648,7 @@ options:
|
||||||
systemd:
|
systemd:
|
||||||
description:
|
description:
|
||||||
- Run container in systemd mode. The default is true.
|
- Run container in systemd mode. The default is true.
|
||||||
type: bool
|
type: str
|
||||||
tmpfs:
|
tmpfs:
|
||||||
description:
|
description:
|
||||||
- Create a tmpfs mount. For example tmpfs
|
- Create a tmpfs mount. For example tmpfs
|
||||||
|
@ -643,6 +662,7 @@ options:
|
||||||
description:
|
description:
|
||||||
- Run the container in a new user namespace using the supplied mapping.
|
- Run the container in a new user namespace using the supplied mapping.
|
||||||
type: list
|
type: list
|
||||||
|
elements: str
|
||||||
ulimit:
|
ulimit:
|
||||||
description:
|
description:
|
||||||
- Ulimit options
|
- Ulimit options
|
||||||
|
|
Loading…
Reference in New Issue