#!/usr/bin/env python3 """Render the optional outbox with caller auth on/off, without cluster access.""" import subprocess import tempfile from pathlib import Path import yaml def render(*settings, succeeds=True): command = ["helm", "template", "flex-auth", "charts/flex-auth", "-f", "values/stage2-canary.yaml"] for setting in settings: command += ["--set", setting] result = subprocess.run(command, capture_output=True, text=True, check=False) if not succeeds: assert result.returncode != 0, "invalid multi-writer configuration was accepted" return [] assert result.returncode == 0, result.stderr return list(yaml.safe_load_all(result.stdout)) def deployment(documents): return next(d for d in documents if d["kind"] == "Deployment") base = render() assert not any(d["kind"] == "PersistentVolumeClaim" for d in base) assert "--outbox-dir" not in deployment(base)["spec"]["template"]["spec"]["containers"][0]["args"] enabled = ("outbox.enabled=true", "outbox.source=flex-auth.test") for auth in ((), ("callerAuth.mode=enforce", "callerAuth.binding=test=system:serviceaccount:test:test")): documents = render(*enabled, *auth) pod = deployment(documents)["spec"]["template"]["spec"] container = pod["containers"][0] args = container["args"] assert args[args.index("--outbox-dir") + 1] == "/var/lib/flex-auth/outbox" assert args[args.index("--emission-source") + 1] == "flex-auth.test" assert deployment(documents)["spec"]["strategy"]["type"] == "Recreate" pvc = next(d for d in documents if d["kind"] == "PersistentVolumeClaim") assert pvc["spec"]["accessModes"] == ["ReadWriteOnce"] assert pvc["spec"]["resources"]["requests"]["storage"] == "1Gi" assert any(v.get("persistentVolumeClaim", {}).get("claimName") == pvc["metadata"]["name"] for v in pod["volumes"]) assert any(v["name"] == "flex-auth-outbox" and not v.get("readOnly", False) for v in container["volumeMounts"]) if auth: assert any(v["name"] == "flex-auth-reviewer" for v in pod["volumes"]) existing = render(*enabled, "outbox.existingClaim=retained-outbox") assert not any(d["kind"] == "PersistentVolumeClaim" for d in existing) pod = deployment(existing)["spec"]["template"]["spec"] assert any(v.get("persistentVolumeClaim", {}).get("claimName") == "retained-outbox" for v in pod["volumes"]) render(*enabled, "replicaCount=2", succeeds=False) render("outbox.enabled=true", succeeds=False) print("optional outbox chart checks passed") # Delivery rendering binds an existing admitted credential mount and narrow peers. audit = ("auditDelivery.enabled=true", "auditDelivery.url=http://receiver.test:8000/v1/events", "auditDelivery.secretName=approved-test-sender", "auditDelivery.secretKey=sender-token", "auditDelivery.receiverNamespace=test-receiver", "auditDelivery.receiverPodName=test-audit", "auditDelivery.receiverPort=8000", "auditDelivery.dnsNamespace=test-dns", "auditDelivery.dnsPodLabel=test-dns") for auth in ((), ("callerAuth.mode=enforce", "callerAuth.binding=test=system:serviceaccount:test:test")): documents = render(*enabled, *audit, *auth) pod = deployment(documents)["spec"]["template"]["spec"] container = pod["containers"][0] args = container["args"] assert args[args.index("--audit-url")+1] == "http://receiver.test:8000/v1/events" assert args[args.index("--audit-token-file")+1] == "/var/run/secrets/flex-auth-audit/token" credential = next(v for v in pod["volumes"] if v["name"] == "flex-auth-audit")["secret"] assert credential == {"secretName":"approved-test-sender", "defaultMode":288, "items":[{"key":"sender-token", "path":"token"}]} assert next(v for v in container["volumeMounts"] if v["name"] == "flex-auth-audit")["readOnly"] is True assert not any(d["kind"] == "Secret" for d in documents) network = next(d for d in documents if d["kind"] == "NetworkPolicy")["spec"] receiver = next(rule for rule in network["egress"] if rule.get("ports") == [{"port":8000,"protocol":"TCP"}]) assert receiver["to"] == [{"namespaceSelector":{"matchLabels":{"kubernetes.io/metadata.name":"test-receiver"}}, "podSelector":{"matchLabels":{"app.kubernetes.io/name":"test-audit"}}}] dns = next(rule for rule in network["egress"] if len(rule.get("ports",[])) == 2 and rule["ports"][0]["port"] == 53) assert dns["to"][0]["namespaceSelector"]["matchLabels"]["kubernetes.io/metadata.name"] == "test-dns" assert dns["to"][0]["podSelector"]["matchLabels"]["k8s-app"] == "test-dns" render(*enabled, *audit, "args[0]=serve-readback", succeeds=False) render(*audit, succeeds=False) for invalid in ("auditDelivery.secretName=", "auditDelivery.secretKey=", "auditDelivery.receiverNamespace=", "auditDelivery.receiverPodName=", "auditDelivery.receiverPort=0", "auditDelivery.dnsNamespace=", "auditDelivery.dnsPodLabel=", "auditDelivery.url=http://user:pass@receiver/v1/events", "auditDelivery.url=http://receiver/v1/events?x=1", "auditDelivery.mountPath=relative"): render(*enabled, *audit, invalid, succeeds=False) for document in base: if document["kind"] == "Deployment": assert "--audit-url" not in document["spec"]["template"]["spec"]["containers"][0]["args"] print("inert scoped audit delivery chart checks passed") # YAML/JSON numeric values must never be truncated into invalid Kubernetes ports. # CLI --set integer paths alone do not cover float/bool/null decoder values. for port in (8000.5, 1.5, 65535.5, True, False, None, 0, -1, 65536, "8000.5", "named-port"): for encoding in ("yaml", "json"): command = ["helm", "template", "flex-auth", "charts/flex-auth", "-f", "values/stage2-canary.yaml"] for setting in (*enabled, *audit): if not setting.startswith("auditDelivery.receiverPort="): command += ["--set", setting] if encoding == "json": import json command += ["--set-json", "auditDelivery.receiverPort=" + json.dumps(port)] result = subprocess.run(command, capture_output=True, text=True, check=False) else: # Later -f overrides existing YAML; no --set receiverPort override. command = ["helm", "template", "flex-auth", "charts/flex-auth", "-f", "values/stage2-canary.yaml"] for setting in (*enabled, *audit): if not setting.startswith("auditDelivery.receiverPort="): command += ["--set", setting] with tempfile.TemporaryDirectory() as directory: overlay = Path(directory) / "port.yaml" overlay.write_text(yaml.safe_dump({"auditDelivery":{"receiverPort":port}})) command += ["-f", str(overlay)] result = subprocess.run(command, capture_output=True, text=True, check=False) assert result.returncode != 0, f"{encoding} accepted non-integer/out-of-range port {port!r}" assert "receiverPort" in result.stderr, result.stderr for port in (1, 8000, 65535): documents = render(*enabled, *audit, f"auditDelivery.receiverPort={port}") policy = next(d for d in documents if d["kind"] == "NetworkPolicy") scoped = next(rule for rule in policy["spec"]["egress"] if rule.get("to", [{}])[0].get("podSelector",{}).get("matchLabels",{}).get("app.kubernetes.io/name") == "test-audit") assert type(scoped["ports"][0]["port"]) is int and scoped["ports"][0]["port"] == port print("receiver port integer/type boundary checks passed")