diff --git a/docs/dev/designs/multiple_templates.md b/docs/dev/designs/multiple_templates.md new file mode 100644 index 000000000..676fac5f9 --- /dev/null +++ b/docs/dev/designs/multiple_templates.md @@ -0,0 +1,25 @@ +# Ability to set separate versions of templates for BG domain parts + +## Problem statement + +EnvGene needs to be able to use different template artifacts for rendering BGD +namespaces: common, peer, origin. + +## Proposed solutions + +### A + +Render all 3 templates and replace bgd namespaces in common template with +namespaces from 2 templates + +### B + +Render template/environment descriptors for all template artifact. + +bg_domain object is now rendered before namespaces. + +During namespaces rendering check bg_domain and if namespace is origin or peer, +use namespace template and template_override value from respective template/environment descriptor. + +During processing paramsets check namespace role and use paramsets from respective +templates. diff --git a/python/envgene/envgenehelper/business_helper.py b/python/envgene/envgenehelper/business_helper.py index 5902fed6f..04c9f0474 100644 --- a/python/envgene/envgenehelper/business_helper.py +++ b/python/envgene/envgenehelper/business_helper.py @@ -1,8 +1,10 @@ from dataclasses import dataclass, field +from enum import Enum import re from os import getenv from pathlib import Path from typing import overload +from functools import cache from ruyaml import CommentedMap @@ -360,15 +362,35 @@ def find_cloud_name_from_passport(source_env_dir, all_instances_dir): else: return "" +class NamespaceRole(Enum): + COMMON = 1 + ORIGIN = 2 + PEER = 3 + +def get_namespace_role(ns_name: str, bgd_object: dict | None = None) -> NamespaceRole: + if not bgd_object: + bgd_object = get_bgd_object() + if not bgd_object: + return NamespaceRole.COMMON + if bgd_object['originNamespace']['name'] == ns_name: + return NamespaceRole.ORIGIN + if bgd_object['peerNamespace']['name'] == ns_name: + return NamespaceRole.PEER + return NamespaceRole.COMMON + @dataclass class NamespaceFile: path: Path name: str = field(init=False) + postfix: str = field(init=False) definition_path: Path = field(init=False) + role: NamespaceRole = field(init=False) def __post_init__(self): self.definition_path = self.path.joinpath('namespace.yml') self.name = openYaml(self.definition_path)['name'] + self.postfix = self.path.name + self.role = get_namespace_role(self.name) def get_namespaces_path(env_dir: Path | None = None) -> Path: env_dir = env_dir or get_current_env_dir_from_env_vars() @@ -391,6 +413,7 @@ def get_bgd_path() -> Path: logger.debug(bgd_path) return bgd_path +@cache def get_bgd_object() -> CommentedMap: bgd_path = get_bgd_path() bgd_object = openYaml(bgd_path, allow_default=True) diff --git a/scripts/build_env/build_env.py b/scripts/build_env/build_env.py index 9caae2f1d..aaa01a016 100644 --- a/scripts/build_env/build_env.py +++ b/scripts/build_env/build_env.py @@ -10,6 +10,7 @@ from schema_validation import checkEnvSpecificParametersBySchema from cloud_passport import process_cloud_passport from pathlib import Path +from envgenehelper.business_helper import get_namespace_role, get_namespaces # const GENERATED_HEADER = "The contents of this file is generated from template artifact: %s.\nContents will be overwritten by next generation.\nPlease modify this contents only for development purposes or as workaround." @@ -460,6 +461,30 @@ def getTemplateNameFromNamespacePath(namespacePath): path = pathlib.Path(namespacePath) return path.parent.name +def create_role_specific_paramset_map(base_paramset_map: dict, parameters_dir: str, role: str) -> dict: + role_dir_suffix = f'from_template_{role}_ns' + role_specific_dir = os.path.join(parameters_dir, role_dir_suffix) + + role_paramset_map = createParamsetsMap(role_specific_dir) + + if not role_paramset_map: + return base_paramset_map + + merged_map = copy.deepcopy(base_paramset_map) + + for paramset_name, entries in role_paramset_map.items(): + if paramset_name not in merged_map: + merged_map[paramset_name] = entries + continue + # Keep paramsets from_instance and replace template paramsets + filtered_base_entries = [ + e for e in merged_map[paramset_name] + if 'from_template' not in e['filePath'] or role_dir_suffix in e['filePath'] + ] + merged_map[paramset_name] = filtered_base_entries + entries + + logger.info(f"Created {role}-specific paramset map with {len(role_paramset_map)} role-specific paramsets") + return merged_map def build_env(env_name, env_instances_dir, parameters_dir, env_template_dir, resource_profiles_dir, env_specific_resource_profile_map, all_instances_dir, render_context): @@ -482,7 +507,7 @@ def build_env(env_name, env_instances_dir, parameters_dir, env_template_dir, res # pathes tenantTemplatePath = env_dir + "/tenant.yml" cloudTemlatePath = env_dir + "/cloud.yml" - namespaceTemplates = find_namespaces(env_dir) + namespaces = get_namespaces() # env specific parameters map - will be filled with env specific parameters during template processing env_specific_parameters_map = {} env_specific_parameters_map["namespaces"] = {} @@ -522,21 +547,34 @@ def build_env(env_name, env_instances_dir, parameters_dir, env_template_dir, res # process namespaces template_namespace_names = [] + + # Create role-specific paramset maps if needed + origin_paramset_map = create_role_specific_paramset_map(paramset_map, parameters_dir, 'origin') + peer_paramset_map = create_role_specific_paramset_map(paramset_map, parameters_dir, 'peer') + # iterate through namespace definitions and create namespace parameters - for templatePath in namespaceTemplates: - logger.info(f"Processing namespace: {templatePath}") - templateName = getTemplateNameFromNamespacePath(templatePath) - template_namespace_names.append(templateName) - initParametersStructure(env_specific_parameters_map["namespaces"], templateName) + for ns in namespaces: + logger.info(f"Processing namespace: {ns.definition_path}") + template_namespace_names.append(ns.postfix) + initParametersStructure(env_specific_parameters_map['namespaces'], ns.postfix) + + if ns.role == NamespaceRole.ORIGIN: + ns_paramset_map = origin_paramset_map + elif ns.role == NamespaceRole.PEER: + ns_paramset_map = peer_paramset_map + else: + ns_paramset_map = paramset_map + processTemplate( - templatePath, - templateName, + ns.definition_path, + ns.postfix, env_instances_dir, namespace_schema, - paramset_map, - env_specific_parameters_map["namespaces"][templateName], + ns_paramset_map, + env_specific_parameters_map['namespaces'][ns.postfix], resource_profiles_map=needed_resource_profiles_map, - header_text=generated_header_text) + header_text=generated_header_text, + ) logger.info(f"EnvSpecific parameters are: \n{dump_as_yaml_format(env_specific_parameters_map)}") checkEnvSpecificParametersBySchema(env_dir, env_specific_parameters_map, template_namespace_names) diff --git a/scripts/build_env/env_template/process_env_template.py b/scripts/build_env/env_template/process_env_template.py index e9924f727..e1238c11d 100644 --- a/scripts/build_env/env_template/process_env_template.py +++ b/scripts/build_env/env_template/process_env_template.py @@ -3,24 +3,26 @@ import tempfile from pathlib import Path +from pkg_resources import functools + from artifact_searcher import artifact from artifact_searcher.utils.models import FileExtension, Application, Credentials, Registry from envgenehelper import getEnvDefinition, fetch_cred_value from envgenehelper import openYaml, find_all_yaml_files_by_stem, getenv_with_error, logger from envgenehelper import unpack_archive, get_cred_config -artifact_dest = f"{tempfile.gettempdir()}/artifact.zip" build_env_path = "/build_env" +ORIGIN_NS_TEMPLATE_PATH = "/build_env_origin_ns" +PEER_NS_TEMPLATE_PATH = "/build_env_peer_ns" -def parse_artifact_appver(env_definition: dict) -> [str, str]: - artifact_appver = env_definition['envTemplate'].get('artifact', '') +def parse_artifact_appver(artifact_appver: str) -> list[str]: logger.info(f"Environment template artifact version: {artifact_appver}") return artifact_appver.split(':') - -def load_artifact_definition(name: str) -> Application: - base_dir = getenv_with_error('CI_PROJECT_DIR') +# TODO not actually safe, do something else +@functools.lru_cache(maxsize=2, typed=False) +def load_artifact_definition(name: str, base_dir: str) -> Application: path_pattern = os.path.join(base_dir, 'configuration', 'artifact_definitions', name) path = next(iter(find_all_yaml_files_by_stem(path_pattern)), None) if not path: @@ -28,8 +30,7 @@ def load_artifact_definition(name: str) -> Application: return Application.model_validate(openYaml(path)) -def get_registry_creds(registry: Registry) -> Credentials: - cred_config = get_cred_config() +def get_registry_creds(registry: Registry, cred_config: dict) -> Credentials: cred_id = registry.credentials_id if cred_id: username = cred_config[cred_id]['data'].get('username') @@ -54,10 +55,10 @@ def extract_snapshot_version(url: str, snapshot_version: str) -> str: # logic downloading template by artifact definition -def download_artifact_new_logic(env_definition: dict) -> str: - app_name, app_version = parse_artifact_appver(env_definition) - app_def = load_artifact_definition(app_name) - cred = get_registry_creds(app_def.registry) +def download_artifact_new_logic(artifact_appver: str, target_path: str, base_dir: str, cred_config: dict) -> str: + app_name, app_version = parse_artifact_appver(artifact_appver) + app_def = load_artifact_definition(app_name, base_dir) + cred = get_registry_creds(app_def.registry, cred_config) template_url = None resolved_version = app_version @@ -89,13 +90,24 @@ def download_artifact_new_logic(env_definition: dict) -> str: if not template_url: raise ValueError(f"artifact not found group_id={group_id}, artifact_id={artifact_id}, version={version}") logger.info(f"Environment template url has been resolved: {template_url}") - artifact.download(template_url, artifact_dest, cred) - unpack_archive(artifact_dest, build_env_path) + + # Use a unique temporary file for each download to avoid conflicts + with tempfile.NamedTemporaryFile(suffix='.zip', delete=False) as tmp_file: + artifact_dest = tmp_file.name + + try: + artifact.download(template_url, artifact_dest, cred) + unpack_archive(artifact_dest, target_path) + finally: + # Clean up the temporary file + if os.path.exists(artifact_dest): + os.unlink(artifact_dest) + return resolved_version # logic downloading template by exact coordinates and repo, deprecated -def download_artifact_old_logic(env_definition: dict, project_dir: str) -> str: +def download_artifact_old_logic(env_definition: dict, project_dir: str, cred_config: dict) -> str: template_artifact = env_definition['envTemplate']['templateArtifact'] artifact_info = template_artifact['artifact'] @@ -111,7 +123,6 @@ def download_artifact_old_logic(env_definition: dict, project_dir: str) -> str: repo_url = registry.get(repo_type) dd_repo_url = registry.get(dd_repo_type) - cred_config = get_cred_config() repository_username = fetch_cred_value(registry.get("username"), cred_config) repository_password = fetch_cred_value(registry.get("password"), cred_config) cred = Credentials(username=repository_username, password=repository_password) @@ -137,21 +148,80 @@ def download_artifact_old_logic(env_definition: dict, project_dir: str) -> str: resolved_version = extract_snapshot_version(template_url, dd_version) logger.info(f"Environment template url has been resolved: {template_url}") - artifact.download(template_url, artifact_dest, cred) - unpack_archive(artifact_dest, build_env_path) + + # Use a unique temporary file for each download to avoid conflicts + with tempfile.NamedTemporaryFile(suffix='.zip', delete=False) as tmp_file: + artifact_dest = tmp_file.name + + try: + artifact.download(template_url, artifact_dest, cred) + unpack_archive(artifact_dest, build_env_path) + finally: + # Clean up the temporary file + if os.path.exists(artifact_dest): + os.unlink(artifact_dest) + return resolved_version -def process_env_template() -> str: +async def download_artifact_new_logic_async(artifact_appver: str, target_path: str, base_dir: str, cred_config: dict) -> str: + """Async wrapper for download_artifact_new_logic to enable concurrent downloads""" + return await asyncio.to_thread(download_artifact_new_logic, artifact_appver, target_path, base_dir, cred_config) + + +async def download_artifact_old_logic_async(env_definition: dict, project_dir: str, cred_config: dict) -> str: + """Async wrapper for download_artifact_old_logic to enable concurrent downloads""" + return await asyncio.to_thread(download_artifact_old_logic, env_definition, project_dir, cred_config) + + +def process_env_template() -> tuple[str, str | None, str | None]: project_dir = getenv_with_error("CI_PROJECT_DIR") cluster = getenv_with_error("CLUSTER_NAME") environment = getenv_with_error("ENVIRONMENT_NAME") env_dir = Path(f"{project_dir}/environments/{cluster}/{environment}") env_definition = getEnvDefinition(env_dir) + env_template = env_definition.get('envTemplate', {}) - if 'artifact' in env_definition.get('envTemplate', {}): - logger.info("Use template downloading new logic") - return download_artifact_new_logic(env_definition) - else: - logger.info("Use template downloading old logic") - return download_artifact_old_logic(env_definition, project_dir) + cred_config = get_cred_config() + + bg_artifacts_key = 'bgNsArtifacts' + bg_artifacts = env_template.get(bg_artifacts_key, {}) + + async def download_all_templates(): + if 'artifact' in env_template: + logger.info("Use template downloading new logic") + main_task = download_artifact_new_logic_async( + env_template.get('artifact', ''), + build_env_path, + project_dir, + cred_config + ) + else: + logger.info("Use template downloading old logic") + main_task = download_artifact_old_logic_async(env_definition, project_dir, cred_config) + + tasks = [main_task] + task_labels = ['main'] + + bg_artifact_configs = [ + ('origin', ORIGIN_NS_TEMPLATE_PATH), + ('peer', PEER_NS_TEMPLATE_PATH), + ] + + for artifact_key, target_path in bg_artifact_configs: + artifact_appver = bg_artifacts.get(artifact_key) + if artifact_appver: + logger.info(f'Try to download template for appver: {artifact_appver}, from {bg_artifacts_key}.{artifact_key}') + tasks.append(download_artifact_new_logic_async(artifact_appver, target_path, project_dir, cred_config)) + task_labels.append(artifact_key) + + results = await asyncio.gather(*tasks) + + result_map = dict(zip(task_labels, results)) + return ( + result_map['main'], + result_map.get('origin', None), + result_map.get('peer', None) + ) + + return asyncio.run(download_all_templates()) diff --git a/scripts/build_env/main.py b/scripts/build_env/main.py index e2867c5a7..ba791c4b5 100644 --- a/scripts/build_env/main.py +++ b/scripts/build_env/main.py @@ -20,7 +20,8 @@ def prepare_folders_for_rendering(env_name, cluster_name, source_env_dir, templates_dir, render_dir, - render_parameters_dir, render_profiles_dir, output_dir): + render_parameters_dir, render_profiles_dir, output_dir, + origin_ns_templates_dir=None, peer_ns_templates_dir=None): # clearing folders delete_dir(render_dir) delete_dir(render_parameters_dir) @@ -40,6 +41,13 @@ def prepare_folders_for_rendering(env_name, cluster_name, source_env_dir, templa copy_path(f'{source_env_dir}/{INVENTORY_DIR_NAME}/parameters', f'{render_parameters_dir}/from_instance') # copying all template resource profiles copy_path(f'{templates_dir}/resource_profiles', render_profiles_dir) + + def copy_additional_template_parameters(source, postfix): + copy_path(f'{source}/parameters', f'{render_parameters_dir}/from_template_{postfix}') + + copy_additional_template_parameters(origin_ns_templates_dir, 'origin_ns') + copy_additional_template_parameters(peer_ns_templates_dir, 'peer_ns') + return render_env_dir @@ -98,7 +106,7 @@ def handle_template_override(render_dir): def build_environment(env_name, cluster_name, templates_dir, source_env_dir, all_instances_dir, output_dir, - g_template_version, work_dir): + g_template_version, work_dir, origin_ns_templates_dir=None, peer_ns_templates_dir=None): # defining folders that will be used during generation render_dir = getAbsPath('tmp/render') render_parameters_dir = getAbsPath('tmp/parameters_templates') @@ -111,7 +119,8 @@ def build_environment(env_name, cluster_name, templates_dir, source_env_dir, all # preparing folders for generation render_env_dir = prepare_folders_for_rendering(env_name, cluster_name, source_env_dir, templates_dir, render_dir, - render_parameters_dir, render_profiles_dir, output_dir) + render_parameters_dir, render_profiles_dir, output_dir, + origin_ns_templates_dir, peer_ns_templates_dir) pre_process_env_before_rendering(render_env_dir, source_env_dir, all_instances_dir) # get deployer parameters cmdb_url, _, _ = get_deployer_config(f"{cluster_name}/{env_name}", work_dir, all_instances_dir, None, None, False) @@ -163,6 +172,8 @@ def build_environment(env_name, cluster_name, templates_dir, source_env_dir, all envvars["current_env"] = current_env # Object for Jinja2 templates that need current_env.environmentName envvars["cluster_name"] = cluster_name envvars["templates_dir"] = templates_dir + envvars["origin_ns_templates_dir"] = origin_ns_templates_dir + envvars["peer_ns_templates_dir"] = peer_ns_templates_dir envvars["env_instances_dir"] = getAbsPath(render_env_dir) envvars["render_dir"] = getAbsPath(render_dir) envvars["render_parameters_dir"] = getAbsPath(render_parameters_dir) @@ -290,10 +301,12 @@ def validate_appregdefs(render_dir, env_name): def render_environment(env_name, cluster_name, templates_dir, all_instances_dir, output_dir, g_template_version, - work_dir): + work_dir, origin_ns_templates_dir=None, peer_ns_templates_dir=None): logger.info(f'env: {env_name}') logger.info(f'cluster_name: {cluster_name}') logger.info(f'templates_dir: {templates_dir}') + logger.info(f'origin_ns_templates_dir: {origin_ns_templates_dir}') + logger.info(f'peer_ns_templates_dir: {peer_ns_templates_dir}') logger.info(f'instances_dir: {all_instances_dir}') logger.info(f'output_dir: {output_dir}') logger.info(f'template_version: {g_template_version}') @@ -307,7 +320,7 @@ def render_environment(env_name, cluster_name, templates_dir, all_instances_dir, logger.info(f"Environment {env_name} directory is {env_dir}") # build env resulting_env_dir = build_environment(env_name, cluster_name, templates_dir, env_dir, all_instances_dir, output_dir, - g_template_version, work_dir) + g_template_version, work_dir, origin_ns_templates_dir, peer_ns_templates_dir) # create credentials create_credentials(resulting_env_dir, env_dir, all_instances_dir) # update versions @@ -319,13 +332,16 @@ def render_environment(env_name, cluster_name, templates_dir, all_instances_dir, cluster = getenv_with_error("CLUSTER_NAME") environment = getenv_with_error("ENVIRONMENT_NAME") base_dir = getenv_with_error('CI_PROJECT_DIR') - template_version = process_env_template() + # tv - template version + common_tv, origin_ns_tv, peer_ns_tv = process_env_template() g_templates_dir = "/build_env/templates" + g_origin_ns_templates_dir = "/build_env_origin_ns/templates" if origin_ns_tv else None + g_peer_ns_templates_dir = "/build_env_peer_ns/templates" if peer_ns_tv else None g_all_instances_dir = f"{base_dir}/environments" g_output_dir = f"{base_dir}/environments" g_work_dir = get_parent_dir_for_dir(g_all_instances_dir) decrypt_all_cred_files_for_env() render_environment(environment, cluster, g_templates_dir, g_all_instances_dir, g_output_dir, - template_version, g_work_dir) + common_tv, g_work_dir, g_origin_ns_templates_dir, g_peer_ns_templates_dir) encrypt_all_cred_files_for_env() diff --git a/scripts/build_env/render_config_env.py b/scripts/build_env/render_config_env.py index 6dcdfd9ee..5a71c9975 100644 --- a/scripts/build_env/render_config_env.py +++ b/scripts/build_env/render_config_env.py @@ -9,7 +9,7 @@ from deepmerge import always_merger from envgenehelper import logger, openYaml, readYaml, writeYamlToFile, openFileAsString, copy_path, dumpYamlToStr, \ create_yaml_processor, find_all_yaml_files_by_stem, ensure_directory, dump_as_yaml_format -from envgenehelper.business_helper import get_bgd_object, get_namespaces +from envgenehelper.business_helper import get_bgd_object, get_namespaces, get_namespace_role from envgenehelper.validation import ensure_valid_fields, ensure_required_keys from jinja2 import Template, TemplateError from pydantic import BaseModel, Field @@ -21,18 +21,21 @@ yml = create_yaml_processor() - class Context(BaseModel): env: Optional[str] = '' render_dir: Optional[str] = '' cloud_passport: OrderedDict = Field(default_factory=OrderedDict) templates_dir: Optional[Path] = None + origin_ns_templates_dir: Optional[Path] = None + peer_ns_templates_dir: Optional[Path] = None output_dir: Optional[str] = '' cluster_name: Optional[str] = '' env_definition: OrderedDict = Field(default_factory=OrderedDict) current_env: OrderedDict = Field(default_factory=OrderedDict) current_env_dir: Optional[str] = '' current_env_template: OrderedDict = Field(default_factory=OrderedDict) + origin_ns_env_template: OrderedDict = Field(default_factory=OrderedDict) + peer_ns_env_template: OrderedDict = Field(default_factory=OrderedDict) tenant: Optional[str] = '' env_template: OrderedDict = Field(default_factory=OrderedDict) env_instances_dir: Optional[str] = '' @@ -101,15 +104,24 @@ def generate_config(self): logger.info(f"config = {config}") self.ctx.config = config - def set_env_template(self): - env_template_path_stem = f'{self.ctx.templates_dir}/env_templates/{self.ctx.current_env["env_template"]}' - env_template_path = next(iter(find_all_yaml_files_by_stem(env_template_path_stem)), None) - if not env_template_path: - raise ValueError(f'Template descriptor was not found in {env_template_path_stem}') + def _load_template_descriptor(self, templates_dir: Path | None, target_attr: str): + stem = f'{templates_dir}/env_templates/{self.ctx.current_env["env_template"]}' + path = next(iter(find_all_yaml_files_by_stem(stem)), None) + if not path: + raise ValueError(f'Template descriptor was not found in {stem}') + + template = openYaml(filePath=path, safe_load=True) + logger.info(f"{target_attr} = {template}") + setattr(self.ctx, target_attr, template) + + def set_env_templates(self): + # main template (required) + self._load_template_descriptor(self.ctx.templates_dir, 'current_env_template') - env_template = openYaml(filePath=env_template_path, safe_load=True) - logger.info(f"env_template = {env_template}") - self.ctx.current_env_template = env_template + if self.ctx.origin_ns_templates_dir: + self._load_template_descriptor(self.ctx.origin_ns_templates_dir, 'origin_ns_env_template') + if self.ctx.peer_ns_templates_dir: + self._load_template_descriptor(self.ctx.peer_ns_templates_dir, 'peer_ns_env_template') def validate_applications(self): applications = self.ctx.sd_config.get("applications", []) @@ -254,20 +266,68 @@ def generate_bgd_file(self): return self.render_from_file_to_file(Template(template).render(self.ctx.as_dict()), target_path) + def _get_bgd_object_for_namespace_routing(self) -> dict: + bg_domain_template = self.ctx.current_env_template.get("bg_domain") + if not bg_domain_template: + return {} + + try: + bg_domain_path = Template(bg_domain_template).render(self.ctx.as_dict()) + bgd_object = self.render_from_file_to_obj(bg_domain_path) + logger.info(f"Loaded BG domain for namespace routing: {bgd_object}") + return bgd_object + except Exception as e: + logger.warning(f"Failed to load BG domain for namespace routing: {e}") + return {} + + def _resolve_ns_template_path(self, ns: dict, templates_dir: Path, context: dict) -> str: + ns_template_path = Template(ns["template_path"]).render(context) + if templates_dir and str(self.ctx.templates_dir) in ns_template_path: + ns_template_path = ns_template_path.replace(str(self.ctx.templates_dir), str(templates_dir)) + return ns_template_path + + def _write_namespace(self, ns: dict, ns_template_path: str, rendered_ns: dict, templates_dir: Path): + ns_template_name = self.generate_ns_postfix(ns, ns_template_path) + logger.info(f"Generate Namespace yaml for {ns_template_name} from {templates_dir}") + + ns_dir = f'{self.ctx.current_env_dir}/Namespaces/{ns_template_name}' + writeYamlToFile(f'{ns_dir}/namespace.yml', rendered_ns) + self.generate_override_template(ns.get("template_override"), Path(f'{ns_dir}/namespace.yml_override'), + ns_template_name) + + def _get_bg_template_for_role(self, role: str) -> tuple[dict, Path | None]: + """Return (env_template, templates_dir) if BG template handles this role.""" + if role == 'origin' and self.ctx.origin_ns_templates_dir: + return self.ctx.origin_ns_env_template, self.ctx.origin_ns_templates_dir + if role == 'peer' and self.ctx.peer_ns_templates_dir: + return self.ctx.peer_ns_env_template, self.ctx.peer_ns_templates_dir + return self.ctx.current_env_template, self.ctx.templates_dir + def generate_namespace_file(self): context = self.ctx.as_dict() - namespaces = self.ctx.current_env_template["namespaces"] - for ns in namespaces: - ns_template_path = Template(ns["template_path"]).render(context) - ns_template_name = self.generate_ns_postfix(ns, ns_template_path) - logger.info(f"Generate Namespace yaml for {ns_template_name}") - current_env_dir = self.ctx.current_env_dir - ns_dir = f'{current_env_dir}/Namespaces/{ns_template_name}' - namespace_file = f'{ns_dir}/namespace.yml' - self.render_from_file_to_file(ns_template_path, namespace_file) - - self.generate_override_template(ns.get("template_override"), Path(f'{ns_dir}/namespace.yml_override'), - ns_template_name) + bgd_object = self._get_bgd_object_for_namespace_routing() + rendered_roles = set() + + for ns in self.ctx.current_env_template.get("namespaces", []): + ns_template_path = self._resolve_ns_template_path(ns, self.ctx.templates_dir, context) + rendered_ns = self.render_from_file_to_obj(ns_template_path) + ns_name = rendered_ns.get("name", "") + role = get_namespace_role(ns_name, bgd_object) + + bg_template = self._get_bg_template_for_role(role) + if bg_template: + if role in rendered_roles: + continue + # Render all namespaces of this role from BG template + env_template, templates_dir = bg_template + for bg_ns in env_template.get("namespaces", []): + bg_path = self._resolve_ns_template_path(bg_ns, templates_dir, context) + bg_rendered = self.render_from_file_to_obj(bg_path) + if get_namespace_role(bg_rendered.get("name", ""), bgd_object) == role: + self._write_namespace(bg_ns, bg_path, bg_rendered, templates_dir) + rendered_roles.add(role) + else: + self._write_namespace(ns, ns_template_path, rendered_ns, self.ctx.templates_dir) def calculate_cloud_name(self) -> str: inv = self.ctx.env_definition["inventory"] @@ -462,7 +522,7 @@ def render_config_env(self, env_name: str, extra_env: dict): current_env_dir = f'{self.ctx.render_dir}/{self.ctx.env}' self.ctx.current_env_dir = current_env_dir - self.set_env_template() + self.set_env_templates() self.generate_solution_structure() self.generate_tenant_file() diff --git a/scripts/build_env/tests/env-build/test_render_envs.py b/scripts/build_env/tests/env-build/test_render_envs.py index 251ef9945..93e418986 100644 --- a/scripts/build_env/tests/env-build/test_render_envs.py +++ b/scripts/build_env/tests/env-build/test_render_envs.py @@ -17,6 +17,7 @@ ("cluster01", "env04", "test-template-2"), ("bgd-cluster","bgd-env","bgd"), ("cluster03", "rpo-replacement-mode", "simple"), + ("bgd-cluster", "bgd-ns-artifacts-env", "bgd"), ] base_dir = Path(__file__).resolve().parents[4] @@ -37,7 +38,22 @@ def change_test_dir(monkeypatch): def test_render_envs(cluster_name, env_name, version): environ['CI_PROJECT_DIR'] = g_base_dir environ['FULL_ENV_NAME'] = cluster_name + '/' + env_name - render_environment(env_name, cluster_name, g_templates_dir, g_inventory_dir, g_output_dir, version, g_base_dir) + origin_ns_templates_dir = None + peer_ns_templates_dir = None + if env_name == "bgd-ns-artifacts-env": # for testing multiple artifact case + origin_ns_templates_dir = str((base_dir / "test_data/test_templates").resolve()) + peer_ns_templates_dir = str((base_dir / "test_data/test_templates").resolve()) + render_environment( + env_name, + cluster_name, + g_templates_dir, + g_inventory_dir, + g_output_dir, + version, + g_base_dir, + origin_ns_templates_dir, + peer_ns_templates_dir, + ) source_dir = f"{g_inventory_dir}/{cluster_name}/{env_name}" generated_dir = f"{g_output_dir}/{cluster_name}/{env_name}" files_to_compare = get_all_files_in_dir(source_dir) @@ -74,3 +90,4 @@ def test_cleanup_target_dir_removes_expected_items(): assert (target_dir / "keep").exists() delete_dir(target_dir) + diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/AppDefs/application-1.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/AppDefs/application-1.yml new file mode 100644 index 000000000..cf96b3568 --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/AppDefs/application-1.yml @@ -0,0 +1,7 @@ +name: "application-1" +registryName: "registry-1" +artifactId: "application-1" +groupId: "org.qubership" +supportParallelDeploy: true +deployParameters: {} +technicalConfigurationParameters: {} diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/AppDefs/application-2.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/AppDefs/application-2.yml new file mode 100644 index 000000000..a65effbc6 --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/AppDefs/application-2.yml @@ -0,0 +1,9 @@ +name: "application-2" +registryName: "registry-2" +artifactId: "application-2" +groupId: "org.qubership" +supportParallelDeploy: true +deployParameters: {} +technicalConfigurationParameters: {} +metadata: + helmReleaseNameStrategy: "perApplication" diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Credentials/credentials.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Credentials/credentials.yml new file mode 100644 index 000000000..97d1687df --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Credentials/credentials.yml @@ -0,0 +1,22 @@ +bgdomaincred: # bg domain bgd-env-bg-domain + type: "secret" + data: + secret: "envgeneNullValue" # FillMe +cloud-deploy-sa-token: # cloud passport: test-cloud-passport version: 1.5 + type: "secret" + data: + secret: "token-placeholder-123" +consul-token: # cloud test-solution-structure + type: "secret" + data: + secret: "envgeneNullValue" # FillMe +dbaas: # cloud test-solution-structure + type: "usernamePassword" + data: + username: "envgeneNullValue" # FillMe + password: "envgeneNullValue" # FillMe +maas: # cloud test-solution-structure + type: "usernamePassword" + data: + username: "envgeneNullValue" # FillMe + password: "envgeneNullValue" # FillMe diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Inventory/env_definition.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Inventory/env_definition.yml new file mode 100644 index 000000000..c093d29e3 --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Inventory/env_definition.yml @@ -0,0 +1,20 @@ +inventory: + environmentName: "bgd-ns-artifacts-env" + clusterUrl: "test-val.com" + tenantName: "test-tenant" + deployer: "test-deployer" + cloudName: "test-solution-structure" + cloudPassport: "test-cloud-passport" +envTemplate: + name: "bgd" + additionalTemplateVariables: {} + sharedTemplateVariables: [] + envSpecificParamsets: {} + envSpecificTechnicalParamsets: {} + sharedMasterCredentialFiles: [] + artifact: "bgd" + bgNsArtifacts: + origin: "bgd-origin" + peer: "bgd-peer" +generatedVersions: + generateEnvironmentLatestVersion: "bgd:bgd" diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/bg-controller/namespace.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/bg-controller/namespace.yml new file mode 100644 index 000000000..bac8d92e2 --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/bg-controller/namespace.yml @@ -0,0 +1,16 @@ +# The contents of this file is generated from template artifact: bgd. +# Contents will be overwritten by next generation. +# Please modify this contents only for development purposes or as workaround. +name: "bgd-ns-artifacts-env-bg-controller" +credentialsId: "" +isServerSideMerge: false +labels: + - "Instance-bgd-ns-artifacts-env" +cleanInstallApprovalRequired: false +mergeDeployParametersAndE2EParameters: false +deployParameters: {} +e2eParameters: {} +technicalConfigurationParameters: {} +deployParameterSets: [] +e2eParameterSets: [] +technicalConfigurationParameterSets: [] diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/bg-plugin/namespace.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/bg-plugin/namespace.yml new file mode 100644 index 000000000..b7ba603da --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/bg-plugin/namespace.yml @@ -0,0 +1,16 @@ +# The contents of this file is generated from template artifact: bgd. +# Contents will be overwritten by next generation. +# Please modify this contents only for development purposes or as workaround. +name: "bgd-ns-artifacts-env-bg-plugin" +credentialsId: "" +isServerSideMerge: false +labels: + - "Instance-bgd-ns-artifacts-env" +cleanInstallApprovalRequired: false +mergeDeployParametersAndE2EParameters: false +deployParameters: {} +e2eParameters: {} +technicalConfigurationParameters: {} +deployParameterSets: [] +e2eParameterSets: [] +technicalConfigurationParameterSets: [] diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/origin-app/namespace.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/origin-app/namespace.yml new file mode 100644 index 000000000..41fcf41e9 --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/origin-app/namespace.yml @@ -0,0 +1,23 @@ +# The contents of this file is generated from template artifact: bgd. +# Contents will be overwritten by next generation. +# Please modify this contents only for development purposes or as workaround. +name: "bgd-ns-artifacts-env-origin-app" +credentialsId: "" +isServerSideMerge: false +labels: + - "Instance-bgd-ns-artifacts-env" + - "BG-Role-Origin" +cleanInstallApprovalRequired: false +mergeDeployParametersAndE2EParameters: false +deployParameters: + APP_NAMESPACE: "bgd-ns-artifacts-env-app" + BG_ARTIFACT_SOURCE: "origin-template" + ENVGENE_CONFIG_REF_NAME: "branch_name" + ENVGENE_CONFIG_TAG: "No Ref tag" +e2eParameters: + APP_NAMESPACE: "bgd-ns-artifacts-env-app" +technicalConfigurationParameters: + APP_NAMESPACE: "bgd-ns-artifacts-env-app" +deployParameterSets: [] +e2eParameterSets: [] +technicalConfigurationParameterSets: [] diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/other-app/namespace.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/other-app/namespace.yml new file mode 100644 index 000000000..5d6a10a66 --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/other-app/namespace.yml @@ -0,0 +1,19 @@ +# The contents of this file is generated from template artifact: bgd. +# Contents will be overwritten by next generation. +# Please modify this contents only for development purposes or as workaround. +name: "bgd-ns-artifacts-env-other-app" +credentialsId: "" +isServerSideMerge: false +labels: + - "Instance-bgd-ns-artifacts-env" +cleanInstallApprovalRequired: false +mergeDeployParametersAndE2EParameters: false +deployParameters: + APP_NAMESPACE: "bgd-ns-artifacts-env-app" + ENVGENE_CONFIG_REF_NAME: "branch_name" + ENVGENE_CONFIG_TAG: "No Ref tag" +e2eParameters: {} +technicalConfigurationParameters: {} +deployParameterSets: [] +e2eParameterSets: [] +technicalConfigurationParameterSets: [] diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/peer-app/namespace.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/peer-app/namespace.yml new file mode 100644 index 000000000..2308bab77 --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/Namespaces/peer-app/namespace.yml @@ -0,0 +1,23 @@ +# The contents of this file is generated from template artifact: bgd. +# Contents will be overwritten by next generation. +# Please modify this contents only for development purposes or as workaround. +name: "bgd-ns-artifacts-env-peer-app" +credentialsId: "" +isServerSideMerge: false +labels: + - "Instance-bgd-ns-artifacts-env" + - "BG-Role-Peer" +cleanInstallApprovalRequired: false +mergeDeployParametersAndE2EParameters: false +deployParameters: + APP_NAMESPACE: "bgd-ns-artifacts-env-app" + BG_ARTIFACT_SOURCE: "peer-template" + ENVGENE_CONFIG_REF_NAME: "branch_name" + ENVGENE_CONFIG_TAG: "No Ref tag" +e2eParameters: + APP_NAMESPACE: "bgd-ns-artifacts-env-app" +technicalConfigurationParameters: + APP_NAMESPACE: "bgd-ns-artifacts-env-app" +deployParameterSets: [] +e2eParameterSets: [] +technicalConfigurationParameterSets: [] diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/RegDefs/registry-1.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/RegDefs/registry-1.yml new file mode 100644 index 000000000..599de06df --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/RegDefs/registry-1.yml @@ -0,0 +1,19 @@ +name: "registry-1" +credentialsId: "registry-cred" +mavenConfig: + repositoryDomainName: "maven.qubership.org" + fullRepositoryUrl: "https://maven.qubership.org/repository" + targetSnapshot: "snapshot" + targetStaging: "staging" + targetRelease: "release" + releaseGroup: "" + snapshotGroup: "" +dockerConfig: + snapshotUri: "docker.qubership.org/snapshot" + stagingUri: "docker.qubership.org/staging" + releaseUri: "docker.qubership.org/release" + groupUri: "docker.qubership.org/group" + snapshotRepoName: "docker-snapshot" + stagingRepoName: "docker-staging" + releaseRepoName: "docker-release" + groupName: "docker-group" diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/RegDefs/registry-2.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/RegDefs/registry-2.yml new file mode 100644 index 000000000..ef136e375 --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/RegDefs/registry-2.yml @@ -0,0 +1,19 @@ +name: "registry-2" +credentialsId: "registry-cred" +mavenConfig: + repositoryDomainName: "maven.qubership.org" + fullRepositoryUrl: "https://maven.qubership.org/repository" + targetSnapshot: "snapshot" + targetStaging: "staging" + targetRelease: "release" + releaseGroup: "" + snapshotGroup: "" +dockerConfig: + snapshotUri: "docker.qubership.org/snapshot" + stagingUri: "docker.qubership.org/staging" + releaseUri: "docker.qubership.org/release" + groupUri: "docker.qubership.org/group" + snapshotRepoName: "docker-snapshot" + stagingRepoName: "docker-staging" + releaseRepoName: "docker-release" + groupName: "docker-group" diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/bg_domain.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/bg_domain.yml new file mode 100644 index 000000000..59076258a --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/bg_domain.yml @@ -0,0 +1,12 @@ +name: "bgd-ns-artifacts-env-bg-domain" +type: bgdomain +originNamespace: + name: "bgd-ns-artifacts-env-origin-bss" + type: namespace +peerNamespace: + name: "bgd-ns-artifacts-env-peer-bss" + type: namespace +controllerNamespace: + name: "bgd-ns-artifacts-env-bg-controller" + type: namespace + credentials: bgdomaincred diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/cloud.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/cloud.yml new file mode 100644 index 000000000..3936201d9 --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/cloud.yml @@ -0,0 +1,48 @@ +# The contents of this file is generated from template artifact: bgd. +# Contents will be overwritten by next generation. +# Please modify this contents only for development purposes or as workaround. +name: "test-solution-structure" +apiUrl: "tmp.cloud.com" # cloud passport: test-cloud-passport version: 1.5 +apiPort: "0000" # cloud passport: test-cloud-passport version: 1.5 +privateUrl: "test-host.managed.tmp.cloud" # cloud passport: test-cloud-passport version: 1.5 +publicUrl: "test-host.managed.tmp.cloud" # cloud passport: test-cloud-passport version: 1.5 +dashboardUrl: "https://dashboard.test-host.managed.tmp.cloud" # cloud passport: test-cloud-passport version: 1.5 +labels: [] +defaultCredentialsId: "cloud-deploy-sa-token" # cloud passport: test-cloud-passport version: 1.5 +protocol: "https" # cloud passport: test-cloud-passport version: 1.5 +dbMode: "db" +databases: [] +maasConfig: + credentialsId: "maas" + enable: true + maasUrl: "http://maas.None" + maasInternalAddress: "http://maas.maas:8888" +vaultConfig: + credentialsId: "" + enable: false + url: "" +dbaasConfigs: + - credentialsId: "dbaas" + enable: true + apiUrl: "http://dbaas.dbaas:8888" + aggregatorUrl: "https://dbaas.None" +consulConfig: + tokenSecret: "consul-token" + enabled: true + publicUrl: "https://consul.None" + internalUrl: "http://consul.consul:8888" +deployParameters: + CLOUD_DASHBOARD_URL: "https://dashboard.test-host.managed.tmp.cloud" # cloud passport: test-cloud-passport version: 1.5 + CMDB_URL: "https://test-host.managed.tmp.cloud" # cloud passport: test-cloud-passport version: 1.5 + GRAFANA_UI_URL: "https://test-host.managed.tmp.cloud" # cloud passport: test-cloud-passport version: 1.5 + GRAYLOG_UI_URL: "https://test-host.managed.tmp.cloud" # cloud passport: test-cloud-passport version: 1.5 + TRACING_UI_URL: "https://test-host.managed.tmp.cloud" # cloud passport: test-cloud-passport version: 1.5 + VALUE: "true" # cloud passport: test-cloud-passport version: 1.5 +e2eParameters: + CMDB_NAME: "test-deployer" + TEMPLATE_NAME: "bgd" +technicalConfigurationParameters: {} +deployParameterSets: [] +e2eParameterSets: [] +technicalConfigurationParameterSets: [] +productionMode: false # cloud passport: test-cloud-passport version: 1.5 diff --git a/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/tenant.yml b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/tenant.yml new file mode 100644 index 000000000..bf0d3517b --- /dev/null +++ b/test_data/test_environments/bgd-cluster/bgd-ns-artifacts-env/tenant.yml @@ -0,0 +1,17 @@ +# The contents of this file is generated from template artifact: bgd. +# Contents will be overwritten by next generation. +# Please modify this contents only for development purposes or as workaround. +name: "test-tenant" +registryName: "default" +description: "" +owners: "" +gitRepository: "" +defaultBranch: "" +credential: "" +labels: [] +globalE2EParameters: + pipelineDefaultRecipients: "" + recipientsStrategy: "merge" + mergeTenantsAndE2EParameters: false + environmentParameters: {} +deployParameters: {} diff --git a/test_data/test_templates/env_templates/bgd-origin.yaml b/test_data/test_templates/env_templates/bgd-origin.yaml new file mode 100644 index 000000000..a27169b54 --- /dev/null +++ b/test_data/test_templates/env_templates/bgd-origin.yaml @@ -0,0 +1,13 @@ +--- +# Template for origin namespace in Blue-Green deployment +# This template is used when bgNsArtifacts.origin is specified in env_definition.yml +tenant: "{{ templates_dir }}/env_templates/bgd/tenant.yml.j2" +cloud: + template_path: "{{ templates_dir }}/env_templates/bgd/cloud.yml.j2" +namespaces: + - template_path: "{{ templates_dir }}/env_templates/bgd-origin/Namespaces/app.yml.j2" + deploy_postfix: "origin-app" + template_override: + name: "{{current_env.name}}-origin-app" +bg_domain: "{{ templates_dir }}/env_templates/bgd/bg_domain.yml.j2" +parametersets: [] diff --git a/test_data/test_templates/env_templates/bgd-origin/Namespaces/app.yml.j2 b/test_data/test_templates/env_templates/bgd-origin/Namespaces/app.yml.j2 new file mode 100644 index 000000000..67ac27918 --- /dev/null +++ b/test_data/test_templates/env_templates/bgd-origin/Namespaces/app.yml.j2 @@ -0,0 +1,21 @@ +--- +name: "{{current_env.name}}-app" +labels: +- "Instance-{{current_env.name}}" +- "BG-Role-Origin" +credentialsId: "" +isServerSideMerge: false +cleanInstallApprovalRequired: false +mergeDeployParametersAndE2EParameters: false +deployParameters: + ENVGENE_CONFIG_REF_NAME: "{{ lookup('ansible.builtin.env', 'CI_COMMIT_REF_NAME')| default('No Ref Name') }}" + ENVGENE_CONFIG_TAG: "{{ lookup('ansible.builtin.env', 'CI_COMMIT_TAG')| default('No Ref tag') }}" + APP_NAMESPACE: "{{current_env.name}}-app" + BG_ARTIFACT_SOURCE: "origin-template" +e2eParameters: + APP_NAMESPACE: "{{current_env.name}}-app" +technicalConfigurationParameters: + APP_NAMESPACE: "{{current_env.name}}-app" +deployParameterSets: [] +e2eParameterSets: [] +technicalConfigurationParameterSets: [] diff --git a/test_data/test_templates/env_templates/bgd-peer.yaml b/test_data/test_templates/env_templates/bgd-peer.yaml new file mode 100644 index 000000000..394d44514 --- /dev/null +++ b/test_data/test_templates/env_templates/bgd-peer.yaml @@ -0,0 +1,13 @@ +--- +# Template for peer namespace in Blue-Green deployment +# This template is used when bgNsArtifacts.peer is specified in env_definition.yml +tenant: "{{ templates_dir }}/env_templates/bgd/tenant.yml.j2" +cloud: + template_path: "{{ templates_dir }}/env_templates/bgd/cloud.yml.j2" +namespaces: + - template_path: "{{ templates_dir }}/env_templates/bgd-peer/Namespaces/app.yml.j2" + deploy_postfix: "peer-app" + template_override: + name: "{{current_env.name}}-peer-app" +bg_domain: "{{ templates_dir }}/env_templates/bgd/bg_domain.yml.j2" +parametersets: [] diff --git a/test_data/test_templates/env_templates/bgd-peer/Namespaces/app.yml.j2 b/test_data/test_templates/env_templates/bgd-peer/Namespaces/app.yml.j2 new file mode 100644 index 000000000..959914d3d --- /dev/null +++ b/test_data/test_templates/env_templates/bgd-peer/Namespaces/app.yml.j2 @@ -0,0 +1,21 @@ +--- +name: "{{current_env.name}}-app" +labels: +- "Instance-{{current_env.name}}" +- "BG-Role-Peer" +credentialsId: "" +isServerSideMerge: false +cleanInstallApprovalRequired: false +mergeDeployParametersAndE2EParameters: false +deployParameters: + ENVGENE_CONFIG_REF_NAME: "{{ lookup('ansible.builtin.env', 'CI_COMMIT_REF_NAME')| default('No Ref Name') }}" + ENVGENE_CONFIG_TAG: "{{ lookup('ansible.builtin.env', 'CI_COMMIT_TAG')| default('No Ref tag') }}" + APP_NAMESPACE: "{{current_env.name}}-app" + BG_ARTIFACT_SOURCE: "peer-template" +e2eParameters: + APP_NAMESPACE: "{{current_env.name}}-app" +technicalConfigurationParameters: + APP_NAMESPACE: "{{current_env.name}}-app" +deployParameterSets: [] +e2eParameterSets: [] +technicalConfigurationParameterSets: []