如何通过Python使用“ Cloud SQL Admin API”获取新创建的备份的ID?

时间:2018-12-26 07:23:01

标签: google-cloud-platform google-cloud-sql

我正在使用 Cloud SQL Admin API backupRuns 实例编写脚本,该实例具有以下方法:
1.删​​除(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的链接:https://developers.google.com/resources/api-libraries/documentation/sqladmin/v1beta4/python/latest/sqladmin_v1beta4.backupRuns.html

我在API中发现的奇怪之处是 insert()方法,当我们插入/创建一个调用该API方法的新备份时,它返回以下响应: {'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()方法并使用 insertTime检查列表项的 enqueuedTime 并获取ID,然后调用 get()方法获取状态。 在我看来,这是一种骇客,有没有更好的方法来监视状态,直到状态为 SUCCESSFUL

2 个答案:

答案 0 :(得分:1)

我发现此API也令人困惑。 insert方法返回一个sql#operation对象,它具有GUID类型的id字段。 listget方法使用sql#backupRun对象,并且它们的id的数据类型为long。我还没有找到任何映射这些方法的方法。

您可以使用description字段来标识您的backupRun。这不是最佳选择,但可以为您工作。在插入方法主体参数的description字段中指定一个唯一值。然后,您可以使用描述过滤列表方法的结果,并且除了enqueuedTime之外,还可以过滤type ='ON_DEMAND'。列表结果按时间倒序排列,因此您应该在列表的开头找到正确的项目。

文档中有id个参数,其中有insert个方法body参数,但设置该参数将引发错误。该API仍处于测试阶段。希望此API能够成熟和更改,以便我们可以进行从插入到获取的链接。

答案 1 :(得分:0)

Google API将每个请求都视为一个操作,可以从 googleapiclient.discovery 构建的服务的 operations()中进行检索。例如:

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()可用于获取使用在响应中返回name的API执行的任何操作。

有关更多信息,请参阅此link