[2.7] docker_swarm: removing nodes requires docker >= 2.4.0 (#53592)

* Removing a swarm node does not work with docker-py < 2.4.0, since it calls client.inspect_node(). (#53565)

For the same reason, docker_node requires docker >= 2.4.0.

(cherry picked from commit c75da35595)

* Reconstructing a change from devel which is required to make usage detection work this way.
This commit is contained in:
Felix Fontein 2019-03-11 21:20:30 +01:00 committed by Toshio Kuratomi
parent b84d9a8365
commit 2773e215f7
4 changed files with 13 additions and 3 deletions

View file

@ -1,2 +1,2 @@
bugfixes: bugfixes:
- "docker_swarm - now supports docker-py 1.10.0 and newer, instead only docker 2.6.0 and newer." - "docker_swarm - now supports docker-py 1.10.0 and newer for most operations, instead only docker 2.6.0 and newer."

View file

@ -442,7 +442,7 @@ class AnsibleDockerClient(Client):
if not data['supported']: if not data['supported']:
# Test whether option is specified # Test whether option is specified
if 'detect_usage' in data: if 'detect_usage' in data:
used = data['detect_usage']() used = data['detect_usage'](self)
else: else:
used = self.module.params.get(option) is not None used = self.module.params.get(option) is not None
if used and 'default' in self.module.argument_spec[option]: if used and 'default' in self.module.argument_spec[option]:

View file

@ -2234,7 +2234,7 @@ class AnsibleDockerClientContainer(AnsibleDockerClient):
self.comparisons = comparisons self.comparisons = comparisons
def __init__(self, **kwargs): def __init__(self, **kwargs):
def detect_ipvX_address_usage(): def detect_ipvX_address_usage(client):
''' '''
Helper function to detect whether any specified network uses ipv4_address or ipv6_address Helper function to detect whether any specified network uses ipv4_address or ipv6_address
''' '''

View file

@ -52,6 +52,7 @@ options:
- Set to C(join), to join an existing cluster. - Set to C(join), to join an existing cluster.
- Set to C(absent), to leave an existing cluster. - Set to C(absent), to leave an existing cluster.
- Set to C(remove), to remove an absent node from the cluster. - Set to C(remove), to remove an absent node from the cluster.
Note that removing requires docker-py >= 2.4.0.
- Set to C(inspect) to display swarm informations. - Set to C(inspect) to display swarm informations.
type: str type: str
required: yes required: yes
@ -553,6 +554,10 @@ class SwarmManager(DockerBaseClass):
self.results['changed'] = True self.results['changed'] = True
def _detect_remove_operation(client):
return client.module.params['state'] == 'remove'
def main(): def main():
argument_spec = dict( argument_spec = dict(
advertise_addr=dict(type='str'), advertise_addr=dict(type='str'),
@ -592,6 +597,11 @@ def main():
ca_force_rotate=dict(docker_py_version='2.6.0', docker_api_version='1.30'), ca_force_rotate=dict(docker_py_version='2.6.0', docker_api_version='1.30'),
autolock_managers=dict(docker_py_version='2.6.0'), autolock_managers=dict(docker_py_version='2.6.0'),
log_driver=dict(docker_py_version='2.6.0'), log_driver=dict(docker_py_version='2.6.0'),
remove_operation=dict(
docker_py_version='2.4.0',
detect_usage=_detect_remove_operation,
usage_msg='remove swarm nodes'
),
) )
client = AnsibleDockerClient( client = AnsibleDockerClient(