docker_* modules: improve diff (#48546)

* Add difference tracking tool

* Improve --diff mode for docker_container.

* Improve diffs of sets by ordering the sets.

* Rewrite imports, get rid of HAS_DOCKER_PY_x variables and use docker_version instead.

* Rename container -> active (more generic).

* Add --diff for docker_volume. Change old diff output.

* Add --diff for docker_network. Change old diff output.

* Add --diff for docker_swarm_service.

* Add changelog.

* Add entry for porting guide on docker_network and docker_volume.
This commit is contained in:
Felix Fontein 2018-11-19 10:59:54 +01:00 committed by John R Barker
commit 891687284f
13 changed files with 356 additions and 114 deletions

View file

@ -115,7 +115,11 @@ except ImportError:
# missing docker-py handled in ansible.module_utils.docker_common
pass
from ansible.module_utils.docker_common import DockerBaseClass, AnsibleDockerClient
from ansible.module_utils.docker_common import (
DockerBaseClass,
AnsibleDockerClient,
DifferenceTracker,
)
from ansible.module_utils.six import iteritems, text_type
@ -146,6 +150,8 @@ class DockerVolumeManager(object):
u'actions': []
}
self.diff = self.client.module._diff
self.diff_tracker = DifferenceTracker()
self.diff_result = dict()
self.existing_volume = self.get_existing_volume()
@ -155,6 +161,11 @@ class DockerVolumeManager(object):
elif state == 'absent':
self.absent()
if self.diff or self.check_mode or self.parameters.debug:
if self.diff:
self.diff_result['before'], self.diff_result['after'] = self.diff_tracker.get_before_after()
self.results['diff'] = self.diff_result
def get_existing_volume(self):
try:
volumes = self.client.volumes()
@ -176,22 +187,28 @@ class DockerVolumeManager(object):
:return: list of options that differ
"""
differences = []
differences = DifferenceTracker()
if self.parameters.driver and self.parameters.driver != self.existing_volume['Driver']:
differences.append('driver')
differences.add('driver', parameter=self.parameters.driver, active=self.existing_volume['Driver'])
if self.parameters.driver_options:
if not self.existing_volume.get('Options'):
differences.append('driver_options')
differences.add('driver_options',
parameter=self.parameters.driver_options,
active=self.existing_volume.get('Options'))
else:
for key, value in iteritems(self.parameters.driver_options):
if (not self.existing_volume['Options'].get(key) or
value != self.existing_volume['Options'][key]):
differences.append('driver_options.%s' % key)
differences.add('driver_options.%s' % key,
parameter=value,
active=self.existing_volume['Options'].get(key))
if self.parameters.labels:
existing_labels = self.existing_volume.get('Labels', {})
for label in self.parameters.labels:
if existing_labels.get(label) != self.parameters.labels.get(label):
differences.append('labels.%s' % label)
differences.add('labels.%s' % label,
parameter=self.parameters.labels.get(label),
active=existing_labels.get(label))
return differences
@ -222,18 +239,20 @@ class DockerVolumeManager(object):
self.results['changed'] = True
def present(self):
differences = []
differences = DifferenceTracker()
if self.existing_volume:
differences = self.has_different_config()
if differences or self.parameters.force:
self.diff_tracker.add('exists', parameter=True, active=self.existing_volume is not None)
if not differences.empty or self.parameters.force:
self.remove_volume()
self.existing_volume = None
self.create_volume()
if self.diff or self.check_mode or self.parameters.debug:
self.results['diff'] = differences
self.diff_result['differences'] = differences.get_legacy_docker_diffs()
self.diff_tracker.merge(differences)
if not self.check_mode and not self.parameters.debug:
self.results.pop('actions')
@ -241,6 +260,7 @@ class DockerVolumeManager(object):
self.results['ansible_facts'] = {u'docker_volume': self.get_existing_volume()}
def absent(self):
self.diff_tracker.add('exists', parameter=False, active=self.existing_volume is not None)
self.remove_volume()