File accumulated-changes-from-yomi-167.patch of Package salt

From 828650500159fd7040d2fa76b2fc4d2b627f7065 Mon Sep 17 00:00:00 2001
From: Alberto Planas <aplanas@gmail.com>
Date: Tue, 22 Oct 2019 11:02:33 +0200
Subject: [PATCH] Accumulated changes from Yomi (#167)

* core.py: ignore wrong product_name files

Some firmwares (like some NUC machines), do not provide valid
/sys/class/dmi/id/product_name strings. In those cases an
UnicodeDecodeError exception happens.

This patch ignore this kind of issue during the grains creation.

(cherry picked from commit 2d57d2a6063488ad9329a083219e3826e945aa2d)

* zypperpkg: understand product type

(cherry picked from commit b865491b74679140f7a71c5ba50d482db47b600f)
---
 salt/grains/core.py                  |  6 +--
 salt/modules/zypperpkg.py            | 22 ----------
 tests/unit/grains/test_core.py       | 64 +++++++++++++++++++++++++++-
 tests/unit/modules/test_zypperpkg.py | 38 +++++++++++++++++
 4 files changed, 103 insertions(+), 27 deletions(-)

diff --git a/salt/grains/core.py b/salt/grains/core.py
index 0dc1d97f97..a2983e388b 100644
--- a/salt/grains/core.py
+++ b/salt/grains/core.py
@@ -1046,7 +1046,7 @@ def _virtual(osdata):
         if os.path.isfile("/sys/devices/virtual/dmi/id/product_name"):
             try:
                 with salt.utils.files.fopen(
-                    "/sys/devices/virtual/dmi/id/product_name", "rb"
+                    "/sys/devices/virtual/dmi/id/product_name", "r"
                 ) as fhr:
                     output = salt.utils.stringutils.to_unicode(
                         fhr.read(), errors="replace"
@@ -1066,9 +1066,7 @@ def _virtual(osdata):
             except UnicodeDecodeError:
                 # Some firmwares provide non-valid 'product_name'
                 # files, ignore them
-                log.debug(
-                    "The content in /sys/devices/virtual/dmi/id/product_name is not valid"
-                )
+                pass
             except OSError:
                 pass
     elif osdata["kernel"] == "FreeBSD":
diff --git a/salt/modules/zypperpkg.py b/salt/modules/zypperpkg.py
index 2daec0f380..b5621174a4 100644
--- a/salt/modules/zypperpkg.py
+++ b/salt/modules/zypperpkg.py
@@ -958,28 +958,6 @@ def list_pkgs(versions_as_list=False, root=None, includes=None, **kwargs):
                         }
                     ]
 
-        for include in includes:
-            if include in ("pattern", "patch"):
-                if include == "pattern":
-                    pkgs = list_installed_patterns(root=root)
-                elif include == "patch":
-                    pkgs = list_installed_patches(root=root)
-                else:
-                    pkgs = []
-                for pkg in pkgs:
-                    pkg_extended_name = "{}:{}".format(include, pkg)
-                    info = info_available(pkg_extended_name, refresh=False, root=root)
-                    _ret[pkg_extended_name] = [
-                        {
-                            "epoch": None,
-                            "version": info[pkg]["version"],
-                            "release": None,
-                            "arch": info[pkg]["arch"],
-                            "install_date": None,
-                            "install_date_time_t": None,
-                        }
-                    ]
-
         __context__[contextkey] = _ret
 
     return __salt__["pkg_resource.format_pkg_list"](
diff --git a/tests/unit/grains/test_core.py b/tests/unit/grains/test_core.py
index a5ceeb8317..0dc3423646 100644
--- a/tests/unit/grains/test_core.py
+++ b/tests/unit/grains/test_core.py
@@ -2047,13 +2047,74 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin):
             result = core.path()
         assert result == {"path": path, "systempath": comps}, result
 
