Объект Operation
Каждая операция, которая изменяет состояние ресурса, приводит к созданию объекта Operation
С помощью объекта Operation
вы можете:
- Отслеживать статус операций, которые занимают неопределенное время. Например, запуск виртуальной машины или подключение диска.
- Отменять операции.
- Просматривать список операций, которые были выполнены над заданным ресурсом.
Формат объекта Operation
Объект Operation
содержит поля:
Поле | Описание |
---|---|
id * |
string Идентификатор операции. Генерируется на стороне сервиса. |
created_at * |
google.protobuf.Timestamp Время запуска операции. Указывается в формате RFC3339 (Timestamps) |
created_by * |
string Идентификатор пользователя, запустившего операцию. |
modified_at * |
google.protobuf.Timestamp Время последнего изменения ресурса. Указывается в формате RFC3339 (Timestamps) |
done * |
bool Статус операции. Принимает одно из двух значений: true— операция завершена. Обратите внимание, операция считается завершенной, даже если в ходе ее выполнения возникла ошибка. false— операция не завершена. |
response |
google.protobuf.Any Поле присутствует только в том случае, если операция была успешно завершена. Для методов Create и Update поле response содержит представление созданного или измененного ресурса. Для других операций поле может содержать пустое сообщение google.protobuf.EmptyПоля response и error являются взаимоисключающими. Ответ не может одновременно содержать оба поля. |
error |
google.rpc.Status Сообщение об ошибке. Поле присутствует в том случае, если в ходе выполнения операции возникла ошибка. Поле error может появиться в ответе до того, как операция была завершена: когда возникает ошибка, сервис сразу добавляет поле error в объект Operation . Одновременно с этим сервис начинает откатываться к предыдущему состоянию: завершает все запущенные процедуры и удаляет ресурсы, которые были созданы в ходе операции. Только когда сервис вернется к предыдущему состоянию, операция будет считаться завершенной и значение ее поля done будет выставлено в true. Поля response и error являются взаимоисключающими. Ответ не может одновременно содержать оба поля. |
metadata |
google.protobuf.Any Метаданные операции. Обычно в поле содержится идентификатор ресурса, над которым выполняется операция. Если метод возвращает объект Operation , в описании метода приведена структура соответствующего ему поля metadata . |
description |
string Описание операции. Максимальная длина составляет 256 символов. |
* Обязательное поле.
Отслеживание статуса операции
Узнать статус операции можно с помощью метода Get
// Возвращает объект Operation по заданному идентификатору.
rpc Get (GetOperationRequest) returns (operation.Operation) {
option (google.api.http) = {
get: "/operations/{operation_id}"
};
}
message GetOperationRequest {
// Идентификатор операции.
string operation_id = 1;
}
Пример REST запроса на получение статуса операции:
GET https://operation.api.cloud.yandex.net/operations/fcmq0j5033e516c56ctq
Отмена операции
Отменить операцию можно с помощью метода Cancel
// Отменяет заданную операцию.
rpc Cancel (CancelOperationRequest) returns (operation.Operation) {
option (google.api.http) = {
post: "/operations/{operation_id}:cancel"
};
}
message CancelOperationRequest {
// Идентификатор операции, которую нужно отменить.
string operation_id = 1;
}
Пример отмены операции в REST:
POST https://operation.api.cloud.yandex.net/operations/a3s17h9sbq5asdgss12:cancel
В ответ сервер вернет объект Operation
, который будет содержать текущий статус отменяемой операции.
Отменять можно только те операции, которые изменяют состояние ресурсов. В справочниках все операции, для которых возможна отмена, отмечены явно.
Примечание
Метод Cancel
работает по принципу Best Effort. Вызов метода не гарантирует, что операция будет отменена. Операция может находиться на стадии, когда отмена уже невозможна.
Просмотр списка операций
Для просмотра списка операций, которые были выполнены над заданным ресурсом, предназначен метод ListOperations
. Метод поддерживает постраничное отображение результатов.
Обратите внимание, метод ListOperations
позволяет получить список операций только над конкретным ресурсом, но не над категорией ресурсов. Например, вы не сможете посмотреть историю операций, которые производились над всеми дисками в вашем облаке.
Пример gRPC-описания метода ListOperations
// Выводит список операций, которые были произведены над заданным диском.
rpc ListOperations (ListDiskOperationsRequest)
returns (ListDiskOperationsResponse) {
option (google.api.http) = {
get: "/compute/v1/disks/{disk_id}/operations"
};
}
message ListDiskOperationsRequest {
// Идентификатор диска.
string disk_id = 1;
// Максимальное количество результатов на странице ответа.
int64 page_size = 2;
// Токен запрашиваемой страницы с результатами.
string page_token = 3;
}
message ListDiskOperationsResponse {
// Список операций, выполненных над заданным диском.
repeated operation.Operation operations = 1;
// Токен следующей страницы с результатами.
string next_page_token = 2;
}
Максимальное значение поля page_size
равно 1000.
Пример запроса списка операций в REST:
GET https://compute.api.cloud.yandex.net/compute/v1/disks/e0m97h0gbq0foeuis03/operations
Ответ сервера:
{
"operations": [
{
"id": "fcmq0j5033e516c56ctq",
"createdAt": "2018-08-29T18:31:15.311Z",
"createdBy": "v1swrh5sbqs5sdgss15",
"done": true,
"metadata": {
"@type": "type.googleapis.com/yandex.cloud.compute.v1.CreateDiskMetadata",
"diskId": "sfg36d6sbq5asdgfs01"
},
"response": {
"@type": "type.googleapis.com/yandex.cloud.compute.v1.Disk",
"id": "sfg36d6sbq5asdgfs01",
"folderId": "a3s17h9sbq5asdgss12",
"name": "disk-1",
"description": "Test disk",
"zoneId" : "ru-central1-a",
"typeId" : "network-nvme",
"size" : 10737418240
}
},
...
]
}