From a80e1e7cfa300b260981e0ed74c76a3ecb0ec0f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Ferr=C3=A3o?= <2031761+viniciusferrao@users.noreply.github.com> Date: Sat, 18 Jul 2026 00:58:31 -0300 Subject: [PATCH 1/3] test(dhcp): isolate EL9 backend selection fixture --- xCAT-test/unit/dhcp_backend_selection.t | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/xCAT-test/unit/dhcp_backend_selection.t b/xCAT-test/unit/dhcp_backend_selection.t index 9083ec2c9..1e215b191 100644 --- a/xCAT-test/unit/dhcp_backend_selection.t +++ b/xCAT-test/unit/dhcp_backend_selection.t @@ -155,7 +155,13 @@ is( ); is( - xCAT::DHCP::Backend->choose( requested => 'auto', os => 'rhel9', platform => 'el9' )->{name}, + xCAT::DHCP::Backend->choose( + requested => 'auto', + os => 'rhel9', + platform => 'el9', + os_name => 'rhel', + version => 9, + )->{name}, 'isc', 'auto selects ISC on EL9' ); From c340abd543ec2044b3239a2da9820203b4e48422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Ferr=C3=A3o?= <2031761+viniciusferrao@users.noreply.github.com> Date: Sat, 18 Jul 2026 00:58:49 -0300 Subject: [PATCH 2/3] fix(dhcp): use complete Ubuntu release for backend selection --- perl-xCAT/xCAT/DHCP/Backend.pm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/perl-xCAT/xCAT/DHCP/Backend.pm b/perl-xCAT/xCAT/DHCP/Backend.pm index 0132f8a97..934b8828c 100644 --- a/perl-xCAT/xCAT/DHCP/Backend.pm +++ b/perl-xCAT/xCAT/DHCP/Backend.pm @@ -58,7 +58,7 @@ sub default_backend { } my $os_name = exists $args{os_name} ? $args{os_name} : $class->_osver('os'); - my $version = exists $args{version} ? $args{version} : $class->_osver('version'); + my $version = exists $args{version} ? $args{version} : ( split /,/, $class->_osver('all'), 2 )[1]; if ( defined($os_name) && $os_name =~ /^ubuntu$/i && defined($version) && $version =~ /^\d+\.\d+(?:\.\d+)*$/ ) { require xCAT::Utils; return 'kea' if xCAT::Utils->version_cmp( $version, '22.04' ) >= 0; From a53853d91990fa48cf85a51ad7bf88090376b252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Ferr=C3=A3o?= <2031761+viniciusferrao@users.noreply.github.com> Date: Sat, 18 Jul 2026 00:59:04 -0300 Subject: [PATCH 3/3] test(dhcp): cover detected Ubuntu backend selection --- xCAT-test/unit/dhcp_backend_selection.t | 99 ++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/xCAT-test/unit/dhcp_backend_selection.t b/xCAT-test/unit/dhcp_backend_selection.t index 1e215b191..f6450cf21 100644 --- a/xCAT-test/unit/dhcp_backend_selection.t +++ b/xCAT-test/unit/dhcp_backend_selection.t @@ -8,6 +8,18 @@ use Test::More; use xCAT::DHCP::Backend; +sub with_detected_osver { + my ( $values, $code ) = @_; + + no warnings 'redefine'; + local *xCAT::DHCP::Backend::_osver = sub { + my ( $class, $type ) = @_; + return $values->{ defined($type) ? $type : '' }; + }; + + return $code->(); +} + is( xCAT::DHCP::Backend->normalize(undef), 'auto', 'undefined backend defaults to auto' ); is( xCAT::DHCP::Backend->normalize(' ISC '), 'isc', 'backend values are trimmed and lowercased' ); is( xCAT::DHCP::Backend->normalize('kea'), 'kea', 'kea is valid' ); @@ -88,7 +100,7 @@ is( is( xCAT::DHCP::Backend->default_backend( platform => '', os => 'ubuntu24.04', os_name => 'ubuntu', version => '24' ), 'isc', - 'Ubuntu major-only version is not treated as a date-based release' + 'injected Ubuntu major-only version remains conservative' ); is( @@ -142,6 +154,70 @@ is( 'openSUSE Leap 15 defaults to ISC' ); +is( + with_detected_osver( + { + '' => 'ubuntu20', + platform => '', + os => 'ubuntu', + version => '20', + release => '04', + all => 'ubuntu,20.04', + }, + sub { xCAT::DHCP::Backend->default_backend() } + ), + 'isc', + 'detected Ubuntu 20.04 defaults to ISC using the osver contract' +); + +is( + with_detected_osver( + { + '' => 'ubuntu22', + platform => '', + os => 'ubuntu', + version => '22', + release => '04', + all => 'ubuntu,22.04', + }, + sub { xCAT::DHCP::Backend->default_backend() } + ), + 'kea', + 'detected Ubuntu 22.04 defaults to Kea using the osver contract' +); + +is( + with_detected_osver( + { + '' => 'ubuntu24', + platform => '', + os => 'ubuntu', + version => '24', + release => '04.4', + all => 'ubuntu,24.04.4', + }, + sub { xCAT::DHCP::Backend->choose( requested => 'auto' )->{name} } + ), + 'kea', + 'auto selects Kea for detected Ubuntu 24.04 point releases' +); + +is( + with_detected_osver( + { + '' => 'ubuntu24', + platform => '', + os => 'ubuntu', + version => '24', + release => '', + all => 'ubuntu,24', + }, + sub { xCAT::DHCP::Backend->default_backend() } + ), + 'isc', + 'detected Ubuntu release without a minor version remains conservative' +); + is( xCAT::DHCP::Backend->choose( requested => 'isc', os => 'rhel10', platform => 'el10' )->{name}, 'isc', @@ -184,6 +260,27 @@ is( 'auto selects Kea on Ubuntu 22.04' ); +SKIP: { + skip 'xCAT::Utils is not available for native OS detection', 1 unless eval { require xCAT::Utils; 1 }; + + my $os_name = xCAT::Utils->osver('os'); + my $version = xCAT::Utils->osver('version'); + my $release = xCAT::Utils->osver('release'); + my $detected_osver = defined($version) ? $version : ''; + $detected_osver .= ".$release" if defined($release) && $release ne ''; + my $supported_ubuntu = defined($os_name) && $os_name eq 'ubuntu' + && $detected_osver =~ /^\d+\.\d+(?:\.\d+)*$/ + && xCAT::Utils->version_cmp( $detected_osver, '22.04' ) >= 0; + + skip 'native OS is not Ubuntu 22.04 or newer', 1 unless $supported_ubuntu; + + is( + xCAT::DHCP::Backend->choose( requested => 'auto' )->{name}, + 'kea', + 'native Ubuntu 22.04 or newer defaults to Kea' + ); +} + like( xCAT::DHCP::Backend->choose( requested => 'invalid' )->{error}, qr/Invalid site\.dhcpbackend/,