+    @skipIf(not salt.utils.platform.is_linux(), "System is not Linux")
+    @patch("os.path.exists")
+    @patch("salt.utils.platform.is_proxy")
+    def test_kernelparams_return(self):
+        expectations = [
+            (
+                "BOOT_IMAGE=/vmlinuz-3.10.0-693.2.2.el7.x86_64",
+                {
+                    "kernelparams": [
+                        ("BOOT_IMAGE", "/vmlinuz-3.10.0-693.2.2.el7.x86_64")
+                    ]
+                },
+            ),
+            (
+                "root=/dev/mapper/centos_daemon-root",
+                {"kernelparams": [("root", "/dev/mapper/centos_daemon-root")]},
+            ),
+            (
+                "rhgb quiet ro",
+                {"kernelparams": [("rhgb", None), ("quiet", None), ("ro", None)]},
+            ),
+            ('param="value1"', {"kernelparams": [("param", "value1")]}),
+            (
+                'param="value1 value2 value3"',
+                {"kernelparams": [("param", "value1 value2 value3")]},
+            ),
+            (
+                'param="value1 value2 value3" LANG="pl" ro',
+                {
+                    "kernelparams": [
+                        ("param", "value1 value2 value3"),
+                        ("LANG", "pl"),
+                        ("ro", None),
+                    ]
+                },
+            ),
+            ("ipv6.disable=1", {"kernelparams": [("ipv6.disable", "1")]}),
+            (
+                'param="value1:value2:value3"',
+                {"kernelparams": [("param", "value1:value2:value3")]},
+            ),
+            (
+                'param="value1,value2,value3"',
+                {"kernelparams": [("param", "value1,value2,value3")]},
+            ),
+            (
+                'param="value1" param="value2" param="value3"',
+                {
+                    "kernelparams": [
+                        ("param", "value1"),
+                        ("param", "value2"),
+                        ("param", "value3"),
+                    ]
+                },
+            ),
+        ]
+
+        for cmdline, expectation in expectations:
+            with patch("salt.utils.files.fopen", mock_open(read_data=cmdline)):
+                self.assertEqual(core.kernelparams(), expectation)
+
     @skipIf(not salt.utils.platform.is_linux(), "System is not Linux")
     @patch("os.path.exists")
     @patch("salt.utils.platform.is_proxy")
     def test__hw_data_linux_empty(self, is_proxy, exists):
         is_proxy.return_value = False
         exists.return_value = True
-        with patch("salt.utils.files.fopen", mock_open(read_data=b"")):
+        with patch("salt.utils.files.fopen", mock_open(read_data="")):
             self.assertEqual(
                 core._hw_data({"kernel": "Linux"}),
                 {
@@ -2067,6 +2128,7 @@ class CoreGrainsTestCase(TestCase, LoaderModuleMockMixin):
             )
 
     @skipIf(not salt.utils.platform.is_linux(), "System is not Linux")
+    @skipIf(six.PY2, "UnicodeDecodeError is throw in Python 3")
     @patch("os.path.exists")
     @patch("salt.utils.platform.is_proxy")
     def test__hw_data_linux_unicode_error(self, is_proxy, exists):
diff --git a/tests/unit/modules/test_zypperpkg.py b/tests/unit/modules/test_zypperpkg.py
index 5d4e7766b6..1b62122e0e 100644
--- a/tests/unit/modules/test_zypperpkg.py
+++ b/tests/unit/modules/test_zypperpkg.py
@@ -1424,6 +1424,44 @@ Repository 'DUMMY' not found by its alias, number, or URI.
                     ret, {"product:openSUSE": {"old": "15.2", "new": "15.3"}}
                 )
 
+    @patch("salt.modules.zypperpkg._systemd_scope", MagicMock(return_value=False))
+    @patch(
+        "salt.modules.zypperpkg.list_products",
+        MagicMock(return_value={"openSUSE": {"installed": False, "summary": "test"}}),
+    )
+    @patch(
+        "salt.modules.zypperpkg.list_pkgs",
+        MagicMock(
+            side_effect=[{"product:openSUSE": "15.2"}, {"product:openSUSE": "15.3"}]
+        ),
+    )
+    def test_install_product_ok(self):
+        """
+        Test successfully product installation.
+        """
+        with patch.dict(
+            zypper.__salt__,
+            {
+                "pkg_resource.parse_targets": MagicMock(
+                    return_value=(["product:openSUSE"], None)
+                )
+            },
+        ):
+            with patch(
+                "salt.modules.zypperpkg.__zypper__.noraise.call", MagicMock()
+            ) as zypper_mock:
+                ret = zypper.install("product:openSUSE", includes=["product"])
+                zypper_mock.assert_called_once_with(
+                    "--no-refresh",
+                    "install",
+                    "--auto-agree-with-licenses",
+                    "--name",
+                    "product:openSUSE",
+                )
+                self.assertDictEqual(
+                    ret, {"product:openSUSE": {"old": "15.2", "new": "15.3"}}
+                )
+
     def test_remove_purge(self):
         """
         Test package removal
-- 
2.29.2


openSUSE Build Service is sponsored by