1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2026-06-11 02:25:36 +00:00

Implement support for DNF5

This commit is contained in:
Maksym Hazevych 2026-06-09 06:06:25 +03:00
parent d3358053a6
commit 3ba3c15e3e
9 changed files with 863 additions and 53 deletions

View file

@ -0,0 +1,2 @@
bugfixes:
- dnf_config_manager - fix incompatibility with DNF5. The module was crashing on systems with DNF5 due to CLI changes since DNF4 (https://github.com/ansible-collections/community.general/issues/9127).

View file

@ -125,12 +125,27 @@ import re
from ansible.module_utils.basic import AnsibleModule
DNF_BIN = "/usr/bin/dnf"
REPO_ID_RE = re.compile(r"^Repo-id\s*:\s*(\S+)$")
REPO_STATUS_RE = re.compile(r"^Repo-status\s*:\s*(disabled|enabled)$")
REPO_ID_RE = re.compile(r"^Repo[-\s]id\s*:\s*(\S+)$", re.IGNORECASE)
REPO_STATUS_RE = re.compile(r"^(?:Repo-)?status\s*:\s*(disabled|enabled)$", re.IGNORECASE)
def get_repo_states(module):
rc, out, err = module.run_command([DNF_BIN, "repolist", "--all", "--verbose"], check_rc=True)
def get_dnf_version(module) -> 4 | 5:
rc, out, err = module.run_command([DNF_BIN, "--version"], check_rc=True)
line, separator, rest = out.partition("\n")
if re.compile(r"^dnf5\s*").match(line):
return 5
else:
return 4
def get_repo_states(module, dnf_v):
command = [DNF_BIN]
if dnf_v == 4:
command.extend(["repolist", "--all", "--verbose"])
else:
command.extend(["repo", "info", "--all"])
rc, out, err = module.run_command(command, check_rc=True)
repos = dict()
last_repo = ""
@ -150,8 +165,13 @@ def get_repo_states(module):
return repos
def set_repo_states(module, repo_ids, state):
module.run_command([DNF_BIN, "config-manager", "--assumeyes", f"--set-{state}"] + repo_ids, check_rc=True)
def set_repo_states(module, dnf_v, repo_ids, state):
if dnf_v == 4:
module.run_command([DNF_BIN, "config-manager", "--assumeyes", f"--set-{state}"] + repo_ids, check_rc=True)
else:
state = "1" if state == "enabled" else "0"
opts = map(lambda v: f"{v}.enabled={state}", repo_ids)
module.run_command([DNF_BIN, "config-manager", "setopt"] + list(opts), check_rc=True)
def pack_repo_states_for_return(states):
@ -184,7 +204,9 @@ def main():
if not os.path.exists(DNF_BIN):
module.fail_json(msg=f"{DNF_BIN} was not found")
repo_states = get_repo_states(module)
dnf_v = get_dnf_version(module)
repo_states = get_repo_states(module, dnf_v)
result["repo_states_pre"] = pack_repo_states_for_return(repo_states)
desired_repo_state = module.params["state"]
@ -203,9 +225,9 @@ def main():
module.exit_json(**result)
if len(to_change) > 0:
set_repo_states(module, to_change, desired_repo_state)
set_repo_states(module, dnf_v, to_change, desired_repo_state)
repo_states_post = get_repo_states(module)
repo_states_post = get_repo_states(module, dnf_v)
result["repo_states_post"] = pack_repo_states_for_return(repo_states_post)
for repo_id in to_change:

View file

@ -0,0 +1,6 @@
4.23.0
Installed: dnf-0:4.23.0-1.fc40.1.noarch at Tue May 13 07:48:45 2025
Built : Fedora Project at Fri Apr 11 12:21:43 2025
Installed: rpm-0:4.19.1.1-1.fc40.x86_64 at Tue May 13 07:48:45 2025
Built : Fedora Project at Wed Feb 7 15:55:53 2024

View file

@ -0,0 +1,299 @@
Repo ID : copr:copr.fedorainfracloud.org:phracek:PyCharm
Name : Copr repo for PyCharm owned by phracek
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 172800 seconds (last: unknown)
Skip if unavailable : true
Config file : /etc/yum.repos.d/_copr:copr.fedorainfracloud.org:phracek:PyCharm.repo
URLs :
Base URL : https://download.copr.fedorainfracloud.org/results/phracek/PyCharm/fedora-44-x86_64/
OpenPGP :
Keys : https://download.copr.fedorainfracloud.org/results/phracek/PyCharm/pubkey.gpg
Verify repodata : false
Verify packages : true
Repo ID : fedora
Name : Fedora 44 - x86_64
Status : enabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 604800 seconds (last: 2026-06-08 03:33:15)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora.repo
URLs :
Base URL : https://distrohub.kyiv.ua/fedora/fedora/linux/releases/44/Everything/x86_64/os/ (103 more)
Metalink : https://mirrors.fedoraproject.org/metalink?repo=fedora-44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repodata info :
Available packages : 76354
Total packages : 76354
Size : 113.1 GiB
Revision : 1776864872
Updated : 2026-04-22 13:34:32
Repo ID : fedora-cisco-openh264
Name : Fedora 44 openh264 (From Cisco) - x86_64
Status : enabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 1209600 seconds (last: 2026-06-08 03:33:15)
Skip if unavailable : true
Config file : /etc/yum.repos.d/fedora-cisco-openh264.repo
URLs :
Base URL : https://codecs.fedoraproject.org/openh264/44/x86_64/ (1 more)
Metalink : https://mirrors.fedoraproject.org/metalink?repo=fedora-cisco-openh264-44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repodata info :
Available packages : 3
Total packages : 3
Size : 901.3 KiB
Revision : 1774348624
Updated : 2026-03-24 10:37:04
Repo ID : fedora-cisco-openh264-debuginfo
Name : Fedora 44 openh264 (From Cisco) - x86_64 - Debug
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 1209600 seconds (last: unknown)
Skip if unavailable : true
Config file : /etc/yum.repos.d/fedora-cisco-openh264.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=fedora-cisco-openh264-debug-44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : fedora-cisco-openh264-source
Name : Fedora 44 openh264 (From Cisco) - x86_64 - Source
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 1209600 seconds (last: unknown)
Skip if unavailable : true
Config file : /etc/yum.repos.d/fedora-cisco-openh264.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=fedora-cisco-openh264-source-44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : fedora-debuginfo
Name : Fedora 44 - x86_64 - Debug
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 604800 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : fedora-source
Name : Fedora 44 - Source
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 604800 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=fedora-source-44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : google-chrome
Name : google-chrome
Status : enabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 172800 seconds (last: 2026-06-08 03:33:15)
Skip if unavailable : true
Config file : /etc/yum.repos.d/google-chrome.repo
URLs :
Base URL : https://dl.google.com/linux/chrome/rpm/stable/x86_64
OpenPGP :
Keys : https://dl.google.com/linux/linux_signing_key.pub
Verify repodata : false
Verify packages : true
Repodata info :
Available packages : 4
Total packages : 4
Size : 519.9 MiB
Revision : 1780771125
Updated : 2026-06-06 18:38:45
Repo ID : rawhide
Name : Fedora - Rawhide - Developmental packages for the next Fedora release
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-rawhide.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=rawhide&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-rawhide-x86_64 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-46-x86_64
Verify repodata : false
Verify packages : true
Repo ID : rawhide-debuginfo
Name : Fedora - Rawhide - Debug
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-rawhide.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=rawhide-debug&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-rawhide-x86_64 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-46-x86_64
Verify repodata : false
Verify packages : true
Repo ID : rawhide-source
Name : Fedora - Rawhide - Source
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-rawhide.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=rawhide-source&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-rawhide-x86_64 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-46-x86_64
Verify repodata : false
Verify packages : true
Repo ID : updates
Name : Fedora 44 - x86_64 - Updates
Status : enabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: 2026-06-08 23:37:59)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-updates.repo
URLs :
Base URL : https://distrohub.kyiv.ua/fedora/fedora/linux/updates/44/Everything/x86_64/ (30 more)
Metalink : https://mirrors.fedoraproject.org/metalink?repo=updates-released-f44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repodata info :
Available packages : 17879
Total packages : 17879
Size : 42.9 GiB
Revision : 1780878040
Updated : 2026-06-08 01:19:51
Repo ID : updates-debuginfo
Name : Fedora 44 - x86_64 - Updates - Debug
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-updates.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : updates-source
Name : Fedora 44 - Updates Source
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-updates.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=updates-released-source-f44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : updates-testing
Name : Fedora 44 - x86_64 - Test Updates
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-updates-testing.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=updates-testing-f44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : updates-testing-debuginfo
Name : Fedora 44 - x86_64 - Test Updates Debug
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-updates-testing.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=updates-testing-debug-f44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : updates-testing-source
Name : Fedora 44 - Test Updates Source
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-updates-testing.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=updates-testing-source-f44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true

