50 lines
1.4 KiB
Python
Executable File
50 lines
1.4 KiB
Python
Executable File
#!/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 <output-dir>
|
|
"""
|
|
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())
|