Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package salt for openSUSE:Factory checked in 
at 2021-02-17 18:09:30
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/salt (Old)
 and      /work/SRC/openSUSE:Factory/.salt.new.28504 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "salt"

Wed Feb 17 18:09:30 2021 rev:114 rq:871386 version:3002.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/salt/salt.changes        2021-01-15 
19:45:23.377946908 +0100
+++ /work/SRC/openSUSE:Factory/.salt.new.28504/salt.changes     2021-02-17 
18:09:32.453842474 +0100
@@ -1,0 +2,30 @@
+Thu Feb 11 16:02:59 UTC 2021 - Pablo Su??rez Hern??ndez 
<pablo.suarezhernan...@suse.com>
+
+- virt: search for grub.xen path
+- Xen spicevmc, DNS SRV records backports:
+  Fix virtual network generated DNS XML for SRV records
+  Don't add spicevmc channel to xen VMs
+- virt UEFI fix: virt.update when efi=True
+
+- Added:
+  * virt-uefi-fix-backport-312.patch
+  * 3002.2-xen-spicevmc-dns-srv-records-backports-314.patch
+  * open-suse-3002.2-xen-grub-316.patch
+
+-------------------------------------------------------------------
+Mon Jan 25 13:52:50 UTC 2021 - Pablo Su??rez Hern??ndez 
<pablo.suarezhernan...@suse.com>
+
+- Do not crash when unexpected cmd output at listing patches (bsc#1181290)
+
+- Added:
+  * do-not-crash-when-unexpected-cmd-output-at-listing-p.patch
+
+-------------------------------------------------------------------
+Fri Jan 22 16:28:51 UTC 2021 - Pablo Su??rez Hern??ndez 
<pablo.suarezhernan...@suse.com>
+
+- Fix behavior for "onlyif/unless" when multiple conditions (bsc#1180818)
+
+- Added:
+  * fix-onlyif-unless-when-multiple-conditions-bsc-11808.patch
+
+-------------------------------------------------------------------

New:
----
  3002.2-xen-spicevmc-dns-srv-records-backports-314.patch
  do-not-crash-when-unexpected-cmd-output-at-listing-p.patch
  fix-onlyif-unless-when-multiple-conditions-bsc-11808.patch
  open-suse-3002.2-xen-grub-316.patch
  virt-uefi-fix-backport-312.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ salt.spec ++++++
--- /var/tmp/diff_new_pack.6OGWgf/_old  2021-02-17 18:09:34.825844414 +0100
+++ /var/tmp/diff_new_pack.6OGWgf/_new  2021-02-17 18:09:34.829844418 +0100
@@ -348,6 +348,17 @@
 Patch144:     revert-add-patch-support-for-allow-vendor-change-opt.patch
 # PATCH-FIX_OPENSUSE: 
https://github.com/openSUSE/salt/commit/73e357d7eee19a73cade22becb30d9689cae27ba
 Patch145:     remove-deprecated-warning-that-breaks-miniion-execut.patch
+# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/59345
+Patch146:     fix-onlyif-unless-when-multiple-conditions-bsc-11808.patch
+# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/59354
+Patch147:     do-not-crash-when-unexpected-cmd-output-at-listing-p.patch
+# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/59189
+Patch148:     virt-uefi-fix-backport-312.patch
+# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/59355
+#                     https://github.com/saltstack/salt/pull/59417
+Patch149:     3002.2-xen-spicevmc-dns-srv-records-backports-314.patch
+# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/59485
+Patch150:     open-suse-3002.2-xen-grub-316.patch
 
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRequires:  logrotate
@@ -892,6 +903,11 @@
 %patch143 -p1
 %patch144 -p1
 %patch145 -p1
+%patch146 -p1
+%patch147 -p1
+%patch148 -p1
+%patch149 -p1
+%patch150 -p1
 
 %build
 # Putting /usr/bin at the front of $PATH is needed for RHEL/RES 7. Without this

++++++ 3002.2-xen-spicevmc-dns-srv-records-backports-314.patch ++++++
++++ 1334 lines (skipped)

++++++ _lastrevision ++++++
--- /var/tmp/diff_new_pack.6OGWgf/_old  2021-02-17 18:09:34.913844486 +0100
+++ /var/tmp/diff_new_pack.6OGWgf/_new  2021-02-17 18:09:34.913844486 +0100
@@ -1 +1 @@
-73673e4ab1d13c4393183b8ad6066dfab39c7e63
\ No newline at end of file
+98a9fb14263d76c4873bc68f208aeee04b583044
\ No newline at end of file

++++++ do-not-crash-when-unexpected-cmd-output-at-listing-p.patch ++++++
>From cec95ba8f9b561d7ca4c66be9483e4b9386cb741 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
 <psuarezhernan...@suse.com>
Date: Mon, 25 Jan 2021 12:15:59 +0000
Subject: [PATCH] Do not crash when unexpected cmd output at listing
 patches (bsc#1181290)

Add unit tests to cover unexpected output when listing patches
---
 salt/modules/yumpkg.py            | 20 ++++++++--
 tests/unit/modules/test_yumpkg.py | 63 +++++++++++++++++++++++++++++++
 2 files changed, 80 insertions(+), 3 deletions(-)

diff --git a/salt/modules/yumpkg.py b/salt/modules/yumpkg.py
index df174e737d..82adbbd59d 100644
--- a/salt/modules/yumpkg.py
+++ b/salt/modules/yumpkg.py
@@ -3291,10 +3291,17 @@ def _get_patches(installed_only=False):
 
     cmd = [_yum(), "--quiet", "updateinfo", "list", "all"]
     ret = __salt__["cmd.run_stdout"](cmd, python_shell=False, 
env={"SALT_RUNNING": "1"})
+    parsing_errors = False
+
     for line in salt.utils.itertools.split(ret, os.linesep):
-        inst, advisory_id, sev, pkg = re.match(
-            r"([i|\s]) ([^\s]+) +([^\s]+) +([^\s]+)", line
-        ).groups()
+        try:
+            inst, advisory_id, sev, pkg = re.match(
+                r"([i|\s]) ([^\s]+) +([^\s]+) +([^\s]+)", line
+            ).groups()
+        except Exception:  # pylint: disable=broad-except
+            parsing_errors = True
+            continue
+
         if advisory_id not in patches:
             patches[advisory_id] = {
                 "installed": True if inst == "i" else False,
@@ -3305,6 +3312,13 @@ def _get_patches(installed_only=False):
             if inst != "i":
                 patches[advisory_id]["installed"] = False
 
+    if parsing_errors:
+        log.warning(
+            "Skipped some unexpected output while running '{}' to list 
patches. Please check output".format(
+                " ".join(cmd)
+            )
+        )
+
     if installed_only:
         patches = {k: v for k, v in patches.items() if v["installed"]}
     return patches
diff --git a/tests/unit/modules/test_yumpkg.py 
b/tests/unit/modules/test_yumpkg.py
index b97e82d307..96d3f12b17 100644
--- a/tests/unit/modules/test_yumpkg.py
+++ b/tests/unit/modules/test_yumpkg.py
@@ -383,6 +383,69 @@ class YumTestCase(TestCase, LoaderModuleMockMixin):
                     _patch in 
patches["my-fake-patch-installed-1234"]["summary"]
                 )
 
+    def test_list_patches_with_unexpected_output(self):
+        """
+        Test patches listin with unexpected output from updateinfo list
+
+        :return:
+        """
+        yum_out = [
+            "Update notice RHBA-2014:0722 (from rhel7-dev-rhel7-rpm-x86_64) is 
broken, or a bad duplicate, skipping.",
+            "You should report this problem to the owner of the 
rhel7-dev-rhel7-rpm-x86_64 repository.",
+            'To help pinpoint the issue, please attach the output of "yum 
updateinfo --verbose" to the report.',
+            "Update notice RHSA-2014:1971 (from rhel7-dev-rhel7-rpm-x86_64) is 
broken, or a bad duplicate, skipping.",
+            "Update notice RHSA-2015:1981 (from rhel7-dev-rhel7-rpm-x86_64) is 
broken, or a bad duplicate, skipping.",
+            "Update notice RHSA-2015:0067 (from rhel7-dev-rhel7-rpm-x86_64) is 
broken, or a bad duplicate, skipping",
+            "i my-fake-patch-not-installed-1234 recommended    
spacewalk-usix-2.7.5.2-2.2.noarch",
+            "  my-fake-patch-not-installed-1234 recommended    
spacewalksd-5.0.26.2-21.2.x86_64",
+            "i my-fake-patch-not-installed-1234 recommended    
suseRegisterInfo-3.1.1-18.2.x86_64",
+            "i my-fake-patch-installed-1234 recommended        
my-package-one-1.1-0.1.x86_64",
+            "i my-fake-patch-installed-1234 recommended        
my-package-two-1.1-0.1.x86_64",
+        ]
+
+        expected_patches = {
+            "my-fake-patch-not-installed-1234": {
+                "installed": False,
+                "summary": [
+                    "spacewalk-usix-2.7.5.2-2.2.noarch",
+                    "spacewalksd-5.0.26.2-21.2.x86_64",
+                    "suseRegisterInfo-3.1.1-18.2.x86_64",
+                ],
+            },
+            "my-fake-patch-installed-1234": {
+                "installed": True,
+                "summary": [
+                    "my-package-one-1.1-0.1.x86_64",
+                    "my-package-two-1.1-0.1.x86_64",
+                ],
+            },
+        }
+
+        with patch.dict(yumpkg.__grains__, {"osarch": "x86_64"}), patch.dict(
+            yumpkg.__salt__,
+            {"cmd.run_stdout": 
MagicMock(return_value=os.linesep.join(yum_out))},
+        ):
+            patches = yumpkg.list_patches()
+            
self.assertFalse(patches["my-fake-patch-not-installed-1234"]["installed"])
+            self.assertTrue(
+                len(patches["my-fake-patch-not-installed-1234"]["summary"]) == 
3
+            )
+            for _patch in expected_patches["my-fake-patch-not-installed-1234"][
+                "summary"
+            ]:
+                self.assertTrue(
+                    _patch in 
patches["my-fake-patch-not-installed-1234"]["summary"]
+                )
+
+            
self.assertTrue(patches["my-fake-patch-installed-1234"]["installed"])
+            self.assertTrue(
+                len(patches["my-fake-patch-installed-1234"]["summary"]) == 2
+            )
+            for _patch in 
expected_patches["my-fake-patch-installed-1234"]["summary"]:
+                self.assertTrue(
+                    _patch in 
patches["my-fake-patch-installed-1234"]["summary"]
+                )
+
     def test_latest_version_with_options(self):
         with patch.object(yumpkg, "list_pkgs", MagicMock(return_value={})):
 
-- 
2.29.2


++++++ fix-onlyif-unless-when-multiple-conditions-bsc-11808.patch ++++++
>From 828ca76e2083d87ace12b488277e51d4e30c8c9a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?=
 <psuarezhernan...@suse.com>
Date: Thu, 21 Jan 2021 11:19:07 +0000
Subject: [PATCH] Fix onlyif/unless when multiple conditions
 (bsc#1180818)

Add unit tests to ensure right onlyif/unless behavior

Add extra unit test to cover valid cases

Add unit tests cases to ensure proper onlyif/unless behavior

Change tests to use 'exit' cmd and work outside Linux
---
 salt/state.py            |  20 ++++--
 tests/unit/test_state.py | 148 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 163 insertions(+), 5 deletions(-)

diff --git a/salt/state.py b/salt/state.py
index cc6db7e1b2..070a914636 100644
--- a/salt/state.py
+++ b/salt/state.py
@@ -947,8 +947,10 @@ class State:
                         "result": True,
                     }
                 )
+                return False
             elif cmd == 0:
                 ret.update({"comment": "onlyif condition is true", "result": 
False})
+            return True
 
         for entry in low_data_onlyif:
             if isinstance(entry, str):
@@ -960,7 +962,8 @@ class State:
                     # Command failed, notify onlyif to skip running the item
                     cmd = 100
                 log.debug("Last command return code: %s", cmd)
-                _check_cmd(cmd)
+                if not _check_cmd(cmd):
+                    return ret
             elif isinstance(entry, dict):
                 if "fun" not in entry:
                     ret["comment"] = "no `fun` argument in onlyif: 
{}".format(entry)
@@ -972,7 +975,8 @@ class State:
                 if get_return:
                     result = salt.utils.data.traverse_dict_and_list(result, 
get_return)
                 if self.state_con.get("retcode", 0):
-                    _check_cmd(self.state_con["retcode"])
+                    if not _check_cmd(self.state_con["retcode"]):
+                        return ret
                 elif not result:
                     ret.update(
                         {
@@ -981,6 +985,7 @@ class State:
                             "result": True,
                         }
                     )
+                    return ret
                 else:
                     ret.update({"comment": "onlyif condition is true", 
"result": False})
 
@@ -991,6 +996,7 @@ class State:
                         "result": False,
                     }
                 )
