# VM Service Discovery & Implementation Details ## Обзор Сервис управления виртуальными машинами (VM) в облаке Nubes. Позволяет выполнять операции полного жизненного цикла: создание, изменение, остановка, запуск, удаление. **ВАЖНО:** Удаление ВМ происходит через механизм карантина (`suspend`), аналогично VDC. Реальное удаление происходит через 14 дней административными процессами облака. ## API Endpoints * **Base URL**: `/api/v1/index.cfm` * **Service ID**: 28 ### Основные методы | Операция | HTTP метод | URL | Описание | | :--- | :--- | :--- | :--- | | **Create Draft** | `POST` | `/instances` | Создание черновика инстанса. | | **Start Op** | `POST` | `/instanceOperations` | Инициация операции (create, modify, suspend, resume). | | **Add Params** | `POST` | `/instanceOperationCfsParams` | Добавление параметров к операции. | | **Validate** | `GET` | `/instanceOperations/{opId}/validate-cfs` | Валидация (опционально). | | **Run Op** | `POST` | `/instanceOperations/{opId}/run` | Запуск выполнения операции. | ## Parameter Mapping (Code & IDs) API использует `svcOperationCfsParamId` для идентификации параметров. **Внимание:** ID отличаются для создани (`create`) и изменения (`modify`). В провайдере (v1.0.3+) реализована логика маппинга по `code` (имени), а также fallback на ID. | Parameter Name (Terraform) | API Code | Create ID | Modify ID | Тип данных | Описание | | :--- | :--- | :--- | :--- | :--- | :--- | | `vapp_uid` | `vappUid` | **407** | - | String | UUID vApp контейнера | | `vm_name` | `vmName` | **408** | - | String | Уникальное имя ВМ | | `vm_cpu` | `vmCpu` | **409** | **493** | Int | Кол-во ядер | | `vm_ram` | `vmRam` | **410** | **494** | Int | RAM (GB) | | `vm_disk` | `vmDisk` | **411** | **495**? | Int | Доп. диск (GB) | | `ip_space_name` | `ipSpaceName` | **412** | **496** | String | Public IP setting ("no-needed") | | `access_ip_list` | `accessIpList` | **413** | **497** | JSON/List | Whitelist IP | | `image_vm` | `imageVm` | **414** | - | String | OS Template (e.g. Ubuntu_22-20G) | | `cloud_init` | `cloudInit` | **415** | - | String | YAML конфиг | | `user_login` | `userLogin` | **416** | - | String | Admin User | | `user_public_key` | `userPublicKey` | **417** | - | String | SSH Key (OpenSSH) | | `access_port_list` | `accessPortList` | **448** | **498** | JSON/List | Whitelist Ports | | `need_add_zabbix_template` | `needAddZabbixTemplate` | **449** | **499** | Bool | Мониторинг | ## Операции и Жизненный цикл ### Create (Создание) 1. `POST /instances` -> создает объект. 2. `POST /instanceOperations` (op="create"). 3. Заполняются параметры 407-449. 4. `Run`. ### Modify (Изменение) 1. `POST /instanceOperations` (op="modify"). 2. Заполняются параметры (ID 493-499). 3. `Run`. 4. Влияет на ресурсы (CPU, RAM), сеть и мониторинг. Имя и OS обычно не меняются. ### Suspend (Карантин/Удаление) 1. `POST /instanceOperations` (op="suspend"). 2. `Run` (обычно без параметров). 3. ВМ останавливается и помечается для удаления. ### Resume (Восстановление) 1. `POST /instanceOperations` (op="resume"). 2. `Run`. 3. ВМ запускается из состояния `suspend`. ## Реализация Terraform ### Deletion Protection Ресурс `nubes_vm_instance` поддерживает параметр `deletion_protection` (default: `true`). * **true**: При `terraform destroy` ресурс удаляется только из tfstate. В облаке остается активным. * **false**: При `terraform destroy` выполняется операция **suspend**. ВМ выключается и попадает в карантин (14 дней). ### Modify Logic Метод `Update` распознает изменения и вызывает операцию `modify`. Параметры CPU, RAM, PortList, IpList, Zabbix и др. обновляются. Параметры создания (Template, Login, Key, vApp, Name) обычно immutable или требуют пересоздания (ForceNew). ## Результаты анализа HAR * `vmOK.har`: Успешное создание ВМ. Подтверждены ID 407-449. * `vmsuspendresumemodify.har`: Анализ операций `modify` (ID 493-499), `suspend`, `resume`. ## Известные проблемы * API не возвращает `code` (имя параметра) в некоторых случаях, полагаемся на хардкод маппинг ID или порядок. (Исправлено в v1.0.3 через универсальный маппер). * `accessIpList` и `accessPortList` требуют явной передачи зависимостей JSON/Array даже если пусты.