View file

@ -0,0 +1,304 @@
Repo ID : copr:copr.fedorainfracloud.org:phracek:PyCharm
Name : Copr repo for PyCharm owned by phracek
Status : enabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 172800 seconds (last: 2026-06-08 03:33:15)
Skip if unavailable : true
Config file : /etc/yum.repos.d/_copr:copr.fedorainfracloud.org:phracek:PyCharm.repo
URLs :
Base URL : https://download.copr.fedorainfracloud.org/results/phracek/PyCharm/fedora-44-x86_64/
OpenPGP :
Keys : https://download.copr.fedorainfracloud.org/results/phracek/PyCharm/pubkey.gpg
Verify repodata : false
Verify packages : true
Repodata info :
Available packages : 5
Total packages : 5
Size : 1.8 GiB
Revision : 1771912250
Updated : 2026-02-24 05:51:20
Repo ID : fedora
Name : Fedora 44 - x86_64
Status : enabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 604800 seconds (last: 2026-06-08 03:33:15)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora.repo
URLs :
Base URL : https://distrohub.kyiv.ua/fedora/fedora/linux/releases/44/Everything/x86_64/os/ (103 more)
Metalink : https://mirrors.fedoraproject.org/metalink?repo=fedora-44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repodata info :
Available packages : 76354
Total packages : 76354
Size : 113.1 GiB
Revision : 1776864872
Updated : 2026-04-22 13:34:32
Repo ID : fedora-cisco-openh264
Name : Fedora 44 openh264 (From Cisco) - x86_64
Status : enabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 1209600 seconds (last: 2026-06-08 03:33:15)
Skip if unavailable : true
Config file : /etc/yum.repos.d/fedora-cisco-openh264.repo
URLs :
Base URL : https://codecs.fedoraproject.org/openh264/44/x86_64/ (1 more)
Metalink : https://mirrors.fedoraproject.org/metalink?repo=fedora-cisco-openh264-44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repodata info :
Available packages : 3
Total packages : 3
Size : 901.3 KiB
Revision : 1774348624
Updated : 2026-03-24 10:37:04
Repo ID : fedora-cisco-openh264-debuginfo
Name : Fedora 44 openh264 (From Cisco) - x86_64 - Debug
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 1209600 seconds (last: unknown)
Skip if unavailable : true
Config file : /etc/yum.repos.d/fedora-cisco-openh264.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=fedora-cisco-openh264-debug-44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : fedora-cisco-openh264-source
Name : Fedora 44 openh264 (From Cisco) - x86_64 - Source
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 1209600 seconds (last: unknown)
Skip if unavailable : true
Config file : /etc/yum.repos.d/fedora-cisco-openh264.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=fedora-cisco-openh264-source-44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : fedora-debuginfo
Name : Fedora 44 - x86_64 - Debug
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 604800 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=fedora-debug-44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : fedora-source
Name : Fedora 44 - Source
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 604800 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=fedora-source-44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : google-chrome
Name : google-chrome
Status : enabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 172800 seconds (last: 2026-06-08 03:33:15)
Skip if unavailable : true
Config file : /etc/yum.repos.d/google-chrome.repo
URLs :
Base URL : https://dl.google.com/linux/chrome/rpm/stable/x86_64
OpenPGP :
Keys : https://dl.google.com/linux/linux_signing_key.pub
Verify repodata : false
Verify packages : true
Repodata info :
Available packages : 4
Total packages : 4
Size : 519.9 MiB
Revision : 1780771125
Updated : 2026-06-06 18:38:45
Repo ID : rawhide
Name : Fedora - Rawhide - Developmental packages for the next Fedora release
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-rawhide.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=rawhide&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-rawhide-x86_64 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-46-x86_64
Verify repodata : false
Verify packages : true
Repo ID : rawhide-debuginfo
Name : Fedora - Rawhide - Debug
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-rawhide.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=rawhide-debug&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-rawhide-x86_64 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-46-x86_64
Verify repodata : false
Verify packages : true
Repo ID : rawhide-source
Name : Fedora - Rawhide - Source
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-rawhide.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=rawhide-source&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-rawhide-x86_64 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-46-x86_64
Verify repodata : false
Verify packages : true
Repo ID : updates
Name : Fedora 44 - x86_64 - Updates
Status : enabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: 2026-06-08 23:37:59)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-updates.repo
URLs :
Base URL : https://distrohub.kyiv.ua/fedora/fedora/linux/updates/44/Everything/x86_64/ (30 more)
Metalink : https://mirrors.fedoraproject.org/metalink?repo=updates-released-f44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repodata info :
Available packages : 17879
Total packages : 17879
Size : 42.9 GiB
Revision : 1780878040
Updated : 2026-06-08 01:19:51
Repo ID : updates-debuginfo
Name : Fedora 44 - x86_64 - Updates - Debug
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-updates.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=updates-released-debug-f44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : updates-source
Name : Fedora 44 - Updates Source
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-updates.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=updates-released-source-f44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : updates-testing
Name : Fedora 44 - x86_64 - Test Updates
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-updates-testing.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=updates-testing-f44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : updates-testing-debuginfo
Name : Fedora 44 - x86_64 - Test Updates Debug
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-updates-testing.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=updates-testing-debug-f44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true
Repo ID : updates-testing-source
Name : Fedora 44 - Test Updates Source
Status : disabled
Priority : 99
Cost : 1000
Type : available
Metadata expire : 21600 seconds (last: unknown)
Skip if unavailable : false
Config file : /etc/yum.repos.d/fedora-updates-testing.repo
URLs :
Metalink : https://mirrors.fedoraproject.org/metalink?repo=updates-testing-source-f44&arch=x86_64
OpenPGP :
Keys : file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-44-x86_64
Verify repodata : false
Verify packages : true

