def _load_base_software_stacks()

in source/idea/infrastructure/resources/lambda_functions/custom_resource/ddb_default_values_populator_lambda/handler.py [0:0]


def _load_base_software_stacks() -> Optional[List[Dict[str, Any]]]:
    with open(BASE_SOFTWARE_STACK_CONFIG_PATH, "r") as f:
        base_stacks_config = yaml.safe_load(f)

    if not base_stacks_config:
        logger.error(f"{BASE_SOFTWARE_STACK_CONFIG_PATH} is empty. Returning")
        return None

    base_software_stacks = []
    for base_os in software_stacks.BASE_OS:
        logger.info(f"Processing base_os: {base_os}")
        os_config = base_stacks_config.get(base_os)
        for arch in software_stacks.ARCHITECTURE:
            arch_key = _reformat_key(arch)
            logger.info(f"Processing architecture: {arch_key} with base_os: {base_os}")
            arch_config = os_config.get(arch_key)
            if not arch_config:
                logger.error(
                    f"Entry for architecture: {arch_key} within base_os: {base_os}. NOT FOUND. Returning"
                )
                continue

            default_name = arch_config.get("default-name")
            default_description = arch_config.get("default-description")
            default_min_storage_value = arch_config.get("default-min-storage-value")
            default_min_storage_unit = arch_config.get("default-min-storage-unit")
            default_min_ram_value = arch_config.get("default-min-ram-value")
            default_min_ram_unit = arch_config.get("default-min-ram-unit")
            default_tenancy = arch_config.get("default-tenancy")
            default_allowed_instance_types = arch_config.get(
                "default-allowed-instance-types"
            )

            if (
                not default_name
                or not default_description
                or not default_min_storage_value
                or not default_min_storage_unit
                or not default_min_ram_value
                or not default_min_ram_unit
                or not default_tenancy
                or not default_allowed_instance_types
            ):
                error_message = (
                    f"Invalid base-software-stack-config.yaml configuration for OS: {base_os} Arch Config: "
                    f"{arch}. Missing default-name and/or default-description and/or default-min-storage-value "
                    f"and/or default-min-storage-unit and/or default-min-ram-value and/or default-min-ram-unit "
                    f"and/or default-allowed-instance-types"
                )
                logger.error(error_message)
                raise Exception(error_message)

            aws_region = os.environ.get("AWS_DEFAULT_REGION")
            logger.info(
                f"Processing arch: {arch_key} within base_os: {base_os} "
                f"for aws_region: {aws_region}"
            )

            region_configs = arch_config.get(aws_region)
            if not region_configs:
                logger.error(
                    f"Entry for arch: {arch_key} within base_os: {base_os}. "
                    f"for aws_region: {aws_region} "
                    f"NOT FOUND. Returning"
                )
                continue

            for region_config in region_configs:
                ami_id = region_config.get("ami-id")
                if not ami_id:
                    error_message = (
                        f"Invalid base-software-stack-config.yaml configuration for OS: {base_os} Arch"
                        f" Config: {arch} AWS-Region: {aws_region}."
                        f" Missing ami-id"
                    )
                    logger.error(error_message)
                    raise Exception(error_message)

                ss_id_suffix = region_config.get("ss-id-suffix")
                if not ss_id_suffix:
                    error_message = (
                        f"Invalid base-software-stack-config.yaml configuration for OS: {base_os} Arch"
                        f" Config: {arch} AWS-Region: {aws_region}."
                        f" Missing ss-id-suffix"
                    )
                    logger.error(error_message)
                    raise Exception(error_message)

                gpu_manufacturer = region_config.get("gpu-manufacturer")
                if gpu_manufacturer and gpu_manufacturer not in {
                    "AMD",
                    "NVIDIA",
                    "NO_GPU",
                }:
                    error_message = (
                        f"Invalid base-software-stack-config.yaml configuration for OS: {base_os} Arch"
                        f" Config: {arch} AWS-Region: {aws_region}."
                        f" Invalid gpu-manufacturer {gpu_manufacturer} can be one of AMD, NVIDIA, NO_GPU only"
                    )

                    logger.error(error_message)
                    raise Exception(error_message)
                elif not gpu_manufacturer:
                    gpu_manufacturer = "NO_GPU"

                custom_stack_name = region_config.get(
                    software_stacks.SOFTWARE_STACK_DB_NAME_KEY, default_name
                )
                custom_stack_description = region_config.get(
                    software_stacks.SOFTWARE_STACK_DB_DESCRIPTION_KEY,
                    default_description,
                )
                custom_stack_min_storage_value = region_config.get(
                    _reformat_key(
                        software_stacks.SOFTWARE_STACK_DB_MIN_STORAGE_VALUE_KEY
                    ),
                    default_min_storage_value,
                )
                custom_stack_min_storage_unit = region_config.get(
                    _reformat_key(
                        software_stacks.SOFTWARE_STACK_DB_MIN_STORAGE_UNIT_KEY
                    ),
                    default_min_storage_unit,
                )
                custom_stack_min_ram_value = region_config.get(
                    _reformat_key(software_stacks.SOFTWARE_STACK_DB_MIN_RAM_VALUE_KEY),
                    default_min_ram_value,
                )
                custom_stack_min_ram_unit = region_config.get(
                    _reformat_key(software_stacks.SOFTWARE_STACK_DB_MIN_RAM_UNIT_KEY),
                    default_min_ram_unit,
                )
                custom_allowed_instance_types = region_config.get(
                    _reformat_key(
                        software_stacks.SOFTWARE_STACK_DB_ALLOWED_INSTANCE_TYPES_KEY
                    ),
                    default_allowed_instance_types,
                )
                custom_stack_gpu_manufacturer = gpu_manufacturer
                custom_stack_tenancy = region_config.get(
                    _reformat_key(software_stacks.SOFTWARE_STACK_DB_TENANCY_KEY),
                    default_tenancy,
                )

                software_stack_id = f"{software_stacks.BASE_STACK_PREFIX}-{base_os}-{arch_key}-{ss_id_suffix}"

                base_software_stacks.append(
                    {
                        software_stacks.SOFTWARE_STACK_DB_HASH_KEY: base_os,
                        software_stacks.SOFTWARE_STACK_DB_RANGE_KEY: software_stack_id,
                        software_stacks.SOFTWARE_STACK_DB_NAME_KEY: custom_stack_name,
                        software_stacks.SOFTWARE_STACK_DB_DESCRIPTION_KEY: custom_stack_description,
                        software_stacks.SOFTWARE_STACK_DB_AMI_ID_KEY: ami_id,
                        software_stacks.SOFTWARE_STACK_DB_ENABLED_KEY: True,
                        software_stacks.SOFTWARE_STACK_DB_MIN_STORAGE_VALUE_KEY: custom_stack_min_storage_value,
                        software_stacks.SOFTWARE_STACK_DB_MIN_STORAGE_UNIT_KEY: custom_stack_min_storage_unit,
                        software_stacks.SOFTWARE_STACK_DB_MIN_RAM_VALUE_KEY: custom_stack_min_ram_value,
                        software_stacks.SOFTWARE_STACK_DB_MIN_RAM_UNIT_KEY: custom_stack_min_ram_unit,
                        software_stacks.SOFTWARE_STACK_DB_ARCHITECTURE_KEY: arch,
                        software_stacks.SOFTWARE_STACK_DB_GPU_KEY: custom_stack_gpu_manufacturer,
                        software_stacks.SOFTWARE_STACK_DB_TENANCY_KEY: custom_stack_tenancy,
                        software_stacks.SOFTWARE_STACK_DB_ALLOWED_INSTANCE_TYPES_KEY: custom_allowed_instance_types,
                        software_stacks.SOFTWARE_STACK_DB_PROJECTS_KEY: [],
                    }
                )

    return base_software_stacks