如何使用 "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 APIbackupRuns 实例编写脚本,该实例具有以下方法:

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=*)

这是 link 到 API:https://developers.google.com/resources/api-libraries/documentation/sqladmin/v1beta4/python/latest/sqladmin_v1beta4.backupRuns.html

我在 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'}

这似乎是一个异步调用,其中 statusPENDING 变为 SUCCESSFUL几秒钟。现在,如果我想继续检查实例,直到它的状态为 SUCCESSFUL,我将需要新创建实例的 _id_(调用get() 方法)。

我唯一能想到的方法是调用 list() 方法并检查 enqueuedTime使用上面响应的 insertTime 列出项目并获取 id,然后调用 get() 方法获取状态。 这对我来说感觉像是一个 hack,有没有更好的方法来观察状态,直到 SUCCESSFUL?

我发现这个 API 也令人困惑。 insert 方法 returns 一个 sql#operation 对象,它有一个 GUID 类型的 id 字段。 listget 方法使用 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_responseinsert_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