diff --git a/changelogs/fragments/403-docker-api.yml b/changelogs/fragments/403-docker-api.yml new file mode 100644 index 00000000..fb651289 --- /dev/null +++ b/changelogs/fragments/403-docker-api.yml @@ -0,0 +1,4 @@ +major_changes: + - "docker_host_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/403)." diff --git a/plugins/modules/docker_host_info.py b/plugins/modules/docker_host_info.py index dd09e334..22e3cd50 100644 --- a/plugins/modules/docker_host_info.py +++ b/plugins/modules/docker_host_info.py @@ -94,15 +94,13 @@ options: type: bool default: no extends_documentation_fragment: -- community.docker.docker -- community.docker.docker.docker_py_1_documentation +- community.docker.docker.api_documentation author: - Piotr Wojciechowski (@WojciechowskiPiotr) requirements: - - "L(Docker SDK for Python,https://docker-py.readthedocs.io/en/stable/) >= 1.10.0" - "Docker API >= 1.25" ''' @@ -205,21 +203,17 @@ import traceback from ansible.module_utils.common.text.converters import to_native -from ansible_collections.community.docker.plugins.module_utils.common import ( +from ansible_collections.community.docker.plugins.module_utils.common_api import ( AnsibleDockerClient, RequestException, ) -try: - from docker.errors import DockerException, APIError -except ImportError: - # Missing Docker SDK for Python handled in ansible.module_utils.docker.common - pass - from ansible_collections.community.docker.plugins.module_utils.util import ( DockerBaseClass, clean_dict_booleans_for_docker_api, ) +from ansible_collections.community.docker.plugins.module_utils._api.errors import DockerException, APIError +from ansible_collections.community.docker.plugins.module_utils._api.utils.utils import convert_filters class DockerHostManager(DockerBaseClass): @@ -275,25 +269,37 @@ class DockerHostManager(DockerBaseClass): filter_arg['filters'] = filters try: if docker_object == 'containers': - items = self.client.containers(**filter_arg) + params = { + 'limit': -1, + 'all': 0, + 'size': 0, + 'trunc_cmd': 0, + 'filters': convert_filters(filters) if filters else None, + } + items = self.client.get_json("/containers/json", params=params) elif docker_object == 'networks': - items = self.client.networks(**filter_arg) + params = { + 'filters': convert_filters(filters or {}) + } + items = self.client.get_json("/networks", params=params) elif docker_object == 'images': - items = self.client.images(**filter_arg) + params = { + 'only_ids': 0, + 'all': 0, + 'filters': convert_filters(filters) if filters else None, + } + items = self.client.get_json("/images/json", params=params) elif docker_object == 'volumes': - items = self.client.volumes(**filter_arg) + params = { + 'filters': convert_filters(filters) if filters else None, + } + items = self.client.get_json('/volumes', params=params) + items = items['Volumes'] except APIError as exc: - self.client.fail("Error inspecting docker host for object '%s': %s" % - (docker_object, to_native(exc))) + self.client.fail("Error inspecting docker host for object '%s': %s" % (docker_object, to_native(exc))) if self.verbose_output: - if docker_object != 'volumes': - return items - else: - return items['Volumes'] - - if docker_object == 'volumes': - items = items['Volumes'] + return items for item in items: item_record = dict() @@ -329,16 +335,9 @@ def main(): verbose_output=dict(type='bool', default=False), ) - option_minimal_versions = dict( - network_filters=dict(docker_py_version='2.0.2'), - disk_usage=dict(docker_py_version='2.2.0'), - ) - client = AnsibleDockerClient( argument_spec=argument_spec, supports_check_mode=True, - min_docker_version='1.10.0', - option_minimal_versions=option_minimal_versions, fail_results=dict( can_talk_to_docker=False, ), @@ -353,10 +352,10 @@ def main(): DockerHostManager(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_host_info/tasks/main.yml b/tests/integration/targets/docker_host_info/tasks/main.yml index 8d4d8edd..ad51293f 100644 --- a/tests/integration/targets/docker_host_info/tasks/main.yml +++ b/tests/integration/targets/docker_host_info/tasks/main.yml @@ -4,7 +4,7 @@ #################################################################### - include_tasks: test_host_info.yml - when: docker_py_version is version('1.10.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_host_info tests!" - when: not(docker_py_version is version('1.10.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) diff --git a/tests/integration/targets/docker_host_info/tasks/test_host_info.yml b/tests/integration/targets/docker_host_info/tasks/test_host_info.yml index 90dac3ec..55619c07 100644 --- a/tests/integration/targets/docker_host_info/tasks/test_host_info.yml +++ b/tests/integration/targets/docker_host_info/tasks/test_host_info.yml @@ -224,7 +224,6 @@ docker_host_info: disk_usage: yes register: output - ignore_errors: yes - name: assert reading docker host facts when docker is running and get disk usage assert: @@ -236,20 +235,12 @@ - 'output.images is not defined' - 'output.disk_usage.LayersSize is number' - 'output.disk_usage.BuilderSize is not defined' - when: docker_py_version is version('2.2.0', '>=') - - assert: - that: - - output is failed - - "('version is ' ~ docker_py_version ~ ' ') in output.msg" - - "'Minimum version required is 2.2.0 ' in output.msg" - when: docker_py_version is version('2.2.0', '<') - name: Get info on Docker host and get disk usage with verbose output docker_host_info: disk_usage: yes verbose_output: yes register: output - ignore_errors: yes - name: assert reading docker host facts when docker is running and get disk usage with verbose output assert: @@ -261,13 +252,6 @@ - 'output.images is not defined' - 'output.disk_usage.LayersSize is number' - 'output.disk_usage.BuilderSize is number' - when: docker_py_version is version('2.2.0', '>=') - - assert: - that: - - output is failed - - "('version is ' ~ docker_py_version ~ ' ') in output.msg" - - "'Minimum version required is 2.2.0 ' in output.msg" - when: docker_py_version is version('2.2.0', '<') - name: Get info on Docker host, disk usage and get all lists together docker_host_info: @@ -275,7 +259,7 @@ containers: yes networks: yes images: yes - disk_usage: "{{ docker_py_version is version('2.2.0', '>=') }}" + disk_usage: yes register: output - name: assert reading docker host facts when docker is running, disk usage and get lists together @@ -290,11 +274,8 @@ - 'output.volumes[0].Mountpoint is not defined' - 'output.images[0].Id is string' - 'output.images[0].ParentId is not defined' - - assert: - that: - 'output.disk_usage.LayersSize is number' - 'output.disk_usage.BuilderSize is not defined' - when: docker_py_version is version('2.2.0', '>=') - name: Get info on Docker host, disk usage and get all lists together with verbose output docker_host_info: @@ -302,7 +283,7 @@ containers: yes networks: yes images: yes - disk_usage: "{{ docker_py_version is version('2.2.0', '>=') }}" + disk_usage: yes verbose_output: yes register: output @@ -318,11 +299,8 @@ - 'output.volumes[0].Mountpoint is string' - 'output.images[0].Id is string' - 'output.images[0].ParentId is string' - - assert: - that: - 'output.disk_usage.LayersSize is number' - 'output.disk_usage.BuilderSize is number' - when: docker_py_version is version('2.2.0', '>=') always: - name: Delete container