如何使用 "Cloud SQL Admin API" 和 Python 获取新创建的备份的 ID?
How to get the ID of newly created backup using "Cloud SQL Admin API" with Python?
我正在使用 Cloud SQL Admin API 的 backupRuns 实例编写脚本,该实例具有以下方法:
1. delete(project=*, instance=*, id=*)
2. get(project=*, instance=*, id=*)
3. insert(project=*, instance=*, body=*)
4. list(project=*, instance=*, maxResults=None, pageToken=None)
5. list_next(previous_request=*, previous_response=*)
我在 API 中发现奇怪的是 insert() 方法,当我们 insert/create 一个新备份调用 API,它 returns 以下响应:
{'insertTime': '2018-12-26T06:48:35.675Z',
'kind': 'sql#operation',
'name': 'some-random-string,
'operationType': 'BACKUP_VOLUME',
'selfLink': 'https://www.googleapis.com/sql/v1beta4/projects/project-name/operations/some-random-string',
'status': 'PENDING',
'targetId': 'cloud-instance-name',
'targetLink': 'https://www.googleapis.com/sql/v1beta4/projects/project-name/instances/cloud-instance-name',
'targetProject': 'project-name',
'user': 'some-user@project.iam.gserviceaccount.com'}
这似乎是一个异步调用,其中 status 从 PENDING 变为 SUCCESSFUL几秒钟。现在,如果我想继续检查实例,直到它的状态为 SUCCESSFUL,我将需要新创建实例的 _id_(调用get() 方法)。
我唯一能想到的方法是调用 list() 方法并检查 enqueuedTime使用上面响应的 insertTime 列出项目并获取 id,然后调用 get() 方法获取状态。
这对我来说感觉像是一个 hack,有没有更好的方法来观察状态,直到 SUCCESSFUL?
我发现这个 API 也令人困惑。 insert
方法 returns 一个 sql#operation
对象,它有一个 GUID 类型的 id
字段。 list
和 get
方法使用 sql#backupRun
对象,它们有 id
数据类型 long。我还没有找到任何方法来映射这些。
您可以使用 description
字段来识别您的 backupRun。它不是最佳的,但可以为你工作。在插入方法正文参数的 description
字段中指定一个唯一值。然后,您可以使用描述过滤列表方法结果,除了 enqueuedTime 之外,还可能过滤 type='ON_DEMAND'。列表结果按时间倒序排列,因此您应该在列表的开头找到正确的项目。
insert
方法 body
参数的文档中有一个 id
参数,但设置它会引发错误。 API 仍处于测试阶段。希望这个 API 成熟和改变,以便我们可以从插入到获取链接。
Google API 将每个请求视为可以从 [构建的服务的 operations() 中检索的操作=33=]。例如:
from googleapiclient import discovery
service = discovery.build('sqladmin', 'v1beta4')
#Just insert a backup for an SQL instance or any other operation
insert_response = service.backupRuns().insert(project=<project-id>,instance=<instance-id>, body={}).execute()
#Get the opepration to check the status
insert_operation = service.operations().get(project=<project-id>,operation=insert_response['name']).execute()
此insert_opertation
可用于检查操作的当前状态。
这里是 insert_response
和 insert_operation
的样子:
print(insert_response)
{'insertTime': '2019-01-08T13:04:31.941Z',
'kind': 'sql#operation',
'name': '<unique-name-of-the-operation>',
'operationType': 'BACKUP_VOLUME',
'selfLink': 'https://www.googleapis.com/sql/v1beta4/projects/<project-id>/operations/<unique-name-of-the-operation>',
'startTime': '2019-01-08T13:04:32.052Z',
'status': 'RUNNING',
'targetId': '<instance-name>',
'targetLink': 'https://www.googleapis.com/sql/v1beta4/projects/<project-id>/instances/<instance-name>',
'targetProject': '<project-id>',
'user': '<user>'}
print(insert_operation)
{'endTime': '2018-12-26T13:07:08.746Z',
'enqueuedTime': '2018-12-26T13:06:33.563Z',
'id': '<operation-id>',
'instance': '<instance-name>',
'kind': 'sql#backupRun',
'selfLink': 'https://www.googleapis.com/sql/v1beta4/projects/<project-id>/instances/<instance-name>/backupRuns/<operation-id>',
'startTime': '2018-12-26T13:06:33.563Z',
'status': 'SUCCESSFUL',
'type': 'ON_DEMAND',
'windowStartTime': '2018-12-26T13:06:33.563Z'}
service.operations().get()
可用于获取使用 API 执行的任何操作,其中 return 响应中的 name
。
有关详细信息,请参阅此 link。
我正在使用 Cloud SQL Admin API 的 backupRuns 实例编写脚本,该实例具有以下方法:
1. delete(project=*, instance=*, id=*)
2. get(project=*, instance=*, id=*)
3. insert(project=*, instance=*, body=*)
4. list(project=*, instance=*, maxResults=None, pageToken=None)
5. list_next(previous_request=*, previous_response=*)
我在 API 中发现奇怪的是 insert() 方法,当我们 insert/create 一个新备份调用 API,它 returns 以下响应:
{'insertTime': '2018-12-26T06:48:35.675Z',
'kind': 'sql#operation',
'name': 'some-random-string,
'operationType': 'BACKUP_VOLUME',
'selfLink': 'https://www.googleapis.com/sql/v1beta4/projects/project-name/operations/some-random-string',
'status': 'PENDING',
'targetId': 'cloud-instance-name',
'targetLink': 'https://www.googleapis.com/sql/v1beta4/projects/project-name/instances/cloud-instance-name',
'targetProject': 'project-name',
'user': 'some-user@project.iam.gserviceaccount.com'}
这似乎是一个异步调用,其中 status 从 PENDING 变为 SUCCESSFUL几秒钟。现在,如果我想继续检查实例,直到它的状态为 SUCCESSFUL,我将需要新创建实例的 _id_(调用get() 方法)。
我唯一能想到的方法是调用 list() 方法并检查 enqueuedTime使用上面响应的 insertTime 列出项目并获取 id,然后调用 get() 方法获取状态。
这对我来说感觉像是一个 hack,有没有更好的方法来观察状态,直到 SUCCESSFUL?
我发现这个 API 也令人困惑。 insert
方法 returns 一个 sql#operation
对象,它有一个 GUID 类型的 id
字段。 list
和 get
方法使用 sql#backupRun
对象,它们有 id
数据类型 long。我还没有找到任何方法来映射这些。
您可以使用 description
字段来识别您的 backupRun。它不是最佳的,但可以为你工作。在插入方法正文参数的 description
字段中指定一个唯一值。然后,您可以使用描述过滤列表方法结果,除了 enqueuedTime 之外,还可能过滤 type='ON_DEMAND'。列表结果按时间倒序排列,因此您应该在列表的开头找到正确的项目。
insert
方法 body
参数的文档中有一个 id
参数,但设置它会引发错误。 API 仍处于测试阶段。希望这个 API 成熟和改变,以便我们可以从插入到获取链接。
Google API 将每个请求视为可以从 [构建的服务的 operations() 中检索的操作=33=]。例如:
from googleapiclient import discovery
service = discovery.build('sqladmin', 'v1beta4')
#Just insert a backup for an SQL instance or any other operation
insert_response = service.backupRuns().insert(project=<project-id>,instance=<instance-id>, body={}).execute()
#Get the opepration to check the status
insert_operation = service.operations().get(project=<project-id>,operation=insert_response['name']).execute()
此insert_opertation
可用于检查操作的当前状态。
这里是 insert_response
和 insert_operation
的样子:
print(insert_response)
{'insertTime': '2019-01-08T13:04:31.941Z',
'kind': 'sql#operation',
'name': '<unique-name-of-the-operation>',
'operationType': 'BACKUP_VOLUME',
'selfLink': 'https://www.googleapis.com/sql/v1beta4/projects/<project-id>/operations/<unique-name-of-the-operation>',
'startTime': '2019-01-08T13:04:32.052Z',
'status': 'RUNNING',
'targetId': '<instance-name>',
'targetLink': 'https://www.googleapis.com/sql/v1beta4/projects/<project-id>/instances/<instance-name>',
'targetProject': '<project-id>',
'user': '<user>'}
print(insert_operation)
{'endTime': '2018-12-26T13:07:08.746Z',
'enqueuedTime': '2018-12-26T13:06:33.563Z',
'id': '<operation-id>',
'instance': '<instance-name>',
'kind': 'sql#backupRun',
'selfLink': 'https://www.googleapis.com/sql/v1beta4/projects/<project-id>/instances/<instance-name>/backupRuns/<operation-id>',
'startTime': '2018-12-26T13:06:33.563Z',
'status': 'SUCCESSFUL',
'type': 'ON_DEMAND',
'windowStartTime': '2018-12-26T13:06:33.563Z'}
service.operations().get()
可用于获取使用 API 执行的任何操作,其中 return 响应中的 name
。
有关详细信息,请参阅此 link。