aios/tools/hape/hape_libs/commands/customize_cmd.py (77 lines of code) (raw):

# -*- coding: utf-8 -*- import click import os import shutil import jinja2 from .common import * from hape_libs.utils.template import CustomUndefined class CustomizeContext(object): def __init__(self, conf_path, service_name_suffix, mode, has_vector_index, has_remote_nodes): self.conf_path = conf_path self.service_name_suffix = service_name_suffix self.mode = mode self.has_vector_index = has_vector_index self.has_remote_nodes = has_remote_nodes self.image = None def to_dict(self): return { "conf_path": self.conf_path, "service_name_suffix": self.service_name_suffix, "mode": self.mode, "has_vector_index": self.has_vector_index, "image": self.image, "has_remote_nodes": self.has_remote_nodes } _customize_ctxs = [ CustomizeContext("proc", "proc", "proc", False, False), CustomizeContext("default", "local", "docker", False, False), CustomizeContext("vector", "local", "docker", True, False), CustomizeContext("llm", "local", "docker", True, False), CustomizeContext("vector-proc", "vector-proc", "proc", True, False), CustomizeContext("remote", "remote", "docker", False, True), CustomizeContext("k8s", "k8s", "k8s", False, True) ] def get_render_files(ctx, template_dir): files = [] for dirpath, dirnames, filenames in os.walk(template_dir): for file_name in filenames: file_path = os.path.join(dirpath, file_name) relative_path = os.path.relpath(file_path, template_dir) files.append(relative_path) return files @click.command(short_help='Customize hape config by case') @click.option('-t', '--template', required=True, help="Template path of hape conf") @click.option('-i', '--image', required=True, help="Image to render hape conf") def customize(**kwargs): template_dir = kwargs['template'] if not os.path.isdir(template_dir): raise ValueError("Argument template must be a directory") env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_dir), undefined = CustomUndefined) k8s_include = [ "cluster_templates/appmaster/c2.yaml" ] for ctx in _customize_ctxs: ctx.image = kwargs['image'] vars = ctx.to_dict() target_dir = os.path.join(template_dir, "..", ctx.conf_path) if os.path.exists(target_dir): shutil.rmtree(target_dir) render_files = get_render_files(ctx, template_dir) print("Render files: {}".format(render_files)) print("Render variables: {}".format(vars)) for file in render_files: template = env.get_template(file) ## if render will get undefine in kubeconfig variable skip_render = False if file in k8s_include: if ctx.mode == "k8s": skip_render = True else: continue if not skip_render: rendered_template = template.render(**{"customize":vars}) else: rendered_template = open(os.path.join(template_dir, file)).read() target_file = os.path.join(target_dir, file) if not os.path.exists(os.path.dirname(target_file)): os.makedirs(os.path.dirname(target_file)) with open(target_file, "w") as f: f.write(rendered_template)