为什么 python gcloud discovery api 用于创建实例 return None?
Why does python gcloud discovery api for creating instance return None?
现有文档
https://cloud.google.com/compute/docs/reference/rest/v1/instances/insert
声明 return 类型的调用将是多个状态值的字典。另外,连他们的python examples都显示return类型是dict类型。
实际发生了什么
我所经历的是这个电话实际上给了我 None
:
config = {
'name': "test-machine",
'machineType': "zones/us-central1-c/machineTypes/foobar",
'disks': [
{
'boot': True,
'autoDelete': True,
'deviceName': "test-machine",
...
}
}
operation = compute.instances().insert(project=PROJECT_NAME, zone=ZONE, body=config).execute()
wait_for_operation(compute, PROJECT_NAME, ZONE, operation["name"])
wait_for_operation()
函数直接取自 python 示例:
def wait_for_operation(compute, project, zone, operation):
print('Waiting for operation to finish...')
while True:
result = compute.zoneOperations().get(
project=project,
zone=zone,
operation=operation).execute()
if result['status'] == 'DONE':
print("done.")
if 'error' in result:
raise Exception(result['error'])
return result
time.sleep(1)
然而,我得到这个错误:
Traceback (most recent call last):
File "gcloud_playground.py", line 113, in <module>
wait_for_operation(compute, PROJECT_NAME, ZONE, operation["name"])
TypeError: 'NoneType' object has no attribute '__getitem__'
实际情况是我的实例创建成功,但我不知道是否创建成功。
好的,我明白了。这是我 JSON 的一个格式错误的部分,以某种方式搞砸了 gcloud 发现 api。
我在配置中写到:
"tags" : [ "tag1", "tag2", ... ]
而不是
"tags" : { "items" : [ "tag1", "tag2", ... ] }
这是 gcloud 未能发现的一个非常微妙和愚蠢的错误。
任何人看到这个,你的配置是错误的,发现 api 是错误的。如果你得到一个 None 就和你得到一个 googleapiclient.errors.HttpError
!
一样
现有文档
https://cloud.google.com/compute/docs/reference/rest/v1/instances/insert
声明 return 类型的调用将是多个状态值的字典。另外,连他们的python examples都显示return类型是dict类型。
实际发生了什么
我所经历的是这个电话实际上给了我 None
:
config = {
'name': "test-machine",
'machineType': "zones/us-central1-c/machineTypes/foobar",
'disks': [
{
'boot': True,
'autoDelete': True,
'deviceName': "test-machine",
...
}
}
operation = compute.instances().insert(project=PROJECT_NAME, zone=ZONE, body=config).execute()
wait_for_operation(compute, PROJECT_NAME, ZONE, operation["name"])
wait_for_operation()
函数直接取自 python 示例:
def wait_for_operation(compute, project, zone, operation):
print('Waiting for operation to finish...')
while True:
result = compute.zoneOperations().get(
project=project,
zone=zone,
operation=operation).execute()
if result['status'] == 'DONE':
print("done.")
if 'error' in result:
raise Exception(result['error'])
return result
time.sleep(1)
然而,我得到这个错误:
Traceback (most recent call last):
File "gcloud_playground.py", line 113, in <module>
wait_for_operation(compute, PROJECT_NAME, ZONE, operation["name"])
TypeError: 'NoneType' object has no attribute '__getitem__'
实际情况是我的实例创建成功,但我不知道是否创建成功。
好的,我明白了。这是我 JSON 的一个格式错误的部分,以某种方式搞砸了 gcloud 发现 api。
我在配置中写到:
"tags" : [ "tag1", "tag2", ... ]
而不是
"tags" : { "items" : [ "tag1", "tag2", ... ] }
这是 gcloud 未能发现的一个非常微妙和愚蠢的错误。
任何人看到这个,你的配置是错误的,发现 api 是错误的。如果你得到一个 None 就和你得到一个 googleapiclient.errors.HttpError
!