#!/usr/bin/env bash set -euo pipefail # T43: istiod가 런타임에 만드는 CRD/ConfigMap은 Helm 소유가 아니다 # (keep-policy + 소유 라벨 부재) # # 이 테스트는 read-only 검증이다 (manifests: N/A). # istio-system 네임스페이스에 이미 설치되어 있는 CRD/ConfigMap을 조회만 # 하며, 어떤 리소스도 생성/수정/삭제하지 않는다. 그래서 임시 네임스페이스나 # manifest.yaml, trap 기반 정리가 필요 없다 (생성한 것이 없으므로 지울 것도 # 없음). 그래도 계약에 따라 존재하지 않는 istio-vt-t43 네임스페이스에 대한 # 방어적 delete 한 줄만 남겨둔다 (--ignore-not-found 이므로 안전한 no-op). trap 'kubectl delete namespace istio-vt-t43 --wait=false --ignore-not-found >/dev/null 2>&1 || true' EXIT echo "=== istio.io CRD 개수 ===" kubectl get crd -o name | grep -c 'istio\.io' echo "=== 샘플 CRD 3종의 helm.sh/resource-policy 애너테이션 ===" for crd in gateways.networking.istio.io virtualservices.networking.istio.io destinationrules.networking.istio.io; do printf '%s: ' "$crd" kubectl get crd "$crd" -o jsonpath='{.metadata.annotations.helm\.sh/resource-policy}'; echo done echo "=== istiod가 런타임에 만드는 configmap 3종 존재 확인 ===" kubectl -n istio-system get cm istio-ca-root-cert istio-leader istio-namespace-controller-election -o name echo "=== istio-ca-root-cert 라벨/애너테이션 ===" kubectl -n istio-system get cm istio-ca-root-cert -o jsonpath='{.metadata.labels}{"\n"}{.metadata.annotations}{"\n"}' echo "=== istio-leader 의 meta.helm.sh/release-name 애너테이션 (비어있어야 함) ===" kubectl -n istio-system get cm istio-leader -o jsonpath='{.metadata.annotations.meta\.helm\.sh/release-name}'; echo '(empty expected)' echo "=== helm get manifest istiod 안에 해당 이름이 '리소스로' 등장하는지 (문자열 매치는 오탐 가능성 있어 grep -c 참고용) ===" helm -n istio-system get manifest istiod 2>/dev/null | grep -c 'istio-ca-root-cert\|istio-leader' || echo 0 echo "=== (보강) 위 grep 매치가 실제 'kind: ConfigMap' 리소스 객체인지 python으로 정밀 검사 ===" helm -n istio-system get manifest istiod 2>/dev/null > /tmp/istiod-manifest-full.yaml python3 - <<'PYEOF' import re with open('/tmp/istiod-manifest-full.yaml') as f: content = f.read() docs = content.split('\n---\n') found = [] for i, doc in enumerate(docs): if re.search(r'^kind:\s*ConfigMap', doc, re.MULTILINE): m = re.search(r'^metadata:\n(?:.*\n)*?\s*name:\s*(\S+)', doc, re.MULTILINE) name = m.group(1) if m else '?' if 'istio-ca-root-cert' in name or 'istio-leader' in name or 'istio-namespace-controller-election' in name: found.append((i, name)) print("ConfigMap 리소스 객체(kind:ConfigMap, metadata.name) 중 대상 이름 일치:", found) print("전체 렌더링된 문서 수:", len(docs)) PYEOF