func retrieveResourceChildren()

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)
	}
}