From b492f6fb74314fbe8388558bc1283874c1917825 Mon Sep 17 00:00:00 2001 From: "pulse-triage[bot]" <249995291+pulse-triage[bot]@users.noreply.github.com> Date: Tue, 13 Oct 2026 04:01:38 +0100 Subject: [PATCH] Keep the TrueNAS caller fixture closed over its NAS platform read Final whole-package proof retained a SCALE caller failure and showed its missing nas_agent_removal_platform definition. Extract the real platform reader through the existing redirected vendor paths and require an ordinary-Linux negative scope read without command-not-found noise. Preserve all sixteen task/process/manager controls and production refusal deadlines; this closure repair does not diagnose the observed service-quiescence failure. Contract-Neutral: Complete test fixture namespace and negative-scope assertion only; no production installer, service, removal, credential or timeout delta. Change-source: pulse-maintainer --- scripts/installtests/agent_truenas_teardown.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/scripts/installtests/agent_truenas_teardown.py b/scripts/installtests/agent_truenas_teardown.py index 624ed9293a..43d51c6786 100644 --- a/scripts/installtests/agent_truenas_teardown.py +++ b/scripts/installtests/agent_truenas_teardown.py @@ -18,6 +18,7 @@ ROOT = Path(__file__).resolve().parents[2] SOURCE = Path(os.environ.get("PULSE_AGENT_TRUENAS_SOURCE", ROOT / "scripts/install.sh")) FUNCTIONS = ( "portable_path_uid", "portable_path_mode", "trusted_lifecycle_regular_file", + "nas_agent_removal_platform", "read_agent_removal_unit_state", "confirm_agent_unit_quiescent", "quiesce_agent_units_for_removal", "teardown_systemd_agent_service", "read_legacy_agent_removal_processes", "legacy_agent_processes_absent", @@ -372,6 +373,10 @@ remove_safe_profile_state_dir() { rm -rf -- "$SAFE_PROFILE_STATE_DIR"; } result = self.exercise(bootstrap='missing', tasks='absent', appliance=False) self.assertEqual(result[0].returncode, 0, result[0].stderr) self.assertFalse(any(e.startswith('task:') for e in result[2])) + # The complete caller also checks the unrelated NAS platform. Extract + # that real function, with its existing vendor paths redirected, rather + # than letting an undefined command masquerade as a negative scope read. + self.assertNotIn('command not found', result[0].stdout + result[0].stderr) def test_process_read_exposes_only_roles_and_real_timeout_child_is_stopped(self): result = self.exercise(fault='live-bootstrap', flow='process')