+                return ret
         return ret
 
     def _run_check_unless(self, low_data, cmd_opts):
@@ -1013,8 +1019,10 @@ class State:
                         "result": True,
                     }
                 )
+                return False
             elif cmd != 0:
                 ret.update({"comment": "unless condition is false", "result": 
False})
+            return True
 
         for entry in low_data_unless:
             if isinstance(entry, str):
@@ -1026,7 +1034,8 @@ class State:
                 except CommandExecutionError:
                     # Command failed, so notify unless to skip the item
                     cmd = 0
-                _check_cmd(cmd)
+                if not _check_cmd(cmd):
+                    return ret
             elif isinstance(entry, dict):
                 if "fun" not in entry:
                     ret["comment"] = "no `fun` argument in unless: 
{}".format(entry)
@@ -1038,7 +1047,8 @@ class State:
                 if get_return:
                     result = salt.utils.data.traverse_dict_and_list(result, 
get_return)
                 if self.state_con.get("retcode", 0):
-                    _check_cmd(self.state_con["retcode"])
+                    if not _check_cmd(self.state_con["retcode"]):
+                        return ret
                 elif result:
                     ret.update(
                         {
@@ -1047,6 +1057,7 @@ class State:
                             "result": True,
                         }
                     )
+                    return ret
                 else:
                     ret.update(
                         {"comment": "unless condition is false", "result": 
False}
@@ -1058,6 +1069,7 @@ class State:
                         "result": False,
                     }
                 )
