manifests/hack/build_kfdef_specs.py

76 lines
2.3 KiB
Python

"""Generate KFDef YAML from kustomize packages.
This is a helper tool aimed at generating the RAW Yaml for KFDef specs into
kubeflow/manifests.
We use kustomize to make it easier to generate KFDef YAML files corresponding
to different KF versions but we don't want users to be exposed to that.
"""
import fire
import logging
import os
import subprocess
import tempfile
import yaml
RESOURCE_PREFIX = "kfdef.apps.kubeflow.org_v1_kfdef_"
class KFDefBuilder:
@staticmethod
def run():
root = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
kfdef_dir = os.path.join(root, "kfdef")
source_dir = os.path.join(root, "kfdef", "source")
# Walk over all versions
for base, dirs, _ in os.walk(source_dir):
for version in dirs:
package_dir = os.path.join(base, version)
# Create a temporary directory to write all the kustomize output to
temp_dir = tempfile.mkdtemp()
subprocess.check_call(["kustomize", "build", package_dir, "-o",
temp_dir])
for f in os.listdir(temp_dir):
new_name = f[len(RESOURCE_PREFIX):]
# To preserve the existing pattern for now master files are just
# named kfctl_?.Yaml
# whereas version files are named kfctl_?.version.yaml
# in subsequent PRs we might change that
if version == "master":
ext = ".yaml"
else:
ext = "." + version + ".yaml"
basename, _ = os.path.splitext(new_name)
new_name = basename + ext
new_file = os.path.join(kfdef_dir, new_name.replace("-", "_"))
logging.info(f"Processing file: {f} -> {new_file}")
with open(os.path.join(temp_dir, f)) as hf:
spec = yaml.load(hf)
# Remove the name. Kustomize requires a name but we don't want
# a name so that kfctl will fill it in based on the app directory
del spec["metadata"]["name"]
with open(new_file, "w") as hf:
yaml.safe_dump(spec, hf, default_flow_style = False)
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format=('%(levelname)s|%(asctime)s'
'|%(message)s|%(pathname)s|%(lineno)d|'),
datefmt='%Y-%m-%dT%H:%M:%S',
)
fire.Fire(KFDefBuilder)