Skip to content

List

taskcat._cli_modules.list

List(profiles='default', regions='ALL', stack_type='ALL')

[ALPHA] lists taskcat jobs with active stacks

:param profiles: comma separated list of aws profiles to search :param regions: comma separated list of regions to search, default is to check all commercial regions :param stack_type: type of stacks to check, options are 'test', 'project', or 'ALL'. default is 'ALL'

Source code in taskcat/_cli_modules/list.py
def __init__(  # noqa: C901
    self,
    profiles: Union[str, ListType[str]] = "default",
    regions="ALL",
    stack_type="ALL",
):
    """
    :param profiles: comma separated list of aws profiles to search
    :param regions: comma separated list of regions to search, default is to check \
        all commercial regions
    :param stack_type: type of stacks to check, options are 'test', 'project', or 'ALL'. \
        default is 'ALL'
    """
    if isinstance(profiles, str):
        profiles = profiles.split(",")
    if regions == "ALL":
        region_set: set = set()
        for profile in profiles:
            region_set = region_set.union(
                set(
                    boto3.Session(profile_name=profile).get_available_regions(
                        "cloudformation"
                    )
                )
            )
        regions = list(region_set)
    else:
        regions = regions.split(",")
    stacks = Stacker.list_stacks(profiles, regions)
    jobs: dict = {}
    for stack in stacks:
        stack_key = stack["taskcat-id"].hex + "-" + stack["region"]
        if stack_key not in jobs:
            name = stack.get("taskcat-installer")
            if stack_type == "ALL":
                if not name:
                    name = stack["taskcat-project-name"]
                jobs[stack_key] = {
                    "name": name,
                    "id": stack["taskcat-id"].hex,
                    "project_name": stack["taskcat-project-name"],
                    "active_stacks": 1,
                    "region": stack["region"],
                }
            elif stack_type == "test" and not name:
                name = stack["taskcat-project-name"]
                jobs[stack_key] = {
                    "name": name,
                    "id": stack["taskcat-id"].hex,
                    "project_name": stack["taskcat-project-name"],
                    "active_stacks": 1,
                    "region": stack["region"],
                }
            elif name and stack_type == "project":
                jobs[stack_key] = {
                    "name": name,
                    "id": stack["taskcat-id"].hex,
                    "project_name": stack["taskcat-project-name"],
                    "active_stacks": 1,
                    "region": stack["region"],
                }
        else:
            jobs[stack_key]["active_stacks"] += 1

    longest_name = List._longest([v["name"] for _, v in jobs.items()])
    longest_project_name = List._longest(
        [v["project_name"] for _, v in jobs.items()]
    )
    if not jobs:
        LOG.info("no stacks found")
        return
    if stack_type != "test":
        header = (
            f"NAME{List._spaces(longest_name)}PROJECT{List._spaces(longest_project_name)}"
            f"ID{List._spaces(34)}REGION"
        )
        column = "{}    {}       {}    {}"
    else:
        header = f"NAME{List._spaces(longest_name)}ID{List._spaces(34)}REGION"
        column = "{}    {}    {}"
    LOG.error(header, extra={"nametag": ""})
    for job in jobs.values():
        args = [
            List._pad(job["name"], longest_name),
            List._pad(job["project_name"], longest_project_name),
            job["id"],
            job["region"],
        ]
        if stack_type == "test":
            args = [List._pad(job["name"], longest_name), job["id"], job["region"]]
        LOG.error(column.format(*args), extra={"nametag": ""})