Revert "Port GUI kernel switcher for ARM 64k", it's broken

See https://github.com/rhinstaller/anaconda/pull/4858#issuecomment-1652180161
This commit is contained in:
Adam Williamson 2023-07-26 10:27:13 -07:00
parent 82bbadbd9a
commit 19857b475b
2 changed files with 636 additions and 1 deletions

View File

@ -0,0 +1,627 @@
From 3962cd5f7e6fc64306d6c4e173b5542d215d234a Mon Sep 17 00:00:00 2001
From: Adam Williamson <awilliam@redhat.com>
Date: Wed, 26 Jul 2023 10:19:25 -0700
Subject: [PATCH] Revert "Add GUI option for installing 64k ARM kernel"
This reverts commit 0c7c9e9586d962c9babf0d718e38768c8bb34b85.
It's broken - it tries to use the `match_available_packages`
method of a `DNFPayload` instance, but that method is part of
`DNFManager`, not `DNFPayload`. See
https://github.com/rhinstaller/anaconda/pull/4858#issuecomment-1652180161 .
We are reverting this downstream (in Fedora) to fix composes
while upstream comes up with a proper fix.
---
data/anaconda.conf | 3 -
data/profile.d/rhel.conf | 1 -
pyanaconda/core/configuration/ui.py | 4 -
.../ui/gui/spokes/software_selection.glade | 224 +++++-------------
.../ui/gui/spokes/software_selection.py | 62 -----
pyanaconda/ui/lib/software.py | 43 +---
.../pyanaconda_tests/ui/test_software.py | 34 +--
7 files changed, 64 insertions(+), 307 deletions(-)
diff --git a/data/anaconda.conf b/data/anaconda.conf
index 73e6e21e55..34d2d26802 100644
--- a/data/anaconda.conf
+++ b/data/anaconda.conf
@@ -302,9 +302,6 @@ password_policies =
user (quality 1, length 6, empty)
luks (quality 1, length 6)
-# Should kernel options be shown in the software selection spoke?
-show_kernel_options = True
-
[License]
# A path to EULA (if any)
#
diff --git a/data/profile.d/rhel.conf b/data/profile.d/rhel.conf
index 468a05f78c..0a645fd0ca 100644
--- a/data/profile.d/rhel.conf
+++ b/data/profile.d/rhel.conf
@@ -39,7 +39,6 @@ swap_is_recommended = True
[User Interface]
help_directory = /usr/share/anaconda/help/rhel
custom_stylesheet = /usr/share/anaconda/pixmaps/redhat.css
-show_kernel_options = True
[License]
eula = /usr/share/redhat-release/EULA
diff --git a/pyanaconda/core/configuration/ui.py b/pyanaconda/core/configuration/ui.py
index 57cb232c7c..e4432f68f8 100644
--- a/pyanaconda/core/configuration/ui.py
+++ b/pyanaconda/core/configuration/ui.py
@@ -90,10 +90,6 @@ class UserInterfaceSection(Section):
"""Convert a policies string into a list of dictionaries."""
return list(map(self._convert_policy_line, value.strip().split("\n")))
- @property
- def show_kernel_options(self):
- return self._get_option("show_kernel_options", bool)
-
@classmethod
def _convert_policy_line(cls, line):
"""Convert a policy line into a dictionary."""
diff --git a/pyanaconda/ui/gui/spokes/software_selection.glade b/pyanaconda/ui/gui/spokes/software_selection.glade
index 4cb67f2769..87804c72ea 100644
--- a/pyanaconda/ui/gui/spokes/software_selection.glade
+++ b/pyanaconda/ui/gui/spokes/software_selection.glade
@@ -1,28 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.40.0 -->
+<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.10"/>
<requires lib="AnacondaWidgets" version="1.0"/>
<object class="AnacondaSpokeWindow" id="softwareWindow">
- <property name="can-focus">False</property>
+ <property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
- <property name="window-name" translatable="yes">SOFTWARE SELECTION</property>
+ <property name="window_name" translatable="yes">SOFTWARE SELECTION</property>
<signal name="button-clicked" handler="on_back_clicked" swapped="no"/>
<signal name="info-bar-clicked" handler="on_info_bar_clicked" swapped="no"/>
<child internal-child="main_box">
<object class="GtkBox" id="AnacondaSpokeWindow-main_box1">
- <property name="can-focus">False</property>
+ <property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="orientation">vertical</property>
<child internal-child="nav_box">
<object class="GtkEventBox" id="AnacondaSpokeWindow-nav_box1">
- <property name="can-focus">False</property>
+ <property name="can_focus">False</property>
<child internal-child="nav_area">
- <!-- n-columns=3 n-rows=3 -->
<object class="GtkGrid" id="AnacondaSpokeWindow-nav_area1">
- <property name="can-focus">False</property>
+ <property name="can_focus">False</property>
</object>
</child>
</object>
@@ -34,36 +33,55 @@
</child>
<child internal-child="alignment">
<object class="GtkAlignment" id="AnacondaSpokeWindow-alignment1">
- <property name="can-focus">False</property>
+ <property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
- <property name="top-padding">12</property>
- <property name="bottom-padding">48</property>
- <property name="left-padding">24</property>
- <property name="right-padding">24</property>
+ <property name="top_padding">12</property>
+ <property name="bottom_padding">48</property>
+ <property name="left_padding">24</property>
+ <property name="right_padding">24</property>
<child internal-child="action_area">
<object class="GtkBox" id="AnacondaSpokeWindow-action_area1">
- <property name="can-focus">False</property>
+ <property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
<property name="orientation">vertical</property>
<child>
- <!-- n-columns=2 n-rows=3 -->
<object class="GtkGrid" id="grid1">
<property name="visible">True</property>
- <property name="can-focus">False</property>
+ <property name="can_focus">False</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
- <property name="column-spacing">24</property>
- <property name="column-homogeneous">True</property>
+ <property name="column_spacing">24</property>
+ <property name="column_homogeneous">True</property>
+ <child>
+ <object class="GtkLabel" id="label1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">end</property>
+ <property name="margin_bottom">6</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">Base Environment</property>
+ <property name="wrap">True</property>
+ <property name="xalign">0</property>
+ <attributes>
+ <attribute name="font-desc" value="Cantarell 12"/>
+ <attribute name="weight" value="normal"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ </packing>
+ </child>
<child>
<object class="GtkLabel" id="label2">
<property name="visible">True</property>
- <property name="can-focus">False</property>
+ <property name="can_focus">False</property>
<property name="valign">end</property>
- <property name="margin-bottom">6</property>
+ <property name="margin_bottom">6</property>
<property name="hexpand">True</property>
<property name="label" translatable="yes">Additional software for Selected Environment</property>
<property name="wrap">True</property>
@@ -74,27 +92,27 @@
</attributes>
</object>
<packing>
- <property name="left-attach">1</property>
- <property name="top-attach">0</property>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
</packing>
</child>
<child>
<object class="GtkScrolledWindow" id="addonScrolledWindow">
<property name="visible">True</property>
- <property name="can-focus">True</property>
+ <property name="can_focus">True</property>
<property name="hexpand">True</property>
<property name="vexpand">True</property>
- <property name="hscrollbar-policy">never</property>
- <property name="shadow-type">in</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
<child>
<object class="GtkViewport" id="addonViewport">
- <property name="width-request">250</property>
+ <property name="width_request">250</property>
<property name="visible">True</property>
- <property name="can-focus">False</property>
+ <property name="can_focus">False</property>
<child>
<object class="GtkListBox" id="addonListBox">
<property name="visible">True</property>
- <property name="can-focus">False</property>
+ <property name="can_focus">False</property>
<property name="hexpand">True</property>
<signal name="row-activated" handler="on_addon_activated" swapped="no"/>
</object>
@@ -103,160 +121,40 @@
</child>
</object>
<packing>
- <property name="left-attach">1</property>
- <property name="top-attach">1</property>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
</packing>
</child>
<child>
- <object class="GtkLabel" id="label1">
+ <object class="GtkScrolledWindow" id="environmentScrolledWindow">
<property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="valign">end</property>
- <property name="margin-bottom">6</property>
+ <property name="can_focus">True</property>
+ <property name="events">GDK_STRUCTURE_MASK | GDK_SCROLL_MASK</property>
<property name="hexpand">True</property>
- <property name="label" translatable="yes">Base Environment</property>
- <property name="wrap">True</property>
- <property name="xalign">0</property>
- <attributes>
- <attribute name="font-desc" value="Cantarell 12"/>
- <attribute name="weight" value="normal"/>
- </attributes>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkScrolledWindow" id="environmentScrolledWindow">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="events">GDK_STRUCTURE_MASK | GDK_SCROLL_MASK</property>
- <property name="hexpand">True</property>
- <property name="vexpand">True</property>
- <property name="hscrollbar-policy">never</property>
- <property name="shadow-type">in</property>
- <child>
- <object class="GtkViewport" id="environmentViewport">
- <property name="width-request">250</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkListBox" id="environmentListBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hexpand">True</property>
- <signal name="row-activated" handler="on_environment_activated" swapped="no"/>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
+ <property name="vexpand">True</property>
+ <property name="hscrollbar_policy">never</property>
+ <property name="shadow_type">in</property>
<child>
- <object class="GtkBox" id="kernelBox">
+ <object class="GtkViewport" id="environmentViewport">
+ <property name="width_request">250</property>
<property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">12</property>
+ <property name="can_focus">False</property>
<child>
- <object class="GtkLabel" id="label3">
+ <object class="GtkListBox" id="environmentListBox">
<property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="valign">end</property>
- <property name="margin-top">12</property>
+ <property name="can_focus">False</property>
<property name="hexpand">True</property>
- <property name="label" translatable="yes">Kernel Options</property>
- <property name="wrap">True</property>
- <property name="xalign">0</property>
- <attributes>
- <attribute name="font-desc" value="Cantarell 12"/>
- <attribute name="weight" value="normal"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <!-- n-columns=2 n-rows=1 -->
- <object class="GtkGrid" id="kernelComboGrid">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="row-spacing">12</property>
- <child>
- <object class="GtkLabel" id="kernelPageSizeLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">12</property>
- <property name="hexpand">True</property>
- <property name="label" translatable="yes">Page size:</property>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBox" id="kernelPageSizeCombo">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hexpand">True</property>
- <property name="active">0</property>
- <property name="id-column">0</property>
- <child>
- <object class="GtkCellRendererText"/>
- <attributes>
- <attribute name="markup">1</attribute>
- <attribute name="single-paragraph-mode">1</attribute>
- <attribute name="text">1</attribute>
- </attributes>
- </child>
- </object>
- <packing>
- <property name="left-attach">1</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
+ <signal name="row-activated" handler="on_environment_activated" swapped="no"/>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">3</property>
- </packing>
</child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">1</property>
- </packing>
</child>
</object>
<packing>
- <property name="left-attach">0</property>
- <property name="top-attach">1</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
</packing>
</child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
</object>
<packing>
<property name="expand">True</property>
diff --git a/pyanaconda/ui/gui/spokes/software_selection.py b/pyanaconda/ui/gui/spokes/software_selection.py
index 1736b0b4b0..151e0e0b9f 100644
--- a/pyanaconda/ui/gui/spokes/software_selection.py
+++ b/pyanaconda/ui/gui/spokes/software_selection.py
@@ -32,13 +32,9 @@ from pyanaconda.ui.gui.spokes import NormalSpoke
from pyanaconda.ui.gui.spokes.lib.detailederror import DetailedErrorDialog
from pyanaconda.ui.gui.spokes.lib.software_selection import GroupListBoxRow, SeparatorRow, \
EnvironmentListBoxRow
-from pyanaconda.ui.gui.utils import escape_markup
from pyanaconda.ui.lib.software import SoftwareSelectionCache, get_software_selection_status, \
is_software_selection_complete, get_group_data, get_environment_data
from pyanaconda.ui.lib.subscription import is_cdn_registration_required
-from pyanaconda.ui.lib.software import FEATURE_64K, KernelFeatures, get_kernel_from_properties, \
- get_available_kernel_features, get_kernel_titles_and_descriptions
-from pyanaconda.core.configuration.anaconda import conf
import gi
gi.require_version("Gtk", "3.0")
@@ -98,23 +94,6 @@ class SoftwareSelectionSpoke(NormalSpoke):
Gtk.Scrollable.get_vadjustment(addon_viewport)
)
- # Display a group of options for selecting desired properties of a kernel
- self._kernel_box = self.builder.get_object("kernelBox")
- self._combo_kernel_page_size = self.builder.get_object("kernelPageSizeCombo")
- self._label_kernel_page_size = self.builder.get_object("kernelPageSizeLabel")
-
- # Normally I would create these in the .glade file but due to a bug they weren't
- # created properly
- self._model_kernel_page_size = Gtk.ListStore(str, str)
-
- kernel_labels = get_kernel_titles_and_descriptions()
- for i in ["4k", "64k"]:
- self._model_kernel_page_size.append([i, "<b>%s</b>\n%s" % \
- (escape_markup(kernel_labels[i][0]),
- escape_markup(kernel_labels[i][1]))])
- self._combo_kernel_page_size.set_model(self._model_kernel_page_size)
- self._available_kernels = get_available_kernel_features(self.payload)
-
@property
def _selection(self):
"""The packages selection."""
@@ -235,12 +214,10 @@ class SoftwareSelectionSpoke(NormalSpoke):
# Create a new software selection cache.
self._selection_cache = SoftwareSelectionCache(self.payload.proxy)
self._selection_cache.apply_selection_data(self._selection)
- self._available_kernels = get_available_kernel_features(self.payload)
# Refresh up the UI.
self._refresh_environments()
self._refresh_groups()
- self._refresh_kernel_features()
# Set up the info bar.
self.clear_info()
@@ -314,35 +291,6 @@ class SoftwareSelectionSpoke(NormalSpoke):
listbox.remove(child)
del child
- def _refresh_kernel_features(self):
- """Display options for selecting kernel features."""
-
- # Only showing parts of kernel box relevant for current system.
- self._available_kernels = get_available_kernel_features(self.payload)
-
- if not conf.ui.show_kernel_options:
- show_kernels = False
- else:
- show_kernels = False
- for (_key, val) in self._available_kernels.items():
- if val:
- show_kernels = True
- break
-
- if show_kernels:
- self._kernel_box.set_visible(True)
- self._kernel_box.set_no_show_all(False)
-
- # Arm 64k page size kernel combo
- self._combo_kernel_page_size.set_visible(self._available_kernels[FEATURE_64K])
- self._combo_kernel_page_size.set_no_show_all(not self._available_kernels[FEATURE_64K])
- self._label_kernel_page_size.set_visible(self._available_kernels[FEATURE_64K])
- self._label_kernel_page_size.set_no_show_all(not self._available_kernels[FEATURE_64K])
- else:
- # Hide the entire box.
- self._kernel_box.set_visible(False)
- self._kernel_box.set_no_show_all(True)
-
def apply(self):
"""Apply the changes."""
self._kickstarted = False
@@ -350,16 +298,6 @@ class SoftwareSelectionSpoke(NormalSpoke):
selection = self._selection_cache.get_selection_data()
log.debug("Setting new software selection: %s", selection)
- # Select kernel
- property_64k = self._available_kernels[FEATURE_64K] and \
- self._combo_kernel_page_size.get_active_id() == FEATURE_64K
- kernel_properties = KernelFeatures(property_64k)
- kernel = get_kernel_from_properties(kernel_properties)
- if kernel is not None and conf.ui.show_kernel_options:
- log.debug("Selected kernel package: %s", kernel)
- selection.packages.append(kernel)
- selection.excluded_packages.append("kernel")
-
self.payload.set_packages_selection(selection)
hubQ.send_not_ready(self.__class__.__name__)
diff --git a/pyanaconda/ui/lib/software.py b/pyanaconda/ui/lib/software.py
index 3eebc024df..747ac8367b 100644
--- a/pyanaconda/ui/lib/software.py
+++ b/pyanaconda/ui/lib/software.py
@@ -1,5 +1,5 @@
#
-# Copyright (C) 2023 Red Hat, Inc.
+# Copyright (C) 2021 Red Hat, Inc.
#
# This copyrighted material is made available to anyone wishing to use,
# modify, copy, or redistribute it subject to the terms and conditions of
@@ -15,9 +15,6 @@
# License and may only be used or replicated with the express permission of
# Red Hat, Inc.
#
-from collections import namedtuple
-from blivet.arch import is_aarch64
-
from pyanaconda.anaconda_loggers import get_module_logger
from pyanaconda.core.i18n import _
from pyanaconda.modules.common.structures.comps import CompsEnvironmentData, CompsGroupData
@@ -25,9 +22,6 @@ from pyanaconda.modules.common.structures.packages import PackagesSelectionData
log = get_module_logger(__name__)
-FEATURE_64K = "64k"
-KernelFeatures = namedtuple("KernelFeatures", ["page_size_64k"])
-
def get_environment_data(dnf_proxy, environment_name):
"""Get the environment data.
@@ -102,41 +96,6 @@ def get_software_selection_status(dnf_proxy, selection, kickstarted=False):
return environment_data.name
-def get_available_kernel_features(payload):
- """Returns a dictionary with that shows which kernels should be shown in the UI.
- """
- features = {
- FEATURE_64K: is_aarch64() and any(payload.match_available_packages("kernel-64k"))
- }
-
- return features
-
-
-def get_kernel_titles_and_descriptions():
- """Returns a dictionary with descriptions and titles for different kernel options.
- """
- kernel_features = {
- "4k": (_("4k"), _("More efficient memory usage in smaller environments")),
- "64k": (_("64k"), _("System performance gains for memory-intensive workloads")),
- }
-
- return kernel_features
-
-
-def get_kernel_from_properties(features):
- """Translates the selection of required properties into a kernel package name and returns it
- or returns None if no properties were selected.
- """
- kernels = {
- # ARM 64k Package Name
- ( False ): None,
- ( True ): "kernel-64k",
- }
-
- kernel_package = kernels[features[0]]
- return kernel_package
-
-
class SoftwareSelectionCache(object):
"""The cache of the user software selection.
diff --git a/tests/unit_tests/pyanaconda_tests/ui/test_software.py b/tests/unit_tests/pyanaconda_tests/ui/test_software.py
index c9397e15fb..f5ced5d9c1 100644
--- a/tests/unit_tests/pyanaconda_tests/ui/test_software.py
+++ b/tests/unit_tests/pyanaconda_tests/ui/test_software.py
@@ -16,7 +16,6 @@
# Red Hat, Inc.
#
import unittest
-from unittest.mock import patch
from unittest.mock import Mock
from dasbus.structure import compare_data
@@ -26,8 +25,8 @@ from pyanaconda.modules.common.structures.packages import PackagesSelectionData
from pyanaconda.modules.payloads.payload.dnf.dnf import DNFModule
from pyanaconda.modules.payloads.payload.dnf.dnf_manager import DNFManager
from pyanaconda.ui.lib.software import is_software_selection_complete, \
- get_software_selection_status, SoftwareSelectionCache, get_kernel_from_properties, \
- get_available_kernel_features, KernelFeatures
+ get_software_selection_status, SoftwareSelectionCache
+
def get_dnf_proxy(dnf_manager):
"""Create a DNF payload proxy using the specified DNF manager."""
@@ -96,35 +95,6 @@ class SoftwareSelectionUITestCase(unittest.TestCase):
status = get_software_selection_status(self.dnf_proxy, selection, kickstarted=True)
assert status == "Custom software selected"
- def test_get_kernel_from_properties(self):
- """Test if kernel features are translated to corrent package names."""
- assert get_kernel_from_properties(
- KernelFeatures(page_size_64k=False)) is None
- assert get_kernel_from_properties(
- KernelFeatures(page_size_64k=True)) == "kernel-64k"
-
- @patch("pyanaconda.ui.lib.software.is_aarch64")
- def test_get_available_kernel_features(self, is_aarch64):
- """test availability of kernel packages"""
- payload = Mock()
- payload.match_available_packages.return_value = ["ntoskrnl"]
- is_aarch64.return_value = False
-
- res = get_available_kernel_features(payload)
- assert isinstance(res, dict)
- assert len(res) > 0
- assert not res["64k"]
- is_aarch64.assert_called_once()
-
- is_aarch64.return_value = True
- assert is_aarch64()
- res = get_available_kernel_features(payload)
- assert res["64k"]
-
- payload.match_available_packages.return_value = []
- res = get_available_kernel_features(payload)
- assert not res["64k"]
-
class SoftwareSelectionCacheTestCase(unittest.TestCase):
"""Test the cache for the Software Selection spoke."""
--
2.41.0

