76 lines
2.3 KiB
Python
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)
|