Функция доступна в версии провайдера 4.5.1 и выше.

_Resource_ функция **decort_cb_kvmvm** служит для управления виртуальными машинами, создаваемыми на платформе DECORT на базе технологии виртуализации KVM.

Важно: при удалении в конфигурационном файле Terraform любого блока disks, на платформе будет удален последний. При необходимости удалить не последний блок, рекомендуем пользоваться web интерфейсом платформы. Поведение будет исправлено в следующих версиях.

### Критичные изменеия в версии 4.11.2

На платформе dynamix, поле stack_id изменено на node_id. В конфигурации ресурса (при использовании) необходимо переименовать соответствующее поле и установить значение значение node_id.

### Работа с полем weight в блоке network

В версии 4.7.0 в блоке network добавлено опциональное поле weight, которое можно использовать, в случае, когда необходимо указать порядок подключения сетей, т.к. по умолчанию сети подключаются в случайном порядке.
Сети с наименьшим весом будут подключены в первую очередь. Сети с неуказанным или нулевым значением будут подключены в последнюю очередь (иметь наименьший приоритет)
В случае, если все сети не имеют параметра весов, подключение будет производится как и раньше.
При выполнении update сортироваться будут только вновь подключаемые сети, порядок уже подключенных сетей остается без изменения.
Так же следует обратить внимание, что если при update была отключена какая либо сеть, то вновь подключаемые сети с наименьшим весом сети займут ранее освобожденные интерфейсы, и только после будут добавляться в конец списка подключенных сетей.
При изменении или удалении данного поля, в уже созданном ресурсе, сеть будет считаться вновь подключаемой и следовательно будет отключена от VM и подключена по новой, с учетом веса подключаемых сетей.

### Смена image_id (redeploy)

При смене образа компьюта `image_id`, логика работы следующая:
- выполняется выключение компьюта (compute/stop) берутся параметры: `force_stop`, по умолчанию: false (чтобы избежать некорректной работы);
- после выполняется redeploy с новым образом, а так же, берутся следующие параметры: diskSize (из `boot_disk_size`), dataDisks - KEEP (начиная с 4.8.2) autoStart из поля `started` и forceStop (`force_stop` по умолчанию false).

### Обработка ошибок

При работе с ресурсом **decort_cb_kvmvm** могут возникать различные ошибки. Ниже приведены наиболее распространенные ошибки и способы их устранения:

#### Ошибки при создании ресурса

**Ошибка: "can't create Compute because rgID %d is not allowed or does not exist"**

**Причина:** Указанный идентификатор ресурсной группы не существует или недоступен для текущего пользователя.

**Решение:**
1. Проверьте правильность указанного `rg_id` в конфигурации Terraform.
2. Убедитесь, что ресурсная группа существует и доступна вашему аккаунту.
3. Используйте data source `decort_cb_rg` для проверки существования ресурсной группы:
   ```terraform
   data "decort_cb_rg" "my_rg" {
     rg_id = 12345
   }
   ```

**Ошибка: "can't create Compute because imageID %d is not allowed or does not exist"**

**Причина:** Указанный идентификатор образа не существует или недоступен для использования.

**Решение:**
1. Проверьте правильность указанного `image_id` в конфигурации.
2. Убедитесь, что образ существует и доступен для вашего аккаунта.
3. Используйте data source `decort_cb_image` для проверки существования образа:
   ```terraform
   data "decort_cb_image" "my_image" {
     image_id = 12345
   }
   ```
4. Если образ не указан, но требуется загрузочный диск, убедитесь, что указан параметр `without_boot_disk = true`.

**Ошибка: "can't create Compute because block disks have more 1 disk type 'B'"**

**Причина:** В блоке `disks` указано более одного диска с типом "B" (загрузочный диск). В конфигурации может быть только один загрузочный диск.

**Решение:**
1. Проверьте блок `disks` в конфигурации Terraform.
2. Убедитесь, что только один диск имеет `disk_type = "B"` или не указывайте `disk_type` для загрузочного диска (он создается автоматически).
3. Для дополнительных дисков используйте `disk_type = "D"` или не указывайте тип (по умолчанию будет "D").

**Ошибка: "can't create compute because vins ID %d is not allowed or does not exist"**

**Причина:** Указанный идентификатор VINS (виртуальной сети) не существует или недоступен.

**Решение:**
1. Проверьте правильность `net_id` в блоке `network` с `net_type = "VINS"`.
2. Убедитесь, что VINS существует и доступен вашему аккаунту.
3. Используйте data source `decort_cb_vins` для проверки:
   ```terraform
   data "decort_cb_vins" "my_vins" {
     vins_id = 12345
   }
   ```

**Ошибка: "can't create compute because extnet ID %d is not allowed or does not exist"**

**Причина:** Указанный идентификатор внешней сети (EXTNET) не существует или недоступен.

**Решение:**
1. Проверьте правильность `net_id` в блоке `network` с `net_type = "EXTNET"`.
2. Убедитесь, что внешняя сеть существует и доступна.
3. Используйте data source `decort_cb_extnet` для проверки существования сети.

**Ошибка: "can't create compute because vfpool ID %d is not allowed or does not exist"**

**Причина:** Указанный идентификатор пула виртуальных функций (VFPool) не существует или недоступен.

**Решение:**
1. Проверьте правильность `net_id` в блоке `network` с `net_type = "VFNIC"`.
2. Убедитесь, что VFPool существует и доступен.
3. Используйте data source `decort_cb_vfpool` для проверки.

**Ошибка: "can't create compute because DPDK ID %d is not allowed or does not exist"**

**Причина:** Указанный идентификатор DPDK сети не существует или недоступен.

**Решение:**
1. Проверьте правильность `net_id` в блоке `network` с `net_type = "DPDK"`.
2. Убедитесь, что DPDK сеть существует и доступна.
3. При использовании DPDK сети убедитесь, что указан параметр `hp_backed = true`.
4. Используйте data source `decort_cb_dpdknet` для проверки.

**Ошибка: "can't create compute because TRUNK ID %d is not allowed or does not exist"**

**Причина:** Указанный идентификатор TRUNK сети не существует или недоступен.

**Решение:**
1. Проверьте правильность `net_id` в блоке `network` с `net_type = "TRUNK"`.
2. Убедитесь, что TRUNK сеть существует и доступна.
3. Используйте data source `decort_cb_trunk` для проверки.

#### Ошибки при обновлении ресурса

**Ошибка: "The resource cannot be updated because it has been destroyed"**

**Причина:** Ресурс был уничтожен и находится в статусе "DESTROYED".

**Решение:**
1. Проверьте статус ресурса через веб-интерфейс платформы или API.
2. Если ресурс был удален, его необходимо пересоздать. Удалите ресурс из состояния Terraform и создайте заново:
   ```bash
   terraform state rm decort_cb_kvmvm.your_resource
   terraform apply
   ```
3. Если ресурс находится в корзине, используйте параметр `restore = true` для восстановления.

**Ошибка: "The compute is in progress with status: %s"**

**Причина:** Вычислительная машина находится в процессе выполнения операции (например, DELETING, DESTROYING, REDEPLOYING).

**Решение:**
1. Дождитесь завершения текущей операции.
2. Проверьте статус ресурса через веб-интерфейс или API.
3. Повторите операцию после завершения текущей.

**Ошибка: "The compute is in status: %s, please, contact support for more information"**

**Причина:** Ресурс вечно находится в статусе "MODELED", что указывает на проблему, требующую вмешательства поддержки.

