From e4f340203520c6e30be74206dcb31a01ca1dcdc2 Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Wed, 6 Jul 2022 21:46:14 +0200 Subject: [PATCH] Rewrite the docker_image_info module (#405) * Rewrite the docker_image_info module. * Improve error messages. --- changelogs/fragments/405-docker-api.yml | 4 +++ plugins/modules/docker_image_info.py | 31 +++++++++---------- .../targets/docker_image_info/tasks/main.yml | 4 +-- 3 files changed, 20 insertions(+), 19 deletions(-) create mode 100644 changelogs/fragments/405-docker-api.yml diff --git a/changelogs/fragments/405-docker-api.yml b/changelogs/fragments/405-docker-api.yml new file mode 100644 index 00000000..2faa283c --- /dev/null +++ b/changelogs/fragments/405-docker-api.yml @@ -0,0 +1,4 @@ +major_changes: + - "docker_image_info - no longer uses the Docker SDK for Python. It requires ``requests`` to be installed, + and depending on the features used has some more requirements. If the Docker SDK for Python is installed, + these requirements are likely met (https://github.com/ansible-collections/community.docker/pull/405)." diff --git a/plugins/modules/docker_image_info.py b/plugins/modules/docker_image_info.py index e237baa7..d7282dc4 100644 --- a/plugins/modules/docker_image_info.py +++ b/plugins/modules/docker_image_info.py @@ -36,12 +36,10 @@ options: elements: str extends_documentation_fragment: -- community.docker.docker -- community.docker.docker.docker_py_1_documentation +- community.docker.docker.api_documentation requirements: - - "L(Docker SDK for Python,https://docker-py.readthedocs.io/en/stable/) >= 1.8.0" - "Docker API >= 1.25" author: @@ -167,14 +165,7 @@ import traceback from ansible.module_utils.common.text.converters import to_native -try: - from docker import utils - from docker.errors import DockerException, NotFound -except ImportError: - # missing Docker SDK for Python handled in ansible.module_utils.docker.common - pass - -from ansible_collections.community.docker.plugins.module_utils.common import ( +from ansible_collections.community.docker.plugins.module_utils.common_api import ( AnsibleDockerClient, RequestException, ) @@ -182,6 +173,8 @@ from ansible_collections.community.docker.plugins.module_utils.util import ( DockerBaseClass, is_image_name_id, ) +from ansible_collections.community.docker.plugins.module_utils._api.errors import DockerException, NotFound +from ansible_collections.community.docker.plugins.module_utils._api.utils.utils import parse_repository_tag class ImageManager(DockerBaseClass): @@ -221,7 +214,7 @@ class ImageManager(DockerBaseClass): self.log('Fetching image %s (ID)' % (name)) image = self.client.find_image_by_id(name, accept_missing_image=True) else: - repository, tag = utils.parse_repository_tag(name) + repository, tag = parse_repository_tag(name) if not tag: tag = 'latest' self.log('Fetching image %s:%s' % (repository, tag)) @@ -232,12 +225,16 @@ class ImageManager(DockerBaseClass): def get_all_images(self): results = [] - images = self.client.images() + params = { + 'only_ids': 0, + 'all': 0, + } + images = self.client.get_json("/images/json", params=params) for image in images: try: - inspection = self.client.inspect_image(image['Id']) + inspection = self.client.get_json('/images/{0}/json', image['Id']) except NotFound: - pass + inspection = None except Exception as exc: self.fail("Error inspecting image %s - %s" % (image['Id'], to_native(exc))) results.append(inspection) @@ -263,10 +260,10 @@ def main(): ImageManager(client, results) client.module.exit_json(**results) except DockerException as e: - client.fail('An unexpected docker error occurred: {0}'.format(to_native(e)), exception=traceback.format_exc()) + client.fail('An unexpected Docker error occurred: {0}'.format(to_native(e)), exception=traceback.format_exc()) except RequestException as e: client.fail( - 'An unexpected requests error occurred when Docker SDK for Python tried to talk to the docker daemon: {0}'.format(to_native(e)), + 'An unexpected requests error occurred when trying to talk to the Docker daemon: {0}'.format(to_native(e)), exception=traceback.format_exc()) diff --git a/tests/integration/targets/docker_image_info/tasks/main.yml b/tests/integration/targets/docker_image_info/tasks/main.yml index f14a108b..559daaef 100644 --- a/tests/integration/targets/docker_image_info/tasks/main.yml +++ b/tests/integration/targets/docker_image_info/tasks/main.yml @@ -53,7 +53,7 @@ - "docker_test_image_hello_world in result.images[0].RepoTags" - "docker_test_image_alpine in result.images[1].RepoTags" - when: docker_py_version is version('1.8.0', '>=') and docker_api_version is version('1.25', '>=') + when: docker_api_version is version('1.25', '>=') - fail: msg="Too old docker / docker-py version to run docker_image_info tests!" - when: not(docker_py_version is version('1.8.0', '>=') and docker_api_version is version('1.25', '>=')) and (ansible_distribution != 'CentOS' or ansible_distribution_major_version|int > 6) + when: not(docker_api_version is version('1.25', '>=')) and (ansible_distribution != 'CentOS' or ansible_distribution_major_version|int > 6)