- if not hasattr(yml, "items"):
- return []
- resources = []
- for k, v in yml.items():
- if k == "get_file":
- if isinstance(v, list):
- resources.append(v[0])
- else:
- resources.append(v)
- continue
- if isinstance(v, dict):
- resources.extend(find_all_get_file_in_yml(v))
- elif isinstance(v, list):
- for d in v:
- resources.extend(find_all_get_file_in_yml(d))
- return resources
-
-
-def find_all_get_resource_in_resource(resource):
- """
- Recursively find all referenced resources
- in a heat resource and return a list of resource ids
- """
- if not hasattr(resource, "items"):
- return []
-
- resources = []
- for k, v in resource.items():
- if k == "get_resource":
- if isinstance(v, list):
- resources.append(v[0])
- else:
- resources.append(v)
- continue
- if isinstance(v, dict):
- resources.extend(find_all_get_resource_in_resource(v))
- elif isinstance(v, list):
- for d in v:
- resources.extend(find_all_get_resource_in_resource(d))
- return resources
-
-
-def get_associated_resources_per_resource(resources):
- """
- Recursively find all referenced resources for each resource
- in a list of resource ids
- """
- if not hasattr(resources, "items"):
- return None
-
- resources_dict = {}
- resources_dict["resources"] = {}
- ref_resources = []
-
- for res_key, res_value in resources.items():
- get_resources = []
-
- for k, v in res_value:
- if k == "get_resource" and isinstance(v, dict):
- get_resources = find_all_get_resource_in_resource(v)
-
- # if resources found, add to dict
- if get_resources:
- ref_resources.extend(get_resources)
- resources_dict["resources"][res_key] = {
- "res_value": res_value,
- "get_resources": get_resources,
- }
-
- resources_dict["ref_resources"] = set(ref_resources)
-
- return resources_dict
-
-
-def flatten(items):
- """
- flatten items from any nested iterable
- """
-
- merged_list = []
- for item in items:
- if isinstance(item, list):
- sub_list = flatten(item)
- merged_list.extend(sub_list)
- else:
- merged_list.append(item)
- return merged_list