使用Apache libcloud获取GCE项目列表

时间:2017-06-02 05:41:47

标签: python google-compute-engine libcloud

方法projects.list提供了有关请求Google计算机引擎"项目"的API调用的详细信息。是否可以使用libcloud执行此操作?我还没有在文档和源代码中找到任何参考,所以我认为它不可能立即实现。

如果是这样的话,是否有人可以提供一些如何实施的帮助?初始化GCENodeDriver不是一个选项,因为它需要提供项目。但是,在使用适当的项目初始化它时,我可以使用它包含的connection引用。但到目前为止,我试图发布一个

response = conn.request('https://cloudresourcemanager.googleapis.com/v1/projects', method='GET')

没有任何有用的结果

  

libcloud.common.google.ResourceNotFoundError: u'Not Found')。

我想知道我是否可以对此调用使用相同的身份验证(使用服务帐户和身份验证json文件)。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

查看projects.list的文档,它只讨论成功的响应案例。

  

方法:projects.list

     

列出用户可见并满足指定的项目   过滤。此方法以未指定的顺序返回Projects。新   项目不一定出现在列表的末尾。

     

HTTP请求

GET https://cloudresourcemanager.googleapis.com/v1/projects
     

网址使用Google API HTTP注释语法。

     

申请正文

     

请求正文必须为空。

     

回复正文

     

如果成功,则响应正文包含具有以下内容的数据   结构:

     

从projects.list方法收到的回复页面。

     

有更多页面可用的分页响应具有nextPageToken   组。此令牌可用于后续请求中以检索   下一个请求页面。

我对libcloud不太熟悉,所以不知道Not Found的含义。对我而言,请求似乎得到了404响应。

我可以提出以下建议,以确认您使用的服务帐户具有所需的权限和身份验证范围。

  • 我不确定服务帐户需要具有哪些权限/角色,但我觉得它应该在组织级别拥有能够列出项目的权限。我在文档中找不到任何关于此的信息。

  • 以下是有关调用此API所需的授权范围的信息。

  

Authorization

     

需要以下OAuth范围之一:

https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/cloud-platform.read-only
https://www.googleapis.com/auth/cloudplatformprojects
https://www.googleapis.com/auth/cloudplatformprojects.readonly

答案 1 :(得分:0)

我遇到了同样的问题。 projects.list终结点使用不同的主机名和不同的OAUTH范围来获取权限,并且不太适合apache libcloud的流程。我最终在我的libcloud脚本中添加了一些额外的googleapiclient代码以获取项目列表:

from googleapiclient import discovery
from google.oauth2 import service_account

projects = {}
kf = 'projectname-12345.json'
creds = service_account.Credentials.from_service_account_file(kf)
projapi = discovery.build('cloudresourcemanager', 'v1',
                          credentials=creds).projects()
req = projapi.list()
while req:
    resp = req.execute()
    for project in resp.get('projects',[]):
        projects[project['projectId']] = project
    req = projapi.list_next(previous_request=req,
                            previous_response=resp)

print(sorted(projects))