cockpit-project / cockpit-machines

Cockpit UI for virtual machines
GNU Lesser General Public License v2.1
298 stars 75 forks source link

create: Add a "view more" option to list of operating systems #1869

Closed mvollmer closed 4 weeks ago

mvollmer commented 1 month ago

This will show all operating systems, regardless of EOL or release dates. Operating systems with an expired EOL date will be annotated accordingly in the list.

Fixes #509

Demo: https://youtu.be/JXuX2GRQjCM

image

image

Note that filtering is based both on End-Of-Life and release dates. Thus, we can't strictly say "Show unsupported operating systems" since the hidden ones are not all unsupported, some are just old.

martinpitt commented 1 month ago

I was looking at ACCEPT_RELEASE_DATES_AFTER - it goes all the way back to the initial "VM create" dialog: https://github.com/cockpit-project/cockpit/commit/e788a1868ed35e05f033f0e7d . It seems rather arbitrary to me, as enterprise OSes like RHEL 8.10 or Ubuntu LTS are being supported for much longer, while e.g. Fedora releases only last 1.5 years.

This is a fallback for when libosinfo doesn't have an EOL date. I checked osinfo-query -f name,version,release-date,eol-date os, and of all the things RHEL (and it's friends CentOS stream, AlmaLinux, and Oracle Linux) lack an EOL date. Commercially, these are the most important ones for us.. So that is a bug which we should report to osinfo.

Also, the "3 years" thing completely fails for RHEL. The odd releases aren't supported much, the lower even ones for a long time (I'm not exactly sure how long), and the .10 ones for really long.

Could we perhaps simplify this and do without the button? On the top of the list, show the currently supported ones (known EOL in the future, or unknown EOL) sorted by name and then release date; then add a divider with "Unsupported:", and then show all the EOLed ones (same sorting)? That way they stay immediately searchable, but the top of the list doesn't get cluttered with old stuff.

mvollmer commented 1 month ago

Could we perhaps simplify this and do without the button?

I think so. The unfiltered list has 158 entries. This is quite manageable, especially together with text filtering.

mvollmer commented 1 month ago

Idea: we can switch to the full list immediately when searching starts.

diff --git a/src/components/create-vm-dialog/createVmDialog.jsx b/src/components/create-vm-dialog/createVmDialog.jsx
index 169456b5..1bfad279 100644
--- a/src/components/create-vm-dialog/createVmDialog.jsx
+++ b/src/components/create-vm-dialog/createVmDialog.jsx
@@ -477,6 +477,11 @@ class OSRow extends React.Component {
                         this.setState({ isOpen: false });
                         onValueChanged('os', null);
                     }}
+                    onTypeaheadInputChanged={() => {
+                        // When searching, immediately switch to the full list
+                        if (!this.state.showAll)
+                            this.setState({ showAll: true });
+                    }}
                     onToggle={(_event, isOpen) => this.setState({ isOpen })}
                     isOpen={this.state.isOpen}
                     menuAppendTo="parent"
mvollmer commented 1 month ago

On the top of the list, show the currently supported ones (known EOL in the future, or unknown EOL) sorted by name and then release date; then add a divider with "Unsupported:", and then show all the EOLed ones (same sorting)?

I have implemented that with PF SelectGroups, but unfortunately PF seems to be buggy: The dropdown can not be scrolled. We might first need to port away from the deprecated Select implementation.

I'll do that, seems to be a good idea in general.

mvollmer commented 1 month ago

I have implemented that with PF SelectGroups, but unfortunately PF seems to be buggy: The dropdown can not be scrolled

Or maybe our overrides don't apply to a Select with isGrouped.

garrett commented 1 month ago

Note that filtering is based both on End-Of-Life and release dates. Thus, we can't strictly say "Show unsupported operating systems" since the hidden ones are not all unsupported, some are just old.

Right, they're implicitly EOL'd. The point is to filter out things that are no longer supported, either with official dates or something that hasn't been touched in a long time. Most modern mainstream distros have published EOL dates.

Not all Linux distros had published official EOL dates, but if they haven't been updated in years, then they're insecure and we don't want to promote those. For example, Hanna Montana Linux hasn't been updated in a long time (2009) and we don't want to show that. Same for more "mainstream" distros, like Corel, Mandrake, and Mandriva.

garrett commented 1 month ago

