Merge remote-tracking branch 'origin/main' into codex/ai-automation-codebase-review-20260710

# Conflicts:
#	.gitea/workflows/cd.yaml
#	apps/api/tests/test_executor_network_policy_boundary.py
This commit is contained in:
ogt
2026-07-11 02:16:44 +08:00
2 changed files with 31 additions and 47 deletions

View File

@@ -2191,61 +2191,42 @@ jobs:
# mutates nested selectors. The checkout is depth=1, so snapshot live
# policy truth and remove server-only metadata before any mutation.
NETWORK_POLICY_ROLLBACK_FILE="/tmp/awoooi-network-policy-rollback.json"
NETWORK_POLICY_LIVE_RAW_FILE="/tmp/awoooi-network-policy-live.json"
NETWORK_POLICY_CHANGE_ACTIVE="0"
BROKER_POLICY_NAME="allow-ansible-executor-broker-ssh-egress"
BROKER_POLICY_EXISTED=$(ssh $SSH_OPTS "wooo@${{ env.K8S_SSH_HOST }}" \
"KUBECTL='sudo kubectl --kubeconfig=/etc/rancher/k3s/k3s.yaml --server=${{ env.K8S_API_SERVER }}'; if \$KUBECTL get networkpolicy '$BROKER_POLICY_NAME' -n awoooi-prod >/dev/null 2>&1; then printf 1; else printf 0; fi")
NETWORK_POLICY_NAMES=(
default-deny-all
allow-nginx-ingress
allow-required-egress
deny-legacy-access
)
if [ "$BROKER_POLICY_EXISTED" = "1" ]; then
NETWORK_POLICY_NAMES+=("$BROKER_POLICY_NAME")
fi
ssh $SSH_OPTS "wooo@${{ env.K8S_SSH_HOST }}" \
"KUBECTL='sudo kubectl --kubeconfig=/etc/rancher/k3s/k3s.yaml --server=${{ env.K8S_API_SERVER }}'; \$KUBECTL get networkpolicy -n awoooi-prod -o json" \
> "$NETWORK_POLICY_LIVE_RAW_FILE"
python3 - "$NETWORK_POLICY_LIVE_RAW_FILE" \
"$NETWORK_POLICY_ROLLBACK_FILE" <<'PY'
"KUBECTL='sudo kubectl --kubeconfig=/etc/rancher/k3s/k3s.yaml --server=${{ env.K8S_API_SERVER }}'; \$KUBECTL get networkpolicy ${NETWORK_POLICY_NAMES[*]} -n awoooi-prod -o json" \
| python3 -c '
import json
import sys
from pathlib import Path
source_path = Path(sys.argv[1])
rollback_path = Path(sys.argv[2])
payload = json.loads(source_path.read_text(encoding="utf-8"))
items = payload.get("items") or []
if not items:
raise SystemExit("live NetworkPolicy snapshot is empty")
sanitized = []
for item in items:
metadata = item.get("metadata") or {}
clean_metadata = {
"name": metadata["name"],
"namespace": metadata.get("namespace", "awoooi-prod"),
source = json.load(sys.stdin)
items = [
{
"apiVersion": item["apiVersion"],
"kind": item["kind"],
"metadata": {
"name": item["metadata"]["name"],
"namespace": item["metadata"]["namespace"],
},
"spec": item["spec"],
}
if metadata.get("labels"):
clean_metadata["labels"] = metadata["labels"]
annotations = dict(metadata.get("annotations") or {})
annotations.pop(
"kubectl.kubernetes.io/last-applied-configuration",
None,
)
if annotations:
clean_metadata["annotations"] = annotations
sanitized.append(
{
"apiVersion": item["apiVersion"],
"kind": item["kind"],
"metadata": clean_metadata,
"spec": item["spec"],
}
)
rollback_path.write_text(
json.dumps(
{"apiVersion": "v1", "kind": "List", "items": sanitized},
separators=(",", ":"),
),
encoding="utf-8",
)
PY
rm -f "$NETWORK_POLICY_LIVE_RAW_FILE"
for item in source["items"]
]
json.dump({"apiVersion": "v1", "kind": "List", "items": items}, sys.stdout)
' \
> "$NETWORK_POLICY_ROLLBACK_FILE"
test -s "$NETWORK_POLICY_ROLLBACK_FILE"
restore_network_policy() {
echo "⏪ restoring previous AWOOOI NetworkPolicy contract"
if cat "$NETWORK_POLICY_ROLLBACK_FILE" | \

View File

@@ -70,10 +70,13 @@ def test_cd_applies_rolls_back_and_verifies_network_boundary() -> None:
assert "02-network-policy.yaml" in workflow
assert "NETWORK_POLICY_ROLLBACK_FILE" in workflow
assert "get networkpolicy -n awoooi-prod -o json" in workflow
assert "get networkpolicy ${NETWORK_POLICY_NAMES[*]}" in workflow
assert "rollback_network_policy_on_exit" in workflow
assert "git show HEAD^:k8s/awoooi-prod/02-network-policy.yaml" not in workflow
assert "BROKER_POLICY_EXISTED" in workflow
assert "NETWORK_POLICY_NAMES" in workflow
assert "item[\"metadata\"][\"name\"]" in workflow
assert "item[\"spec\"]" in workflow
assert "$KUBECTL delete networkpolicy '$BROKER_POLICY_NAME'" in workflow
assert "auth_can_i()" in workflow
assert "API_CAN_PATCH=$(auth_can_i" in workflow