From 4b235a260737de318fd95453c0146534b199f10f Mon Sep 17 00:00:00 2001 From: Felix Fontein Date: Fri, 24 Dec 2021 11:28:35 +0100 Subject: [PATCH] Prepare for distutils.version being removed in Python 3.12 (#258) * Prepare for distutils.version being removed in Python 2.12. * Fix copy'n'paste error. * Fix import. * Re-add Loose prefix. * Fix Python version typo. * Improve formulation. * Move message into own line. * Fix casing, now that the object is no longer called Version. --- .../fragments/258-distutils.version.yml | 2 ++ plugins/connection/docker.py | 4 ++-- plugins/module_utils/common.py | 4 ++-- plugins/module_utils/swarm.py | 8 ++++---- plugins/module_utils/version.py | 20 +++++++++++++++++++ plugins/modules/docker_compose.py | 3 ++- plugins/modules/docker_container.py | 3 ++- plugins/modules/docker_image.py | 4 ++-- plugins/modules/docker_network.py | 4 ++-- plugins/modules/docker_prune.py | 2 +- plugins/modules/docker_swarm_service.py | 2 +- 11 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 changelogs/fragments/258-distutils.version.yml create mode 100644 plugins/module_utils/version.py diff --git a/changelogs/fragments/258-distutils.version.yml b/changelogs/fragments/258-distutils.version.yml new file mode 100644 index 00000000..86f6e208 --- /dev/null +++ b/changelogs/fragments/258-distutils.version.yml @@ -0,0 +1,2 @@ +bugfixes: + - "Various modules and plugins - use vendored version of ``distutils.version`` included in ansible-core 2.12 if available. This avoids breakage when ``distutils`` is removed from the standard library of Python 3.12. Note that ansible-core 2.11, ansible-base 2.10 and Ansible 2.9 are right now not compatible with Python 3.12, hence this fix does not target these ansible-core/-base/2.9 versions (https://github.com/ansible-collections/community.docker/pull/258)." diff --git a/plugins/connection/docker.py b/plugins/connection/docker.py index 745e936c..5ff89617 100644 --- a/plugins/connection/docker.py +++ b/plugins/connection/docker.py @@ -47,8 +47,6 @@ import os.path import subprocess import re -from distutils.version import LooseVersion - import ansible.constants as C from ansible.compat import selectors from ansible.errors import AnsibleError, AnsibleFileNotFound @@ -58,6 +56,8 @@ from ansible.module_utils.common.text.converters import to_bytes, to_native, to_ from ansible.plugins.connection import ConnectionBase, BUFSIZE from ansible.utils.display import Display +from ansible_collections.community.docker.plugins.module_utils.version import LooseVersion + display = Display() diff --git a/plugins/module_utils/common.py b/plugins/module_utils/common.py index d03395e8..c8da5877 100644 --- a/plugins/module_utils/common.py +++ b/plugins/module_utils/common.py @@ -12,8 +12,6 @@ import re import sys import traceback from datetime import timedelta -from distutils.version import LooseVersion - from ansible.module_utils.basic import AnsibleModule, env_fallback, missing_required_lib from ansible.module_utils.common.collections import is_sequence @@ -22,6 +20,8 @@ from ansible.module_utils.six import string_types from ansible.module_utils.six.moves.urllib.parse import urlparse from ansible.module_utils.parsing.convert_bool import BOOLEANS_TRUE, BOOLEANS_FALSE +from ansible_collections.community.docker.plugins.module_utils.version import LooseVersion + HAS_DOCKER_PY = True HAS_DOCKER_PY_2 = False HAS_DOCKER_PY_3 = False diff --git a/plugins/module_utils/swarm.py b/plugins/module_utils/swarm.py index 312c236f..160ae020 100644 --- a/plugins/module_utils/swarm.py +++ b/plugins/module_utils/swarm.py @@ -16,10 +16,10 @@ except ImportError: pass from ansible.module_utils.common.text.converters import to_native -from ansible_collections.community.docker.plugins.module_utils.common import ( - AnsibleDockerClient, - LooseVersion, -) + +from ansible_collections.community.docker.plugins.module_utils.version import LooseVersion + +from ansible_collections.community.docker.plugins.module_utils.common import AnsibleDockerClient class AnsibleDockerSwarmClient(AnsibleDockerClient): diff --git a/plugins/module_utils/version.py b/plugins/module_utils/version.py new file mode 100644 index 00000000..d1769e17 --- /dev/null +++ b/plugins/module_utils/version.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- + +# Copyright: (c) 2021, Felix Fontein +# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) + +"""Provide version object to compare version numbers.""" + +from __future__ import absolute_import, division, print_function +__metaclass__ = type + +from ansible.module_utils.six import raise_from + +try: + from ansible.module_utils.compat.version import LooseVersion +except ImportError: + try: + from distutils.version import LooseVersion + except ImportError as exc: + msg = 'To use this plugin or module with ansible-core < 2.11, you need to use Python < 3.12 with distutils.version present' + raise_from(ImportError(msg), exc) diff --git a/plugins/modules/docker_compose.py b/plugins/modules/docker_compose.py index b3cc12f4..2f692609 100644 --- a/plugins/modules/docker_compose.py +++ b/plugins/modules/docker_compose.py @@ -476,7 +476,8 @@ import sys import tempfile import traceback from contextlib import contextmanager -from distutils.version import LooseVersion + +from ansible_collections.community.docker.plugins.module_utils.version import LooseVersion try: import yaml diff --git a/plugins/modules/docker_container.py b/plugins/modules/docker_container.py index d4b1af50..eaf501bd 100644 --- a/plugins/modules/docker_container.py +++ b/plugins/modules/docker_container.py @@ -1189,13 +1189,14 @@ import pipes import re import shlex import traceback -from distutils.version import LooseVersion from time import sleep from ansible.module_utils.common.text.formatters import human_to_bytes from ansible.module_utils.six import string_types from ansible.module_utils.common.text.converters import to_native, to_text +from ansible_collections.community.docker.plugins.module_utils.version import LooseVersion + from ansible_collections.community.docker.plugins.module_utils.common import ( AnsibleDockerClient, DifferenceTracker, diff --git a/plugins/modules/docker_image.py b/plugins/modules/docker_image.py index 23e9bbaa..399901da 100644 --- a/plugins/modules/docker_image.py +++ b/plugins/modules/docker_image.py @@ -326,8 +326,6 @@ import errno import os import traceback -from distutils.version import LooseVersion - from ansible_collections.community.docker.plugins.module_utils.common import ( clean_dict_booleans_for_docker_api, docker_version, @@ -339,6 +337,8 @@ from ansible_collections.community.docker.plugins.module_utils.common import ( ) from ansible.module_utils.common.text.converters import to_native +from ansible_collections.community.docker.plugins.module_utils.version import LooseVersion + if docker_version is not None: try: if LooseVersion(docker_version) >= LooseVersion('2.0.0'): diff --git a/plugins/modules/docker_network.py b/plugins/modules/docker_network.py index 8f797e66..057211d5 100644 --- a/plugins/modules/docker_network.py +++ b/plugins/modules/docker_network.py @@ -252,10 +252,10 @@ network: import re import traceback -from distutils.version import LooseVersion - from ansible.module_utils.common.text.converters import to_native +from ansible_collections.community.docker.plugins.module_utils.version import LooseVersion + from ansible_collections.community.docker.plugins.module_utils.common import ( AnsibleDockerClient, DockerBaseClass, diff --git a/plugins/modules/docker_prune.py b/plugins/modules/docker_prune.py index 6340137f..aa29efd6 100644 --- a/plugins/modules/docker_prune.py +++ b/plugins/modules/docker_prune.py @@ -186,7 +186,7 @@ except ImportError: # missing Docker SDK for Python handled in ansible.module_utils.docker.common pass -from distutils.version import LooseVersion +from ansible_collections.community.docker.plugins.module_utils.version import LooseVersion from ansible_collections.community.docker.plugins.module_utils.common import ( AnsibleDockerClient, diff --git a/plugins/modules/docker_swarm_service.py b/plugins/modules/docker_swarm_service.py index f3dfcd25..59637189 100644 --- a/plugins/modules/docker_swarm_service.py +++ b/plugins/modules/docker_swarm_service.py @@ -919,7 +919,7 @@ import shlex import time import traceback -from distutils.version import LooseVersion +from ansible_collections.community.docker.plugins.module_utils.version import LooseVersion from ansible_collections.community.docker.plugins.module_utils.common import ( AnsibleDockerClient,