Publish curated Unraid-AppOps-Gateway source from c61e0e1e292914893b40354f904f23dd9fd4a958
This commit is contained in:
1 parent
b47ce43436
commit
9b94d8d0f5
18 files changed
+1651
-75
No files matched your search
@@ -156,3 +156,54 @@ def test_statistics_configuration_caller_cannot_select_credential_or_endpoint(co
|
||||
monkeypatch.setattr(controller, 'configure_runner_statistics_binding', lambda **kwargs: pytest.fail('must not write configuration'))
|
||||
instance.do_POST()
|
||||
assert responses == [(400, {'status': 'invalid_request'})]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("stage", ["preflight", "quiesce"])
|
||||
def test_acceptance_uses_fixed_signed_route_and_protected_source(controller, monkeypatch, stage):
|
||||
import runner_acceptance_quiescence
|
||||
instance, responses, signatures = handler(controller, monkeypatch)
|
||||
instance.path = getattr(controller, "RUNNER_ACCEPTANCE_" + stage.upper() + "_PATH")
|
||||
calls = []
|
||||
monkeypatch.setattr(runner_acceptance_quiescence, stage,
|
||||
lambda **kw: calls.append(kw) or {"status": "blocked", "blockers": ["terminal_origin_claim_missing"]})
|
||||
instance.do_POST()
|
||||
assert signatures == [{"method": "POST", "path": instance.path}]
|
||||
assert calls == [{"revision": "a" * 40, "projects": {controller.SELF_UPGRADE_REPOSITORY: {"branch": "main"}}}]
|
||||
assert responses == [(200, {"status": "blocked", "blockers": ["terminal_origin_claim_missing"]})]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("stage", ["preflight", "quiesce"])
|
||||
@pytest.mark.parametrize("gate", ["untrusted", "invalid_signature", "source_mismatch", "push_pending", "wrong_head"])
|
||||
def test_acceptance_security_gate_refuses_before_executor(controller, monkeypatch, stage, gate):
|
||||
import runner_acceptance_quiescence
|
||||
instance, responses, _ = handler(controller, monkeypatch)
|
||||
instance.path = getattr(controller, "RUNNER_ACCEPTANCE_" + stage.upper() + "_PATH")
|
||||
monkeypatch.setattr(runner_acceptance_quiescence, stage, lambda **_: pytest.fail("no executor before source/auth gate"))
|
||||
if gate == "untrusted":
|
||||
monkeypatch.setattr(instance, "_trusted_client", lambda: False)
|
||||
elif gate == "invalid_signature":
|
||||
monkeypatch.setattr(controller, "_self_upgrade_signature_is_valid", lambda *_, **__: False)
|
||||
elif gate == "source_mismatch":
|
||||
monkeypatch.setattr(controller, "_require_controller_release", lambda: {"sourceRevision": "b" * 40, "sourceRepository": controller.SELF_UPGRADE_REPOSITORY})
|
||||
elif gate == "push_pending":
|
||||
monkeypatch.setattr(controller, "_self_upgrade_preflight", lambda _: {"status": "preflight_rejected"})
|
||||
else:
|
||||
monkeypatch.setattr(controller, "_is_current_branch_head", lambda *args: False)
|
||||
instance.do_POST()
|
||||
assert responses[0][0] in {403, 409}
|
||||
|
||||
|
||||
@pytest.mark.parametrize("field", ["containerId", "project", "revision", "daemon", "command", "credential", "path"])
|
||||
def test_acceptance_caller_cannot_choose_any_effect_identity(controller, monkeypatch, field):
|
||||
instance, responses, _ = handler(controller, monkeypatch, {"reason": "inspect fixture", field: "SECRET-CANARY"})
|
||||
instance.path = controller.RUNNER_ACCEPTANCE_QUIESCE_PATH
|
||||
instance.do_POST()
|
||||
assert responses == [(400, {"status": "invalid_request"})]
|
||||
assert "SECRET-CANARY" not in str(responses)
|
||||
|
||||
|
||||
def test_pending_acceptance_receipt_fences_legacy_maintenance(controller, monkeypatch):
|
||||
import runner_acceptance_quiescence
|
||||
monkeypatch.setattr(runner_acceptance_quiescence, "maintenance_fenced", lambda: True)
|
||||
monkeypatch.setattr(controller.RunnerFleetService, "automatic_cycle", lambda _: pytest.fail("no re-enable during partial receipt"))
|
||||
assert controller._runner_maintenance_cycle() == "acceptance_maintenance_owned"
|
||||
Reference in new issue
Block a user