From b42bbe0e02573b1b421b9013411e08643b199df5 Mon Sep 17 00:00:00 2001 From: Daniel Hilst <392820+dhilst@users.noreply.github.com> Date: Thu, 23 Jul 2026 21:33:50 -0300 Subject: [PATCH 1/4] fix(goconserver): manage the service via systemd instead of the `service` command Goconserver.pm shells out to `service goconserver start|stop|restart` (and `service conserver stop`). That command is provided by the initscripts package, which is NOT installed on a minimal EL9/EL10 management node -- there, every one of these calls fails with rc!=0. The damaging case is restart_service(). makegocons calls build_conf(), which rewrites /etc/goconserver/server.conf with the cert-enabled configuration (global.ssl_key_file/ssl_cert_file/ssl_ca_cert_file), and then calls restart_service() so the daemon picks it up. When the restart fails, xCAT only logs "Could not restart goconserver service." and the daemon keeps running with the configuration it read at boot -- the packaged default, which has no ssl_* fields. goconserver's TLS is gated on those fields being set (sslEnable stays false), so it silently serves plain HTTP on the api port while Goconserver.pm always talks to it over https. Every subsequent request then dies with SSL connect attempt failed error:0A0000C6:SSL routines::packet length too long so makegocons/makegocons -d report "Failed to send delete request." and the console can never be registered. On EL8 the bug is invisible because initscripts happens to be installed there. Use the xCAT::Utils service helpers (startservice/stopservice/restartservice), which resolve the unit through servicemap() and issue `systemctl ` on systemd hosts, falling back to `service`/`initctl` only where appropriate. This is the same mechanism the rest of the tree (AAsn.pm and friends) already uses for named, dhcpd, nfs and others. Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com> --- xCAT-server/lib/perl/xCAT/Goconserver.pm | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/xCAT-server/lib/perl/xCAT/Goconserver.pm b/xCAT-server/lib/perl/xCAT/Goconserver.pm index 324d8e451..c5ed88fcb 100644 --- a/xCAT-server/lib/perl/xCAT/Goconserver.pm +++ b/xCAT-server/lib/perl/xCAT/Goconserver.pm @@ -667,9 +667,7 @@ sub build_conf { #------------------------------------------------------------------------------- sub start_service { - my $cmd = "service goconserver start"; - xCAT::Utils->runcmd($cmd, -1); - if ($::RUNCMD_RC != 0) { + if (xCAT::Utils->startservice("goconserver") != 0) { xCAT::MsgUtils->message("S", "Could not start goconserver service."); return 1; } @@ -694,9 +692,7 @@ sub start_service { #------------------------------------------------------------------------------- sub stop_service { - my $cmd = "service goconserver stop"; - xCAT::Utils->runcmd($cmd, -1); - if ($::RUNCMD_RC != 0) { + if (xCAT::Utils->stopservice("goconserver") != 0) { xCAT::MsgUtils->message("S", "Could not stop goconserver service."); return 1; } @@ -721,9 +717,7 @@ sub stop_service { #------------------------------------------------------------------------------- sub stop_conserver_service { - my $cmd = "service conserver stop"; - xCAT::Utils->runcmd($cmd, -1); - if ($::RUNCMD_RC != 0) { + if (xCAT::Utils->stopservice("conserver") != 0) { xCAT::MsgUtils->message("S", "Could not stop conserver service."); return 1; } @@ -747,9 +741,7 @@ sub stop_conserver_service { #------------------------------------------------------------------------------- sub restart_service { - my $cmd = "service goconserver restart"; - xCAT::Utils->runcmd($cmd, -1); - if ($::RUNCMD_RC != 0) { + if (xCAT::Utils->restartservice("goconserver") != 0) { xCAT::MsgUtils->message("S", "Could not restart goconserver service."); return 1; } From 8bb0606120ddd0415cba80fc9d5b0b1729ab14e9 Mon Sep 17 00:00:00 2001 From: Daniel Hilst <392820+dhilst@users.noreply.github.com> Date: Thu, 23 Jul 2026 21:39:23 -0300 Subject: [PATCH 2/4] fix(xcat-core): add the missing ppc64le netboot templates for EL8/EL9 copycds only defines a --netboot-compute osimage when the netboot compute pkglist/exlist/postinstall for that distro+arch exist under share/xcat/netboot//. For AlmaLinux the ppc64le set was present only for alma10, so on an el8/el9 ppc64le management node copycds created just the install-* osimages and no netboot one. The stateless provisioning test then fails in a confusing way: the case's own `chdef -t osimage -o -ppc64le-netboot-compute synclists=...` auto-creates a bare object, so lsdef reports the image exists (imagetype=NIM and nothing else), while genimage rejects it with Error: Cannot find image '-ppc64le-netboot-compute' from the osimage table. and packimage plus the install that follows fail with it. Two gaps are filled: - share/xcat/netboot/rh/compute.rhels9.ppc64le.pkglist did not exist at all (rhels8 and rhels10 both ship one). Add it with the same content as the rhels9 x86_64 list, matching rhels10 where the two arches are identical. - alma8/alma9 ppc64le compute exlist/pkglist/postinstall are added as symlinks into the rh/ equivalents, exactly as alma10 ppc64le and rocky10 ppc64le already do. With these present, copycds produces a fully populated netboot-compute osimage (provmethod=netboot, pkglist/exlist/postinstall/rootimgdir set) as it already does on alma10 ppc64le. Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com> --- .../netboot/alma/compute.alma8.ppc64le.exlist | 1 + .../alma/compute.alma8.ppc64le.pkglist | 1 + .../alma/compute.alma8.ppc64le.postinstall | 1 + .../netboot/alma/compute.alma9.ppc64le.exlist | 1 + .../alma/compute.alma9.ppc64le.pkglist | 1 + .../alma/compute.alma9.ppc64le.postinstall | 1 + .../netboot/rh/compute.rhels9.ppc64le.pkglist | 30 +++++++++++++++++++ 7 files changed, 36 insertions(+) create mode 120000 xCAT-server/share/xcat/netboot/alma/compute.alma8.ppc64le.exlist create mode 120000 xCAT-server/share/xcat/netboot/alma/compute.alma8.ppc64le.pkglist create mode 120000 xCAT-server/share/xcat/netboot/alma/compute.alma8.ppc64le.postinstall create mode 120000 xCAT-server/share/xcat/netboot/alma/compute.alma9.ppc64le.exlist create mode 120000 xCAT-server/share/xcat/netboot/alma/compute.alma9.ppc64le.pkglist create mode 120000 xCAT-server/share/xcat/netboot/alma/compute.alma9.ppc64le.postinstall create mode 100644 xCAT-server/share/xcat/netboot/rh/compute.rhels9.ppc64le.pkglist diff --git a/xCAT-server/share/xcat/netboot/alma/compute.alma8.ppc64le.exlist b/xCAT-server/share/xcat/netboot/alma/compute.alma8.ppc64le.exlist new file mode 120000 index 000000000..f468ba7e1 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/alma/compute.alma8.ppc64le.exlist @@ -0,0 +1 @@ +../rh/compute.rhels8.ppc64le.exlist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/alma/compute.alma8.ppc64le.pkglist b/xCAT-server/share/xcat/netboot/alma/compute.alma8.ppc64le.pkglist new file mode 120000 index 000000000..38195cc33 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/alma/compute.alma8.ppc64le.pkglist @@ -0,0 +1 @@ +../rh/compute.rhels8.ppc64le.pkglist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/alma/compute.alma8.ppc64le.postinstall b/xCAT-server/share/xcat/netboot/alma/compute.alma8.ppc64le.postinstall new file mode 120000 index 000000000..011158f7b --- /dev/null +++ b/xCAT-server/share/xcat/netboot/alma/compute.alma8.ppc64le.postinstall @@ -0,0 +1 @@ +../rh/compute.rhels8.ppc64le.postinstall \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/alma/compute.alma9.ppc64le.exlist b/xCAT-server/share/xcat/netboot/alma/compute.alma9.ppc64le.exlist new file mode 120000 index 000000000..47be8bdca --- /dev/null +++ b/xCAT-server/share/xcat/netboot/alma/compute.alma9.ppc64le.exlist @@ -0,0 +1 @@ +../rh/compute.rhels9.ppc64le.exlist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/alma/compute.alma9.ppc64le.pkglist b/xCAT-server/share/xcat/netboot/alma/compute.alma9.ppc64le.pkglist new file mode 120000 index 000000000..1674eb9b3 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/alma/compute.alma9.ppc64le.pkglist @@ -0,0 +1 @@ +../rh/compute.rhels9.ppc64le.pkglist \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/alma/compute.alma9.ppc64le.postinstall b/xCAT-server/share/xcat/netboot/alma/compute.alma9.ppc64le.postinstall new file mode 120000 index 000000000..1299428cb --- /dev/null +++ b/xCAT-server/share/xcat/netboot/alma/compute.alma9.ppc64le.postinstall @@ -0,0 +1 @@ +../rh/compute.rhels9.ppc64le.postinstall \ No newline at end of file diff --git a/xCAT-server/share/xcat/netboot/rh/compute.rhels9.ppc64le.pkglist b/xCAT-server/share/xcat/netboot/rh/compute.rhels9.ppc64le.pkglist new file mode 100644 index 000000000..635bd5046 --- /dev/null +++ b/xCAT-server/share/xcat/netboot/rh/compute.rhels9.ppc64le.pkglist @@ -0,0 +1,30 @@ +@minimal-environment +chrony +kernel +net-tools +nfs-utils +openssh-server +rsync +tar +util-linux +wget +python3 +tar +bzip2 +bc +dracut +dracut-network +rsyslog +hostname +e2fsprogs +ethtool +parted +openssl +dhclient +openssh-clients +bash +vim-minimal +rpm +iputils +perl-interpreter + From b9336448f7c3baf31d14ed49740ad5ba9afc0053 Mon Sep 17 00:00:00 2001 From: Daniel Hilst <392820+dhilst@users.noreply.github.com> Date: Fri, 24 Jul 2026 16:15:15 -0300 Subject: [PATCH 3/4] fix(xcat-core): retry_install defaults to 2 provision attempts, not 3 retry_install.sh retries a node provision $times (default 3) x 30 min. The flat diskless/diskfull cases each call it multiple times, so when a node genuinely fails to come up the retries stack to ~3.5-4 h per case (measured: a single contention-flaked el8-x86 diskless burned 14181s in devel-cd #22), which both balloons the CD wall-clock and delays the red verdict. Two attempts still absorbs a one-off transient (a single slow/failed netboot) while halving the worst-case retry time (3->2 tries per call). Callers that pass an explicit count (e.g. the negative-provision check that passes 1) are unaffected -- only the default changes. Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com> --- xCAT-test/autotest/testcase/commoncmd/retry_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xCAT-test/autotest/testcase/commoncmd/retry_install.sh b/xCAT-test/autotest/testcase/commoncmd/retry_install.sh index 7c90298ca..61dcbc723 100755 --- a/xCAT-test/autotest/testcase/commoncmd/retry_install.sh +++ b/xCAT-test/autotest/testcase/commoncmd/retry_install.sh @@ -6,7 +6,7 @@ declare -i tryreinstall=1 node=$1 osimage=$2 vmhost=`lsdef $node -i vmhost -c | cut -d '=' -f 2` -times=3 +times=2 wait_for_provision=30 #Min to wait for node to provision check_status=10 #Sec to keep checking status iterations=$wait_for_provision*60/$check_status #Iterations to check for "booted" status From 851284067d8bb895b1cf7b02ba4bfa5875672640 Mon Sep 17 00:00:00 2001 From: Daniel Hilst <392820+dhilst@users.noreply.github.com> Date: Fri, 24 Jul 2026 16:19:58 -0300 Subject: [PATCH 4/4] fix(xcat-core): retry_install waits 20 min per provision attempt, not 30 wait_for_provision caps how long retry_install polls for a node to reach 'booted' after each rinstall. Measured healthy provisions in devel-cd #22 boot well inside this window (diskless ~6-8 min, diskfull ~8-16 min), so 30 min was mostly slack that only lengthened the give-up time on a genuinely failing node. Drop it to 20 min: still above the ~16-min diskfull install, while shrinking each failed attempt's cost (6 min fixed sleep + 20 poll = 26 min vs 36). Combined with the 3->2 attempt default, a fully-failing case's retry stack drops substantially. Trade-off noted: the margin over a slow-under-load diskfull install is now tighter. Signed-off-by: Daniel Hilst <392820+dhilst@users.noreply.github.com> --- xCAT-test/autotest/testcase/commoncmd/retry_install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xCAT-test/autotest/testcase/commoncmd/retry_install.sh b/xCAT-test/autotest/testcase/commoncmd/retry_install.sh index 61dcbc723..9f4c9e24e 100755 --- a/xCAT-test/autotest/testcase/commoncmd/retry_install.sh +++ b/xCAT-test/autotest/testcase/commoncmd/retry_install.sh @@ -7,7 +7,7 @@ node=$1 osimage=$2 vmhost=`lsdef $node -i vmhost -c | cut -d '=' -f 2` times=2 -wait_for_provision=30 #Min to wait for node to provision +wait_for_provision=20 #Min to wait for node to provision check_status=10 #Sec to keep checking status iterations=$wait_for_provision*60/$check_status #Iterations to check for "booted" status