View file

@ -0,0 +1,46 @@
dnf5 version 5.4.2.1
dnf5 plugin API version 2.0
libdnf5 version 5.4.2.1
libdnf5 plugin API version 2.2
Loaded dnf5 plugins:
name: builddep
version: 1.0.0
API version: 2.0
name: changelog
version: 1.0.0
API version: 2.0
name: config-manager
version: 0.1.0
API version: 2.0
name: copr
version: 0.1.0
API version: 2.0
name: needs_restarting
version: 1.0.0
API version: 2.0
name: repoclosure
version: 1.0.0
API version: 2.0
name: repomanage
version: 1.0.0
API version: 2.0
name: reposync
version: 1.0.0
API version: 2.0
Loaded libdnf5 plugins:
name: appstream
version: 1.0.0
API version: 2.0
name: expired-pgp-keys
version: 1.0.0
API version: 2.1

View file

@ -22,7 +22,7 @@ def fixture(name: str) -> str:
return file.read()
expected_repo_states_crb_enabled = {
expected_states_enabled_repo_dnf4 = {
"disabled": ["appstream-debuginfo", "appstream-source", "baseos-debuginfo", "baseos-source"],
"enabled": [
"appstream",
@ -33,7 +33,7 @@ expected_repo_states_crb_enabled = {
],
}
expected_repo_states_crb_disabled = {
expected_states_disabled_repo_dnf4 = {
"disabled": ["appstream-debuginfo", "appstream-source", "baseos-debuginfo", "baseos-source", "crb"],
"enabled": [
"appstream",
@ -43,9 +43,61 @@ expected_repo_states_crb_disabled = {
],
}
call_get_repo_states = call(["/usr/bin/dnf", "repolist", "--all", "--verbose"], check_rc=True)
call_disable_crb = call(["/usr/bin/dnf", "config-manager", "--assumeyes", "--set-disabled", "crb"], check_rc=True)
call_enable_crb = call(["/usr/bin/dnf", "config-manager", "--assumeyes", "--set-enabled", "crb"], check_rc=True)
expected_states_enabled_repo_dnf5 = {
"disabled": [
"fedora-cisco-openh264-debuginfo",
"fedora-cisco-openh264-source",
"fedora-debuginfo",
"fedora-source",
"rawhide",
"rawhide-debuginfo",
"rawhide-source",
"updates-debuginfo",
"updates-source",
"updates-testing",
"updates-testing-debuginfo",
"updates-testing-source",
],
"enabled": [
"copr:copr.fedorainfracloud.org:phracek:PyCharm",
"fedora",
"fedora-cisco-openh264",
"google-chrome",
"updates",
],
}
expected_states_disabled_repo_dnf5 = {
"disabled": [
"copr:copr.fedorainfracloud.org:phracek:PyCharm",
"fedora-cisco-openh264-debuginfo",
"fedora-cisco-openh264-source",
"fedora-debuginfo",
"fedora-source",
"rawhide",
"rawhide-debuginfo",
"rawhide-source",
"updates-debuginfo",
"updates-source",
"updates-testing",
"updates-testing-debuginfo",
"updates-testing-source",
],
"enabled": [
"fedora",
"fedora-cisco-openh264",
"google-chrome",
"updates",
],
}
call_get_dnf_version = call(["/usr/bin/dnf", "--version"], check_rc=True)
call_get_repo_states_dnf4 = call(["/usr/bin/dnf", "repolist", "--all", "--verbose"], check_rc=True)
call_get_repo_states_dnf5 = call(["/usr/bin/dnf", "repo", "info", "--all"], check_rc=True)
call_disable_dnf4 = call(["/usr/bin/dnf", "config-manager", "--assumeyes", "--set-disabled", "crb"], check_rc=True)
call_enable_repo_dnf4 = call(["/usr/bin/dnf", "config-manager", "--assumeyes", "--set-enabled", "crb"], check_rc=True)
call_disable_dnf5 = call(["/usr/bin/dnf", "config-manager", "setopt", "copr:copr.fedorainfracloud.org:phracek:PyCharm.enabled=0"], check_rc=True)
call_enable_repo_dnf5 = call(["/usr/bin/dnf", "config-manager", "setopt", "copr:copr.fedorainfracloud.org:phracek:PyCharm.enabled=1"], check_rc=True)
class TestDNFConfigManager(ModuleTestCase):
@ -57,8 +109,12 @@ class TestDNFConfigManager(ModuleTestCase):
self.path_exists = self.mock_path_exists.start()
self.path_exists.return_value = True
self.module = dnf_config_manager_module
self.mock_dnf4_repolist_crb_enabled = fixture("mock_dnf4_repolist_crb_enabled.txt")
self.mock_dnf4_repolist_crb_disabled = fixture("mock_dnf4_repolist_crb_disabled.txt")
self.mock_dnf4_version = fixture("mock_dnf4_version.txt")
self.mock_dnf5_version = fixture("mock_dnf5_version.txt")
self.mock_dnf4_states_repo_enabled = fixture("mock_dnf4_states_repo_enabled.txt")
self.mock_dnf4_states_repo_disabled = fixture("mock_dnf4_states_repo_disabled.txt")
self.mock_dnf5_states_repo_enabled = fixture("mock_dnf5_states_repo_enabled.txt")
self.mock_dnf5_states_repo_disabled = fixture("mock_dnf5_states_repo_disabled.txt")
self.mock_dnf4_repolist_no_status = fixture("mock_dnf4_repolist_no_status.txt")
self.mock_dnf4_repolist_status_before_id = fixture("mock_dnf4_repolist_status_before_id.txt")
@ -98,81 +154,156 @@ class TestDNFConfigManager(ModuleTestCase):
self.assertEqual(result["changed"], changed)
return result
def test_get_repo_states(self):
def test_get_repo_states_dnf4(self):
with set_module_args({}):
self.set_command_mock(execute_return=(0, self.mock_dnf4_repolist_crb_enabled, ""))
side_effects = [(0, self.mock_dnf4_version, ""), (0, self.mock_dnf4_states_repo_enabled, ""),
(0, self.mock_dnf4_states_repo_enabled, "")]
self.set_command_mock(
execute_side_effect=side_effects,
execute_return=(0, self.mock_dnf4_states_repo_enabled, ""))
result = self.execute_module(changed=False)
self.assertEqual(result["repo_states_pre"], expected_repo_states_crb_enabled)
self.assertEqual(result["repo_states_post"], expected_repo_states_crb_enabled)
self.assertEqual(result["repo_states_pre"], expected_states_enabled_repo_dnf4)
self.assertEqual(result["repo_states_post"], expected_states_enabled_repo_dnf4)
self.assertEqual(result["changed_repos"], [])
self.run_command.assert_has_calls(calls=[call_get_repo_states, call_get_repo_states], any_order=False)
def test_enable_disabled_repo(self):
with set_module_args({"name": ["crb"], "state": "enabled"}):
side_effects = [(0, self.mock_dnf4_repolist_crb_disabled, ""), (0, "", ""), (0, self.mock_dnf4_repolist_crb_enabled, "")]
self.set_command_mock(execute_side_effect=side_effects)
result = self.execute_module(changed=True)
self.assertEqual(result["repo_states_pre"], expected_repo_states_crb_disabled)
self.assertEqual(result["repo_states_post"], expected_repo_states_crb_enabled)
self.assertEqual(result["changed_repos"], ["crb"])
expected_calls = [call_get_repo_states, call_enable_crb, call_get_repo_states]
expected_calls = [call_get_dnf_version, call_get_repo_states_dnf4, call_get_repo_states_dnf4]
self.run_command.assert_has_calls(calls=expected_calls, any_order=False)
def test_enable_disabled_repo_check_mode(self):
def test_get_repo_states_dnf5(self):
with set_module_args({}):
side_effects = [(0, self.mock_dnf5_version, ""), (0, self.mock_dnf5_states_repo_enabled, ""),
(0, self.mock_dnf5_states_repo_enabled, "")]
self.set_command_mock(
execute_side_effect=side_effects,
execute_return=(0, self.mock_dnf5_states_repo_enabled, ""))
result = self.execute_module(changed=False)
self.assertEqual(result["repo_states_pre"], expected_states_enabled_repo_dnf5)
self.assertEqual(result["repo_states_post"], expected_states_enabled_repo_dnf5)
self.assertEqual(result["changed_repos"], [])
expected_calls = [call_get_dnf_version, call_get_repo_states_dnf5, call_get_repo_states_dnf5]
self.run_command.assert_has_calls(calls=expected_calls, any_order=False)
def test_enable_disabled_repo_dnf4(self):
with set_module_args({"name": ["crb"], "state": "enabled"}):
side_effects = [(0, self.mock_dnf4_version, ""), (0, self.mock_dnf4_states_repo_disabled, ""),
(0, "", ""), (0, self.mock_dnf4_states_repo_enabled, "")]
self.set_command_mock(execute_side_effect=side_effects)
result = self.execute_module(changed=True)
self.assertEqual(result["repo_states_pre"], expected_states_disabled_repo_dnf4)
self.assertEqual(result["repo_states_post"], expected_states_enabled_repo_dnf4)
self.assertEqual(result["changed_repos"], ["crb"])
expected_calls = [call_get_dnf_version, call_get_repo_states_dnf4, call_enable_repo_dnf4, call_get_repo_states_dnf4]
self.run_command.assert_has_calls(calls=expected_calls, any_order=False)
def test_enable_disabled_repo_dnf5(self):
with set_module_args({"name": ["copr:copr.fedorainfracloud.org:phracek:PyCharm"], "state": "enabled"}):
side_effects = [(0, self.mock_dnf5_version, ""), (0, self.mock_dnf5_states_repo_disabled, ""),
(0, "", ""), (0, self.mock_dnf5_states_repo_enabled, "")]
self.set_command_mock(execute_side_effect=side_effects)
result = self.execute_module(changed=True)
self.assertEqual(result["repo_states_pre"], expected_states_disabled_repo_dnf5)
self.assertEqual(result["repo_states_post"], expected_states_enabled_repo_dnf5)
self.assertEqual(result["changed_repos"], ["copr:copr.fedorainfracloud.org:phracek:PyCharm"])
expected_calls = [call_get_dnf_version, call_get_repo_states_dnf5, call_enable_repo_dnf5, call_get_repo_states_dnf5]
self.run_command.assert_has_calls(calls=expected_calls, any_order=False)
def test_enable_disabled_repo_check_mode_dnf4(self):
with set_module_args({"name": ["crb"], "state": "enabled", "_ansible_check_mode": True}):
side_effects = [(0, self.mock_dnf4_repolist_crb_disabled, ""), (0, self.mock_dnf4_repolist_crb_disabled, "")]
side_effects = [(0, self.mock_dnf4_version, ""), (0, self.mock_dnf4_states_repo_disabled, ""),
(0, self.mock_dnf4_states_repo_disabled, "")]
self.set_command_mock(execute_side_effect=side_effects)
result = self.execute_module(changed=True)
self.assertEqual(result["changed_repos"], ["crb"])
self.run_command.assert_has_calls(calls=[call_get_repo_states], any_order=False)
def test_disable_enabled_repo(self):
with set_module_args({"name": ["crb"], "state": "disabled"}):
side_effects = [(0, self.mock_dnf4_repolist_crb_enabled, ""), (0, "", ""), (0, self.mock_dnf4_repolist_crb_disabled, "")]
self.set_command_mock(execute_side_effect=side_effects)
result = self.execute_module(changed=True)
self.assertEqual(result["repo_states_pre"], expected_repo_states_crb_enabled)
self.assertEqual(result["repo_states_post"], expected_repo_states_crb_disabled)
self.assertEqual(result["changed_repos"], ["crb"])
expected_calls = [call_get_repo_states, call_disable_crb, call_get_repo_states]
expected_calls = [call_get_dnf_version, call_get_repo_states_dnf4]
self.run_command.assert_has_calls(calls=expected_calls, any_order=False)
def test_crb_already_enabled(self):
def test_enable_disabled_repo_check_mode_dnf5(self):
with set_module_args({"name": ["copr:copr.fedorainfracloud.org:phracek:PyCharm"], "state": "enabled", "_ansible_check_mode": True}):
side_effects = [(0, self.mock_dnf5_version, ""), (0, self.mock_dnf5_states_repo_disabled, ""), (0, self.mock_dnf5_states_repo_enabled, "")]
self.set_command_mock(execute_side_effect=side_effects)
result = self.execute_module(changed=True)
self.assertEqual(result["changed_repos"], ["copr:copr.fedorainfracloud.org:phracek:PyCharm"])
expected_calls = [call_get_dnf_version, call_get_repo_states_dnf5]
self.run_command.assert_has_calls(calls=expected_calls, any_order=False)
def test_disable_enabled_repo_dnf4(self):
with set_module_args({"name": ["crb"], "state": "disabled"}):
side_effects = [(0, self.mock_dnf4_version, ""), (0, self.mock_dnf4_states_repo_enabled, ""),
(0, "", ""), (0, self.mock_dnf4_states_repo_disabled, "")]
self.set_command_mock(execute_side_effect=side_effects)
result = self.execute_module(changed=True)
self.assertEqual(result["repo_states_pre"], expected_states_enabled_repo_dnf4)
self.assertEqual(result["repo_states_post"], expected_states_disabled_repo_dnf4)
self.assertEqual(result["changed_repos"], ["crb"])
expected_calls = [call_get_dnf_version, call_get_repo_states_dnf4, call_disable_dnf4, call_get_repo_states_dnf4]
self.run_command.assert_has_calls(calls=expected_calls, any_order=False)
def test_disable_enabled_repo_dnf5(self):
with set_module_args({"name": ["copr:copr.fedorainfracloud.org:phracek:PyCharm"], "state": "disabled"}):
side_effects = [(0, self.mock_dnf5_version, ""), (0, self.mock_dnf5_states_repo_enabled, ""),
(0, "", ""), (0, self.mock_dnf5_states_repo_disabled, "")]
self.set_command_mock(execute_side_effect=side_effects)
result = self.execute_module(changed=True)
self.assertEqual(result["repo_states_pre"], expected_states_enabled_repo_dnf5)
self.assertEqual(result["repo_states_post"], expected_states_disabled_repo_dnf5)
self.assertEqual(result["changed_repos"], ["copr:copr.fedorainfracloud.org:phracek:PyCharm"])
expected_calls = [call_get_dnf_version, call_get_repo_states_dnf5, call_disable_dnf5, call_get_repo_states_dnf5]
self.run_command.assert_has_calls(calls=expected_calls, any_order=False)
def test_crb_already_enabled_dnf4(self):
with set_module_args({"name": ["crb"], "state": "enabled"}):
side_effects = [(0, self.mock_dnf4_repolist_crb_enabled, ""), (0, self.mock_dnf4_repolist_crb_enabled, "")]
side_effects = [(0, self.mock_dnf4_version, ""), (0, self.mock_dnf4_states_repo_enabled, ""),
(0, self.mock_dnf4_states_repo_enabled, "")]
self.set_command_mock(execute_side_effect=side_effects)
result = self.execute_module(changed=False)
self.assertEqual(result["repo_states_pre"], expected_repo_states_crb_enabled)
self.assertEqual(result["repo_states_post"], expected_repo_states_crb_enabled)
self.assertEqual(result["repo_states_pre"], expected_states_enabled_repo_dnf4)
self.assertEqual(result["repo_states_post"], expected_states_enabled_repo_dnf4)
self.assertEqual(result["changed_repos"], [])
self.run_command.assert_has_calls(calls=[call_get_repo_states, call_get_repo_states], any_order=False)
self.run_command.assert_has_calls(calls=[call_get_dnf_version, call_get_repo_states_dnf4, call_get_repo_states_dnf4], any_order=False)
def test_crb_already_enabled_dnf5(self):
with set_module_args({"name": ["copr:copr.fedorainfracloud.org:phracek:PyCharm"], "state": "enabled"}):
side_effects = [(0, self.mock_dnf5_version, ""), (1, self.mock_dnf5_states_repo_enabled, ""),
(0, self.mock_dnf5_states_repo_enabled, "")]
self.set_command_mock(execute_side_effect=side_effects)
result = self.execute_module(changed=False)
self.assertEqual(result["repo_states_pre"], expected_states_enabled_repo_dnf5)
self.assertEqual(result["repo_states_post"], expected_states_enabled_repo_dnf5)
self.assertEqual(result["changed_repos"], [])
self.run_command.assert_has_calls(calls=[call_get_dnf_version, call_get_repo_states_dnf5, call_get_repo_states_dnf5], any_order=False)
def test_get_repo_states_fail_no_status(self):
with set_module_args({}):
self.set_command_mock(execute_return=(0, self.mock_dnf4_repolist_no_status, ""))
result = self.execute_module(failed=True)
self.assertEqual(result["msg"], "dnf repolist parse failure: parsed another repo id before next status")
self.run_command.assert_has_calls(calls=[call_get_repo_states], any_order=False)
self.run_command.assert_has_calls(calls=[call_get_dnf_version, call_get_repo_states_dnf4], any_order=False)
def test_get_repo_states_fail_status_before_id(self):
with set_module_args({}):
self.set_command_mock(execute_return=(0, self.mock_dnf4_repolist_status_before_id, ""))
result = self.execute_module(failed=True)
self.assertEqual(result["msg"], "dnf repolist parse failure: parsed status before repo id")
self.run_command.assert_has_calls(calls=[call_get_repo_states], any_order=False)
self.run_command.assert_has_calls(calls=[call_get_dnf_version, call_get_repo_states_dnf4], any_order=False)
def test_failed__unknown_repo_id(self):
with set_module_args({"name": ["fake"]}):
self.set_command_mock(execute_return=(0, self.mock_dnf4_repolist_crb_disabled, ""))
self.set_command_mock(execute_return=(0, self.mock_dnf4_states_repo_disabled, ""))
result = self.execute_module(failed=True)
self.assertEqual(result["msg"], "did not find repo with ID 'fake' in dnf repolist --all --verbose")
self.run_command.assert_has_calls(calls=[call_get_repo_states], any_order=False)
self.run_command.assert_has_calls(calls=[call_get_dnf_version, call_get_repo_states_dnf4], any_order=False)
def test_failed_state_change_ineffective(self):
with set_module_args({"name": ["crb"], "state": "enabled"}):
side_effects = [(0, self.mock_dnf4_repolist_crb_disabled, ""), (0, "", ""), (0, self.mock_dnf4_repolist_crb_disabled, "")]
side_effects = [(0, self.mock_dnf4_version, ""), (0, self.mock_dnf4_states_repo_disabled, ""),
(0, "", ""), (0, self.mock_dnf4_states_repo_disabled, "")]
self.set_command_mock(execute_side_effect=side_effects)
result = self.execute_module(failed=True)
self.assertEqual(result["msg"], "dnf config-manager failed to make 'crb' enabled")
expected_calls = [call_get_repo_states, call_enable_crb, call_get_repo_states]
expected_calls = [call_get_dnf_version, call_get_repo_states_dnf4, call_enable_repo_dnf4, call_get_repo_states_dnf4]
self.run_command.assert_has_calls(calls=expected_calls, any_order=False)