def main()

in ansible/roles/slurm/files/scripts/destroy_nodes.py [0:0]


def main(args):
    required_map = {
        "labels.slurm_cluster_name": args.slurm_cluster_name,
        "labels.slurm_instance_role": "compute",
    }
    required_list = [f"{k}={v}" for k, v in required_map.items()]
    required_logic = " AND ".join(required_list)

    target_list = (
        " OR ".join([f"name={x}" for x in args.target.split(",")])
        if args.target
        else ""
    )
    target_logic = f"AND ({target_list})" if args.target else ""

    exclude_list = (
        " AND ".join([f"name!={x}" for x in args.exclude.split(",")])
        if args.exclude
        else ""
    )
    exclude_logic = f"AND ({exclude_list})" if args.exclude else ""

    filter = f"{required_logic} {target_logic} {exclude_logic}"
    log.debug(f'filter = "{filter}"')

    # NOTE: It is not technically possible to filter by metadata or other
    #       complex nested items
    p_id = args.project_id if args.project_id else lkp.project
    if not p_id:
        print("Error: Project id cannot be determined")
        exit(1)
    result = compute.instances().aggregatedList(project=p_id, filter=filter).execute()

    compute_list = []
    for item in result["items"].values():
        instances = item.get("instances")
        if instances is not None:
            for instance in instances:
                compute_list.append(instance["selfLink"])

    delete_instances(compute_list)

    if len(compute_list) > 0:
        sleep_dur = 30
        log.info(f"Done. Sleeping for {sleep_dur} seconds.")
        sleep(sleep_dur)