**Решение:**
1. Обратитесь в службу поддержки платформы.
2. Предоставьте идентификатор ресурса и описание проблемы.
3. Не пытайтесь выполнять операции с ресурсом до решения проблемы поддержкой.

**Ошибка: "Cannot pin to node a VM, that is not started and stack_id is not set"**

**Причина:** Попытка закрепить виртуальную машину на ноде, когда она не запущена или не указан node_id.

**Решение:**
1. Необходимо установить параметр `pin_to_node=false`, выполнить terraform apply.
2. Установите параметр `started=true` или укажите целевой `node_id`, установите параметр `pin_to_node=true`:
   ```terraform
   resource "decort_cb_kvmvm" "vm" {
     # ... другие параметры ...
     started = true
     node_id = 5,
     pin_to_node = true
   }
   ```

**Ошибка: "Cannot resize compute ID %d: enable 'force_resize' to reduce compute vCPUs"**

**Причина:** Попытка уменьшить количество CPU без установки флага `force_resize`.

**Решение:**
1. Установите параметр `force_resize = true` в конфигурации Terraform.
2. Убедитесь, что виртуальная машина остановлена перед уменьшением CPU (если требуется).
3. Выполните обновление:
   ```terraform
   resource "decort_cb_kvmvm" "vm" {
     # ... другие параметры ...
     cpu = 2  # уменьшение с большего значения
     force_resize = true
   }
   ```

**Ошибка: "can't update Compute because rgID %d not allowed or does not exist"**

**Причина:** При обновлении указан несуществующий или недоступный идентификатор ресурсной группы.

**Решение:**
1. Проверьте правильность `rg_id` в конфигурации.
2. Убедитесь, что ресурсная группа существует и доступна.
3. Обратите внимание, что изменение `rg_id` может быть невозможно для существующего ресурса.

**Ошибка: "can't update Compute because imageID %d not allowed or does not exist"**

**Причина:** При обновлении указан несуществующий или недоступный идентификатор образа.

**Решение:**
1. Проверьте правильность `image_id` в конфигурации.
2. Убедитесь, что образ существует и доступен.
3. При смене образа виртуальная машина будет переразвернута (redeploy).

**Ошибка: "can't update Compute because block disks have more 1 disk type 'B'"**

**Причина:** В блоке `disks` при обновлении указано более одного диска типа "B".

**Решение:**
1. Проверьте блок `disks` в конфигурации.
2. Убедитесь, что только один диск имеет тип "B" или не указывайте тип для загрузочного диска.

#### Ошибки при чтении ресурса

**Ошибка: "The resource cannot be read because it has been destroyed"**

**Причина:** Ресурс был уничтожен и находится в статусе "DESTROYED".

**Решение:**
1. Если ресурс был удален намеренно, удалите его из состояния Terraform:
   ```bash
   terraform state rm decort_cb_kvmvm.your_resource
   ```
2. Если ресурс должен существовать, проверьте его статус через веб-интерфейс или API.
3. Если ресурс находится в корзине, восстановите его с помощью `restore = true`.

#### Общие рекомендации

1. **Проверка существования ресурсов:** Перед использованием идентификаторов ресурсов (rg_id, image_id, net_id и т.д.) рекомендуется использовать соответствующие data source функции для проверки их существования.

2. **Проверка статуса:** Перед выполнением операций обновления убедитесь, что ресурс находится в подходящем статусе (не в процессе выполнения операции).

3. **Валидация конфигурации:** Используйте `terraform validate` для проверки синтаксиса конфигурации перед применением.

4. **Логирование:** При возникновении ошибок проверьте логи Terraform для получения дополнительной информации.

5. **Версии провайдера:** Убедитесь, что используете актуальную версию провайдера, так как некоторые ошибки могут быть исправлены в новых версиях.

6. **Соответствие версий:** Версия платформы DECORT должна соответствовать версии Terraform провайдера. Несоответствие версий может привести к ошибкам при работе с ресурсами. Убедитесь, что используете совместимые версии платформы и провайдера.

7. **Импорт ресурсов после изменений на платформе:** При изменении ресурса напрямую через веб-интерфейс платформы или API (вне Terraform) может возникнуть расхождение между фактическим состоянием ресурса на платформе и состоянием в Terraform. В таких случаях необходимо выполнить импорт ресурса в состояние Terraform:
   ```bash
   terraform import decort_cb_kvmvm.your_resource <compute_id>
   ```
   После импорта выполните `terraform plan` для проверки различий и при необходимости обновите конфигурацию.

