def build_codenames(tobj: Template, config: Config) -> List[RegionalCodename]: """Builds regional codename objects""" built_cn = [] filters = deep_get(tobj.underlying.template, tobj.metadata_path, {}) mappings = deep_get(tobj.underlying.template, tobj.mapping_path, {}) for cname, cfilters in filters.items(): config.update_filter({cname: cfilters}) for region, cndata in mappings.items(): _missing_filters: Set[str] = set() if region == "AMI": continue if not REGION_REGEX.search(region): LOG.error( f"[{region}] is not a valid region. Please check your template!" ) raise AMIUpdaterFatalException for cnname in cndata.keys(): _filters = _construct_filters(cnname, config) if not _filters: if cnname not in _missing_filters: _missing_filters.add(cnname) LOG.warning( f"No query parameters were found for: {cnname.upper()}.", "(Results for this codename are not possible.", ) continue region_cn = RegionalCodename(region=region, cn=cnname, filters=_filters) built_cn.append(region_cn) return built_cn
def __init__(self, underlying: TCTemplate): self.codenames: Set[Dict[str, str]] = set() self.mapping_path: str = "Mappings/AWSAMIRegionMap" self.metadata_path: str = "Metadata/AWSAMIRegionMap/Filters" self.region_codename_lineno: Dict[str, Dict[str, int]] = {} self.region_names: Set[str] = set() self.underlying: TCTemplate = underlying self._ls = self.underlying.linesplit _template_regions = deep_get(self.underlying.template, self.mapping_path, {}) for region_name, region_data in _template_regions.items(): if region_name == "AMI": continue self.region_names.add(region_name) for codename, cnvalue in region_data.items(): key = f"{codename}/{region_name}" line_no = codename.start_mark.line if cnvalue == "": if '""' in self._ls[line_no]: cnvalue = '""' elif "''" in self._ls[line_no]: cnvalue = "''" self.region_codename_lineno[key] = { "line": line_no, "old": cnvalue }
def get_filter(cls, code_name): _x = deep_get(cls.raw_dict, f"global/AMIs/{code_name}", {}) return { str(k): [str(v)] if isinstance(v, str) else list(v) for k, v in _x.items() }
def get_filter(cls, code_name): _x = deep_get(cls.raw_dict, f"global/AMIs/{code_name}", {}) return _x