diff --git a/xCAT-server/lib/perl/xCAT/Template.pm b/xCAT-server/lib/perl/xCAT/Template.pm index 44f22b751..4147ad137 100644 --- a/xCAT-server/lib/perl/xCAT/Template.pm +++ b/xCAT-server/lib/perl/xCAT/Template.pm @@ -1853,8 +1853,7 @@ my $UBUNTU_ARCHIVE_KEYRING = '/usr/share/keyrings/ubuntu-archive-keyring.gpg'; # The apt lines that keep the recommended packages out of the install. ospkgs installs without # them and the installer matches it. ppc64el is the exception: curtin installs a bootloader # package of its own for UEFI and for s390x only, and on a PReP machine install_grub runs -# "dpkg-reconfigure grub-ieee1275" on a package the Ubuntu kernel image merely recommends. With -# the recommended packages off that package is absent and the install stops there. +# "dpkg-reconfigure grub-ieee1275" on a package the Ubuntu kernel image only recommends. sub ubuntu_subiquity_no_recommends_lines { my ($osarch) = @_; diff --git a/xCAT-server/share/xcat/install/ubuntu/compute.subiquity.tmpl b/xCAT-server/share/xcat/install/ubuntu/compute.subiquity.tmpl index e83dceb8d..63a158f1a 100644 --- a/xCAT-server/share/xcat/install/ubuntu/compute.subiquity.tmpl +++ b/xCAT-server/share/xcat/install/ubuntu/compute.subiquity.tmpl @@ -128,8 +128,7 @@ autoinstall: - ['bash', '-c', 'xm=#XCATVAR:XCATMASTER#; port="#TABLEBLANKOKAY:site:key=xcatiport:value#"; [ -n "$port" ] || port=3002; ok=0; for i in 1 2 3 4 5; do if exec 3<>/dev/tcp/$xm/$port; then if read -r -t 10 hello <&3 && [ "$hello" = "ready" ]; then printf "next\n" >&3; if read -r -t 10 ack <&3 && [ "$ack" = "done" ]; then ok=1; fi; fi; exec 3>&- 3<&-; [ "$ok" = 1 ] && break; fi; sleep 5; done; if [ "$ok" != 1 ]; then echo "xcat: FAILED to flip $(hostname) to local-disk boot via $xm:$port; the node will PXE back into the installer" >>/target/var/log/xcat/xcat.log; fi; exit 0'] error-commands: # Subiquity waits for every error command to return. "nc -l 8080" waits for a collector, which - # an unattended install does not have, so the node held the failure until the provisioning - # timeout reset it and the reason never left the node. Keep the archive on the installer, and - # print the end of the curtin log to the console, which the management node records. + # an unattended install does not have. Keep the archive on the installer, and print the end of + # the curtin log to the console, which the management node records. - ['sh', '-c', 'tar -c --ignore-failed-read --transform="s/^/#HOSTNAME#-logs\//" /var/crash /var/log/installer /tmp/pre-install.log /autoinstall.yaml >/run/#HOSTNAME#-logs.tar 2>/dev/null; exit 0'] - ['sh', '-c', 'tail -n 80 /var/log/installer/curtin-install.log >"${XCAT_ERROR_CONSOLE:-/dev/console}" 2>/dev/null; exit 0'] diff --git a/xCAT-test/unit/ubuntu_subiquity_error_commands.t b/xCAT-test/unit/ubuntu_subiquity_error_commands.t index ee89356ef..1c1acb067 100755 --- a/xCAT-test/unit/ubuntu_subiquity_error_commands.t +++ b/xCAT-test/unit/ubuntu_subiquity_error_commands.t @@ -6,15 +6,13 @@ use FindBin; use File::Temp qw(tempdir); use Test::More; -# Subiquity waits for every error command to return before it reports the failure. The template -# used to offer the installer logs with "nc -l 8080", which waits for a collector that an -# unattended install never has, so a failed install stopped there: the node answered ping with no -# disk or network activity for as long as the provisioning timeout allowed, and the reason for the -# failure stayed on the node. That is how a missing grub-ieee1275 on ppc64el read as a wedged -# curtin extract. +# Subiquity waits for every error command to return before it reports the failure. An error +# command that waits for a collector an unattended install does not have therefore holds the +# node until the provisioning timeout. # -# Run the error commands, with the programs that would reach the host or the network replaced, and -# check that they return and that they write the end of the curtin log where the caller points. +# Run the error commands, with the programs that would reach the host or the network replaced, +# and check that they return and that they write the end of the curtin log where the caller +# points. my $tmpl = "$FindBin::Bin/../../xCAT-server/share/xcat/install/ubuntu/compute.subiquity.tmpl"; plan skip_all => 'compute.subiquity.tmpl not found' unless -r $tmpl; @@ -24,7 +22,7 @@ my $source = do { local $/; <$fh> }; close $fh; my ($block) = $source =~ m{^ error-commands:\n((?: [-#].*\n)+)}m; -BAIL_OUT('the template declares no error-commands') unless $block; +die('the template declares no error-commands') unless $block; # One command per list item. The list form ['sh', '-c', '...'] carries the command in its last # element; a plain item is the command itself. @@ -35,15 +33,14 @@ foreach my $line (split /\n/, $block) { if ($item =~ m{^\['[^']+', '-c', '(.*)'\]$}) { push @commands, $1; } else { push @commands, $item; } } -BAIL_OUT('no error command found in the block') unless @commands; +die('no error command found in the block') unless @commands; my $root = tempdir(CLEANUP => 1); my $console = "$root/console"; my $script = "$root/error-commands.sh"; -# nc, tar and tail are shadowed: bash resolves a function ahead of PATH, so the commands run as -# written while nothing reaches the host or the network. nc waits the way a listener with no -# collector waits. +# bash resolves a function ahead of PATH, so the commands run as written while nothing reaches +# the host or the network. The nc shadow waits the way a listener with no collector waits. open(my $out, '>', $script) or die "open $script: $!"; print {$out} "export XCAT_ERROR_CONSOLE='$console'\n"; print {$out} "nc() { sleep 300; }\n";