#!/usr/bin/env -S uv run # /// script # requires-python = ">=3.11" # dependencies = ["pyyaml"] # /// """ Extract OpenAPI v3 schemas from CRD YAML on stdin and write JSON schema files to the output directory for use with kubeconform. Usage: kustomize build ... | ci/generate-crd-schemas.py """ import sys import json import os import yaml def main() -> int: output_dir = sys.argv[1] if len(sys.argv) > 1 else "ci/crd-schemas" count = 0 for doc in yaml.safe_load_all(sys.stdin): if not doc or doc.get("kind") != "CustomResourceDefinition": continue group = doc["spec"]["group"] kind = doc["spec"]["names"]["kind"] group_dir = os.path.join(output_dir, group) os.makedirs(group_dir, exist_ok=True) for ver in doc["spec"].get("versions", []): if not ver.get("served", True): continue schema = ver.get("schema", {}).get("openAPIV3Schema") if not schema: continue fname = os.path.join(group_dir, f"{kind.lower()}_{ver['name']}.json") with open(fname, "w") as f: json.dump({"$schema": "http://json-schema.org/schema#", **schema}, f, indent=2) f.write("\n") print(f" wrote {fname}", file=sys.stderr) count += 1 return count if __name__ == "__main__": print(main())