Как получить идентификатор вновь созданной резервной копии, используя «Cloud SQL Admin API» с Python? - PullRequest
0 голосов
/ 26 декабря 2018

Я пишу скрипт, используя скрипт 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: 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 изменяется с В ожидании до УСПЕШНО через несколько секунд.Теперь, если я хочу продолжать проверять экземпляр до тех пор, пока его состояние не станет SUCCESSFUL , мне понадобится _id_ недавно созданного экземпляра (для вызова get () метод).

Единственный способ, которым я мог разобраться, - это вызвать метод list () и проверить enqueuedTime элементов списка с помощью insertTime изответ выше и получите идентификатор, затем вызовите метод get () для статуса.Для меня это похоже на хак, есть ли лучший способ следить за состоянием, пока оно не станет УСПЕШНО ?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Google API обрабатывает каждый запрос как операцию, которую можно извлечь из операций () службы, созданной из googleapiclient.discovery .Например:

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, которые возвращают name в ответе.

Для получения дополнительной информации см. Ссылку .

0 голосов
/ 26 декабря 2018

Я нашел этот API также запутанным.Метод insert возвращает объект sql#operation, и он имеет поле GUID-type id.Методы list и get используют объект sql#backupRun и имеют id с типом данных long.Я не нашел способа сопоставить их.

Вы можете использовать поле description для идентификации вашего backupRun.Это не оптимально, но может работать на вас.Укажите уникальное значение в поле description в параметре тела метода вставки.Затем вы можете отфильтровать результат метода списка с описанием и, возможно, также фильтровать type = 'ON_DEMAND' в дополнение к enqueuedTime.Результат списка расположен в обратном хронологическом порядке, поэтому вы должны найти нужный элемент в начале списка.

В документации есть параметр id для параметра insert методов body, но его установка будетподнять ошибку.API все еще находится в бета-версии.Надеюсь, что этот API созревает и изменяется, так что мы можем получить ссылки из вставок, чтобы получить.

...