+                return ret
 
         # No reason to stop, return ret
         return ret
diff --git a/tests/unit/test_state.py b/tests/unit/test_state.py
index b1bcf8fe83..95018a9cf3 100644
--- a/tests/unit/test_state.py
+++ b/tests/unit/test_state.py
@@ -205,6 +205,152 @@ class StateCompilerTestCase(TestCase, 
AdaptedConfigurationTestCaseMixin):
                 )
                 self.assertEqual(expected_result, return_result)
 
+    def test_verify_unless_list_cmd(self):
+        low_data = {
+            "state": "cmd",
+            "name": 'echo "something"',
+            "__sls__": "tests.cmd",
+            "__env__": "base",
+            "__id__": "check unless",
+            "unless": ["exit 0", "exit 1"],
+            "order": 10001,
+            "fun": "run",
+        }
+        expected_result = {
+            "comment": "unless condition is true",
+            "result": True,
+            "skip_watch": True,
+        }
+        with patch("salt.state.State._gather_pillar") as state_patch:
+            minion_opts = self.get_temp_config("minion")
+            state_obj = salt.state.State(minion_opts)
+            return_result = state_obj._run_check_unless(low_data, {})
+            self.assertEqual(expected_result, return_result)
+
+    def test_verify_unless_list_cmd_different_order(self):
+        low_data = {
+            "state": "cmd",
+            "name": 'echo "something"',
+            "__sls__": "tests.cmd",
+            "__env__": "base",
+            "__id__": "check unless",
+            "unless": ["exit 1", "exit 0"],
+            "order": 10001,
+            "fun": "run",
+        }
+        expected_result = {
+            "comment": "unless condition is true",
+            "result": True,
+            "skip_watch": True,
+        }
+        with patch("salt.state.State._gather_pillar") as state_patch:
+            minion_opts = self.get_temp_config("minion")
+            state_obj = salt.state.State(minion_opts)
+            return_result = state_obj._run_check_unless(low_data, {})
+            self.assertEqual(expected_result, return_result)
+
+    def test_verify_onlyif_list_cmd_different_order(self):
+        low_data = {
+            "state": "cmd",
+            "name": 'echo "something"',
+            "__sls__": "tests.cmd",
+            "__env__": "base",
+            "__id__": "check onlyif",
+            "onlyif": ["exit 1", "exit 0"],
+            "order": 10001,
+            "fun": "run",
+        }
+        expected_result = {
+            "comment": "onlyif condition is false",
+            "result": True,
+            "skip_watch": True,
+        }
+        with patch("salt.state.State._gather_pillar") as state_patch:
+            minion_opts = self.get_temp_config("minion")
+            state_obj = salt.state.State(minion_opts)
+            return_result = state_obj._run_check_onlyif(low_data, {})
+            self.assertEqual(expected_result, return_result)
+
+    def test_verify_unless_list_cmd_valid(self):
+        low_data = {
+            "state": "cmd",
+            "name": 'echo "something"',
+            "__sls__": "tests.cmd",
+            "__env__": "base",
+            "__id__": "check unless",
+            "unless": ["exit 1", "exit 1"],
+            "order": 10001,
+            "fun": "run",
+        }
+        expected_result = {"comment": "unless condition is false", "result": 
False}
+        with patch("salt.state.State._gather_pillar") as state_patch:
+            minion_opts = self.get_temp_config("minion")
+            state_obj = salt.state.State(minion_opts)
+            return_result = state_obj._run_check_unless(low_data, {})
+            self.assertEqual(expected_result, return_result)
+
+    def test_verify_onlyif_list_cmd_valid(self):
+        low_data = {
+            "state": "cmd",
+            "name": 'echo "something"',
+            "__sls__": "tests.cmd",
+            "__env__": "base",
+            "__id__": "check onlyif",
+            "onlyif": ["exit 0", "exit 0"],
+            "order": 10001,
+            "fun": "run",
+        }
+        expected_result = {"comment": "onlyif condition is true", "result": 
False}
+        with patch("salt.state.State._gather_pillar") as state_patch:
+            minion_opts = self.get_temp_config("minion")
+            state_obj = salt.state.State(minion_opts)
+            return_result = state_obj._run_check_onlyif(low_data, {})
+            self.assertEqual(expected_result, return_result)
+
+    def test_verify_unless_list_cmd_invalid(self):
+        low_data = {
+            "state": "cmd",
+            "name": 'echo "something"',
+            "__sls__": "tests.cmd",
+            "__env__": "base",
+            "__id__": "check unless",
+            "unless": ["exit 0", "exit 0"],
+            "order": 10001,
+            "fun": "run",
+        }
+        expected_result = {
+            "comment": "unless condition is true",
+            "result": True,
+            "skip_watch": True,
+        }
+        with patch("salt.state.State._gather_pillar") as state_patch:
+            minion_opts = self.get_temp_config("minion")
+            state_obj = salt.state.State(minion_opts)
+            return_result = state_obj._run_check_unless(low_data, {})
+            self.assertEqual(expected_result, return_result)
+
+    def test_verify_onlyif_list_cmd_invalid(self):
+        low_data = {
+            "state": "cmd",
+            "name": 'echo "something"',
+            "__sls__": "tests.cmd",
+            "__env__": "base",
+            "__id__": "check onlyif",
+            "onlyif": ["exit 1", "exit 1"],
+            "order": 10001,
+            "fun": "run",
+        }
+        expected_result = {
+            "comment": "onlyif condition is false",
+            "result": True,
+            "skip_watch": True,
+        }
+        with patch("salt.state.State._gather_pillar") as state_patch:
+            minion_opts = self.get_temp_config("minion")
+            state_obj = salt.state.State(minion_opts)
+            return_result = state_obj._run_check_onlyif(low_data, {})
+            self.assertEqual(expected_result, return_result)
+
     def test_verify_unless_parse(self):
         low_data = {
             "unless": [{"fun": "test.arg", "args": ["arg1", "arg2"]}],
@@ -376,7 +522,7 @@ class StateCompilerTestCase(TestCase, 
AdaptedConfigurationTestCaseMixin):
             "__sls__": "tests.cmd",
             "__env__": "base",
             "__id__": "check onlyif",
-            "onlyif": ["/bin/true", "/bin/false"],
+            "onlyif": ["exit 0", "exit 1"],
             "order": 10001,
             "fun": "run",
         }
