yandex-cloud / nodejs-sdk

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

InstanceService update #15

Open wsnnn opened 4 years ago

wsnnn commented 4 years ago

С помощью метода update(InstanceService) пытаюсь изменить resources_spec.

В доках: _"Поля, которые требуется изменить, указываются в запросе в поле updatemask". В заголовках sdk прописан в camelCase как updateMask. Но если заполнять его как updateMask, то при выполнении пишет ошибку: UnhandledPromiseRejectionWarning: Error: 3 INVALID_ARGUMENT: Validation failed: - update_mask: Field mask cannot be empty Если поменять на 'update_mask', то начинает работать.

А далее основная проблема, в 'update_mask' надо указать поля, которые будут заменены. Главный вопрос, из каких доков по API яндекса брать названия, из REST(там поле называется "resourcesSpec") или из gRPC(там "resources_spec"), или так, как указано в ответе Operation(get/list, "resources")?

Задача, изменить resourcesSpec на что-то подобное:

resourcesSpec: {memory: 4, cores: 4, coreFraction: 100},

Это не срабатывает, опять же, не понятно, в каком именно формате указывать поля и значения. В ответ ошибка: (node:2587) UnhandledPromiseRejectionWarning: Error: 3 INVALID_ARGUMENT: Request validation error: Unable to update selected parameters at once.

Можно посмотреть работающий пример метода update в рамках данного SDK?

monsterzz commented 4 years ago

А далее основная проблема, в 'update_mask' надо указать поля, которые будут заменены. Главный вопрос, из каких доков по API яндекса брать названия, из REST(там поле называется "resourcesSpec") или из gRPC(там "resources_spec"), или так, как указано в ответе Operation(get/list, "resources")?

Правильно брать названия полей из gRPC.

Это не срабатывает, опять же, не понятно, в каком именно формате указывать поля и значения. В ответ ошибка: (node:2587) UnhandledPromiseRejectionWarning: Error: 3 INVALID_ARGUMENT: Request validation error: Unable to update selected parameters at once.

Не все параметры могут быть изменены вместе. Пришлите, пожалуйста, всё тело запроса, чтобы понять что именно идет не так. Как вариант можно открыть кейс в техническую поддержку и они передадут информацию команде сервиса Compute Cloud

wsnnn commented 4 years ago

Ниже код упрощен, суть - сначала получаем instance, потом изменяем его(опущены все условности, типа проверки состояния и т.п.)

const {Session} = require('yandex-cloud');
let _session = new Session({oauthToken: "TOKEN"})
const {InstanceService} = require('yandex-cloud/api/compute/v1')
let instanceService = new InstanceService(_session)
let _instanceId = "ID"
let self = this;

instanceService.get({instanceId: _instanceId, view: "FULL"}).then((instance) => {
    console.log(instance);

    self.instanceService.update({
        'update_mask': 'resources_spec',

        instanceId: instance.id,
        platformId: instance.platformId,
        name: instance.name,
        serviceAccountId: instance.serviceAccountId,
        //resourcesSpec:{core_fraction:100},
        resourcesSpec:{memory: 4*1024*1024*1024, cores: 4, core_fraction: 100},

    }).then((r) => {
        console.log(r); 
    })
 })

Если попробовать менять только один параметр за раз, например 'core_fraction', то в ошибке потребует указать обязательное значение "cores" Error: 3 INVALID_ARGUMENT: resourcesSpec.cores: Int value should be greater than or equal to 1. А так ошибка, описанная постом выше.