## Аргументы
_Resource_ функция **decort_cb_kvmvm** принимает следующие аргументы:

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| name | string | :heavy_check_mark: | Имя виртуальной машины. Обратите внимание, что имя должно быть уникальным в рамках ресурсной группы. |
| rg_id | int | :heavy_check_mark: | Идентификатор ресурсной группы, которой принадлежит данная виртуальная машина. |
| cpu | int | :heavy_check_mark: | Количество процессоров. |
| ram | int | :heavy_check_mark: | Объём оперативной памяти в МБ.<br/> |
| storage_policy_id | int | :heavy_check_mark: | ID политики хранения |
| chipset | string | Тип эмулируемой системы |
| boot_disk_size | int | :x: | Размер загрузочного диска виртуальной машины в ГБ. |
| boot_disk_cache | string | :x: | Установка режима кэширования для загрузочного диска. Возможные варианты: "none" или "writethrough" |
| image_id | int | :x: | Идентификатор образа, на базе которого создаётся загрузочный диск виртуальной машины.<br/> |
| sep_id | int | :x: | ID SEP для создания загрузочного диска. Если не задан, будет использоваться sepId образа. Значение по умолчанию 0. |
| pool | string | :x: | Пул (если установлен sepId). Если значение не задано, то пул будет выбран системой. |
| cloud_init | string | :x: | Используется на этапе создания вм.<br/>Параметры для утилиты _cloud_init_, которая используется на платформе DECORT для первичного конфигурирования виртуальной машины после её создания. Файл в формате JSON. Если ранее конфигурация cloud_init ранее была создана в формате YAML, можно воспользоваться любым онлайн конвертером, например: https://onlineyamltools.com/convert-yaml-to-json |
| description | string | :x: | Текстовое описание виртуальной машины. |
| force_resize | bool | :x: | Флаг для изменения CPU и RAM в принудительном порядке |
| started | bool | :x: | Флаг запуска машины,<br/>по умолчанию - true.<br/>Если true - машина включена,<br/>если false - выключена. |
| alt_boot_id | int | :x: | ID live CD-ROM для загрузки образа. |
| node_id | int | :x: | id ноды |
| is | string | :x: | Наименование системы |
| ipa_type | string | :x: | Тип аутентификатора |
| custom_fields | string | :x: | Кастомные поля |
| network | []Struct [см. ниже](#описание-блока-network-args) | :x: | Параметры сетевого подключения.<br/>Если нужно сконфигурировать несколько сетевых подключений, данный блок можно задавать многократно - по одному на каждое подключение. |
| affinity_label | string | :x: | Метка для правил affinity |
| affinity_rules | []Struct [см. ниже](#описание-блока-affinity_rules-args) | :x: | Блок описания правил affinity. Блоков может быть несколько, один или отсутствовать. |
| anti_affinity_rules | []Struct [см. ниже](#описание-блока-anti_affinity_rules-args) | :x: | Блок описания правил anti-affinity. Блоков может быть несколько, один или отсутствовать. |
| disks | []Struct [см. ниже](#описание-блока-disks-args) | :x: | Описание диска. Таких может быть любое кол-во, либо не быть вообще |
| extra_disks | []int | :x: | Список идентификаторов дополнительных дисков, которые подключены к данной виртуальной машине помимо загрузочного диска. Если такие диски отсутствуют, то список будет пустым. |
| tags | []Struct [см. ниже](#описание-блока-tags-args) | :x: | Задание тэгов компьюта |
| port_forwarding | []Struct [см. ниже](#описание-блока-port_forwarding-args) | :x: | Настройка порт форвардинга для компьюта |
| user_access | []Struct [см. ниже](#описание-блока-user_access-args) | :x: | Предоставление доступов к компьюту |
| snapshot | []Struct [см. ниже](#описание-блока-snapshot-args) | :x: | Создание мнапшотов |
| rollback | []Struct [см. ниже](#описание-блока-rollback-args) | :x: | Rollback на определенный снапшот |
| cd | []Struct [см. ниже](#описание-блока-cd-args) | :x: | Добавление диска cd rom |
| pin_to_node | bool | :x: | Флаг, отвечающий за добавление кмпьюта на ноду |
| auto_start_w_node | bool | :x: | Флаг, отвечающий за автостарт при рестарте ноды |
| force_pin | bool | :x: | Флаг для принудительного добавления компьюта на ноду |
| enabled | bool | :x: | Флаг доступности компьюта для проведения с ним операций |
| pause | bool | :x: | Флаг, отвечающий за pause/resume компьюта |
| reset | bool | :x: | Флаг, отвечающий за reset компьюта |
| restore | bool | :x: | Восстановить удаленный компьют из корзины |
| force_stop | bool | :x: | Флаг, отвечающий за стоп при редеплое компьюта |
| detach_disks | bool | :x: | Отсоединение прикрепленных к виртуальной машине дисков перед ее удалением. Параметр считывается только при использовании команды `terraform destroy`, то есть только при удалении ресурса |
| permanently | bool | :x: | Мгновенное удаление виртуальной машины, минуя корзину. Параметр считывается только при использовании команды `terraform destroy`, то есть только при удалении ресурса |
| cpu_pin | bool | :x: | Необходимость запускать ВМ на выделенных CPU ядрах |
| preferred_cpu | []int | :x: | Список ядер для использования в механизме vcpupinning. Количество указанных ядер должно быть равно количеству виртуальных процессоров ВМ. Игнорируется если cpu_pin=false или pin_to_node=false|
| numa_affinity | string | :x: | Необходимость выравнивать ВМ по NUMA. Возможные значения - "none, "strict", "loose" |
| hp_backed | bool | :x: | Необходимость использовать для выделения RAM виртуальной машины Huge Pages ядрах |
| read_only | bool | :x: | Режим "только чтение". При значении `true` любые изменения конфигурации недоступны, можно только получать информацию. |
| without_boot_disk | bool | :x: | Флаг отсутствия загрузочного диска |
| pci_devices | []int | :x: | Список PCI девайсов |
| libvirt_settings | []Struct [см. ниже](#описание-блока-libvirt_settings-args) | :x: | Конфигурация параметров libvirt virtio интерфейса |
| loader_type | string | :x: | Тип ВМ. Возможные значения - linux, windows, unknown|
| boot_type | string | :x: | Тип загрузки образа. Возможные значения - bios, uefi |
| hot_resize | bool | :x: | Изменение размера ВМ |
| network_interface_naming | string | :x: | Наименование сетевого интерфейса. Возможные значения - eth, ens |
| security_groups | []Struct [см. ниже](#описание-блока-security_groups) | :x: | Добавление групп безопасности для сетей |
| zone_id | int | :x: | Идентификатор экземпляра zone |
| os_version | string | :x: | Версия ОС, установленная на ВМ |
| boot_disk_blk_discard | bool | :x: | Включение режима unmap для boot диска |

### Описание блока disks args

> При изменении параметров `pool` и `sep_id` для обновления ресурса может возникнуть необходимость синхронизации состояния при помощи команды `terraform refresh`

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| disk_name | string | :heavy_check_mark: | Наименование диска |
| size | int | :heavy_check_mark: | Размер диска, GB |
| storage_policy_id | int | :heavy_check_mark: | ID политики хранения |
| cache | string | :x: | Установка режима кэширования для диска. Возможные варианты: "none" или "writethrough" |
| disk_type | string | :x: | Тип диска. Возможные значения: "D" - диск с данными, "B" - загрузочный диск |
| sep_id | int | :x: | ID storage endpoint |
| pool | string | :x: | Наименование пула для размещения диска |
| desc | string | :x: | Описание диска |
| node_ids | []int | :x: | Список ID ресурсов, которым будет предоставлен диск (ID узла, в котором создается виртуальная машина, указывается автоматически) |
| image_id | int | :x: | ID образа |
| permanently | bool | :x: | Флаг для удаления диска. Если выставлен в true - диск будет моментально удален с платформы, иначе будет добавлен в корзину и его можно будет восстановить. Значение поля считывается только при операции `terraform destroy`. По умолчанию - false |
| blk_discard | bool | :x: | Включение режима unmap для диска |
| create_blank | bool | :x: | Флаг создания ВМ без образа ОС. По умолчанию - false |
| iotune | Struct [см. ниже](#описание-блока-iotune-args) | :x: | Настройки лимитов операций ввода/вывода диска |


### Описание блока iotune args

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| read_bytes_sec | int | :x: | Кол-во байт для чтения в секунду |
| read_bytes_sec_max | int | :x: | Максимальное кол-во байт для чтения |
| read_iops_sec | int | :x: | Кол-во операций чтения io в секунду |
| read_iops_sec_max | int | :x: | Максимальное число io операций чтения |
| size_iops_sec | int | :x: | Размер io операций |
| total_bytes_sec | int | :x: | Общий размер байт в секунду |
| total_bytes_sec_max | int | :x: | Максимальный общий размер байт в секунду |
| total_iops_sec | int | :x: | Общее кол-во io операций в секунду |
| total_iops_sec_max | int | :x: | Максимальное общее кол-во io операций в секунду |
| write_bytes_sec | int | :x: | Кол-во байт для записи в секунду |
| write_bytes_sec_max | int | :x: | Максимальное кол-во байт для записи в секунду |
| write_iops_sec | int | :x: | Кол-во операций записи в секунду |
| write_iops_sec_max | int | :x: | Максимальное число операций записей |


### Описание блока network args

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| net_type | string | :heavy_check_mark: | тип сети, соответствующей данному подключению. "EXTNET" в случае прямого подключения во внешнюю сеть, "VINS" в случае подключения к Virtual Network Segment. |
| net_id | int | :heavy_check_mark: | идентификатор соответствующего сетевого сегмента, в случае использования `net_type = SDN` значение поля net_id должно быть отличным от 0 |
| ip_address | string | :x: | IP адрес, выделенный данному подключению. |
| mac | string | :x: | MAC адрес, назначенный соответствующему сетевому интерфейсу виртуальной машины. |
| weight | int | :x: | Вес сети, указывается при необходимости указания порядка подключения сетей. Первой подключается сеть с наименьшим весом. Сеть с нулевым или неуказанным весом имеет наименьший приоритет |
| mtu | int | :x: | Максимальный объём данных, который может быть передан за одну итерацию. Применяется только для DPDK и EXTNET сетей. Может быть от 1 до 9216 для DPDK сетей и от 1500 до 9216 для EXTNET сетей |
| net_mask | int | :x: | Маска подсети. Применяется только для DPDK и VFNIC сетей |
| sdn_interface_id | string | :x: | ID SDN порта |
| enabled | bool | :x: | Флаг, указывающий доступность сети |

### Описание блока libvirt_settings args

| Параметр | Тип | Описание |
| --- | --- | --- |
| net_type | string | :heavy_check_mark: | тип сети |
| net_id | int | :heavy_check_mark: | идентификатор cети|
| txmode | string | :x: | TX mode |
| ioeventfd | string | :x: | IO event |
| event_idx | string | :x: | Event ID |
| queues | int | :x: | Количество очередей |
| rx_queue_size | int | :x: | Длина очереди RX |
| tx_queue_size | int | :x: | Длина очереди TX |

### Описание блока affinity_rules args

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| topology | string | :heavy_check_mark: | Тип правила. Возможные значения - node, compute |
| policy | string | :heavy_check_mark: | Строгость правила. Возможные значения - RECOMMENDED (рекомендовано) и REQUIRED (обязательно) |
| mode | string | :heavy_check_mark: | Режим проверки. Возможные значения - EQ (равно), NE (не равно), ANY - любое |
| key | string | :heavy_check_mark: | Ключ правила |
| value | string | :heavy_check_mark: | Значение правила |

### Описание блока anti_affinity_rules args

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| topology | string | :heavy_check_mark: | Тип правила. Возможные значения - node, compute |
| policy | string | :heavy_check_mark: | Строгость правила. Возможные значения - RECOMMENDED (рекомендовано) и REQUIRED (обязательно) |
| mode | string | :heavy_check_mark: | Режим проверки. Возможные значения - EQ (равно), NE (не равно), ANY - любое |
| key | string | :heavy_check_mark: | Ключ правила |
| value | string | :heavy_check_mark: | Значение правила |

### Описание блока tags args

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| key | string | :heavy_check_mark: | Ключ тэга |
| val | string | :heavy_check_mark: | Значение тэга |

### Описание блока port_forwarding args

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| public_port_start | int | :heavy_check_mark: | Начало диапазона внешних портов для данного правила pfw |
| public_port_end | int | :x: | Конец диапазона внешних портов для данного правила pfw |
| local_port | int | :x: | Локальный порт для данного правила pfw |
| proto | string | :heavy_check_mark: | Протокол создания правила pfw. Возможные значения: "tcp" или "udp" |

### Описание блока user_access args

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| username | string | :heavy_check_mark: | Юзер, которому необходимо выдать определенные права на компьют |
| access_type | string | :heavy_check_mark: | Права, которые выдадутся юзеру на компьют. Возможные значения: "R", "RCX" или "ARCXDU" |

### Описание блока snapshot args

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| label | string | :heavy_check_mark: | Лейбл снапшота |

### Описание блока rollback args

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| label | string | :heavy_check_mark: | Лейбл снапшота на который нужно сделать rollback |

### Описание блока cd args

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| cdrom_id | int | :heavy_check_mark: | Идентификатор образа cdrom диска |

### Описание блока libvirt_settings

| Параметр | Тип | Описание |
| --- | --- | --- |
| mac | string | MAC адреc |
| txmode | string | TX mode |
| ioeventfd | string | IO event |
| event_idx | string | Event ID |
| queues | int | Количество очередей |
| rx_queue_size | int | Длина очереди RX |
| tx_queue_size | int | Длина очереди TX |

### Описание блока security_groups

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| net_type | string | :heavy_check_mark: | Тип сети, соответствующей данному подключению, "VINS", "EXTNET", "VFNIC", "DPDK", "SDN", "TRUNK" (при выборе типа DPDK, необходимо указать hp_backed = true) |
| net_id | int | :heavy_check_mark: | Идентификатор соответствующего сетевого сегмента |
| security_groups | []int | :heavy_check_mark: | Список групп безопасности для сети |
| enable_secgroups | bool | :x: | Флаг, указывающий включены ли группы базеопасности |

## Возвращаемые значения
В случае успешного выполнения _resource_ функция **decort_cb_kvmvm** возвращает в указанную при вызове переменную следующие значения:

| Параметр | Тип | Описание |
| --- | --- | --- |
| account_id | int | Уникальный идентификатор аккаунта-владельца ("account") данной виртуальной машины. |
| account_name | string | Имя аккаунта, которому принадлежит данная виртуальная машина. |
| acl | []Struct [см. ниже](#описание-структуры-acl) | Cписок Acces Control |
| affinity_label | string | Лейбл аффинити |
| affinity_rules | []Struct [см. ниже](#описание-структуры-affinity-rules) | Правила аффинити для компьютов |
| affinity_weight | int | weight аффинити |
| alt_boot_id | int | ID live CD-ROM для загрузки образа. |
| anti_affinity_rules | []Struct [см. ниже](#описание-структуры-affinity-rules) | Правила анти аффинити для компьютов |
| arch | string | Архитектура |
| auto_start_w_node | bool | Флаг, отвечающий за автостарт при рестарте ноды |
| boot_disk_id | int | Идентификатор загрузочного диска виртуальной машины. |
| boot_disk_size | int | Размер загрузочного диска в ГБ |
| boot_disk_cache | string | Режима кэширования для загрузочного диска |
| boot_image_id | int | ID загрузочного образа |
| boot_order | []string | Boot order |
| chipset | string | Тип эмулируемой системы |
| clone_reference | int | кол-во клонов |
| clones | []int | id клонов |
| compute_id | int | Идентификатор экземпляра _compute_, соответствующего данной виртуальной машине. |
| computeci_id | int | ID вычислительного ресурса |
| cd_image_id | int | ID cd image id |
| cpu | int | Количество виртуальных CPU, выделенных данному серверу. |
| create_blank | bool | Флаг создания ВМ без образа ОС |
| created_by | string | Кем создан _compute_ |
| created_time | int | Время создания _compute_ |
| custom_fields | string | Кастомные поля |
| deleted_by | string | Кем удален _compute_ |
| deleted_time | int | Время удаления _compute_ |
| description | string | Текстовое описание виртуальной машины. |
| devices | string | Девайсы |
| disks | []Struct [см. ниже](#описание-структуры-disks) | информация о дисках компьюта |
| driver | string | Аппаратная архитектура данной виртуальной машины. |
| gid | int | GRID ID |
| guid | int | ID ресурса |
| image_id | int | Идентификатор образа ОС, на базе которого создан загрузочный диск этой виртуальной машины. |
| image_name | string | Имя образа |
| interfaces | []Struct [см. ниже](#описание-структуры-interfaces) | Информация о интерфейсах компьюта |
| lock_status | string | Статус доступности |
| manager_id | int | Manager id |
| manager_type | string | Type manager |
| migrationjob | int | Migrationjob |
| milestones | int | Вехи |
| name | string | Имя компьюта |
| natable_vins_id | int | NAT vins id |
| natable_vins_ip | string | NAT vins ip |
| natable_vins_name | string | NAT vins name |
| natable_vins_network | string | NAT vins network |
| natable_vins_network_name | string | NAT vins network name |
| need_reboot | bool | флаг, указывающий, что требуется перезагрузка |
| need_reboot | bool | Флаг перезапуска |
| numa_node_id | int | ID узла  NUMA |
| os_version | string | Версия ОС, установленная на ВМ |
| os_users | []Struct [см. ниже](#описание-структуры-os-users) | Имена и пароли пользователей гостевой ОС, установленные платформой при создании виртуального сервера. |
| pinned | int | на какую ноду прикреплен компьют (-1 если не прикреплен) |
| preferred_cpu | []int | список ядер для использования в механизме vcpupinning |
| ram | int | Объём оперативной памяти в МБ, выделенной этой виртуальной машине. |
| reference_id | string | ID ссылки |
| registered | bool | Компьют зарегестрирован |
| res_name | string | Наименование ресурса |
| reserved_node_cpus | []int | Количество зарезервированных CPU в узле |
| rg_id | int | Идентификатор ресурсной группы, к которой принадлежит виртуальная машина. |
| rg_name | string | Имя ресурсной группы, к которой принадлежит виртуальная машина. |
| security_groups | []Struct [см. ниже](#описание-структуры-security_groups) | Список групп безопасности для сетей |
| snap_sets | []Struct [см. ниже](#описание-структуры-snap-sets) | Snap sets |
| node_id | int | id ноды |
| node_name | string | Название ноды |
| stateless_sep_id | int | ID сеп |
| stateless_sep_type | string | Тип сеп |
| status | string | Статус компьюта |
| storage_policy_id | int | ID политики хранения |
| tags | []Struct [см. ниже](#описание-структуры-tags) | Тэги |
| tech_status | string | Технический статус компьюта в составе группы |
| updated_by | string | Кем компьют был обновлен |
| updated_time | int | Время последнего обновления |
| user_managed | bool | Флаг, показывает управление пользователем вычислительной мощностью |
| read_only | bool | Флаг, показывающий включение режима только для чтения. |
| pci_devices | []int | Список PCI девайсов |
| vnc_password | string | vnc пароль |
| vgpus | []Struct [см. ниже](#описание-структуры-vgpu) | Список vgpu |
| virtual_image_id | int | ID виртуального образа |
| virtual_image_name | string | Имя виртуального образа |
| sep_id | int | ID sep |
| pool | string | Pool |
| extra_disks | []int | Список идентификаторов дополнительных дисков, которые подключены к данной виртуальной машине помимо загрузочного диска. Если такие диски отсутствуют, то список будет пустым. |
| network | []Struct [см. ниже](#описание-структуры-network) | Характеристики сетевых сегментов, к которым подключен данный сервер. |
| loader_type | string | Тип ВМ |
| boot_type | string | Тип загрузки образа. Возможные значения - bios, uefi |
| hot_resize | bool | Изменение размера ВМ |
| network_interface_naming | string | Наименование сетевого интерфейса |
| zone_id | int | Идентификатор экземпляра zone |

### Описание структуры vgpu

| Параметр | Тип | Описание |
| --- | --- | --- |
| id | int | Идентификатор ресурса |
| gid | int | ID платформы |
| type | string | Тип |
| mode | string | Режим работы ресурса |
| status | string | Статус ресурса |
| profile_id | int | Идентификатор профиля |
| ram | int | Объем оперативной памяти |
| last_update_time | int | Время последнего обновления |
| created_time | int | Время создания |
| deleted_time | int | Время удаления |
| vmid | int | Идентификатор виртуальной машины |
| pgpuid | int | Идентификатор GPU профиля |
| reference_id | string | Ссылочный идентификатор |
| account_id | int | Идентификатор аккаунта |
| rg_id | int | Идентификатор ресурсной группы |
| last_claimed_by | int | Последний пользователь, запросивший ресурс |
| pci_slot | int | Номер PCI слота |
| bus_number | int | Номер шины |
| guid | int | GUID |

### Описание структуры network
| Параметр | Тип | Описание |
| --- | --- | --- |
| net_id | int | ID сети |
| net_type | string | Тип сети |
| ip_address | string | IP адрес |
| mac | string | MAC адрес |
| weight | int | Вес сети |
| mtu | int | Максимальный объём данных, который может быть передан за одну итерацию. Применяется только для DPDK  сетей. |
| sdn_interface_id | string | ID SDN порта, при наличии |
| enabled | bool | Флаг, указывающий доступность сети |
| net_mask | int | Маска подсети |

### Описание структуры os users
| Параметр | Тип | Описание |
| --- | --- | --- |
| guid | string | GUID |
| login | string | Логин |
| password | string | Пароль |
| public_key | string | Публичный ssh ключ |

### Описание структуры tags
| Параметр | Тип | Описание |
| --- | --- | --- |
| key | string | Ключ тэга |
| val | string | Значение тэга |

### Описание структуры snap sets
| Параметр | Тип | Описание |
| --- | --- | --- |
| disks | []int | Список id дисков |
| guid | string | GUID |
| label | string | Лейбл |
| timestamp | int | Время |

### Описание структуры interfaces
| Параметр | Тип | Описание |
| --- | --- | --- |
| conn_id | int | ID connect |
| conn_type | string | Тип connect |
| def_gw | string | Шлюз по умолчанию |
| enabled | bool | Доступность подключения |
| enable_secgroup | bool | Доступность групп безопасности |
| flip_group_id | int | id flip group |
| guid | string | GUID |
| ip_address | string | IP адрес |
| listen_ssh | bool | открыт ли ssh connect |
| mac | string | MAC адрес устройства |
| mtu | int | Максимальный объём данных, который может быть передан за одну итерацию |
| name | string | Имя |
| net_id | int | ID сети |
| netmask | int | Маска сети |
| net_type | string | Тип сети |
| node_id | int | ID узла |
| pci_slot | int | Pci Slot |
| qos | []Struct{}[см. ниже](#описание-структуры-qos) | QOS |
| sdn_interface_id | string | ID SDN порта, при наличии |
| security_groups | []int | Список ID групп безопасности |
| target | string | Цель сети |
| type | string | Тип |
| vnfs | []int | VNFS |
| libvirt_settings | []Struct{}[см. ниже](#описание-структуры-libvirt_settings) | Параметры libvirt virtio интерфейса |

### Описание структуры libvirt_settings

| Параметр | Тип | Описание |
| --- | --- | --- |
| guid | string | GUID |
| txmode | string | TX mode |
| ioeventfd | string | IO event |
| event_idx | string | Event ID |
| queues | int | Количество очередей |
| rx_queue_size | int | Длина очереди RX |
| tx_queue_size | int | Длина очереди TX |

### Описание структуры qos
| Параметр | Тип | Описание |
| --- | --- | --- |
| e_rate | int | E rate |
| guid | string | ID ресурса |
| in_brust | int | In brust |
| in_rate | int | In rate |

### Описание структуры acl
| Параметр | Тип | Описание |
| --- | --- | --- |
| explicit | bool | Явно ли указан доступ |
| guid | string | guid Ресурса |
| right | string | Права на ресурс |
| status | string | Статус ресурса |
| type | string | Тип ресурса |
| user_group_id | string | ID user group |

### Описание структуры affinity rules
| Параметр | Тип | Описание |
| --- | --- | --- |
| guid | string | guid |
| key | string | Ключ |
| mode | string | Режим сравнения |
| policy | string | Степень "строгости" этого правила |
| topology | string | Топология |
| value | string | Значение |

### Описание структуры disks
| Параметр | Тип | Описание |
| --- | --- | --- |
| cache | string | Режим кэширования загрузочного диска |
| pool | string | Имя пула в системе хранения, на ресурсах которой размещён данный диск |
| sep_id | int | Идентификатор Storage Endpoint Provider (SEP). SEP это способ идентифицировать конкретную систему хранения, на ресурсах которой размещён данный диск |
| size | int | Размер диска в ГБ |
| disk_type | string | Тип диска с точки зрения его роли в составе _compute_. Может принимать одно из фиксированных значений:<br/>"B" - признак загрузочного диска ("boot").<br/>"D" - признак дополнительного диска ("data") |
| disk_name | string | Наименование диска |
| desc | string | Описание |
| image_id | int | ID образа |
| disk_id | int | ID диска |
| shareable | bool | Флаг, отвечающий за доступность диска дургим ресурсам |
| size_max | int | Максимальный размер диска |
| size_used | int | Кол-во используемого места, в ГБ |
| storage_policy_id | int | ID политики хранения |
| to_clean | bool | Необходимость очистки диска перед его удалением |
| blk_discard | bool | Включение режима unmap для диска |
| iotune | Struct [см. ниже](#описание-структуры-iotune) | Настройки лимитов операций ввода/вывода диска |

### Описание структуры iotune
| Параметр | Тип | Описание |
| --- | --- | --- |
| read_bytes_sec | int | Кол-во байт для чтения в секунду |
| read_bytes_sec_max | int | Максимальное кол-во байт для чтения |
| read_iops_sec | int | Кол-во операций чтения io в секунду |
| read_iops_sec_max | int | Максимальное число io операций чтения |
| size_iops_sec | int | Размер io операций |
| total_bytes_sec | int | Общий размер байт в секунду |
| total_bytes_sec_max | int | Максимальный общий размер байт в секунду |
| total_iops_sec | int | Общее кол-во io операций в секунду |
| total_iops_sec_max | int | Максимальное общее кол-во io операций в секунду |
| write_bytes_sec | int | Кол-во байт для записи в секунду |
| write_bytes_sec_max | int | Максимальное кол-во байт для записи в секунду |
| write_iops_sec | int | Кол-во операций записи в секунду |
| write_iops_sec_max | int | Максимальное число операций записей |

### Описание структуры snapshots
| Параметр | Тип | Описание |
| --- | --- | --- |
| guid | string | id снимка |
| label | string | Наименование снимка |
| res_id | string | Ссылка на снимок |
| snap_set_guid | string | Установленный id снимка |
| snap_set_time | int | Установленное время снимка |
| timestamp | int | Время снимка |

### Описание структуры security_groups

| Аргумент | Тип | Описание |
| --- | --- | --- |
| net_type | string | Тип сети, соответствующей данному подключению, "VINS", "EXTNET", "VFNIC", "DPDK", "SDN", "TRUNK" (при выборе типа DPDK, необходимо указать hp_backed = true) |
| net_id | int | Идентификатор соответствующего сетевого сегмента |
| security_groups | []int | Список групп безопасности для сети |
| enable_secgroups | bool | Флаг, указывающий включены ли группы базеопасности |

## Пример использования
В нижеприведённом примере с помощью _resource_ функции **decort_cb_kvmvm** создаётся виртуальная машина (экземпляр _compute_ в терминологии платформы DECORT) следующими характеристиками:
* Имя виртуальной машины - "tf-managed-vm"
* Характеристики виртуальной машины - 1 CPU, 1024Мб RAM, размер загрузочного диска 10Гб
* К виртуальной машине будет подключён один дополнительный диск с идентификатором 56789
* Идентификатор ресурсной группы, в которой создаётся виртуальная машина - поступает из переменной _decort_cb_rg.my_rg.id_
* Идентификатор образа ОС, который будет установлен на загрузочный диск - поступает из переменной _data.decort_cb_image.os_image.id_
* Виртуальная машина будет иметь одно сетевое подключение - во внешнюю сеть с идентификатором 12, IP адрес этого подключения платформа установит автоматически

```terraform
resource "decort_cb_kvmvm" "comp" {
  #имя compute
  #обязательный параметр
  #тип - строка
  #используется при создании и обновлении
  name = "test-tf-compute-update-new"

  #id ресурсной группы
  #обязательный параметр
  #тип - целое число
  #используется при создании
  rg_id = 1111

  #число cpu
  #обязательный параметр
  #тип - целое число
  #используется при создании и обновлении
  cpu = 1

  #кол-во оперативной памяти, МБ
  #обязательный параметр
  #тип - целое число
  #используется при создании и обновлении
  ram = 2048

  #id политики хранения
  #обязательный параметр
  #тип - целое число
  #используется при создании
  storage_policy_id = 1

  #тип эмулируемой системы
  #опциональный параметр
  #тип - строка
  #возможные значения: "i440fx", "Q35"
  #по умолчанию - Q35
  #используется при создании и обновлении
  #chipset = "Q35"

  #id образа диска для создания compute
  #опциональный параметр
  #тип - целое число
  #используется при создании и обновлении
  #image_id = 111

  #создать вм без загрузочного диска
  #если значение равно True, параметры image_id, boot_disk_size, sep_id, pool игнорируются
  #компьютер создается без загрузочного диска в остановленном состоянии
  #опциональный параметр
  #тип - булев
  #используется при создании
  #without_boot_disk = true

  #создание без образа ОС
  #опциональный параметр
  #тип - булев
  #используется при создании
  #create_blank = false

  #размер загрузочного диска
  #опциональный параметр
  #тип - целое число
  #используется при создании и обновлении
  #boot_disk_size = 20

  #установка режима кэширования для загрузочного диска
  #опциональный параметр
  #тип - строка
  #значение по умолчанию - none
  #возможные варианты: "none" или "writethrough"
  #используется при создании и обновлении
  #boot_disk_cache = "none"

  #id сепа для boot диска
  #опциональный параметр
  #тип - целое число
  #используется при создании
  #sep_id = 1

  #название пула
  #опциональный параметр
  #тип - строка
  #используется при создании
  #pool = "data02"

  #конфигурация cloud init
  #опциональный параметр
  #тип - файл в формате JSON
  #используется при создании
  #cloud_init = file("initconfig.tftpl")

  #описание compute
  #опциональный параметр
  #тип - строка
  #используется при создании и обновлении
  #description = "test update description in tf words update"

  #node id
  #опциональный параметр
  #тип - целое число
  #используется при создании
  #node_id = 1

  #id образа CD-ROM для загрузки
  #опциональный параметр
  #тип - целое число
  #используется при создании и обновлении
  #alt_boot_id = 1

  #необходимость выравнивать ВМ по NUMA
  #опциональный параметр
  #тип - строка
  #возможные значения - "none, "strict", "loose"
  #по умолчанию - "none"
  #используется при создании и обновлении
  #numa_affinity = "loose"

  #необходимость запускать ВМ на выделенных CPU ядрах
  #опциональный параметр
  #тип - булев
  #по умолчанию - false
  #используется при создании и обновлении
  #cpu_pin = true

  #необходимость использовать для выделения RAM виртуальной машины Huge Pages
  #опциональный параметр
  #тип - булев
  #по умолчанию - false
  #используется при создании и обновлении
  #hp_backed = true

  #установка режима "только для чтения", который позволяет лишь получать информацию о ВМ, ничего в ней не менять
  #опциональный параметр
  #тип - булев
  #значение по умолчанию - false
  #используется при создании и обновлении
  #read_only = false

  #создание и добавление диска для compute
  #при изменении параметров `pool` и `sep_id` для обновления ресурса может возникнуть необходимость синхронизации
  #состояния при помощи команды `terraform refresh`
  #опциональный параметр
  #тип - список дисков
  #используется при создании и обновлении
  #disks {
    #имя диска
    #обязательный для диска параметр
    #тип - строка
    #disk_name = "disk_name"

    #размер диска
    #обязательный для диска параметр
    #тип - целое число
    #size = 5

    #id политики хранения
    #обязательный для диска параметр
    #тип - целое число
    #storage_policy_id = 1

    #тип диска
    #опциональный параметр
    #тип - строка
    #disk_type = "D"

    #опциональный параметр
    #тип - целое число
    #sep_id = 1

    #название пула
    #опциональный параметр
    #тип - строка
    #pool = "data01"

    #список node
    #опциональный параметр
    #тип - массив целых чисел
    #node_ids = [10,11]

    #описание диска
    #опциональный параметр
    #тип - строка
    #desc = ""

    #id образа
    #опциональный параметр
    #image_id = 378

    #флаг для удаления диска, без возможности восстановления
    #опциональный параметр
    #тип - булев
    #permanently = false

    #включение режима unmap для диска     
    #опциональный параметр
    #тип - булев
    #по умолчанию - false     
    #blk_discard = false

    #настройки лимитов операций ввода/вывода диска
    #опциональный параметр
    #тип - блок
    #тип вложенных полей - целое число
    #используется при создании и обновлении
    #iotune {
      #read_bytes_sec      = 0
      #read_bytes_sec_max  = 0
      #read_iops_sec       = 0
      #read_iops_sec_max   = 0
      #size_iops_sec       = 0
      #total_bytes_sec     = 0
      #total_bytes_sec_max = 0
      #total_iops_sec      = 3000
      #total_iops_sec_max  = 0
      #write_bytes_sec     = 0
      #write_bytes_sec_max = 0
      #write_iops_sec      = 0
      #write_iops_sec_max  = 0
    #}
  #}

  #правила affinity
  #опциональный параметр
  #может быть один, несколько или ни одного блока
  #тип - блок
  #используется при создании и обновлении
    #affinity_rules {
    #тип правила
    #возможные значения - compute или node
    #обязательный параметр
    #тип - строка
    #topology = "compute"

    #строгость правила
    #возможные значения - RECOMMENDED и REQUIRED
    #обязательный параметр
    #тип - строка
    #policy = "RECOMMENDED"

    #режим проверки
    #возможные значения - ANY, EQ, NE
    #обязательный параметр
    #тип - строка
    #mode = "ANY"

    #ключ правила
    #обязательный параметр
    #тип - строка
    #key = "testkey"

    #ключ правила
    #обязательный параметр
    #тип - строка
    #value = "testvalue"
  #}

  #правила anti-affinity
  #опциональный параметр
  #может быть один, несколько или ни одного блока
  #тип - блок
  #используется при создании и обновлении
  #anti_affinity_rules {
    #тип правила
    #возможные значения - compute или node
    #обязательный параметр
    #тип - строка
    #topology = "compute"

    #строгость правила
    #возможные значения - RECOMMENDED и REQUIRED
    #обязательный параметр
    #тип - строка
    #policy = "RECOMMENDED"

    #режим проверки
    #возможные значения - ANY, EQ, NE
    #обязательный параметр
    #тип - строка
    #mode = "ANY"

    #ключ правила
    #обязательный параметр
    #тип - строка
    #key = "testkey"

    #ключ правила
    #обязательный параметр
    #тип - строка
    #value = "testvalue"
  #}

  #установка метки для вм
  #опциональный параметр
  #тип - строка
  #используется при создании и обновлении
  #affinity_label = "test4"

  #наименование системы
  #опциональный параметр
  #по умолчанию - не задан
  #тип - строка
  #используется при создании
  #is = ""

  #назначение вм
  #опциональный параметр
  #по умолчанию - не задан
  #тип - строка
  #используется при создании
  #ipa_type = ""

  #id экстра дисков
  #опциональный параметр
  #тип - список чисел
  #используется при создании и обновлении
  #extra_disks = [1234, 4322, 1344]

  #управление XML виртуальной машины
  #опциональный параметр
  #тип - строка (json-encoded)
  #используется при создании и обновлении
  #custom_fields = "{`key`:`value`}"

  #присоединение сетей и удаление сетей в компьюте
  #опциональный параметр
  #тип - блок
  #используется при создании и обновлении
  #network {
    #тип сети
    #обязательный параметр
    #возможные значения - "VINS", "EXTNET", "VFNIC", "DPDK", "SDN", "TRUNK" (при выборе типа DPDK, необходимо указать hp_backed = true)
    #тип - строка
    #net_type = "VINS"

    #id сети
    #обязательный параметр
    #при использовании SDN необходимо указать любое значение отличное от 0
    #тип - целое число
    #net_id = 1234

    #ip адрес входящий в сеть
    #опциональный параметр
    #тип - строка
    #ip_address = "127.0.0.1"

    #mac-адрес интерфейса компьюта
    #опциональный параметр
    #тип - строка
    #mac = "52:54:01:12:34:60"

    #вес сети, указывается при необходимости указания порядка подключения сетей
    #первой подключается сеть с наименьшим весом
    #сеть с нулевым или неуказанным весом имеет наименьший приоритет
    #опциональный параметр
    #тип - целое число
    #weight = 15

    #максимальный объём данных, который может быть передан за одну итерацию
    #используется только с сетями типа "DPDK" и "EXTNET"
    #возможные значения - 1-9216
    #опциональный параметр
    #тип - целое число
    #mtu = 1500

    #id sdn сети
    #используется только с сетями типа "SDN"
    #опциональный параметр
    #тип - строка
    #sdn_interface_id = "f2d87a70-ea35-468d-8aef-bb1ecbe2e476"

    #включение сетевого интерфейса
    #используется с сетями типа "VINS", "EXTNET", "DPDK", "SDN", "TRUNK"
    #по умолчанию - true
    #опциональный параметр
    #тип - булев
    #enabled = true

    #маска подсети
    #используется только с сетями типа "DPDK" и "VFNIC"
    #опциональный параметр
    #тип - целое число
    #net_mask = 32 
  #}

  #группы безопасности
  #опциональный параметр
  #тип - блок
  #используется при создании и обновлении
  #security groups {
    #тип сети
    #обязательный параметр
    #тип - строка
    #возможные значения - "VINS", "EXTNET", "VFNIC", "DPDK", "SDN", "TRUNK" (при выборе типа DPDK, необходимо указать hp_backed = true)
    #net_type = "VINS"

    #id сети
    #обязательный параметр
    #при использовании SDN необходимо указать любое значение отличное от 0
    #тип - целое число
    #net_id = 1234

    #список id групп безопасности
    #обязательный параметр
    #тип - массив целых чисел
    #security_groups  = [12, 34]

    #флаг, указывающий, включены ли группы безопасности
    #опциональный параметр
    #тип - булев
    #по умолчанию: false
    #enable_secgroups = false
  #}

  #добавление и удаление тэгов
  #опциональный параметр
  #тип - блок
  #используется при создании и обновлении
  #tags {
    #ключ для тэга
    #обязательный параметр
    #тип - строка
    #key = "key"

    #значения тэга
    #обязательный параметр
    #тип - строка
    #value = "value"
  #}

  #добавление и удаление port forwarding
  #опциональный параметр
  #тип - блок
  #используется при создании и обновлении
  #port_forwarding {
    #номер внешнего начального порта для правила
    #обязательный параметр
    #тип - целое число
    #public_port_start = 2023

    #номер внешнего последнего порта для правила
    #опциональный параметр
    #тип - целое число
    #по умолчанию - -1
    #public_port_end = 2023

    #номер внутреннего базового порта
    #обязательный параметр
    #тип - целое число
    #local_port = 80

    #сетевой протокол
    #обязательный параметр
    #тип - строка
    #proto = "tcp"
  #}

  #предоставить/забрать пользователю доступ к компьюту
  #опциональный параметр
  #тип - блок
  #используется при создании и обновлении
  #user_access {
    #имя юзера, которому предоставляем доступ
    #обязательный параметр
    #тип - строка
    #username = "some@decs3o"

    #права: 'R' - только на чтение, 'RCX' - чтение/запись, 'ARCXDU' - админ
    #обязательный параметр
    #тип - строка
    #access_type = "ARCXDU"
  #}

  #создать/удалить снапшот компьюта
  #опциональный параметр
  #тип - блок
  #используется при создании и обновлении
  #snapshot {
    #лейбл снапшота
    #обязательный параметр
    #тип - строка
    #label = "label1"
  #}

  #флаг для удаления снапшотов в асинхронном режиме
  #опциональный параметр
  #тип - булев
  #по умолчанию - false
  #используется при обновлении
  #snapshot_delete_async = true

  #rollback на нужный снапшот
  #опциональный параметр
  #не имеет смысла при отсутсвии снапшотов
  #тип - блок
  #используется при обновлении
  #rollback {
    #лейбл снапшота
    #обязательный параметр
    #тип - строка
    #label = "label1"
  #}

  #вставить/удалить СD rom
  #опциональный параметр
  #максимальное кол-во - 1
  #тип - блок
  #используется при создании и обновлении
  #cd {
    #id образа диска CD rom
    #обязательный параметр
    #тип - целое число
    #cdrom_id = 344
  #}

  #добавить компьют на ноду
  #опциональный параметр
  #тип - булев
  #используется при создании и обновлении
  #pin_to_node = true

  #список ядер для использования в механизме vcpupinning. Количество указанных ядер должно быть равно количеству виртуальных процессоров ВМ
  #игнорируется если cpu_pin=false или pin_to_node=false
  #опциональный параметр
  #тип - массив целых чисел
  #используется при создании и обновлении
  #preferred_cpu = [1234, 456]

  #флаг для старта компьюта при рестарте ноды
  #опциональный параметр
  #тип - булев
  #используется при создании и обновлении
  #auto_start_w_node = true

  #флаг для принудительного добавления компьюта на ноду
  #опциональный параметр
  #тип - булев
  #используется при создании и обновлении
  #force_pin = true

  #список PCI девайсов
  #опциональный параметр
  #тип - массив целых чисел
  #используется при создании и обновлении
  #pci_devices = [1,2]

  #флаг доступности компьюта для проведения с ним операций
  #опциональный параметр
  #тип - булев
  #используется при создании и обновлении
  #enabled = true

  #pause/resume компьюта
  #опциональный параметр
  #тип - булев
  #используется при создании и обновлении
  #pause = true

  #сделать компьют заново
  #опциональный параметр
  #тип - булев
  #используется при обновлении
  #reset = true

  #восстановить удаленный компьют из корзины
  #опциональный параметр
  #тип - булев
  #используется при обновлении
  #restore = true

  #флаг для редеплоя компьюта
  #опциональный параметр
  #тип - булев
  #используется при обновлении
  #force_stop = true

  #флаг для ресайза компьюта
  #опциональный параметр
  #тип - булев
  #используется при обновлении
  #force_resize = true

  #запуск/стоп компьюта
  #опциональный параметр
  #тип - булев
  #используется при создании и обновлении
  #started = true

  #detach диска при удалении компьюта
  #опциональный параметр
  #тип - булев
  #используется при удалении
  #detach_disks = true

  #флаг для удаления компьюта, без возможности восстановления
  #опциональный параметр
  #тип - булев
  #используется при удалении
  #permanently = false

  #конфигурация параметров libvirt virtio интерфейса
  #опциональный параметр
  #добавление блока возможно только при выключенной виртуальной машине,
  #удаление блока удалит настройки только локально, состояние на платформе не изменится
  #тип - блок
  #используется при создании и обновлении
  #libvirt_settings {
    #тип сети
    #обязательный параметр
    #возможные значения - "VINS", "VFNIC", "DPDK"
    #тип - строка
    #net_type = "VINS"

    #id сети
    #обязательный параметр
    #тип - целое число
    #net_id = 1234

    #tx mode
    #опциональный параметр
    #возможные значения - 'iothread', 'timer' или 'selected by hypervisor'
    #тип - строка
    #txmode = "iothread"

    #io event
    #опциональный параметр
    #возможные значения - 'on', 'off' or 'selected by hypervisor'
    #тип - строка
    #ioeventfd = "on"

    #event ID
    #опциональный параметр
    #возможные значения - 'on', 'off' or 'selected by hypervisor'
    #тип - строка
    #event_idx = "off"

    #количество очередей
    #опциональный параметр
    #тип - целое число
    #queues = "4"

    #длина очереди RX
    #опциональный параметр
    #тип - целое число
    #rx_queue_size = "1024"

    #длина очереди TX
    #опциональный параметр
    #тип - целое число
    #tx_queue_size = "1024"
  #}

  #тип ВМ
  #возможные значения - linux, windows, unknown
  #опциональный параметр
  #тип - строка
  #используется при создании и обновлении
  #loader_type = "unknown"

  #тип загрузки образа
  #возможные значения - bios, uefi
  #опциональный параметр
  #тип - строка
  #используется при создании и обновлении
  #boot_type = "bios"

  #изменение размера ВМ
  #опциональный параметр
  #тип - булев
  #используется при создании и обновлении
  #hot_resize = false

  #наименование сетевого интерфейса
  #возможные значения - eth, ens
  #опциональный параметр
  #тип - строка
  #используется при создании и обновлении
  #network_interface_naming = "ens"

  #идентификатор экземпляра zone 
  #опциональный параметр
  #тип - целое число 
  #используется при создании и обновлении
  #zone_id = 1111

  #версия ОС, установленная на ВМ
  #опциональный параметр 
  #тип - строка
  #используется при создании и обновлении
  #os_version = "name"   

  #включение режима unmap для boot диска   
  #опциональный параметр
  #тип - булев
  #по умолчанию - false   
  #используется при создании и обновлении
  #boot_disk_blk_discard = false
}
```

Данный пример подразумевает, что ранее по тексту tf-файла :
* выполнена корректная инициализация провайдера (подробнее об инициализации Terraform провайдера DECORT см. соответствующий [раздел](https://repository.basistech.ru/BASIS/wiki-terraform-provider-decort/src/branch/main/4.11.3/04.02-Инициализация-Terraform-провайдера-DECORT.md)). 
* создан ресурс типа decort_resgroup (см. _resource_ функцию [decort_resgroup](https://repository.basistech.ru/BASIS/wiki-terraform-provider-decort/src/branch/main/4.11.3/07.01.02-Resource_decort_resgroup.md)) и результат записан в переменную _decort_resgroup.my_rg_ 
* считана информация об образе ОС(см. _data_ функцию [decort_image](https://repository.basistech.ru/BASIS/wiki-terraform-provider-decort/src/branch/main/4.11.3/06.01.07-Data_decort_image.md)) и результат записан в переменную _decort_resgroup.os_image_ 

После успешного завершения такого вызова _resource_ функции **decort_cb_kvmvm** в переменной `decort_cb_kvmvm.my_new_vm` будут сохранены возвращаемые значения. В частности, для получения идентификатора виртуальной машины следует использовать конструкцию `decort_cb_kvmvm.my_new_vm.id`.
