From bd6cec2105c8d575d20d1e3889a6d26b5ce0377e Mon Sep 17 00:00:00 2001 From: Maxwell G Date: Mon, 29 May 2023 11:52:50 -0500 Subject: [PATCH] respawn copr module when dnf is missing (#6522) * respawn copr module when dnf is missing Fixes: https://bugzilla.redhat.com/2203513 * don't guard common.respawn module_util import --- changelogs/fragments/6522-copr-respawn.yaml | 4 ++++ plugins/modules/copr.py | 16 ++++++++++++++++ tests/integration/targets/copr/tasks/main.yml | 6 ------ 3 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 changelogs/fragments/6522-copr-respawn.yaml diff --git a/changelogs/fragments/6522-copr-respawn.yaml b/changelogs/fragments/6522-copr-respawn.yaml new file mode 100644 index 0000000000..8d5922e4c9 --- /dev/null +++ b/changelogs/fragments/6522-copr-respawn.yaml @@ -0,0 +1,4 @@ +--- +minor_changes: + - "copr - respawn module to use the system python interpreter when the ``dnf`` python module is not available in ``ansible_python_interpreter`` + (https://github.com/ansible-collections/community.general/pull/6522)." diff --git a/plugins/modules/copr.py b/plugins/modules/copr.py index 965c2a935d..1311de849d 100644 --- a/plugins/modules/copr.py +++ b/plugins/modules/copr.py @@ -97,6 +97,7 @@ except ImportError: DNF_IMP_ERR = traceback.format_exc() HAS_DNF_PACKAGES = False +from ansible.module_utils.common import respawn from ansible.module_utils.six.moves.urllib.error import HTTPError from ansible.module_utils.basic import missing_required_lib from ansible.module_utils import distro # pylint: disable=import-error @@ -104,6 +105,20 @@ from ansible.module_utils.basic import AnsibleModule # pylint: disable=import-e from ansible.module_utils.urls import open_url # pylint: disable=import-error +def _respawn_dnf(): + if respawn.has_respawned(): + return + system_interpreters = ( + "/usr/libexec/platform-python", + "/usr/bin/python3", + "/usr/bin/python2", + "/usr/bin/python", + ) + interpreter = respawn.probe_interpreters_for_module(system_interpreters, "dnf") + if interpreter: + respawn.respawn_module(interpreter) + + class CoprModule(object): """The class represents a copr module. @@ -460,6 +475,7 @@ def run_module(): params = module.params if not HAS_DNF_PACKAGES: + _respawn_dnf() module.fail_json(msg=missing_required_lib("dnf"), exception=DNF_IMP_ERR) CoprModule.ansible_module = module diff --git a/tests/integration/targets/copr/tasks/main.yml b/tests/integration/targets/copr/tasks/main.yml index 0e46517240..0d66378112 100644 --- a/tests/integration/targets/copr/tasks/main.yml +++ b/tests/integration/targets/copr/tasks/main.yml @@ -10,12 +10,6 @@ ansible_distribution == 'Fedora' or (ansible_os_family == 'RedHat' and ansible_distribution != 'Fedora' and ansible_distribution_major_version | int >= 8) - # The copr module imports dnf which is only available for the system Python - # interpreter. - - > - not (ansible_distribution == 'CentOS' and - ansible_distribution_major_version | int == 8 and not - ansible_python_version.startswith('3.6')) block: - debug: var=copr_chroot - name: enable copr project