File BLS.patch of Package python-kiwi

commit 0174338e01eaf615eda250a7ac985b29a01e4b1d
Author: Marcus Schäfer <ms@suse.de>
Date:   Sun Dec 29 20:48:09 2019 +0100

    Fixed grub config if bootloader spec is in use
    
    Distros that implements the grub bootloader spec prefers
    GRUB_CMDLINE_LINUX over GRUB_CMDLINE_LINUX_DEFAULT. Details:
    https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault

diff --git a/kiwi/bootloader/config/grub2.py b/kiwi/bootloader/config/grub2.py
index 0935109d..4afedb2e 100644
--- a/kiwi/bootloader/config/grub2.py
+++ b/kiwi/bootloader/config/grub2.py
@@ -529,7 +529,7 @@ class BootLoaderConfigGrub2(BootLoaderConfigBase):
         * GRUB_USE_LINUXEFI
         * GRUB_USE_INITRDEFI
         * GRUB_SERIAL_COMMAND
-        * GRUB_CMDLINE_LINUX_DEFAULT
+        * GRUB_CMDLINE_LINUX_DEFAULT | GRUB_CMDLINE_LINUX
         * GRUB_GFXMODE
         * GRUB_TERMINAL
         * GRUB_DISTRIBUTOR
@@ -540,8 +540,22 @@ class BootLoaderConfigGrub2(BootLoaderConfigBase):
             'GRUB_TERMINAL': '"{0}"'.format(self.terminal),
             'GRUB_DISTRIBUTOR': '"{0}"'.format(self.get_menu_entry_title())
         }
+        enable_blscfg_implemented = Command.run(
+            [
+                'grep', '-q', 'GRUB_ENABLE_BLSCFG',
+                Defaults.get_grub_config_tool()
+            ], raise_on_error=False
+        )
         if self.cmdline:
-            grub_default_entries['GRUB_CMDLINE_LINUX_DEFAULT'] = '"{0}"'.format(
+            if enable_blscfg_implemented.returncode == 0:
+                # As documented in:
+                # https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault
+                # Distros implementing BootLoaderSpec (BLS), prefers
+                # GRUB_CMDLINE_LINUX over GRUB_CMDLINE_LINUX_DEFAULT
+                grub_cmdline_key = 'GRUB_CMDLINE_LINUX'
+            else:
+                grub_cmdline_key = 'GRUB_CMDLINE_LINUX_DEFAULT'
+            grub_default_entries[grub_cmdline_key] = '"{0}"'.format(
                 re.sub(r'root=.* |root=.*$', '', self.cmdline).strip()
             )
         if self.terminal and 'serial' in self.terminal:
@@ -582,12 +596,6 @@ class BootLoaderConfigGrub2(BootLoaderConfigBase):
         if self.custom_args.get('boot_is_crypto'):
             grub_default_entries['GRUB_ENABLE_CRYPTODISK'] = 'y'
 
-        enable_blscfg_implemented = Command.run(
-            [
-                'grep', '-q', 'GRUB_ENABLE_BLSCFG',
-                Defaults.get_grub_config_tool()
-            ], raise_on_error=False
-        )
         if enable_blscfg_implemented.returncode == 0:
             grub_default_entries['GRUB_ENABLE_BLSCFG'] = 'true'
 
diff --git a/test/unit/bootloader/config/grub2_test.py b/test/unit/bootloader/config/grub2_test.py
index 9a4347af..274b7848 100644
--- a/test/unit/bootloader/config/grub2_test.py
+++ b/test/unit/bootloader/config/grub2_test.py
@@ -316,7 +316,11 @@ class TestBootLoaderConfigGrub2:
         self, mock_Command_run, mock_sysconfig, mock_exists
     ):
         grep_grub_option = Mock()
+        # mock option lookup in grub toolkit to match
+        # leading to bootloader spec based setup plus
+        # use of special options linuxefi/initrdefi
         grep_grub_option.returncode = 0
+
         mock_Command_run.return_value = grep_grub_option
         grub_default = MagicMock()
         mock_sysconfig.return_value = grub_default
@@ -333,7 +337,7 @@ class TestBootLoaderConfigGrub2:
                 'GRUB_BACKGROUND',
                 '/boot/grub2/themes/openSUSE/background.png'
             ),
-            call('GRUB_CMDLINE_LINUX_DEFAULT', '"some-cmdline"'),
+            call('GRUB_CMDLINE_LINUX', '"some-cmdline"'),
             call('GRUB_DISTRIBUTOR', '"Bob"'),
             call('GRUB_ENABLE_BLSCFG', 'true'),
             call('GRUB_ENABLE_CRYPTODISK', 'y'),
@@ -350,6 +354,32 @@ class TestBootLoaderConfigGrub2:
             call('SUSE_BTRFS_SNAPSHOT_BOOTING', 'true')
         ]
 
+        grub_default.reset_mock()
+        # mock option lookup in grub toolkit to not match
+        # leading to default behavior, no bootloader spec
+        # no special linuxefi/initrdefi config
+        grep_grub_option.returncode = 1
+
+        self.bootloader._setup_default_grub()
+        assert grub_default.__setitem__.call_args_list == [
+            call(
+                'GRUB_BACKGROUND',
+                '/boot/grub2/themes/openSUSE/background.png'
+            ),
+            call('GRUB_CMDLINE_LINUX_DEFAULT', '"some-cmdline"'),
+            call('GRUB_DISTRIBUTOR', '"Bob"'),
+            call('GRUB_ENABLE_CRYPTODISK', 'y'),
+            call('GRUB_GFXMODE', '800x600'),
+            call(
+                'GRUB_SERIAL_COMMAND',
+                '"serial --speed=38400 --unit=0 --word=8 --parity=no --stop=1"'
+            ),
+            call('GRUB_TERMINAL', '"serial"'),
+            call('GRUB_THEME', '/boot/grub2/themes/openSUSE/theme.txt'),
+            call('GRUB_TIMEOUT', 10),
+            call('SUSE_BTRFS_SNAPSHOT_BOOTING', 'true')
+        ]
+
     @patch('os.path.exists')
     @patch('kiwi.bootloader.config.grub2.SysConfig')
     def test_setup_sysconfig_bootloader(self, mock_sysconfig, mock_exists):
openSUSE Build Service is sponsored by