【发布时间】:2022-07-08 06:06:54
【问题描述】:
Cloud ResourceManager Python API v3 有一个list_projects method,但它只返回给定文件夹的直接子项目。
例如,您可以拥有该主文件夹的子文件夹以及它们自己的项目和子文件夹等等。
如何以编程方式获取给定文件夹下的所有子项目?
【问题讨论】:
标签: python google-cloud-platform google-cloud-python
Cloud ResourceManager Python API v3 有一个list_projects method,但它只返回给定文件夹的直接子项目。
例如,您可以拥有该主文件夹的子文件夹以及它们自己的项目和子文件夹等等。
如何以编程方式获取给定文件夹下的所有子项目?
【问题讨论】:
标签: python google-cloud-platform google-cloud-python
我遇到了和你一样的问题。我最终使用了search_projects 方法。如果您不指定过滤器,它将返回您对其拥有 resourcemanager.projects.get 权限的所有项目。您可以过滤状态字段以仅保留 ACTIVE 字段,避免标记为删除的字段。
【讨论】:
我相信我已经使用递归函数解决了这个问题,但希望能提供任何和所有的输入来改进/完善它。当然,这只是示例代码,其中充斥着用于验证和调试的打印语句,因此您需要根据需要进行修改。
它获取所有项目名称并将它们粘贴到一个列表中。对于大型组织,您可能需要更好的数据、文件或其他结构。
#!/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 之前我不知道的回答的启发,我开发了一些代码来使用Cloud Asset 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,因为我找不到一种简单的方法来搜索/返回从特定父项开始的项目AND 处于活动状态。
【讨论】:
如果您在组织中的文件夹下有文件夹,那么 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)
【讨论】: