yandex-cloud / nodejs-sdk

Yandex.Cloud NodeJS SDK
MIT License
64 stars 13 forks source link

Не понятен вывод createVersion #110

Closed konclave closed 1 year ago

konclave commented 1 year ago

Я пытаюсь создавать новую версию облачной функции:

async function createVersion(content, functionId, runtime, serviceAccountId) {
  const functionService = session.client(serviceClients.FunctionServiceClient);
  const { serverless: { functions_function_service: { CreateFunctionVersionRequest } } } = cloudApi;
  const request = CreateFunctionVersionRequest.fromPartial({
            functionId,
            runtime,
            serviceAccountId,
  });
  request.content = content; // Buffer
  const operation = await functionService.createVersion(request);
  console.log(`Operation cmpleted: ${JSON.stringify(operation)`);
}

При этом в консоли я вижу вывод, но при этом operation.done === false и новая версия функции не создается. Не очень понимаю, что происходит – если какая-то ошибка, то должно быть определено operation.err. Ну или await вызова createVersion не должен завершиться успешно 🤔. А так всё выглядит ок, но почему-то функция не создалась.

В логе операций стоит статус "ошибка".

То есть нужно трактовать done === false как неудачное создание функции?

Полный вывод результата createVersion:

{
    "$type": "yandex.cloud.operation.Operation",
    "id": "***",
    "description": "Create function version",
    "createdBy": "***",
    "done": false,
    "createdAt": "2023-01-16T23:43:19.860Z",
    "modifiedAt": "2023-01-16T23:43:19.860Z",
    "metadata": {
      "$type": "google.protobuf.Any",
      "typeUrl": "type.googleapis.com/yandex.cloud.serverless.functions.v1.CreateFunctionVersionMetadata",
      "value": {
        "type": "Buffer",
        "data": [
          10,
          20,
          100,
          52,
          101,
          50,
          54,
          99,
          56,
          97,
          116,
          113,
          105,
          116,
          98,
          54,
          51,
          111,
          115,
          114,
          52,
          110
        ]
      }
    }
  }
nikolaymatrosov commented 1 year ago

Вы дожидаетесь создания операции, но не ее завершения.

https://cloud.yandex.ru/docs/api-design-guide/concepts/about-async

Вот пример как надо создавать версию функции. https://github.com/yc-actions/yc-sls-function/blob/main/src/main.ts#L204-L205

Когда operation.done, нужно проверить какое из полей вернулось — error или response. Это делается в waitForOperation https://github.com/yandex-cloud/nodejs-sdk/blob/master/src/utils/operation/wait-for.ts

konclave commented 1 year ago

Всё понял, спасибо. Поллинг в цикле с таймаутом было немножко неожиданно, но в целом понятно зачем так сделано.