These are all the ones in the future, sorted by EOL date, release date, version, then name (these should all show up and we shouldn't have to worry about them):

OS version release EOL
SUSE Linux Enterprise Desktop 12 SP5 12.5 2019-12-09 2024-10-31
SUSE Linux Enterprise Server 12 SP5 12.5 2019-12-09 2024-10-31
OpenBSD 7.4 7.4 2023-10-16 2024-11-01
Alpine Linux 3.17 3.17 2022-11-22 2024-11-22
ALT 10.0 10.0 2021-12-15 2024-12-31
ALT 10.1 10.1 2023-02-21 2024-12-31
Generic Linux 2020 2020 2020-01-01 2025-01-01
Mageia 9 9 2023-08-27 2025-03-31
OpenBSD 7.5 7.5 2024-04-05 2025-05-01
Alpine Linux 3.18 3.18 2023-05-09 2025-05-09
ALT 10.2 10.2 2024-03-13 2025-06-30
SUSE Linux Enterprise Micro 5.1 5.1 2021-10-26 2025-10-31
Alpine Linux 3.19 3.19 2023-12-07 2025-11-01
ALT 10.3 10.3 2024-03-21 2025-12-31
Alpine Linux 3.20 3.20 2024-05-22 2026-04-01
Ubuntu 16.04 16.04 2016-04-21 2026-04-23
SUSE Linux Enterprise Micro 5.2 5.2 2022-04-14 2026-04-30
Debian 11 11 2021-08-14 2026-08-31
SUSE Linux Enterprise Micro 5.3 5.3 2022-10-25 2026-10-30
SUSE Linux Enterprise 15 SP4 15.4 2022-06-21 2026-12-31
Generic Linux 2022 2022 2022-01-01 2027-01-01
Microsoft Windows Server 2016 10.0 2016-10-15 2027-01-12
SUSE Linux Enterprise Micro 5.4 5.4 2023-04-20 2027-04-30
Ubuntu 18.04 LTS 18.04 2018-04-26 2028-04-26
Debian 12 12 2023-06-10 2028-06-30
Microsoft Windows 10 10.0 2018-11-13 2029-01-09
Microsoft Windows Server 2019 10.0 2018-11-13 2029-01-09
Microsoft Windows 7 6.1 2009-10-22 2029-01-14
Rocky Linux 8 8 2021-06-21 2029-05-31
Circle Linux 8.4 8.4 2021-10-13 2029-05-31
Circle Linux 8.5 8.5 2021-11-26 2029-05-31
Circle Linux 8 Unknown 8-unknown   2029-05-31
Ubuntu 20.04 LTS 20.04 2020-04-23 2030-04-23
Microsoft Windows Server 2022 10.0 2021-08-18 2031-10-14
Ubuntu 22.04 LTS 22.04 2022-04-21 2032-04-21
Rocky Linux 9 9 2022-07-14 2032-05-31
Ubuntu 24.04 LTS 24.04 2024-04-25 2034-04-25

These are all the ones that have a release date but no published EOL, outside of the grace period (these don't show up and most shouldn't):

OS version release EOL
Novell Netware 4 4 1993-04-01  
NetBSD 0.8 0.8 1993-04-20  
NetBSD 0.9 0.9 1993-08-23  
FreeBSD 1.0 1.0 1993-11-01  
FreeBSD 2.0 2.0 1994-11-22  
FreeBSD 2.0.5 2.0.5 1995-06-10  
Mandrake Linux 5.1 5.1 1998-07-23  
Novell Netware 5 5 1998-10-01  
FreeBSD 3.0 3.0 1998-10-16  
FreeBSD 2.2.8 02.02.08 1998-11-22  
Mandrake Linux 5.2 5.2 1998-12-01  
Mandrake Linux 5.3 5.3 1999-02-11  
FreeBSD 3.2 3.2 1999-05-17  
Mandrake Linux 6.0 6.0 1999-05-27  
Mandrake Linux 6.1 6.1 1999-09-17  
Mandrake Linux 7.0 7.0 2000-01-14  
FreeBSD 4.0 4.0 2000-03-14  
Mandrake Linux 7.1 7.1 2000-06-13  
FreeBSD 4.1 4.1 2000-06-27  
Mandrake Linux 7.2 7.2 2000-10-30  
FreeBSD 4.2 4.2 2000-11-21  
Mandrake Linux 8.0 8.0 2001-04-19  
FreeBSD 4.3 4.3 2001-04-20  
FreeBSD 4.4 4.4 2001-09-20  
Mandrake Linux 8.1 8.1 2001-09-27  
Novell Netware 6 6 2001-10-01  
FreeBSD 4.5 4.5 2002-01-29  
Mandrake Linux 8.2 8.2 2002-03-18  
Mandrake Linux 9.0 9.0 2002-09-25  
Mandrake Linux 9.1 9.1 2003-03-25  
Mandrake Linux 9.2 9.2 2003-12-14  
Mandrake Linux 10.0 10.0 2004-04-28  
Mandrake Linux 10.1 10.1 2004-10-15  
Solaris 10 10 2005-01-31  
Mandrake Linux 10.2 10.2 2005-04-14  
Mandriva Linux 2006.0 2006.0 2005-10-14  
FreeBSD 2.2.9 02.02.09 2006-04-01  
Mandriva Linux 2007 2007 2006-10-03  
Mandriva Linux 2007 Spring 2007.1 2007-04-18  
NetBSD 4.0 4.0 2007-12-19  
DragonFlyBSD 1.12.2 01.12.02 2008-04-20  
DragonFlyBSD 2.0.1 2.0.1 2008-09-27  
Mandriva Linux 2010.2 2010.2 2010-12-01  
Oracle Solaris 11 11 2011-11-09  
Red Hat Enterprise Linux 7.0 7.0 2014-06-10  
Oracle Linux 7.0 7.0 2014-07-11  
Red Hat Enterprise Linux 7.1 7.1 2015-03-05  
Oracle Linux 7.1 7.1 2015-03-11  
Asianux Server 7 7.0 2015-07-16  
Red Hat Enterprise Linux 7.2 7.2 2015-11-19  
Oracle Linux 7.2 7.2 2015-11-25  
Asianux Server 7 SP1 7.1 2016-01-22  
Slackware 14.2 14.2 2016-07-01  
Asianux Server 4 SP6 4.6 2016-07-21  
Red Hat Enterprise Linux 7.3 7.3 2016-11-03  
Oracle Linux 7.3 7.3 2016-11-08  
Asianux Server 4 SP7 4.7 2017-05-26  
Red Hat Enterprise Linux 7.4 7.4 2017-08-01  
Oracle Linux 7.4 7.4 2017-08-04  
Asianux Server 7 SP2 7.2 2017-10-24  
CirrOS 0.4.0 0.4.0 2017-11-20  
Red Hat Enterprise Linux 7.5 7.5 2018-04-10  
Oracle Linux 7.5 7.5 2018-04-12  
NetBSD 8.0 8.0 2018-07-17  
Elementary OS 5.0 Juno 5.0 2018-10-16  
Red Hat Enterprise Linux 7.6 7.6 2018-10-30  
Oracle Linux 7.6 7.6 2018-11-19  
Android-x86 8.1 8.1 2019-01-15  
Asianux Server 7 SP3 7.3 2019-02-26  
Univention Corporate Server 4.4 4.4 2019-03-12  
Red Hat Enterprise Linux 8.0 8.0 2019-05-07  
NetBSD 8.1 8.1 2019-05-31  
DragonFlyBSD 5.6 5.6 2019-06-17  
Oracle Linux 8.0 8.0 2019-07-18  
Red Hat Enterprise Linux 7.7 7.7 2019-08-06  
Oracle Linux 7.7 7.7 2019-08-15  
Hyperbola 3 2019-09-23  
Pop!_OS 19.10 19.10 2019-10-22  
Red Hat Enterprise Linux 8.1 8.1 2019-11-05  
Oracle Linux 8.1 8.1 2019-11-15  
Android-x86 9.0 9.0 2019-11-15  
NetBSD 9.0 9.0 2020-02-14  
CirrOS 0.5.0 0.5.0 2020-03-04  
CirrOS 0.5.1 0.5.1 2020-03-06  
Red Hat Enterprise Linux 7.8 7.8 2020-03-31  
NetBSD 8.2 8.2 2020-03-31  
Oracle Linux 7.8 7.8 2020-04-08  
Guix 1.1 1.1 2020-04-15  
Red Hat Enterprise Linux 8.2 8.2 2020-04-28  
Pop!_OS 20.04 20.04 2020-04-30  
Oracle Linux 8.2 8.2 2020-05-06  
Red Hat Enterprise Linux 7.9 7.9 2020-09-30  
Oracle Linux 7.9 7.9 2020-10-07  
NetBSD 9.1 9.1 2020-10-18  
Pop!_OS 20.10 20.10 2020-10-23  
Red Hat Enterprise Linux 8.3 8.3 2020-10-29  
Oracle Linux 8.3 8.3 2020-11-13  
Freenix 14.2 14.2 2020-11-30  
CirrOS 0.5.2 0.5.2 2021-03-06  
AlmaLinux 8 8 2021-03-30  
Guix 1.3 1.3 2021-05-11  
NetBSD 9.2 9.2 2021-05-12  
Red Hat Enterprise Linux 8.4 8.4 2021-05-19  
Univention Corporate Server 5.0 5.0 2021-05-25  
Oracle Linux 8.4 8.4 2021-05-26  
EuroLinux 8 8 2021-06-24  
MIRACLE LINUX 8.4 8.4 2021-10-04  
Microsoft Windows 11 11.0 2021-10-05  
Red Hat Enterprise Linux 8.5 8.5 2021-11-10  
Oracle Linux 8.5 8.5 2021-11-16  
Trisquel 10.0 LTS 10 2022-02-01  
FreeDOS 1.3 1.3 2022-02-20  
Red Hat Enterprise Linux 8.6 8.6 2022-05-10  
Oracle Linux 8.6 8.6 2022-05-16  
Red Hat Enterprise Linux 9.0 9.0 2022-05-17  
AlmaLinux 9 9 2022-05-26  
openSUSE Leap 15.4 15.4 2022-06-08  
EuroLinux 9 9 2022-06-13  
Oracle Linux 9.0 9.0 2022-06-30  
NetBSD 9.3 9.3 2022-08-04  

Same, but in the 3 year grace period:

OS version release EOL
MIRACLE LINUX 9.0 9.0 2022-11-01  
Red Hat Enterprise Linux 8.7 8.7 2022-11-09  
Oracle Linux 8.7 8.7 2022-11-15  
Red Hat Enterprise Linux 9.1 9.1 2022-11-15  
Oracle Linux 9.1 9.1 2022-11-22  
NixOS 22.11 22.11 2022-11-30  
FreeBSD 12.4 12.4 2022-12-05  
Haiku R1/Beta4 r1beta4 2022-12-23  
Trisquel 11.0 LTS 11 2023-03-19  
FreeBSD 13.2 13.2 2023-04-11  
Red Hat Enterprise Linux 9.2 9.2 2023-05-10  
Oracle Linux 9.2 9.2 2023-05-15  
Red Hat Enterprise Linux 8.8 8.8 2023-05-16  
Oracle Linux 8.8 8.8 2023-05-23  
NixOS 23.05 23.05 2023-05-31  
openSUSE Leap 15.5 15.5 2023-06-07  
SUSE Linux Enterprise 15 SP5 15.5 2023-06-20  
Fedora Linux 39 39 2023-11-07  
Fedora Silverblue 39 39 2023-11-07  
Red Hat Enterprise Linux 9.3 9.3 2023-11-07  
Red Hat Enterprise Linux 8.9 8.9 2023-11-14  
Oracle Linux 9.3 9.3 2023-11-14  
FreeBSD 14.0 14.0 2023-11-20  
Oracle Linux 8.9 8.9 2023-11-21  
NixOS 23.11 23.11 2023-11-29  
NetBSD 10.0 10.0 2024-03-28  
NetBSD 9.4 9.4 2024-04-20  
Fedora Linux 40 40 2024-04-23  
Fedora Silverblue 40 40 2024-04-23  
Red Hat Enterprise Linux 9.4 9.4 2024-04-30  
Endless OS 6.0 6.0 2024-05-14  
Red Hat Enterprise Linux 8.10 8.10 2024-05-22  
NixOS 24.05 24.05 2024-05-31  

And these are all the ones without a date (a lot are "unknown"):

OS release
PureOS 8
CentOS Stream 9 9
PureOS 9
PureOS 10
SUSE Linux Enterprise Desktop 12 Unknown 12-unknown
SUSE Linux Enterprise Server 12 Unknown 12-unknown
SUSE Linux Enterprise 15 Unknown 15-unknown
Ubuntu 24.10 24.10
GNOME 3.14 3.14
Red Hat Enterprise Linux 7 Unknown 7-unknown
Scientific Linux 7 Unknown 7-unknown
MIRACLE LINUX 8 Unknown 8-unknown
Red Hat Enterprise Linux 8 Unknown 8-unknown
Asianux Server 8 8.0
Oracle Linux 8.10 8.10
Circle Linux 9 Unknown 9-unknown
MIRACLE LINUX 9 Unknown 9-unknown
Oracle Linux 9 Unknown 9-unknown
Red Hat Enterprise Linux 9 Unknown 9-unknown
Circle Linux 9.0 9.0
Oracle Linux 9.4 9.4
Red Hat Enterprise Linux 9.5 9.5
Slackware -current current
Fedora ELN ELN
openSUSE factory
Fedora CoreOS Next
Haiku Nightly nightly
ALT p10 StarterKits p10
ALT p11 StarterKits p11
ALT p8 StarterKits p8
ALT p9 StarterKits p9
Fedora Rawhide Rawhide
Fedora Silverblue Rawhide Rawhide
ALT regular sisyphus
Fedora CoreOS Stable
Debian testing testing
Fedora CoreOS Testing
openSUSE Tumbleweed tumbleweed
Asianux unknown unknown
Circle Linux Unknown unknown
Fedora unknown
Fedora Silverblue unknown
openSUSE unknown
Red Hat Enterprise Linux Unknown unknown
Rocky Linux Unknown unknown
SUSE CaaS Platform Unknown unknown
SUSE Linux Enterprise Unknown unknown
NixOS Unstable unstable

And all of these are without version, without release dates, and without EOL (and I think they're all rolling and ones we want, except "Unknown"):

OS version release EOL
Arch Linux  
Clear Linux OS  
Gentoo Linux  
Guix Hurd Latest  
Guix latest  
Manjaro  
NixOS  
OmniOSCE Bloody  
OpenIndiana Hipster  
Triton SmartOS  
Unknown  
Void Linux  
garrett commented 1 month ago

Note: When the feature was originally made, we didn't have rolling releases of CentOS stream and the like. We definitely need to rethink how it's handled. But we also shouldn't open the floodgates to all the obsolete and insecure distros.

martinpitt commented 1 month ago

But we also shouldn't open the floodgates to all the obsolete and insecure distros.

That's a good point. We need to weigh "discoverability of the show more.. button" against "accidentally install an old OS".

Both this PR (view more..) and #1872 seem fine to me, I don't have a strong opinion between them. I make the optimistic assumption that admins don't just wildly click around without thinking and creating VMs willy-nilly :grin: @garrett do you have a clear preference between the two approaches?

mvollmer commented 1 month ago

Note: When the feature was originally made, we didn't have rolling releases of CentOS stream and the like. We definitely need to rethink how it's handled. But we also shouldn't open the floodgates to all the obsolete and insecure distros.

I understand #509 so that we should allow the user to download and install any and all operating systems that Cockpit can possibly download and install. No matter what rules we can come up with to classify operating systems into supported / unsupported or secure / not secure or new / old, the feature we are implementing here is about overriding this rule and allowing the user to download and install a operating system that is unsupported or not secure or old.

Correct?

garrett commented 1 month ago

feature we are implementing here is about overriding this rule and allowing the user to download and install a operating system that is unsupported or not secure or old

Yes and no. There's a difference between EOL and totally abandoned.

OK, how's this for a differentiator:

  1. Is there a URL to the media to download?
  2. Is available?

If it doesn't even have a URL to download the media, then we should skip the list. That will probably get rid of a lot of noise, if we don't already do that.

The question on if it is available or not is important, but it's something that libosinfo should be doing, not us. It would still be interesting to know if they have bogus information, but they should fix that upstream.

(We could do a head request to see if it exists when something is selected, I suppose, and throw an error that the remote media doesn't exist, rather than failing. Or just assume it exists.)

How can we query what libosinfo has for the download media for each entry? The docs aren't straightforward about this. I see the URLs to the OS releases, not the media.

mvollmer commented 1 month ago

If it doesn't even have a URL to download the media, then we should skip the list. That will probably get rid of a lot of noise, if we don't already do that.

We already do that. :-)

mvollmer commented 4 weeks ago

Continued in https://github.com/cockpit-project/cockpit-machines/pull/1872