From a1bb33d1d3be5ed7624c3ba9b84c32dedd32437a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20Ferr=C3=A3o?= <2031761+viniciusferrao@users.noreply.github.com> Date: Mon, 12 Oct 2026 19:13:16 -0300 Subject: [PATCH] test(genesis): preserve status publication failure policies --- .../bats/genesis_openembedded_actions.bats | 12 ++++++- .../bats/genesis_openembedded_discovery.bats | 34 ++++++++++++++++--- .../bats/genesis_openembedded_runtime.bats | 22 ++++++++++++ xCAT-test/native/genesis_metadata.py | 6 +++- 4 files changed, 68 insertions(+), 6 deletions(-) diff --git a/xCAT-test/bats/genesis_openembedded_actions.bats b/xCAT-test/bats/genesis_openembedded_actions.bats index fb2c313e2..e3f95e57b 100644 --- a/xCAT-test/bats/genesis_openembedded_actions.bats +++ b/xCAT-test/bats/genesis_openembedded_actions.bats @@ -54,7 +54,7 @@ tail -n +2 "$XCAT_TEST_NEXTDESTINY_QUEUE" >"$XCAT_TEST_NEXTDESTINY_QUEUE.new" mv "$XCAT_TEST_NEXTDESTINY_QUEUE.new" "$XCAT_TEST_NEXTDESTINY_QUEUE" printf '%s\n' "$response" SH - printf '#!/bin/sh\nprintf "logger %%s\\n" "$*" >>"$XCAT_TEST_LOG"\n' >"$bin/logger" + printf '#!/bin/sh\nprintf "logger %%s\\n" "$*" >>"$XCAT_TEST_LOG"\n[ -z "${XCAT_TEST_LOGGER_FAIL-}" ]\n' >"$bin/logger" printf '#!/bin/sh\nprintf "%%s\\n" discover >>"$XCAT_TEST_LOG"\n' >"$bin/discover" printf '#!/bin/sh\nprintf "%%s\\n" getcert >>"$XCAT_TEST_LOG"\n: >"$XCAT_TEST_CERTIFICATE_FILE"\n' >"$bin/getcert" printf '#!/bin/sh\nprintf "reboot-control %%s\\n" "$*" >>"$XCAT_TEST_LOG"\n' >"$bin/reboot-control" @@ -269,3 +269,13 @@ has_no_line() [ "$(cat "$destiny_file")" = osimage ] has_line "$record" '^CODE=XCAT_CHAIN_ADVANCE_FAILED$' } + +@test "action status failures use the caller diagnostic and propagate a logging failure" { + export XCAT_STATUS_COMMAND=/bin/false + run_action standby + [ "$status" -eq 0 ] + grep -Fx 'logger -t xcat-genesis-action -- unable to publish action status' "$command_log" + [ "$(cat "$destiny_file")" = standby ] + XCAT_TEST_LOGGER_FAIL=1 run_action standby + [ "$status" -eq 1 ] +} diff --git a/xCAT-test/bats/genesis_openembedded_discovery.bats b/xCAT-test/bats/genesis_openembedded_discovery.bats index dcce62f7e..39bd62d8d 100644 --- a/xCAT-test/bats/genesis_openembedded_discovery.bats +++ b/xCAT-test/bats/genesis_openembedded_discovery.bats @@ -42,7 +42,7 @@ setup() printf '%s\n' XCATDEST=192.0.2.10:3001 XCATMASTER=192.0.2.10 XCATPORT=3001 \ XCAT_INTERFACE=eth0 XCAT_SOURCE_ADDRESS=192.0.2.98 >"$state_dir/genesis.env" - printf '#!/bin/sh\n[ -z "${XCAT_TEST_LOGGER_FAIL-}" ]\n' >"$bin/logger" + printf '#!/bin/sh\nprintf "logger %%s\\n" "$*" >>"$XCAT_TEST_LOG"\n[ -z "${XCAT_TEST_LOGGER_FAIL-}" ]\n' >"$bin/logger" printf '#!/bin/sh\n[ "$1" = "-m" ] && printf "%%s\\n" "${XCAT_TEST_ARCH-x86_64}"\n' >"$bin/uname" cat >"$bin/ipmitool" <<'SH' #!/bin/sh @@ -292,12 +292,17 @@ not_in_packet() [ "$status" -ne 0 ] } -@test "the certificate client installs only the PEM certificate from a signed x509 request" { - printf '%s\n' 'XCATDEST=[2001:db8::10]:3001' XCATMASTER=2001:db8::10 XCATPORT=3001 \ - XCAT_INTERFACE=eth0 XCAT_SOURCE_ADDRESS=2001:db8::98 >"$state_dir/genesis.env" +credential_response() +{ printf '%s\n' XCAT_NODE_NAME=node042 XCAT_DESTINY=standby >"$XCAT_METADATA_FILE" printf '%s\n' '' '' '-----BEGIN CERTIFICATE-----' 'Q0VSVA==' \ '-----END CERTIFICATE-----' '' '' >"$XCAT_TEST_CREDENTIAL_RESPONSE" +} + +@test "the certificate client installs only the PEM certificate from a signed x509 request" { + printf '%s\n' 'XCATDEST=[2001:db8::10]:3001' XCATMASTER=2001:db8::10 XCATPORT=3001 \ + XCAT_INTERFACE=eth0 XCAT_SOURCE_ADDRESS=2001:db8::98 >"$state_dir/genesis.env" + credential_response run /bin/bash "$GETCERT" [ "$status" -eq 0 ] [ "$(cat "$XCAT_KEY_DIR/cert.pem")" = '-----BEGIN CERTIFICATE----- @@ -312,6 +317,27 @@ Q0VSVA== [ "$status" -eq 0 ] } +@test "discovery status failures use the caller diagnostic and propagate a logging failure" { + export XCAT_STATUS_COMMAND=/bin/false + discover + [ "$status" -eq 0 ] + [ -s "$packet" ] + grep -Fx 'logger -t xcat-genesis-discover -- unable to publish discovery status' "$XCAT_TEST_LOG" + XCAT_TEST_LOGGER_FAIL=1 discover + [ "$status" -eq 1 ] +} + +@test "credential status failures keep the singular diagnostic and propagate a logging failure" { + export XCAT_STATUS_COMMAND=/bin/false + credential_response + run /bin/bash "$GETCERT" + [ "$status" -eq 0 ] + [ -s "$XCAT_KEY_DIR/cert.pem" ] + grep -Fx 'logger -t xcat-genesis-getcert -- unable to publish credential status' "$XCAT_TEST_LOG" + XCAT_TEST_LOGGER_FAIL=1 run /bin/bash "$GETCERT" + [ "$status" -eq 1 ] +} + @test "the certificate client rejects an unsafe node name with a specific code" { printf '%s\n' XCAT_NODE_NAME=invalid/name >"$XCAT_METADATA_FILE" run /bin/bash "$GETCERT" diff --git a/xCAT-test/bats/genesis_openembedded_runtime.bats b/xCAT-test/bats/genesis_openembedded_runtime.bats index c3796680d..524cebc79 100644 --- a/xCAT-test/bats/genesis_openembedded_runtime.bats +++ b/xCAT-test/bats/genesis_openembedded_runtime.bats @@ -395,6 +395,17 @@ VERIFIED_SECONDS=123' ] [ "$status" -eq 0 ] } +@test "network status failures use the caller diagnostic and propagate a logging failure" { + export XCAT_STATUS_COMMAND=/bin/false + printf 'xcatd=127.0.0.1:%s BOOTIF=01-52-54-00-00-00-35\n' "$port" >"$XCAT_CMDLINE_FILE" + network_state + [ "$status" -eq 0 ] + grep -Fx 'logger -t xcat-genesis-network-state -- unable to publish network status' "$XCAT_TEST_LOG" + [ -s "$state_dir/genesis.env" ] + XCAT_TEST_LOGGER_FAIL=1 network_state + [ "$status" -eq 1 ] +} + @test "unsafe network data is rejected, never evaluated, and does not replace the prior state" { printf 'xcatd=127.0.0.1:%s BOOTIF=01-52-54-00-00-00-35\n' "$port" >"$XCAT_CMDLINE_FILE" network_state @@ -476,6 +487,17 @@ with_network_state() [ "$status" -eq 0 ] } +@test "registration status failures use the caller diagnostic and propagate a logging failure" { + export XCATDEST=192.0.2.213:3001 XCAT_STATUS_COMMAND=/bin/false + printf 'xcatd=192.0.2.213:3001 destiny=shell\n' >"$XCAT_CMDLINE_FILE" + run /bin/bash "$REGISTER_SCRIPT" + [ "$status" -eq 0 ] + [ "$(cat "$state_dir/destiny")" = shell ] + grep -Fx 'logger -t xcat-genesis-register -- unable to publish registration status' "$XCAT_TEST_LOG" + XCAT_TEST_LOGGER_FAIL=1 run /bin/bash "$REGISTER_SCRIPT" + [ "$status" -eq 1 ] +} + @test "registration requests a missing destiny, and rejects an empty one without replacing state" { export XCATDEST=192.0.2.213:3001 printf 'xcatd=192.0.2.213:3001\n' >"$XCAT_CMDLINE_FILE" diff --git a/xCAT-test/native/genesis_metadata.py b/xCAT-test/native/genesis_metadata.py index 7a8b0550c..5ab879672 100644 --- a/xCAT-test/native/genesis_metadata.py +++ b/xCAT-test/native/genesis_metadata.py @@ -302,8 +302,12 @@ class GenesisMetadata(unittest.TestCase): library_owner = "xcat-genesis-init" if "xcat-genesis-common" in self.dependencies(library_owner): library_owner = "xcat-genesis-common" + self.assertIn(library_owner, self.dependencies("xcat-genesis-discovery")) + self.assertEqual(self.dependencies(library_owner), {"bash", "util-linux-logger"}) library_data, library_root = self.install(library_owner) - self.installed(library_data, library_root, "libexecdir", "xcat/genesis-functions", 0o644) + library = self.installed(library_data, library_root, "libexecdir", "xcat/genesis-functions", 0o644) + self.assertEqual(library.read_bytes(), + (LAYER / "recipes-core/xcat-genesis-init/files/genesis-functions").read_bytes()) for name in ("genesis-status", "genesis-maintenance-shell"): self.installed(data, root, "libexecdir", "xcat/" + name, 0o755) self.assertFalse(list(root.rglob("*debug-shell*")))