-- 
2.29.2


++++++ open-suse-3002.2-xen-grub-316.patch ++++++
>From 6573d8ca0087f5ce6a8639c0ff583b3248f0704e Mon Sep 17 00:00:00 2001
From: Cedric Bosdonnat <cbosdon...@suse.com>
Date: Thu, 11 Feb 2021 16:41:14 +0100
Subject: [PATCH] Open suse 3002.2 xen grub (#316)

* virt: convert xen pv XML generation test to pytest

* virt: better look for grub.xen when generating xen pv definition

openSUSE 15.3 and SLES 15 SP3 have removed the compatibility symlink for
/usr/share/grub2/x86_64-xen/grub.xen to
/usr/lib/grub2/x86_64-xen/grub.xen. virt._gen_xml() need to check which
is present and put in Xen PV VMs XML definition.
---
 changelog/59484.fixed                         |  1 +
 salt/modules/virt.py                          |  9 +-
 .../pytests/unit/modules/virt/test_domain.py  | 82 ++++++++++++++++++-
 tests/unit/modules/test_virt.py               | 48 -----------
 4 files changed, 90 insertions(+), 50 deletions(-)
 create mode 100644 changelog/59484.fixed

diff --git a/changelog/59484.fixed b/changelog/59484.fixed
new file mode 100644
index 0000000000..b685510ad9
--- /dev/null
+++ b/changelog/59484.fixed
@@ -0,0 +1 @@
+Detect and fix grub.xen path
diff --git a/salt/modules/virt.py b/salt/modules/virt.py
index da132630dd..35711fcef4 100644
--- a/salt/modules/virt.py
+++ b/salt/modules/virt.py
@@ -889,7 +889,14 @@ def _gen_xml(
         # Compute the Xen PV boot method
         if __grains__["os_family"] == "Suse":
             if not boot or not boot.get("kernel", None):
-                context["boot"]["kernel"] = 
"/usr/lib/grub2/x86_64-xen/grub.xen"
+                paths = [
+                    path
+                    for path in ["/usr/share", "/usr/lib"]
+                    if os.path.exists(path + "/grub2/x86_64-xen/grub.xen")
+                ]
+                if not paths:
+                    raise CommandExecutionError("grub-x86_64-xen needs to be 
installed")
+                context["boot"]["kernel"] = paths[0] + 
"/grub2/x86_64-xen/grub.xen"
                 context["boot_dev"] = []
 
     default_port = 23023
diff --git a/tests/pytests/unit/modules/virt/test_domain.py 
b/tests/pytests/unit/modules/virt/test_domain.py
index 72fa599a6c..76433eaef4 100644
--- a/tests/pytests/unit/modules/virt/test_domain.py
+++ b/tests/pytests/unit/modules/virt/test_domain.py
@@ -5,7 +5,7 @@ import salt.modules.virt as virt
 import salt.utils.xmlutil as xmlutil
 import salt.syspaths
 from salt._compat import ElementTree as ET
-from salt.exceptions import SaltInvocationError
+from salt.exceptions import CommandExecutionError, SaltInvocationError
 from tests.support.mock import MagicMock, patch
 
 from .conftest import loader_modules_config
@@ -17,6 +17,86 @@ def configure_loader_modules():
     return loader_modules_config()
 
 
+@pytest.mark.parametrize(
+    "loader",
+    [
+        "/usr/lib/grub2/x86_64-xen/grub.xen",
+        "/usr/share/grub2/x86_64-xen/grub.xen",
+        None,
+    ],
+)
+def test_gen_xml_for_xen_default_profile(loader):
+    """
+    Test virt._gen_xml(), XEN PV default profile case
+    """
+    diskp = virt._disk_profile(
+        virt.libvirt.openAuth.return_value, "default", "xen", [], "hello"
+    )
+    nicp = virt._nic_profile("default", "xen")
+    with patch.dict(
+        virt.__grains__, {"os_family": "Suse"}  # pylint: disable=no-member
+    ):
+        os_mock = MagicMock(spec=virt.os)
+
+        def fake_exists(path):
+            return loader and path == loader
+
+        os_mock.path.exists = MagicMock(side_effect=fake_exists)
+
+        with patch.dict(virt.__dict__, {"os": os_mock}):
+            if loader:
+                xml_data = virt._gen_xml(
+                    virt.libvirt.openAuth.return_value,
+                    "hello",
+                    1,
+                    512,
+                    diskp,
+                    nicp,
+                    "xen",
+                    "xen",
+                    "x86_64",
+                    boot=None,
+                )
+                root = ET.fromstring(xml_data)
+                assert root.attrib["type"] == "xen"
+                assert root.find("vcpu").text == "1"
+                assert root.find("memory").text == str(512 * 1024)
+                assert root.find("memory").attrib["unit"] == "KiB"
+                assert root.find(".//kernel").text == loader
+
+                disks = root.findall(".//disk")
+                assert len(disks) == 1
+                disk = disks[0]
+                root_dir = salt.config.DEFAULT_MINION_OPTS.get("root_dir")
+                assert disk.find("source").attrib["file"].startswith(root_dir)
+                assert "hello_system" in disk.find("source").attrib["file"]
+                assert disk.find("target").attrib["dev"] == "xvda"
+                assert disk.find("target").attrib["bus"] == "xen"
+                assert disk.find("driver").attrib["name"] == "qemu"
+                assert disk.find("driver").attrib["type"] == "qcow2"
+
+                interfaces = root.findall(".//interface")
+                assert len(interfaces) == 1
+                iface = interfaces[0]
+                assert iface.attrib["type"] == "bridge"
+                assert iface.find("source").attrib["bridge"] == "br0"
+                assert iface.find("model") is None
+            else:
+                with pytest.raises(CommandExecutionError):
+                    xml_data = virt._gen_xml(
+                        virt.libvirt.openAuth.return_value,
+                        "hello",
+                        1,
+                        512,
+                        diskp,
+                        nicp,
+                        "xen",
+                        "xen",
+                        "x86_64",
+                        boot=None,
+                    )
+
+
 def test_update_xen_disk_volumes(make_mock_vm, make_mock_storage_pool):
     xml_def = """
         <domain type='xen'>
diff --git a/tests/unit/modules/test_virt.py b/tests/unit/modules/test_virt.py
index a739efdbf6..5c7e1e1cc4 100644
--- a/tests/unit/modules/test_virt.py
+++ b/tests/unit/modules/test_virt.py
@@ -1126,54 +1126,6 @@ class VirtTestCase(TestCase, LoaderModuleMockMixin):
         self.assertEqual(iface.find("source").attrib["bridge"], "DEFAULT")
         self.assertEqual(iface.find("model").attrib["type"], "e1000")
 
-    def test_gen_xml_for_xen_default_profile(self):
-        """
-        Test virt._gen_xml(), XEN PV default profile case
-        """
-        diskp = virt._disk_profile(self.mock_conn, "default", "xen", [], 
"hello")
-        nicp = virt._nic_profile("default", "xen")
-        with patch.dict(
-            virt.__grains__, {"os_family": "Suse"}  # pylint: disable=no-member
-        ):
-            xml_data = virt._gen_xml(
-                self.mock_conn,
-                "hello",
-                1,
-                512,
-                diskp,
-                nicp,
-                "xen",
-                "xen",
-                "x86_64",
-                boot=None,
-            )
-            root = ET.fromstring(xml_data)
-            self.assertEqual(root.attrib["type"], "xen")
-            self.assertEqual(root.find("vcpu").text, "1")
-            self.assertEqual(root.find("memory").text, str(512 * 1024))
-            self.assertEqual(root.find("memory").attrib["unit"], "KiB")
-            self.assertEqual(
-                root.find(".//kernel").text, 
"/usr/lib/grub2/x86_64-xen/grub.xen"
-            )
-
-            disks = root.findall(".//disk")
-            self.assertEqual(len(disks), 1)
-            disk = disks[0]
-            root_dir = salt.config.DEFAULT_MINION_OPTS.get("root_dir")
-            
self.assertTrue(disk.find("source").attrib["file"].startswith(root_dir))
-            self.assertTrue("hello_system" in 
disk.find("source").attrib["file"])
-            self.assertEqual(disk.find("target").attrib["dev"], "xvda")
-            self.assertEqual(disk.find("target").attrib["bus"], "xen")
-            self.assertEqual(disk.find("driver").attrib["name"], "qemu")
-            self.assertEqual(disk.find("driver").attrib["type"], "qcow2")
-
-            interfaces = root.findall(".//interface")
-            self.assertEqual(len(interfaces), 1)
-            iface = interfaces[0]
-            self.assertEqual(iface.attrib["type"], "bridge")
-            self.assertEqual(iface.find("source").attrib["bridge"], "br0")
-            self.assertIsNone(iface.find("model"))
-
     def test_gen_xml_for_esxi_custom_profile(self):
         """
         Test virt._gen_xml(), ESXi/vmware custom profile case
-- 
2.30.0


++++++ virt-uefi-fix-backport-312.patch ++++++
++++ 2449 lines (skipped)

Reply via email to