v3的Cloud ResourceManager Python API有一个list_projects
方法,但它只返回指定文件夹的直接子项目。
例如,你可以在主文件夹的子文件夹中有自己的项目和子文件夹,等等。
如何以编程方式获得给定文件夹下所有子项目的?
我相信我已经用一个递归函数解决了这个问题,但是我将感谢任何能改进/完善这个问题的输入。当然,这只是样例代码,并且到处都是用于验证的print语句&调试,所以你需要修改以适应你的需要。
它获取所有项目名称并将它们粘贴到一个列表中。对于大型组织,您可能需要更好的数据、文件或其他结构。
#!/usr/bin/env python3
from google.cloud.resourcemanager_v3 import ProjectsClient, FoldersClient
all_projects = []
def get_folders_and_projects(folder_id):
"""
Get a list of projects and folders, given a folder ID.
"""
client = ProjectsClient()
list_of_projects = client.list_projects(parent=f'folders/{folder_id}')
print(f"Projects in Folder `{folder_id}`:")
for project in list_of_projects:
print(project.project_id)
all_projects.append(project.project_id) # Add the project names to a list
print("")
client = FoldersClient()
list_of_folders = client.list_folders(parent=f'folders/{folder_id}')
for folder in list_of_folders:
print(f"Folder Name: {folder.display_name}, Folder ID: {folder.name}")
folder_id = folder.name.strip('folders/')
# Call the same f'n again to get child projects & folders:
get_folders_and_projects(folder_id)
get_folders_and_projects('123456789012')
print(all_projects)
需要注意的是:此代码不能以组织ID开头,因为这需要与parent
参数不同的格式,即organizations/org_id
另外,2022年5月25日:受@Alssanro的回答的启发,我之前不知道,我开发了一些代码来使用云资产API来搜索父级中的活动项目。
from google.cloud.asset_v1 import AssetServiceClient, SearchAllResourcesRequest
# The starting parent can be any of the following:
parent = "projects/123456789012"
# parent = "projects/project-name-id"
# parent = "folders/123456789012"
# parent = "organizations/123456789012"
client = AssetServiceClient()
# Construct the request argument
request = SearchAllResourcesRequest(
scope=parent,
asset_types=[
"cloudresourcemanager.googleapis.com/Project",
],
query="state:ACTIVE",
)
# Make the request
paged_results = client.search_all_resources(request=request)
# Handle the response
for response in paged_results:
project_id = response.name.split("/")[4]
print(
f"Project Name: {response.display_name}, Project ID: {project_id}, State: {response.state}, "
)
请注意,我没有使用资源管理器API,因为我找不到一种简单的方法来搜索/返回在特定父开始的项目,并且是活动的。
我面临着和你一样的问题。我最终使用了search_projects方法。如果您没有指定筛选器,它将返回您拥有resourcemanager.projects的所有项目。获取权限。您可以对state字段进行过滤,只保留ACTIVE字段,避免标记为删除的字段。
如果您的组织中有文件夹下的文件夹,那么search_projects是更容易的选择。List_projects将只返回特定组织或文件夹下的项目,但不会进一步递归。
resource_manager_client = resourcemanager_v3.ProjectsClient(credentials=credentials)
projects = resource_manager_client.search_projects()
# Iterate
for project in projects:
print(project.project_id)