View File

@ -1,7 +1,7 @@
Summary: Graphical system installer
Name: anaconda
Version: 39.27
Release: 1%{?dist}
Release: 2%{?dist}
License: GPL-2.0-or-later
URL: http://fedoraproject.org/wiki/Anaconda
@ -12,6 +12,11 @@ URL: http://fedoraproject.org/wiki/Anaconda
# make dist
Source0: https://github.com/rhinstaller/%{name}/releases/download/%{name}-%{version}-1/%{name}-%{version}.tar.bz2
# https://github.com/rhinstaller/anaconda/pull/4858#issuecomment-1652180161
# this change is broken and makes aarch64 installs crash, reverted
# downstream while anaconda fix it to work properly upstream
Patch0: 0001-Revert-Add-GUI-option-for-installing-64k-ARM-kernel.patch
# Versions of required components (done so we make sure the buildrequires
# match the requires versions of things).
@ -478,6 +483,9 @@ rm -rf \
%{_prefix}/libexec/anaconda/dd_*
%changelog
* Wed Jul 26 2023 Adam Williamson <awilliam@redhat.com> - 39.27-2
- Revert "Port GUI kernel switcher for ARM 64k", it's broken, causes crashes
* Tue Jul 25 2023 Packit <hello@packit.dev> - 39.27-1
- webui: if no scenario is available for selection show the options but
disabled (kkoukiou)