我正在使用 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中发现的奇怪之处是 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 ?
答案 0 :(得分:1)
我发现此API也令人困惑。 insert
方法返回一个sql#operation
对象,它具有GUID类型的id
字段。 list
和get
方法使用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_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()
可用于获取使用在响应中返回name
的API执行的任何操作。
有关更多信息,请参阅此link。