示例#1
0
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
示例#2
0
 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
             }
示例#3
0
 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()
     }
示例#4
0
 def get_filter(cls, code_name):
     _x = deep_get(cls.raw_dict, f"global/AMIs/{code_name}", {})
     return _x