docker_container: improve log_options idempotency by converting to string (#54955)

* Warn when log_options values are not strings.

* Add changelog.

* Improve message.

* Improve formatting and formulation of other messages.

* Add test for warning.

* Trying double escaping.
This commit is contained in:
Felix Fontein 2019-04-13 00:36:11 +02:00 committed by ansibot
parent 6ff4547489
commit d64b17731d
3 changed files with 19 additions and 6 deletions

View file

@ -0,0 +1,2 @@
bugfixes:
- "docker_container - fix idempotency of ``log_options`` when non-string values are used. Also warn user that this is the case."

View file

@ -1586,7 +1586,14 @@ class TaskParameters(DockerBaseClass):
if self.log_options is not None:
options['Config'] = dict()
for k, v in self.log_options.items():
options['Config'][k] = str(v)
if not isinstance(v, string_types):
self.client.module.warn(
"Non-string value found for log_options option '%s'. The value is automatically converted to '%s'. "
"If this is not correct, or you want to avoid such warnings, please quote the value." % (k, str(v))
)
v = str(v)
self.log_options[k] = v
options['Config'][k] = v
try:
return LogConfig(**options)
@ -1622,8 +1629,8 @@ class TaskParameters(DockerBaseClass):
if self.env:
for name, value in self.env.items():
if not isinstance(value, string_types):
self.fail("Non-string value found for env option. "
"Ambiguous env options must be wrapped in quotes to avoid YAML parsing. Key: %s" % (name, ))
self.fail("Non-string value found for env option. Ambiguous env options must be "
"wrapped in quotes to avoid them being interpreted. Key: %s" % (name, ))
final_env[name] = str(value)
return final_env
@ -2761,8 +2768,8 @@ class AnsibleDockerClientContainer(AnsibleDockerClient):
key_main = comp_aliases.get(key)
if key_main is None:
if key_main in all_options:
self.fail(("The module option '%s' cannot be specified in the comparisons dict," +
" since it does not correspond to container's state!") % key)
self.fail("The module option '%s' cannot be specified in the comparisons dict, "
"since it does not correspond to container's state!" % key)
self.fail("Unknown module option '%s' in comparisons dict!" % key)
if key_main in comp_aliases_used:
self.fail("Both '%s' and '%s' (aliases of %s) are specified in comparisons dict!" % (key, comp_aliases_used[key_main], key_main))

View file

@ -2125,6 +2125,7 @@
log_options:
labels: production_status
env: os,customer
max-file: 5
register: log_options_1
- name: log_options (idempotency)
@ -2137,6 +2138,7 @@
log_options:
env: os,customer
labels: production_status
max-file: 5
register: log_options_2
- name: log_options (less log options)
@ -2159,7 +2161,7 @@
log_driver: json-file
log_options:
labels: production_status
max-file: 1
max-size: 10m
force_kill: yes
register: log_options_4
@ -2174,6 +2176,8 @@
that:
- log_options_1 is changed
- log_options_2 is not changed
- "'Non-string value found for log_options option \\'max-file\\'. The value is automatically converted to \\'5\\'. If this is not correct, or you want to
avoid such warnings, please quote the value.' in log_options_2.warnings"
- log_options_3 is not changed
- log_options_4 is changed