Google cloud platform Google计算引擎API:获取另一个对象中引用的对象

Google cloud platform Google计算引擎API:获取另一个对象中引用的对象,google-cloud-platform,google-api-python-client,Google Cloud Platform,Google Api Python Client,我正在尝试获取给定容器引擎集群的实例组。我可以成功获取容器集群对象,它有一个名为instanceGroupUrls的属性,它是一个字符串列表,其中每个字符串都是实例组的完整URL: In [14]: gke_api = discovery.build('container', 'v1', credentials=credentials) In [15]: cluster = gke_api.projects().zones().clusters().get( projectId=pro

我正在尝试获取给定容器引擎集群的实例组。我可以成功获取容器集群对象,它有一个名为
instanceGroupUrls
的属性,它是一个字符串列表,其中每个字符串都是实例组的完整URL:

In [14]: gke_api = discovery.build('container', 'v1', credentials=credentials)

In [15]: cluster = gke_api.projects().zones().clusters().get(
    projectId=project_id, zone=zone, clusterId=cluster_id).execute()

In [16]: cluster['instanceGroupUrls']
Out[16]: ['https://www.googleapis.com/compute/v1/projects/{project-id}/zones/{zone-id}/instanceGroupManagers/{instanceGroupID}']
我的问题是:如果我只有资源的完整URL,如何获取实例组?现在,我可以解析该URL,然后使用api发现工具来执行
instanceGroups.get(project='foo',instanceGroup='bar')
,但这看起来非常粗糙,而且容易被破坏

API客户端是否有提供完整URL的方法?我在IPython做了很多谷歌搜索和搜索,但找不到太多。我得到的最接近的是
HttpRequest
class(),但我不确定要为args传递什么

感谢您的帮助,
亚伦

TL;DR-对于
容器
API的发现与对于
计算
API的发现是独立的,两者都无法通过URL了解资源的类型

  • 如果只想查看实例组资源,可以使用通过凭据验证的对象向URL发送请求
  • 如果您想灵活地使用
    compute
    API的发现来访问资源,如您所述,您必须从URL中提取
    区域
    实例组名
    字段并将其传递给。顺便说一句,这不是黑客行为,因为大多数谷歌云API的URL资源格式不太可能改变。这个
1.仅查看实例组资源 如果希望只查看实例组资源并访问其属性而不进行任何修改,则可以使用
httplib2
中经过身份验证的Http对象来获取与URL对应的资源

  • 工作示例
  • 输出
  • 如果您使用的是应用程序默认凭据,则需要对上面的示例进行以下修改,其中您构建了凭据对象,其余代码保持不变,而不是服务帐户:

    from oauth2client.client import GoogleCredentials
    credentials = GoogleCredentials.get_application_default()
    
2.提取实例组名称并使用计算API 下面是从URL中提取实例组名和区域名组件的代码片段(您可能需要与我上面发布的代码片段结合使用)。不需要提取项目名称,因为它将与您拥有Google容器引擎集群的项目相同。输出与上述相同

  • 从URL提取信息并调用计算引擎API的代码段
  • 输出
Instance Group URL: https://www.googleapis.com/compute/v1/projects/some-arbitrary-project/zones/us-central1-a/instanceGroupManagers/gke-cluster-foo-some-group

Instance Group Info:
{ u'baseInstanceName': u'gke-cluster-foo-default-pool-abcdef',
  u'creationTimestamp': u'2017-07-07T10:11:12.678-07:00',
  u'currentActions': { u'abandoning': 0,
                       u'creating': 0,
                       u'creatingWithoutRetries': 0,
                       u'deleting': 0,
                       u'none': 3,
                       u'recreating': 0,
                       u'refreshing': 0,
                       u'restarting': 0},
  u'fingerprint': u'AABBCCDDEFG=',
  u'id': u'12345678901234',
  u'instanceGroup': u'https://www.googleapis.com/compute/v1/projects/some-arbitrary-project/zones/us-central1-a/instanceGroups/gke-cluster-foo-default-pool-some-group',
  u'instanceTemplate': u'https://www.googleapis.com/compute/v1/projects/some-arbitrary-project/global/instanceTemplates/gke-cluster-foo-default-pool-abcdef',
  u'kind': u'compute#instanceGroupManager',
  u'name': u'gke-cluster-foo-default-pool-some-group',
  u'selfLink': u'https://www.googleapis.com/compute/v1/projects/some-arbitrary-project/zones/us-central1-a/instanceGroupManagers/gke-cluster-foo-default-pool-some-grp',
  u'targetSize': 3,
  u'zone': u'https://www.googleapis.com/compute/v1/projects/some-arbitrary-project/zones/us-central1-a'}
from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
import urlparse

# Extract the path component of the URL, and using that extract instance group
# name and zone name.
instance_group_url_components = urlparse.urlsplit(
    instance_group_url).path.split('/')
instance_group_name = instance_group_url_components[-1]
zone_name = instance_group_url_components[-3]

compute_api = discovery.build('compute', 'v1', credentials=credentials)
instance_group_info = compute_api.instanceGroups().get(
    project=PROJECT_NAME, zone=zone_name,
    instanceGroup=instance_group_name).execute()

print 'Instance Group Info: '
pprint.PrettyPrinter(indent=2).pprint(instance_group)
Instance Group URL: https://www.googleapis.com/compute/v1/projects/some-arbitrary-project/zones/us-central1-a/instanceGroupManagers/gke-cluster-foo-some-group

Instance Group Info:
{ u'baseInstanceName': u'gke-cluster-foo-default-pool-abcdef',
  u'creationTimestamp': u'2017-07-07T10:11:12.678-07:00',
  u'currentActions': { u'abandoning': 0,
                       u'creating': 0,
                       u'creatingWithoutRetries': 0,
                       u'deleting': 0,
                       u'none': 3,
                       u'recreating': 0,
                       u'refreshing': 0,
                       u'restarting': 0},
  u'fingerprint': u'AABBCCDDEFG=',
  u'id': u'12345678901234',
  u'instanceGroup': u'https://www.googleapis.com/compute/v1/projects/some-arbitrary-project/zones/us-central1-a/instanceGroups/gke-cluster-foo-default-pool-some-group',
  u'instanceTemplate': u'https://www.googleapis.com/compute/v1/projects/some-arbitrary-project/global/instanceTemplates/gke-cluster-foo-default-pool-abcdef',
  u'kind': u'compute#instanceGroupManager',
  u'name': u'gke-cluster-foo-default-pool-some-group',
  u'selfLink': u'https://www.googleapis.com/compute/v1/projects/some-arbitrary-project/zones/us-central1-a/instanceGroupManagers/gke-cluster-foo-default-pool-some-grp',
  u'targetSize': 3,
  u'zone': u'https://www.googleapis.com/compute/v1/projects/some-arbitrary-project/zones/us-central1-a'}