mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-10-06 16:34:02 -07:00
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:
parent
a67e9f89e7
commit
891687284f
13 changed files with 356 additions and 114 deletions
|
@ -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()
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue