SHA256
1
0
forked from pool/salt
salt/add-rpm_vercmp-python-library-for-version-comparison.patch

1116 lines
41 KiB
Diff

From 0ccc9aa260032ba86481f121132a10f439a20700 Mon Sep 17 00:00:00 2001
From: Victor Zhestkov <vzhestkov@suse.com>
Date: Mon, 15 Nov 2021 17:22:35 +0300
Subject: [PATCH] Add rpm_vercmp python library for version comparison -
3003.3 (#448)
* Add rpm_vercmp python library for version comparison
* Add rpm-vercmp to tiamat builds
* Put GPG tests back to test_rpm_lowpkg
Co-authored-by: Megan Wilhite <mwilhite@vmware.com>
---
changelog/60814.added | 1 +
salt/modules/rpm_lowpkg.py | 21 +-
tests/pytests/unit/modules/test_rpm_lowpkg.py | 545 ++++++++++++++++++
tests/unit/modules/test_rpm_lowpkg.py | 478 ---------------
4 files changed, 566 insertions(+), 479 deletions(-)
create mode 100644 changelog/60814.added
create mode 100644 tests/pytests/unit/modules/test_rpm_lowpkg.py
delete mode 100644 tests/unit/modules/test_rpm_lowpkg.py
diff --git a/changelog/60814.added b/changelog/60814.added
new file mode 100644
index 0000000000..7a9ffe1b25
--- /dev/null
+++ b/changelog/60814.added
@@ -0,0 +1 @@
+Add the python rpm-vercmp library in the rpm_lowpkg.py module.
diff --git a/salt/modules/rpm_lowpkg.py b/salt/modules/rpm_lowpkg.py
index 370bd5b728..aba5b939b6 100644
--- a/salt/modules/rpm_lowpkg.py
+++ b/salt/modules/rpm_lowpkg.py
@@ -29,6 +29,13 @@ try:
except ImportError:
HAS_RPMUTILS = False
+try:
+ import rpm_vercmp
+
+ HAS_PY_RPM = True
+except ImportError:
+ HAS_PY_RPM = False
+
log = logging.getLogger(__name__)
@@ -710,6 +717,8 @@ def version_cmp(ver1, ver2, ignore_epoch=False):
"labelCompare function. Not using rpm.labelCompare for "
"version comparison."
)
+ elif HAS_PY_RPM:
+ cmp_func = rpm_vercmp.vercmp
else:
log.warning(
"Please install a package that provides rpm.labelCompare for "
@@ -778,7 +787,17 @@ def version_cmp(ver1, ver2, ignore_epoch=False):
if not ver1_r or not ver2_r:
ver1_r = ver2_r = ""
- cmp_result = cmp_func((ver1_e, ver1_v, ver1_r), (ver2_e, ver2_v, ver2_r))
+ if HAS_PY_RPM:
+ # handle epoch version comparison first
+ # rpm_vercmp.vercmp does not handle epoch version comparison
+ ret = salt.utils.versions.version_cmp(ver1_e, ver2_e)
+ if ret in (1, -1):
+ return ret
+ cmp_result = cmp_func(ver1, ver2)
+ else:
+ cmp_result = cmp_func(
+ (ver1_e, ver1_v, ver1_r), (ver2_e, ver2_v, ver2_r)
+ )
if cmp_result not in (-1, 0, 1):
raise CommandExecutionError(
"Comparison result '{}' is invalid".format(cmp_result)
diff --git a/tests/pytests/unit/modules/test_rpm_lowpkg.py b/tests/pytests/unit/modules/test_rpm_lowpkg.py
new file mode 100644
index 0000000000..c9d1ac2b1c
--- /dev/null
+++ b/tests/pytests/unit/modules/test_rpm_lowpkg.py
@@ -0,0 +1,545 @@
+"""
+ :codeauthor: Jayesh Kariya <jayeshk@saltstack.com>
+"""
+
+
+import datetime
+import pytest
+import salt.modules.cmdmod
+import salt.modules.rpm_lowpkg as rpm
+import salt.utils.path
+from tests.support.mock import MagicMock, patch
+
+# pylint: disable=unused-import
+try:
+ import rpm as rpm_lib
+
+ HAS_RPM = True
+except ImportError:
+ HAS_RPM = False
+
+try:
+ import rpm_vercmp
+
+ HAS_PY_RPM = True
+except ImportError:
+ HAS_PY_RPM = False
+# pylint: enable=unused-import
+
+
+def _called_with_root(mock):
+ cmd = " ".join(mock.call_args[0][0])
+ return cmd.startswith("rpm --root /")
+
+
+@pytest.fixture
+def configure_loader_modules():
+ return {rpm: {"rpm": MagicMock(return_value=MagicMock)}}
+
+
+# 'list_pkgs' function tests: 2
+
+
+def test_list_pkgs():
+ """
+ Test if it list the packages currently installed in a dict
+ """
+ mock = MagicMock(return_value="")
+ with patch.dict(rpm.__salt__, {"cmd.run": mock}):
+ assert rpm.list_pkgs() == {}
+ assert not _called_with_root(mock)
+
+
+def test_list_pkgs_root():
+ """
+ Test if it list the packages currently installed in a dict,
+ called with root parameter
+ """
+ mock = MagicMock(return_value="")
+ with patch.dict(rpm.__salt__, {"cmd.run": mock}):
+ rpm.list_pkgs(root="/")
+ assert _called_with_root(mock)
+
+
+# 'verify' function tests: 2
+
+
+def test_verify():
+ """
+ Test if it runs an rpm -Va on a system, and returns the
+ results in a dict
+ """
+ mock = MagicMock(
+ return_value={"stdout": "", "stderr": "", "retcode": 0, "pid": 12345}
+ )
+ with patch.dict(rpm.__salt__, {"cmd.run_all": mock}):
+ assert rpm.verify("httpd") == {}
+ assert not _called_with_root(mock)
+
+
+def test_verify_root():
+ """
+ Test if it runs an rpm -Va on a system, and returns the
+ results in a dict, called with root parameter
+ """
+ mock = MagicMock(
+ return_value={"stdout": "", "stderr": "", "retcode": 0, "pid": 12345}
+ )
+ with patch.dict(rpm.__salt__, {"cmd.run_all": mock}):
+ rpm.verify("httpd", root="/")
+ assert _called_with_root(mock)
+
+
+# 'file_list' function tests: 2
+
+
+def test_file_list():
+ """
+ Test if it list the files that belong to a package.
+ """
+ mock = MagicMock(return_value="")
+ with patch.dict(rpm.__salt__, {"cmd.run": mock}):
+ assert rpm.file_list("httpd") == {"errors": [], "files": []}
+ assert not _called_with_root(mock)
+
+
+def test_file_list_root():
+ """
+ Test if it list the files that belong to a package, using the
+ root parameter.
+ """
+
+ mock = MagicMock(return_value="")
+ with patch.dict(rpm.__salt__, {"cmd.run": mock}):
+ rpm.file_list("httpd", root="/")
+ assert _called_with_root(mock)
+
+
+# 'file_dict' function tests: 2
+
+
+def test_file_dict():
+ """
+ Test if it list the files that belong to a package
+ """
+ mock = MagicMock(return_value="")
+ with patch.dict(rpm.__salt__, {"cmd.run": mock}):
+ assert rpm.file_dict("httpd") == {"errors": [], "packages": {}}
+ assert not _called_with_root(mock)
+
+
+def test_file_dict_root():
+ """
+ Test if it list the files that belong to a package
+ """
+ mock = MagicMock(return_value="")
+ with patch.dict(rpm.__salt__, {"cmd.run": mock}):
+ rpm.file_dict("httpd", root="/")
+ assert _called_with_root(mock)
+
+
+# 'owner' function tests: 1
+
+
+def test_owner():
+ """
+ Test if it return the name of the package that owns the file.
+ """
+ assert rpm.owner() == ""
+
+ ret = "file /usr/bin/salt-jenkins-build is not owned by any package"
+ mock = MagicMock(return_value=ret)
+ with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
+ assert rpm.owner("/usr/bin/salt-jenkins-build") == ""
+ assert not _called_with_root(mock)
+
+ ret = {
+ "/usr/bin/vim": "vim-enhanced-7.4.160-1.e17.x86_64",
+ "/usr/bin/python": "python-2.7.5-16.e17.x86_64",
+ }
+ mock = MagicMock(
+ side_effect=[
+ "python-2.7.5-16.e17.x86_64",
+ "vim-enhanced-7.4.160-1.e17.x86_64",
+ ]
+ )
+ with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
+ assert rpm.owner("/usr/bin/python", "/usr/bin/vim") == ret
+ assert not _called_with_root(mock)
+
+
+def test_owner_root():
+ """
+ Test if it return the name of the package that owns the file,
+ using the parameter root.
+ """
+ assert rpm.owner() == ""
+
+ ret = "file /usr/bin/salt-jenkins-build is not owned by any package"
+ mock = MagicMock(return_value=ret)
+ with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
+ rpm.owner("/usr/bin/salt-jenkins-build", root="/")
+ assert _called_with_root(mock)
+
+
+# 'checksum' function tests: 2
+
+
+def test_checksum():
+ """
+ Test if checksum validate as expected
+ """
+ ret = {
+ "file1.rpm": True,
+ "file2.rpm": False,
+ "file3.rpm": False,
+ }
+
+ mock = MagicMock(side_effect=[True, 0, True, 1, False, 0])
+ with patch.dict(rpm.__salt__, {"file.file_exists": mock, "cmd.retcode": mock}):
+ assert rpm.checksum("file1.rpm", "file2.rpm", "file3.rpm") == ret
+ assert not _called_with_root(mock)
+
+
+def test_checksum_root():
+ """
+ Test if checksum validate as expected, using the parameter
+ root
+ """
+ mock = MagicMock(side_effect=[True, 0])
+ with patch.dict(rpm.__salt__, {"file.file_exists": mock, "cmd.retcode": mock}):
+ rpm.checksum("file1.rpm", root="/")
+ assert _called_with_root(mock)
+
+
+@pytest.mark.parametrize("rpm_lib", ["HAS_RPM", "HAS_PY_RPM", "rpmdev-vercmp"])
+def test_version_cmp_rpm_all_libraries(rpm_lib):
+ """
+ Test package version when each library is installed
+ """
+ rpmdev = salt.utils.path.which("rpmdev-vercmp")
+ patch_cmd = patch.dict(rpm.__salt__, {"cmd.run_all": salt.modules.cmdmod.run_all})
+ if rpm_lib == "rpmdev-vercmp":
+ if rpmdev:
+ patch_rpm = patch("salt.modules.rpm_lowpkg.HAS_RPM", False)
+ patch_py_rpm = patch("salt.modules.rpm_lowpkg.HAS_PY_RPM", False)
+ else:
+ pytest.skip("The rpmdev-vercmp binary is not installed")
+ elif rpm_lib == "HAS_RPM":
+ if HAS_RPM:
+ patch_rpm = patch("salt.modules.rpm_lowpkg.HAS_RPM", True)
+ patch_py_rpm = patch("salt.modules.rpm_lowpkg.HAS_PY_RPM", False)
+ else:
+ pytest.skip("The RPM lib is not installed, skipping")
+ elif rpm_lib == "HAS_PY_RPM":
+ if HAS_PY_RPM:
+ patch_rpm = patch("salt.modules.rpm_lowpkg.HAS_RPM", False)
+ patch_py_rpm = patch("salt.modules.rpm_lowpkg.HAS_PY_RPM", True)
+ else:
+ pytest.skip("The Python RPM lib is not installed, skipping")
+
+ with patch_rpm, patch_py_rpm, patch_cmd:
+ assert -1 == rpm.version_cmp("1", "2")
+ assert -1 == rpm.version_cmp("2.9.1-6.el7_2.3", "2.9.1-6.el7.4")
+ assert 1 == rpm.version_cmp("3.2", "3.0")
+ assert 0 == rpm.version_cmp("3.0", "3.0")
+ assert 1 == rpm.version_cmp("1:2.9.1-6.el7_2.3", "2.9.1-6.el7.4")
+ assert -1 == rpm.version_cmp("1:2.9.1-6.el7_2.3", "1:2.9.1-6.el7.4")
+ assert 1 == rpm.version_cmp("2:2.9.1-6.el7_2.3", "1:2.9.1-6.el7.4")
+ assert 0 == rpm.version_cmp("3:2.9.1-6.el7.4", "3:2.9.1-6.el7.4")
+ assert -1 == rpm.version_cmp("3:2.9.1-6.el7.4", "3:2.9.1-7.el7.4")
+ assert 1 == rpm.version_cmp("3:2.9.1-8.el7.4", "3:2.9.1-7.el7.4")
+
+
+@patch("salt.modules.rpm_lowpkg.HAS_RPM", True)
+@patch("salt.modules.rpm_lowpkg.rpm.labelCompare", return_value=-1)
+@patch("salt.modules.rpm_lowpkg.log")
+def test_version_cmp_rpm(mock_log, mock_labelCompare):
+ """
+ Test package version if RPM-Python is installed
+
+ :return:
+ """
+ assert -1 == rpm.version_cmp("1", "2")
+ assert not mock_log.warning.called
+ assert mock_labelCompare.called
+
+
+@patch("salt.modules.rpm_lowpkg.HAS_RPM", False)
+@patch("salt.modules.rpm_lowpkg.HAS_RPMUTILS", True)
+@patch("salt.modules.rpm_lowpkg.HAS_PY_RPM", False)
+@patch("salt.modules.rpm_lowpkg.rpmUtils", create=True)
+@patch("salt.modules.rpm_lowpkg.log")
+def test_version_cmp_rpmutils(mock_log, mock_rpmUtils):
+ """
+ Test package version if rpmUtils.miscutils called
+
+ :return:
+ """
+ mock_rpmUtils.miscutils = MagicMock()
+ mock_rpmUtils.miscutils.compareEVR = MagicMock(return_value=-1)
+ assert -1 == rpm.version_cmp("1", "2")
+ assert mock_log.warning.called
+ assert mock_rpmUtils.miscutils.compareEVR.called
+ assert (
+ mock_log.warning.mock_calls[0][1][0]
+ == "Please install a package that provides rpm.labelCompare for more accurate version comparisons."
+ )
+
+
+@patch("salt.modules.rpm_lowpkg.HAS_RPM", False)
+@patch("salt.modules.rpm_lowpkg.HAS_RPMUTILS", False)
+@patch("salt.modules.rpm_lowpkg.HAS_PY_RPM", False)
+@patch("salt.utils.path.which", return_value=True)
+@patch("salt.modules.rpm_lowpkg.log")
+def test_version_cmp_rpmdev_vercmp(mock_log, mock_which):
+ """
+ Test package version if rpmdev-vercmp is installed
+
+ :return:
+ """
+ mock__salt__ = MagicMock(return_value={"retcode": 12})
+ with patch.dict(rpm.__salt__, {"cmd.run_all": mock__salt__}):
+ assert -1 == rpm.version_cmp("1", "2")
+ assert mock__salt__.called
+ assert mock_log.warning.called
+ assert (
+ mock_log.warning.mock_calls[0][1][0]
+ == "Please install a package that provides rpm.labelCompare for more accurate version comparisons."
+ )
+ assert (
+ mock_log.warning.mock_calls[1][1][0]
+ == "Installing the rpmdevtools package may surface dev tools in production."
+ )
+
+
+@patch("salt.modules.rpm_lowpkg.HAS_RPM", False)
+@patch("salt.modules.rpm_lowpkg.HAS_RPMUTILS", False)
+@patch("salt.modules.rpm_lowpkg.HAS_PY_RPM", False)
+@patch("salt.utils.versions.version_cmp", return_value=-1)
+@patch("salt.utils.path.which", return_value=False)
+@patch("salt.modules.rpm_lowpkg.log")
+def test_version_cmp_python(mock_log, mock_which, mock_version_cmp):
+ """
+ Test package version if falling back to python
+
+ :return:
+ """
+ assert -1 == rpm.version_cmp("1", "2")
+ assert mock_version_cmp.called
+ assert mock_log.warning.called
+ assert (
+ mock_log.warning.mock_calls[0][1][0]
+ == "Please install a package that provides rpm.labelCompare for more accurate version comparisons."
+ )
+ assert (
+ mock_log.warning.mock_calls[1][1][0]
+ == "Falling back on salt.utils.versions.version_cmp() for version comparisons"
+ )
+
+
+def test_list_gpg_keys_no_info():
+ """
+ Test list_gpg_keys with no extra information
+ """
+ mock = MagicMock(return_value="\n".join(["gpg-pubkey-1", "gpg-pubkey-2"]))
+ with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
+ assert rpm.list_gpg_keys() == ["gpg-pubkey-1", "gpg-pubkey-2"]
+ assert not _called_with_root(mock)
+
+
+def test_list_gpg_keys_no_info_root():
+ """
+ Test list_gpg_keys with no extra information and root
+ """
+ mock = MagicMock(return_value="\n".join(["gpg-pubkey-1", "gpg-pubkey-2"]))
+ with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
+ assert rpm.list_gpg_keys(root="/mnt") == ["gpg-pubkey-1", "gpg-pubkey-2"]
+ assert _called_with_root(mock)
+
+
+@patch("salt.modules.rpm_lowpkg.info_gpg_key")
+def test_list_gpg_keys_info(info_gpg_key):
+ """
+ Test list_gpg_keys with extra information
+ """
+ info_gpg_key.side_effect = lambda x, root: {"Description": "key for {}".format(x)}
+ mock = MagicMock(return_value="\n".join(["gpg-pubkey-1", "gpg-pubkey-2"]))
+ with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
+ assert rpm.list_gpg_keys(info=True) == {
+ "gpg-pubkey-1": {"Description": "key for gpg-pubkey-1"},
+ "gpg-pubkey-2": {"Description": "key for gpg-pubkey-2"},
+ }
+ assert not _called_with_root(mock)
+
+
+def test_info_gpg_key():
+ """
+ Test info_gpg_keys from a normal output
+ """
+ info = """Name : gpg-pubkey
+Version : 3dbdc284
+Release : 53674dd4
+Architecture: (none)
+Install Date: Fri 08 Mar 2019 11:57:44 AM UTC
+Group : Public Keys
+Size : 0
+License : pubkey
+Signature : (none)
+Source RPM : (none)
+Build Date : Mon 05 May 2014 10:37:40 AM UTC
+Build Host : localhost
+Packager : openSUSE Project Signing Key <opensuse@opensuse.org>
+Summary : gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)
+Description :
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: rpm-4.14.2.1 (NSS-3)
+
+mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
+3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
+93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
+mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
+oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
+VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
+Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYC
+GwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCU2dN1AUJHR8ElQAKCRC4iy/UPb3C
+hGQrB/9teCZ3Nt8vHE0SC5NmYMAE1Spcjkzx6M4r4C70AVTMEQh/8BvgmwkKP/qI
+CWo2vC1hMXRgLg/TnTtFDq7kW+mHsCXmf5OLh2qOWCKi55Vitlf6bmH7n+h34Sha
+Ei8gAObSpZSF8BzPGl6v0QmEaGKM3O1oUbbB3Z8i6w21CTg7dbU5vGR8Yhi9rNtr
+hqrPS+q2yftjNbsODagaOUb85ESfQGx/LqoMePD+7MqGpAXjKMZqsEDP0TbxTwSk
+4UKnF4zFCYHPLK3y/hSH5SEJwwPY11l6JGdC1Ue8Zzaj7f//axUs/hTC0UZaEE+a
+5v4gbqOcigKaFs9Lc3Bj8b/lE10Y
+=i2TA
+-----END PGP PUBLIC KEY BLOCK-----
+
+"""
+ mock = MagicMock(return_value=info)
+ with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
+ assert rpm.info_gpg_key("key") == {
+ "Name": "gpg-pubkey",
+ "Version": "3dbdc284",
+ "Release": "53674dd4",
+ "Architecture": None,
+ "Install Date": datetime.datetime(2019, 3, 8, 11, 57, 44),
+ "Group": "Public Keys",
+ "Size": 0,
+ "License": "pubkey",
+ "Signature": None,
+ "Source RPM": None,
+ "Build Date": datetime.datetime(2014, 5, 5, 10, 37, 40),
+ "Build Host": "localhost",
+ "Packager": "openSUSE Project Signing Key <opensuse@opensuse.org>",
+ "Summary": "gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)",
+ "Description": """-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: rpm-4.14.2.1 (NSS-3)
+
+mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
+3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
+93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
+mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
+oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
+VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
+Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYC
+GwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCU2dN1AUJHR8ElQAKCRC4iy/UPb3C
+hGQrB/9teCZ3Nt8vHE0SC5NmYMAE1Spcjkzx6M4r4C70AVTMEQh/8BvgmwkKP/qI
+CWo2vC1hMXRgLg/TnTtFDq7kW+mHsCXmf5OLh2qOWCKi55Vitlf6bmH7n+h34Sha
+Ei8gAObSpZSF8BzPGl6v0QmEaGKM3O1oUbbB3Z8i6w21CTg7dbU5vGR8Yhi9rNtr
+hqrPS+q2yftjNbsODagaOUb85ESfQGx/LqoMePD+7MqGpAXjKMZqsEDP0TbxTwSk
+4UKnF4zFCYHPLK3y/hSH5SEJwwPY11l6JGdC1Ue8Zzaj7f//axUs/hTC0UZaEE+a
+5v4gbqOcigKaFs9Lc3Bj8b/lE10Y
+=i2TA
+-----END PGP PUBLIC KEY BLOCK-----""",
+ }
+ assert not _called_with_root(mock)
+
+
+def test_info_gpg_key_extended():
+ """
+ Test info_gpg_keys from an extended output
+ """
+ info = """Name : gpg-pubkey
+Version : 3dbdc284
+Release : 53674dd4
+Architecture: (none)
+Install Date: Fri 08 Mar 2019 11:57:44 AM UTC
+Group : Public Keys
+Size : 0
+License : pubkey
+Signature : (none)
+Source RPM : (none)
+Build Date : Mon 05 May 2014 10:37:40 AM UTC
+Build Host : localhost
+Packager : openSUSE Project Signing Key <opensuse@opensuse.org>
+Summary : gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)
+Description :
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: rpm-4.14.2.1 (NSS-3)
+
+mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
+3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
+93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
+mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
+oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
+VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
+Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYC
+GwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCU2dN1AUJHR8ElQAKCRC4iy/UPb3C
+hGQrB/9teCZ3Nt8vHE0SC5NmYMAE1Spcjkzx6M4r4C70AVTMEQh/8BvgmwkKP/qI
+CWo2vC1hMXRgLg/TnTtFDq7kW+mHsCXmf5OLh2qOWCKi55Vitlf6bmH7n+h34Sha
+Ei8gAObSpZSF8BzPGl6v0QmEaGKM3O1oUbbB3Z8i6w21CTg7dbU5vGR8Yhi9rNtr
+hqrPS+q2yftjNbsODagaOUb85ESfQGx/LqoMePD+7MqGpAXjKMZqsEDP0TbxTwSk
+4UKnF4zFCYHPLK3y/hSH5SEJwwPY11l6JGdC1Ue8Zzaj7f//axUs/hTC0UZaEE+a
+5v4gbqOcigKaFs9Lc3Bj8b/lE10Y
+=i2TA
+-----END PGP PUBLIC KEY BLOCK-----
+
+Distribution: (none)
+"""
+ mock = MagicMock(return_value=info)
+ with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
+ assert rpm.info_gpg_key("key") == {
+ "Name": "gpg-pubkey",
+ "Version": "3dbdc284",
+ "Release": "53674dd4",
+ "Architecture": None,
+ "Install Date": datetime.datetime(2019, 3, 8, 11, 57, 44),
+ "Group": "Public Keys",
+ "Size": 0,
+ "License": "pubkey",
+ "Signature": None,
+ "Source RPM": None,
+ "Build Date": datetime.datetime(2014, 5, 5, 10, 37, 40),
+ "Build Host": "localhost",
+ "Packager": "openSUSE Project Signing Key <opensuse@opensuse.org>",
+ "Summary": "gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)",
+ "Description": """-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: rpm-4.14.2.1 (NSS-3)
+
+mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
+3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
+93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
+mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
+oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
+VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
+Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYC
+GwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCU2dN1AUJHR8ElQAKCRC4iy/UPb3C
+hGQrB/9teCZ3Nt8vHE0SC5NmYMAE1Spcjkzx6M4r4C70AVTMEQh/8BvgmwkKP/qI
+CWo2vC1hMXRgLg/TnTtFDq7kW+mHsCXmf5OLh2qOWCKi55Vitlf6bmH7n+h34Sha
+Ei8gAObSpZSF8BzPGl6v0QmEaGKM3O1oUbbB3Z8i6w21CTg7dbU5vGR8Yhi9rNtr
+hqrPS+q2yftjNbsODagaOUb85ESfQGx/LqoMePD+7MqGpAXjKMZqsEDP0TbxTwSk
+4UKnF4zFCYHPLK3y/hSH5SEJwwPY11l6JGdC1Ue8Zzaj7f//axUs/hTC0UZaEE+a
+5v4gbqOcigKaFs9Lc3Bj8b/lE10Y
+=i2TA
+-----END PGP PUBLIC KEY BLOCK-----""",
+ "Distribution": None,
+ }
+ assert not _called_with_root(mock)
+
+
+def test_remove_gpg_key():
+ """
+ Test remove_gpg_key
+ """
+ mock = MagicMock(return_value=0)
+ with patch.dict(rpm.__salt__, {"cmd.retcode": mock}):
+ assert rpm.remove_gpg_key("gpg-pubkey-1")
+ assert not _called_with_root(mock)
diff --git a/tests/unit/modules/test_rpm_lowpkg.py b/tests/unit/modules/test_rpm_lowpkg.py
deleted file mode 100644
index 280a19b911..0000000000
--- a/tests/unit/modules/test_rpm_lowpkg.py
+++ /dev/null
@@ -1,478 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
- :codeauthor: Jayesh Kariya <jayeshk@saltstack.com>
-"""
-
-# Import Python Libs
-from __future__ import absolute_import
-import datetime
-
-# Import Salt Libs
-import salt.modules.rpm_lowpkg as rpm
-
-# Import Salt Testing Libs
-from tests.support.mixins import LoaderModuleMockMixin
-from tests.support.mock import MagicMock, patch
-from tests.support.unit import TestCase
-
-
-def _called_with_root(mock):
- cmd = " ".join(mock.call_args[0][0])
- return cmd.startswith("rpm --root /")
-
-
-class RpmTestCase(TestCase, LoaderModuleMockMixin):
- """
- Test cases for salt.modules.rpm
- """
-
- def setup_loader_modules(self):
- return {rpm: {"rpm": MagicMock(return_value=MagicMock)}}
-
- # 'list_pkgs' function tests: 2
-
- def test_list_pkgs(self):
- """
- Test if it list the packages currently installed in a dict
- """
- mock = MagicMock(return_value="")
- with patch.dict(rpm.__salt__, {"cmd.run": mock}):
- self.assertDictEqual(rpm.list_pkgs(), {})
- self.assertFalse(_called_with_root(mock))
-
- def test_list_pkgs_root(self):
- """
- Test if it list the packages currently installed in a dict,
- called with root parameter
- """
- mock = MagicMock(return_value="")
- with patch.dict(rpm.__salt__, {"cmd.run": mock}):
- rpm.list_pkgs(root="/")
- self.assertTrue(_called_with_root(mock))
-
- # 'verify' function tests: 2
-
- def test_verify(self):
- """
- Test if it runs an rpm -Va on a system, and returns the
- results in a dict
- """
- mock = MagicMock(
- return_value={"stdout": "", "stderr": "", "retcode": 0, "pid": 12345}
- )
- with patch.dict(rpm.__salt__, {"cmd.run_all": mock}):
- self.assertDictEqual(rpm.verify("httpd"), {})
- self.assertFalse(_called_with_root(mock))
-
- def test_verify_root(self):
- """
- Test if it runs an rpm -Va on a system, and returns the
- results in a dict, called with root parameter
- """
- mock = MagicMock(
- return_value={"stdout": "", "stderr": "", "retcode": 0, "pid": 12345}
- )
- with patch.dict(rpm.__salt__, {"cmd.run_all": mock}):
- rpm.verify("httpd", root="/")
- self.assertTrue(_called_with_root(mock))
-
- # 'file_list' function tests: 2
-
- def test_file_list(self):
- """
- Test if it list the files that belong to a package.
- """
- mock = MagicMock(return_value="")
- with patch.dict(rpm.__salt__, {"cmd.run": mock}):
- self.assertDictEqual(rpm.file_list("httpd"), {"errors": [], "files": []})
- self.assertFalse(_called_with_root(mock))
-
- def test_file_list_root(self):
- """
- Test if it list the files that belong to a package, using the
- root parameter.
- """
-
- mock = MagicMock(return_value="")
- with patch.dict(rpm.__salt__, {"cmd.run": mock}):
- rpm.file_list("httpd", root="/")
- self.assertTrue(_called_with_root(mock))
-
- # 'file_dict' function tests: 2
-
- def test_file_dict(self):
- """
- Test if it list the files that belong to a package
- """
- mock = MagicMock(return_value="")
- with patch.dict(rpm.__salt__, {"cmd.run": mock}):
- self.assertDictEqual(rpm.file_dict("httpd"), {"errors": [], "packages": {}})
- self.assertFalse(_called_with_root(mock))
-
- def test_file_dict_root(self):
- """
- Test if it list the files that belong to a package
- """
- mock = MagicMock(return_value="")
- with patch.dict(rpm.__salt__, {"cmd.run": mock}):
- rpm.file_dict("httpd", root="/")
- self.assertTrue(_called_with_root(mock))
-
- # 'owner' function tests: 1
-
- def test_owner(self):
- """
- Test if it return the name of the package that owns the file.
- """
- self.assertEqual(rpm.owner(), "")
-
- ret = "file /usr/bin/salt-jenkins-build is not owned by any package"
- mock = MagicMock(return_value=ret)
- with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
- self.assertEqual(rpm.owner("/usr/bin/salt-jenkins-build"), "")
- self.assertFalse(_called_with_root(mock))
-
- ret = {
- "/usr/bin/vim": "vim-enhanced-7.4.160-1.e17.x86_64",
- "/usr/bin/python": "python-2.7.5-16.e17.x86_64",
- }
- mock = MagicMock(
- side_effect=[
- "python-2.7.5-16.e17.x86_64",
- "vim-enhanced-7.4.160-1.e17.x86_64",
- ]
- )
- with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
- self.assertDictEqual(rpm.owner("/usr/bin/python", "/usr/bin/vim"), ret)
- self.assertFalse(_called_with_root(mock))
-
- def test_owner_root(self):
- """
- Test if it return the name of the package that owns the file,
- using the parameter root.
- """
- self.assertEqual(rpm.owner(), "")
-
- ret = "file /usr/bin/salt-jenkins-build is not owned by any package"
- mock = MagicMock(return_value=ret)
- with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
- rpm.owner("/usr/bin/salt-jenkins-build", root="/")
- self.assertTrue(_called_with_root(mock))
-
- # 'checksum' function tests: 2
-
- def test_checksum(self):
- """
- Test if checksum validate as expected
- """
- ret = {
- "file1.rpm": True,
- "file2.rpm": False,
- "file3.rpm": False,
- }
-
- mock = MagicMock(side_effect=[True, 0, True, 1, False, 0])
- with patch.dict(rpm.__salt__, {"file.file_exists": mock, "cmd.retcode": mock}):
- self.assertDictEqual(
- rpm.checksum("file1.rpm", "file2.rpm", "file3.rpm"), ret
- )
- self.assertFalse(_called_with_root(mock))
-
- def test_checksum_root(self):
- """
- Test if checksum validate as expected, using the parameter
- root
- """
- mock = MagicMock(side_effect=[True, 0])
- with patch.dict(rpm.__salt__, {"file.file_exists": mock, "cmd.retcode": mock}):
- rpm.checksum("file1.rpm", root="/")
- self.assertTrue(_called_with_root(mock))
-
- @patch("salt.modules.rpm_lowpkg.HAS_RPM", True)
- @patch("salt.modules.rpm_lowpkg.rpm.labelCompare", return_value=-1)
- @patch("salt.modules.rpm_lowpkg.log")
- def test_version_cmp_rpm(self, mock_log, mock_labelCompare):
- """
- Test package version if RPM-Python is installed
-
- :return:
- """
- self.assertEqual(-1, rpm.version_cmp("1", "2"))
- self.assertEqual(mock_log.warning.called, False)
- self.assertEqual(mock_labelCompare.called, True)
-
- @patch("salt.modules.rpm_lowpkg.HAS_RPM", False)
- @patch("salt.modules.rpm_lowpkg.HAS_RPMUTILS", True)
- @patch("salt.modules.rpm_lowpkg.rpmUtils", create=True)
- @patch("salt.modules.rpm_lowpkg.log")
- def test_version_cmp_rpmutils(self, mock_log, mock_rpmUtils):
- """
- Test package version if rpmUtils.miscutils called
-
- :return:
- """
- mock_rpmUtils.miscutils = MagicMock()
- mock_rpmUtils.miscutils.compareEVR = MagicMock(return_value=-1)
- self.assertEqual(-1, rpm.version_cmp("1", "2"))
- self.assertEqual(mock_log.warning.called, True)
- self.assertEqual(mock_rpmUtils.miscutils.compareEVR.called, True)
- self.assertEqual(
- mock_log.warning.mock_calls[0][1][0],
- "Please install a package that provides rpm.labelCompare for more accurate version comparisons.",
- )
-
- @patch("salt.modules.rpm_lowpkg.HAS_RPM", False)
- @patch("salt.modules.rpm_lowpkg.HAS_RPMUTILS", False)
- @patch("salt.utils.path.which", return_value=True)
- @patch("salt.modules.rpm_lowpkg.log")
- def test_version_cmp_rpmdev_vercmp(self, mock_log, mock_which):
- """
- Test package version if rpmdev-vercmp is installed
-
- :return:
- """
- mock__salt__ = MagicMock(return_value={"retcode": 12})
- with patch.dict(rpm.__salt__, {"cmd.run_all": mock__salt__}):
- self.assertEqual(-1, rpm.version_cmp("1", "2"))
- self.assertEqual(mock__salt__.called, True)
- self.assertEqual(mock_log.warning.called, True)
- self.assertEqual(
- mock_log.warning.mock_calls[0][1][0],
- "Please install a package that provides rpm.labelCompare for more accurate version comparisons.",
- )
- self.assertEqual(
- mock_log.warning.mock_calls[1][1][0],
- "Installing the rpmdevtools package may surface dev tools in production.",
- )
-
- @patch("salt.modules.rpm_lowpkg.HAS_RPM", False)
- @patch("salt.modules.rpm_lowpkg.HAS_RPMUTILS", False)
- @patch("salt.utils.versions.version_cmp", return_value=-1)
- @patch("salt.utils.path.which", return_value=False)
- @patch("salt.modules.rpm_lowpkg.log")
- def test_version_cmp_python(self, mock_log, mock_which, mock_version_cmp):
- """
- Test package version if falling back to python
-
- :return:
- """
- with patch(
- "salt.modules.rpm_lowpkg.rpm.labelCompare", MagicMock(return_value=0)
- ), patch("salt.modules.rpm_lowpkg.HAS_RPM", False):
- self.assertEqual(
- -1, rpm.version_cmp("1", "2")
- ) # mock returns -1, a python implementation was called
-
- def test_list_gpg_keys_no_info(self):
- """
- Test list_gpg_keys with no extra information
- """
- mock = MagicMock(return_value="\n".join(["gpg-pubkey-1", "gpg-pubkey-2"]))
- with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
- self.assertEqual(rpm.list_gpg_keys(), ["gpg-pubkey-1", "gpg-pubkey-2"])
- self.assertFalse(_called_with_root(mock))
-
- def test_list_gpg_keys_no_info_root(self):
- """
- Test list_gpg_keys with no extra information and root
- """
- mock = MagicMock(return_value="\n".join(["gpg-pubkey-1", "gpg-pubkey-2"]))
- with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
- self.assertEqual(
- rpm.list_gpg_keys(root="/mnt"), ["gpg-pubkey-1", "gpg-pubkey-2"]
- )
- self.assertTrue(_called_with_root(mock))
-
- @patch("salt.modules.rpm_lowpkg.info_gpg_key")
- def test_list_gpg_keys_info(self, info_gpg_key):
- """
- Test list_gpg_keys with extra information
- """
- info_gpg_key.side_effect = lambda x, root: {
- "Description": "key for {}".format(x)
- }
- mock = MagicMock(return_value="\n".join(["gpg-pubkey-1", "gpg-pubkey-2"]))
- with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
- self.assertEqual(
- rpm.list_gpg_keys(info=True),
- {
- "gpg-pubkey-1": {"Description": "key for gpg-pubkey-1"},
- "gpg-pubkey-2": {"Description": "key for gpg-pubkey-2"},
- },
- )
- self.assertFalse(_called_with_root(mock))
-
- def test_info_gpg_key(self):
- """
- Test info_gpg_keys from a normal output
- """
- info = """Name : gpg-pubkey
-Version : 3dbdc284
-Release : 53674dd4
-Architecture: (none)
-Install Date: Fri 08 Mar 2019 11:57:44 AM UTC
-Group : Public Keys
-Size : 0
-License : pubkey
-Signature : (none)
-Source RPM : (none)
-Build Date : Mon 05 May 2014 10:37:40 AM UTC
-Build Host : localhost
-Packager : openSUSE Project Signing Key <opensuse@opensuse.org>
-Summary : gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)
-Description :
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: rpm-4.14.2.1 (NSS-3)
-
-mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
-3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
-93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
-mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
-oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
-VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
-Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYC
-GwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCU2dN1AUJHR8ElQAKCRC4iy/UPb3C
-hGQrB/9teCZ3Nt8vHE0SC5NmYMAE1Spcjkzx6M4r4C70AVTMEQh/8BvgmwkKP/qI
-CWo2vC1hMXRgLg/TnTtFDq7kW+mHsCXmf5OLh2qOWCKi55Vitlf6bmH7n+h34Sha
-Ei8gAObSpZSF8BzPGl6v0QmEaGKM3O1oUbbB3Z8i6w21CTg7dbU5vGR8Yhi9rNtr
-hqrPS+q2yftjNbsODagaOUb85ESfQGx/LqoMePD+7MqGpAXjKMZqsEDP0TbxTwSk
-4UKnF4zFCYHPLK3y/hSH5SEJwwPY11l6JGdC1Ue8Zzaj7f//axUs/hTC0UZaEE+a
-5v4gbqOcigKaFs9Lc3Bj8b/lE10Y
-=i2TA
------END PGP PUBLIC KEY BLOCK-----
-
-"""
- mock = MagicMock(return_value=info)
- with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
- self.assertEqual(
- rpm.info_gpg_key("key"),
- {
- "Name": "gpg-pubkey",
- "Version": "3dbdc284",
- "Release": "53674dd4",
- "Architecture": None,
- "Install Date": datetime.datetime(2019, 3, 8, 11, 57, 44),
- "Group": "Public Keys",
- "Size": 0,
- "License": "pubkey",
- "Signature": None,
- "Source RPM": None,
- "Build Date": datetime.datetime(2014, 5, 5, 10, 37, 40),
- "Build Host": "localhost",
- "Packager": "openSUSE Project Signing Key <opensuse@opensuse.org>",
- "Summary": "gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)",
- "Description": """-----BEGIN PGP PUBLIC KEY BLOCK-----
-Version: rpm-4.14.2.1 (NSS-3)
-
-mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
-3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
-93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
-mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
-oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
-VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
-Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYC
-GwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCU2dN1AUJHR8ElQAKCRC4iy/UPb3C
-hGQrB/9teCZ3Nt8vHE0SC5NmYMAE1Spcjkzx6M4r4C70AVTMEQh/8BvgmwkKP/qI
-CWo2vC1hMXRgLg/TnTtFDq7kW+mHsCXmf5OLh2qOWCKi55Vitlf6bmH7n+h34Sha
-Ei8gAObSpZSF8BzPGl6v0QmEaGKM3O1oUbbB3Z8i6w21CTg7dbU5vGR8Yhi9rNtr
-hqrPS+q2yftjNbsODagaOUb85ESfQGx/LqoMePD+7MqGpAXjKMZqsEDP0TbxTwSk
-4UKnF4zFCYHPLK3y/hSH5SEJwwPY11l6JGdC1Ue8Zzaj7f//axUs/hTC0UZaEE+a
-5v4gbqOcigKaFs9Lc3Bj8b/lE10Y
-=i2TA
------END PGP PUBLIC KEY BLOCK-----""",
- },
- )
- self.assertFalse(_called_with_root(mock))
-
- def test_info_gpg_key_extended(self):
- """
- Test info_gpg_keys from an extended output
- """
- info = """Name : gpg-pubkey
-Version : 3dbdc284
-Release : 53674dd4
-Architecture: (none)
-Install Date: Fri 08 Mar 2019 11:57:44 AM UTC
-Group : Public Keys
-Size : 0
-License : pubkey
-Signature : (none)
-Source RPM : (none)
-Build Date : Mon 05 May 2014 10:37:40 AM UTC
-Build Host : localhost
-Packager : openSUSE Project Signing Key <opensuse@opensuse.org>
-Summary : gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)
-Description :
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: rpm-4.14.2.1 (NSS-3)
-
-mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
-3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
-93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
-mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
-oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
-VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
-Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYC
-GwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCU2dN1AUJHR8ElQAKCRC4iy/UPb3C
-hGQrB/9teCZ3Nt8vHE0SC5NmYMAE1Spcjkzx6M4r4C70AVTMEQh/8BvgmwkKP/qI
-CWo2vC1hMXRgLg/TnTtFDq7kW+mHsCXmf5OLh2qOWCKi55Vitlf6bmH7n+h34Sha
-Ei8gAObSpZSF8BzPGl6v0QmEaGKM3O1oUbbB3Z8i6w21CTg7dbU5vGR8Yhi9rNtr
-hqrPS+q2yftjNbsODagaOUb85ESfQGx/LqoMePD+7MqGpAXjKMZqsEDP0TbxTwSk
-4UKnF4zFCYHPLK3y/hSH5SEJwwPY11l6JGdC1Ue8Zzaj7f//axUs/hTC0UZaEE+a
-5v4gbqOcigKaFs9Lc3Bj8b/lE10Y
-=i2TA
------END PGP PUBLIC KEY BLOCK-----
-
-Distribution: (none)
-"""
- mock = MagicMock(return_value=info)
- with patch.dict(rpm.__salt__, {"cmd.run_stdout": mock}):
- self.assertEqual(
- rpm.info_gpg_key("key"),
- {
- "Name": "gpg-pubkey",
- "Version": "3dbdc284",
- "Release": "53674dd4",
- "Architecture": None,
- "Install Date": datetime.datetime(2019, 3, 8, 11, 57, 44),
- "Group": "Public Keys",
- "Size": 0,
- "License": "pubkey",
- "Signature": None,
- "Source RPM": None,
- "Build Date": datetime.datetime(2014, 5, 5, 10, 37, 40),
- "Build Host": "localhost",
- "Packager": "openSUSE Project Signing Key <opensuse@opensuse.org>",
- "Summary": "gpg(openSUSE Project Signing Key <opensuse@opensuse.org>)",
- "Description": """-----BEGIN PGP PUBLIC KEY BLOCK-----
-Version: rpm-4.14.2.1 (NSS-3)
-
-mQENBEkUTD8BCADWLy5d5IpJedHQQSXkC1VK/oAZlJEeBVpSZjMCn8LiHaI9Wq3G
-3Vp6wvsP1b3kssJGzVFNctdXt5tjvOLxvrEfRJuGfqHTKILByqLzkeyWawbFNfSQ
-93/8OunfSTXC1Sx3hgsNXQuOrNVKrDAQUqT620/jj94xNIg09bLSxsjN6EeTvyiO
-mtE9H1J03o9tY6meNL/gcQhxBvwuo205np0JojYBP0pOfN8l9hnIOLkA0yu4ZXig
-oKOVmf4iTjX4NImIWldT+UaWTO18NWcCrujtgHueytwYLBNV5N0oJIP2VYuLZfSD
-VYuPllv7c6O2UEOXJsdbQaVuzU1HLocDyipnABEBAAG0NG9wZW5TVVNFIFByb2pl
-Y3QgU2lnbmluZyBLZXkgPG9wZW5zdXNlQG9wZW5zdXNlLm9yZz6JATwEEwECACYC
-GwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAUCU2dN1AUJHR8ElQAKCRC4iy/UPb3C
-hGQrB/9teCZ3Nt8vHE0SC5NmYMAE1Spcjkzx6M4r4C70AVTMEQh/8BvgmwkKP/qI
-CWo2vC1hMXRgLg/TnTtFDq7kW+mHsCXmf5OLh2qOWCKi55Vitlf6bmH7n+h34Sha
-Ei8gAObSpZSF8BzPGl6v0QmEaGKM3O1oUbbB3Z8i6w21CTg7dbU5vGR8Yhi9rNtr
-hqrPS+q2yftjNbsODagaOUb85ESfQGx/LqoMePD+7MqGpAXjKMZqsEDP0TbxTwSk
-4UKnF4zFCYHPLK3y/hSH5SEJwwPY11l6JGdC1Ue8Zzaj7f//axUs/hTC0UZaEE+a
-5v4gbqOcigKaFs9Lc3Bj8b/lE10Y
-=i2TA
------END PGP PUBLIC KEY BLOCK-----""",
- "Distribution": None,
- },
- )
- self.assertFalse(_called_with_root(mock))
-
- def test_remove_gpg_key(self):
- """
- Test remove_gpg_key
- """
- mock = MagicMock(return_value=0)
- with patch.dict(rpm.__salt__, {"cmd.retcode": mock}):
- self.assertTrue(rpm.remove_gpg_key("gpg-pubkey-1"))
- self.assertFalse(_called_with_root(mock))
--
2.33.1