in src/statequery/assignments.go [110:172]
func retrieveResourceChildren(manClient *cloudresourcemanagerSDK.Service, cache *Cache, resourceType string, resourceName string) ([]string, error) {
// Qualified name of current parent
parent := fmt.Sprintf("%s/%s", resourceType, resourceName)
switch resourceType {
case "projects":
// Resource is a project, only return this particular resource
return []string{
resourceName,
}, nil
case "organizations":
// Resource is an organization, resolve all children using Resource Manager
fallthrough // Treat same as folders
case "folders":
// Resource is a folder, resolve all children using Resource Manager
// Attempt cache resolution
result, err := cache.Get(parent)
if err == nil {
// Cache hit, return early
log.Printf("cache hit for key: %s\n", parent)
return result, nil
}
// Cache miss
log.Printf("cache miss: %v\n", err)
// Resolve children of type folder
folders, err := manClient.Folders.List().Parent(parent).Do()
if err != nil {
return nil, err
}
for _, folder := range folders.Folders {
tokens := strings.Split(folder.Name, "/")
folderName := tokens[1]
children, err := retrieveResourceChildren(manClient, cache, "folders", folderName)
if err != nil {
return nil, err
}
result = append(result, children...)
}
// Resolve children of type project
projects, err := manClient.Projects.List().Parent(parent).Do()
if err != nil {
return nil, err
}
for _, project := range projects.Projects {
children, err := retrieveResourceChildren(manClient, cache, "projects", project.ProjectId)
if err != nil {
return nil, err
}
result = append(result, children...)
}
// Update cache
cache.Add(parent, result)
return result, nil
default:
return nil, fmt.Errorf("unexpected assignee resource type: %s", resourceType)
}
}