#!/usr/bin/env python3 """Export live workloads for GitOps. Secrets and ConfigMaps are not exported.""" import json import subprocess import sys from pathlib import Path import yaml NAMESPACES = ("llm", "dify", "observability") KINDS = ("deploy", "svc", "externalsecret", "scaledobject") DROP_META = ( "uid", "resourceVersion", "generation", "creationTimestamp", "managedFields", "selfLink", ) DROP_ANN = { "kubectl.kubernetes.io/last-applied-configuration", "deployment.kubernetes.io/revision", "argocd.argoproj.io/tracking-id", } def clean(obj): meta = obj.setdefault("metadata", {}) for key in DROP_META: meta.pop(key, None) anns = meta.get("annotations") or {} for key in list(anns): if key in DROP_ANN: del anns[key] if anns: meta["annotations"] = anns else: meta.pop("annotations", None) obj.pop("status", None) template = obj.get("spec", {}).get("template", {}).get("metadata") if isinstance(template, dict): template.pop("creationTimestamp", None) return obj def main(): out = Path(sys.argv[1]) count = 0 for ns in NAMESPACES: for kind in KINDS: raw = subprocess.check_output(["kubectl", "-n", ns, "get", kind, "-o", "json"]) data = json.loads(raw) for item in data.get("items", []): name = item["metadata"]["name"] if name == "kube-root-ca.crt": continue item = clean(item) folder = out / ns folder.mkdir(parents=True, exist_ok=True) short = kind path = folder / f"{short}-{name}.yaml" path.write_text(yaml.safe_dump(item, sort_keys=False, allow_unicode=True)) count += 1 print(f"wrote {path}") print(f"count {count}") if __name__ == "__main__": main()