[2.7] docker_swarm: fix minimal API version (#49709)
* docker_swarm: fix minimal API version (#49691)
* Reduce minimally required docker API version to 1.25, with selective features requiring 1.30.
* Adjust test requirements.
* Forgot some imports.
(cherry picked from commit 495a426039
)
* Add changelog for docker swarm minimum api fix
This commit is contained in:
parent
0954942dfd
commit
2566219fc8
4 changed files with 72 additions and 8 deletions
4
changelogs/fragments/docker-swarm-min-ver.yaml
Normal file
4
changelogs/fragments/docker-swarm-min-ver.yaml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
bugfixes:
|
||||||
|
- docker_swarm - decreased minimal required API version from 1.35 to
|
||||||
|
1.25; some features require API version 1.30 though.
|
|
@ -141,7 +141,7 @@ requirements:
|
||||||
module has been superseded by L(docker,https://pypi.org/project/docker/)
|
module has been superseded by L(docker,https://pypi.org/project/docker/)
|
||||||
(see L(here,https://github.com/docker/docker-py/issues/1310) for details).
|
(see L(here,https://github.com/docker/docker-py/issues/1310) for details).
|
||||||
Version 2.1.0 or newer is only available with the C(docker) module."
|
Version 2.1.0 or newer is only available with the C(docker) module."
|
||||||
- Docker API >= 1.35
|
- Docker API >= 1.25
|
||||||
author:
|
author:
|
||||||
- Thierry Bouvet (@tbouvet)
|
- Thierry Bouvet (@tbouvet)
|
||||||
'''
|
'''
|
||||||
|
@ -214,6 +214,7 @@ actions:
|
||||||
'''
|
'''
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
from distutils.version import LooseVersion
|
||||||
from time import sleep
|
from time import sleep
|
||||||
try:
|
try:
|
||||||
from docker.errors import APIError
|
from docker.errors import APIError
|
||||||
|
@ -221,7 +222,11 @@ except ImportError:
|
||||||
# missing docker-py handled in ansible.module_utils.docker_common
|
# missing docker-py handled in ansible.module_utils.docker_common
|
||||||
pass
|
pass
|
||||||
|
|
||||||
from ansible.module_utils.docker_common import AnsibleDockerClient, DockerBaseClass
|
from ansible.module_utils.docker_common import (
|
||||||
|
AnsibleDockerClient,
|
||||||
|
DockerBaseClass,
|
||||||
|
docker_version,
|
||||||
|
)
|
||||||
from ansible.module_utils._text import to_native
|
from ansible.module_utils._text import to_native
|
||||||
|
|
||||||
|
|
||||||
|
@ -283,6 +288,60 @@ class TaskParameters(DockerBaseClass):
|
||||||
|
|
||||||
class SwarmManager(DockerBaseClass):
|
class SwarmManager(DockerBaseClass):
|
||||||
|
|
||||||
|
def _get_minimal_versions(self):
|
||||||
|
# TODO: Move this and the same from docker_container.py to docker_common.py
|
||||||
|
self.option_minimal_versions = dict()
|
||||||
|
for option, data in self.client.module.argument_spec.items():
|
||||||
|
self.option_minimal_versions[option] = dict()
|
||||||
|
self.option_minimal_versions.update(dict(
|
||||||
|
signing_ca_cert=dict(docker_api_version='1.30'),
|
||||||
|
signing_ca_key=dict(docker_api_version='1.30'),
|
||||||
|
ca_force_rotate=dict(docker_api_version='1.30'),
|
||||||
|
))
|
||||||
|
|
||||||
|
for option, data in self.option_minimal_versions.items():
|
||||||
|
# Test whether option is supported, and store result
|
||||||
|
support_docker_py = True
|
||||||
|
support_docker_api = True
|
||||||
|
if 'docker_py_version' in data:
|
||||||
|
support_docker_py = self.client.docker_py_version >= LooseVersion(data['docker_py_version'])
|
||||||
|
if 'docker_api_version' in data:
|
||||||
|
support_docker_api = self.client.docker_api_version >= LooseVersion(data['docker_api_version'])
|
||||||
|
data['supported'] = support_docker_py and support_docker_api
|
||||||
|
# Fail if option is not supported but used
|
||||||
|
if not data['supported']:
|
||||||
|
# Test whether option is specified
|
||||||
|
if 'detect_usage' in data:
|
||||||
|
used = data['detect_usage']()
|
||||||
|
else:
|
||||||
|
used = self.client.module.params.get(option) is not None
|
||||||
|
if used and 'default' in self.client.module.argument_spec[option]:
|
||||||
|
used = self.client.module.params[option] != self.client.module.argument_spec[option]['default']
|
||||||
|
if used:
|
||||||
|
# If the option is used, compose error message.
|
||||||
|
if 'usage_msg' in data:
|
||||||
|
usg = data['usage_msg']
|
||||||
|
else:
|
||||||
|
usg = 'set %s option' % (option, )
|
||||||
|
if not support_docker_api:
|
||||||
|
msg = 'docker API version is %s. Minimum version required is %s to %s.'
|
||||||
|
msg = msg % (self.client.docker_api_version_str, data['docker_api_version'], usg)
|
||||||
|
elif not support_docker_py:
|
||||||
|
if LooseVersion(data['docker_py_version']) < LooseVersion('2.0.0'):
|
||||||
|
msg = ("docker-py version is %s. Minimum version required is %s to %s. "
|
||||||
|
"Consider switching to the 'docker' package if you do not require Python 2.6 support.")
|
||||||
|
elif self.client.docker_py_version < LooseVersion('2.0.0'):
|
||||||
|
msg = ("docker-py version is %s. Minimum version required is %s to %s. "
|
||||||
|
"You have to switch to the Python 'docker' package. First uninstall 'docker-py' before "
|
||||||
|
"installing 'docker' to avoid a broken installation.")
|
||||||
|
else:
|
||||||
|
msg = "docker version is %s. Minimum version required is %s to %s."
|
||||||
|
msg = msg % (docker_version, data['docker_py_version'], usg)
|
||||||
|
else:
|
||||||
|
# should not happen
|
||||||
|
msg = 'Cannot %s with your configuration.' % (usg, )
|
||||||
|
self.client.fail(msg)
|
||||||
|
|
||||||
def __init__(self, client, results):
|
def __init__(self, client, results):
|
||||||
|
|
||||||
super(SwarmManager, self).__init__()
|
super(SwarmManager, self).__init__()
|
||||||
|
@ -291,6 +350,8 @@ class SwarmManager(DockerBaseClass):
|
||||||
self.results = results
|
self.results = results
|
||||||
self.check_mode = self.client.check_mode
|
self.check_mode = self.client.check_mode
|
||||||
|
|
||||||
|
self._get_minimal_versions()
|
||||||
|
|
||||||
self.parameters = TaskParameters(client)
|
self.parameters = TaskParameters(client)
|
||||||
|
|
||||||
def __call__(self):
|
def __call__(self):
|
||||||
|
@ -506,7 +567,7 @@ def main():
|
||||||
supports_check_mode=True,
|
supports_check_mode=True,
|
||||||
required_if=required_if,
|
required_if=required_if,
|
||||||
min_docker_version='2.6.0',
|
min_docker_version='2.6.0',
|
||||||
min_docker_api_version='1.35',
|
min_docker_api_version='1.25',
|
||||||
)
|
)
|
||||||
|
|
||||||
results = dict(
|
results = dict(
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
- include_tasks: test_secrets.yml
|
- include_tasks: test_secrets.yml
|
||||||
# Maximum of 2.1.0 (docker-py version for docker_secrets) and 2.6.0 (docker-py version for docker_swarm) is 2.6.0
|
# Maximum of 2.1.0 (docker-py version for docker_secrets) and 2.6.0 (docker-py version for docker_swarm) is 2.6.0
|
||||||
# Maximum of 1.25 (docker API version for docker_secrets) and 1.35 (docker API version for docker_swarm) is 1.35
|
when: docker_py_version is version('2.6.0', '>=') and docker_api_version is version('1.25', '>=')
|
||||||
when: docker_py_version is version('2.6.0', '>=') and docker_api_version is version('1.35', '>=')
|
|
||||||
|
|
||||||
- fail: msg="Too old docker / docker-py version to run docker_secrets tests!"
|
- fail: msg="Too old docker / docker-py version to run docker_secrets tests!"
|
||||||
when: not(docker_py_version is version('2.6.0', '>=') and docker_api_version is version('1.35', '>=')) and (ansible_distribution != 'CentOS' or ansible_distribution_major_version|int > 6)
|
when: not(docker_py_version is version('2.6.0', '>=') and docker_api_version is version('1.25', '>=')) and (ansible_distribution != 'CentOS' or ansible_distribution_major_version|int > 6)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
- include_tasks: test_swarm.yml
|
- include_tasks: test_swarm.yml
|
||||||
when: docker_py_version is version('2.6.0', '>=') and docker_api_version is version('1.35', '>=')
|
when: docker_py_version is version('2.6.0', '>=') and docker_api_version is version('1.25', '>=')
|
||||||
|
|
||||||
- fail: msg="Too old docker / docker-py version to run docker_swarm tests!"
|
- fail: msg="Too old docker / docker-py version to run docker_swarm tests!"
|
||||||
when: not(docker_py_version is version('2.6.0', '>=') and docker_api_version is version('1.35', '>=')) and (ansible_distribution != 'CentOS' or ansible_distribution_major_version|int > 6)
|
when: not(docker_py_version is version('2.6.0', '>=') and docker_api_version is version('1.25', '>=')) and (ansible_distribution != 'CentOS' or ansible_distribution_major_version|int > 6)
|
||||||
|
|
Loading…
Reference in a new issue