From c0e67ac520bf2ae22b1c880e7243d0b1e847b64e Mon Sep 17 00:00:00 2001 From: Abhijeet Kasurde Date: Thu, 23 Dec 2021 14:08:03 +0530 Subject: [PATCH] Prepare for distutils.version being removed in Python 3.12 distutils has been deprecafed and will be removed from Python's stdlib in Python 3.12 (see python.org/dev/peps/pep-0632). This PR replaces the use of distutils.version.LooseVersion and distutils.version.StrictVersion with LooseVersion from the vendored copy of distutils.version included with ansible-core 2.12 (ansible/ansible#74644) if available, and falls back to distutils.version for ansible-core 2.11 and before. Since ansible-core 2.11 and earlier do not support Python 3.12 (since they use LooseVersion itself in various places), this incomplete fix should be OK for now. Also, the way this PR works (by adding a new module_utils version that abstracts away where LooseVersion comes from), it is easy to also fix this for ansible-core 2.11 and earlier later on. Signed-off-by: Abhijeet Kasurde --- changelogs/fragments/disutils.version.yml | 2 ++ .../roles/helm/library/helm_test_version.py | 2 +- plugins/module_utils/common.py | 3 ++- plugins/module_utils/version.py | 19 +++++++++++++++++++ plugins/modules/helm.py | 3 ++- 5 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 changelogs/fragments/disutils.version.yml create mode 100644 plugins/module_utils/version.py diff --git a/changelogs/fragments/disutils.version.yml b/changelogs/fragments/disutils.version.yml new file mode 100644 index 00000000000..48f69e4bd09 --- /dev/null +++ b/changelogs/fragments/disutils.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." diff --git a/molecule/default/roles/helm/library/helm_test_version.py b/molecule/default/roles/helm/library/helm_test_version.py index 3068597d5c1..06a3fdfe252 100644 --- a/molecule/default/roles/helm/library/helm_test_version.py +++ b/molecule/default/roles/helm/library/helm_test_version.py @@ -51,7 +51,7 @@ ''' import re -from distutils.version import LooseVersion +from ansible_collections.kubernetes.core.plugins.module_utils.version import LooseVersion from ansible.module_utils.basic import AnsibleModule diff --git a/plugins/module_utils/common.py b/plugins/module_utils/common.py index 1be5513ce91..4446a85e522 100644 --- a/plugins/module_utils/common.py +++ b/plugins/module_utils/common.py @@ -26,7 +26,8 @@ import sys import hashlib from datetime import datetime -from distutils.version import LooseVersion + +from ansible_collections.kubernetes.core.plugins.module_utils.version import LooseVersion from ansible_collections.kubernetes.core.plugins.module_utils.args_common import ( AUTH_ARG_MAP, diff --git a/plugins/module_utils/version.py b/plugins/module_utils/version.py new file mode 100644 index 00000000000..3d7d6a87d4d --- /dev/null +++ b/plugins/module_utils/version.py @@ -0,0 +1,19 @@ +# -*- 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: + raise_from(ImportError('To use this plugin or module with ansible-core < 2.11, you need to use Python < 3.12 with distutils.version present'), exc) diff --git a/plugins/modules/helm.py b/plugins/modules/helm.py index 7e9a7067a90..7cd30686f44 100644 --- a/plugins/modules/helm.py +++ b/plugins/modules/helm.py @@ -308,7 +308,8 @@ import tempfile import traceback -from distutils.version import LooseVersion +from ansible_collections.kubernetes.core.plugins.module_utils.version import LooseVersion + try: import yaml