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

### Работа с custom_fields

CustomFields - метод работы с XML ВМ.
Для описания конфигурации используется файл в формате JSON, например:

customfields.json:
```
{
  "title": "test",
  "name": "basename",
  "cpu": {
    "mode": "host-model"
  }
}
```

После этого, достаточно передать файл в качестве значения параметра:
```
custom_fields = file("customfields.json")
```

### Возможные затруднения при импорте kvmvm с extra_disks
При импорте kvmvm c extra_disks, терраформ не может записать в стейт информацию об extra_disks по следующим причинам:
- терраформ на стадии импорта не производит чтение конфигурации, кроме проверки необходимых (requirement) полей, из-за чего данные, хранящиеся в поле extra_disks, будут непрочитаны;
Из-за этого, при первом запуске команды `terraform apply`, терраформ сообщит что удалит эти диски из disks, но, при этом, удалены они не будут, если указаны в массиве extra_disks.

По умолчанию, sep_id и pool в платформе выбираются те же, на которых размещается загрузочный диск (создается вместе с виртуальной машиной). Из-за этого, могут возникать ошибки следующего характера:

- `Cannot attach disk to Compute ID XXX: Pool xxxx does not support disk type X ` - данная ошибка означает то, что выбранный пул не поддерживает выбранные тип диска
  Пути решения:
- Выполнить **dynamix_disk_list_types_detailed**. Результатом выполнения этой функции станет список доступных пулов хранилища вместе с их идентификаторами (sep_id).
- Заполнить поля sep_id и pool подходящими полями для диска.

### Работа boot_disk

В стейт в поле boot_disk записывается первый найденный диск с типом "B", остальные диски с типом "B" обрабатываются и записываются в массив disks.

### Работа с cloud_init

Cloud Init позволяет запустить ВМ с предустановленными настройками пользователя, группами и доступами. Подробнее про настройку cloud_init можно прочесть по [ссылке](https://cloudinit.readthedocs.io/en/latest/reference/examples.html).

**Пароли, указанные в cloud_init не сохраняются на платформе и не отображаются в API!**

Для использования cloud_init конфигурации, следует:

1. Создать файл с расширением `.tftpl` в рабочей директории.
2. Описать в созданном файле конфигурацию cloud_init в формате JSON:

### initconfig.tftpl

```
{
  "users": [
    {
      "groups": "users, wheel",
      "name": "user",
      "plain_text_passwd": "examplePassword",
      "primary_group": "user",
      "ssh_authorized_keys": [
        "ssh-rsa EXAMPLE%id_rsa.pub"
      ],
      "sudo": "ALL=(ALL) NOPASSWD:ALL"
    }
  ]
}
```

3. Указать путь до файла `initconfig.tftpl` в качестве значения параметра `cloud_init` в ресурсе `dynamix_kvmvm`:

```terraform
resource "dynamix_kvmvm" "compute1" {
   # ...

   cloud_init = file("initconfig.tftpl")

   # ...
}
```

4. Выполнить `terraform apply`

**Конфигурация cloud_init применяется только при создании компьюта, во всех остальных случаях - игнорируется**

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

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

## Аргументы

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

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| driver | string | :heavy_check_mark: | Аппаратная архитектура виртуальной машины.<br/>Может принимать одно из следующих значений:<br/> _ "KVM_X86" - stateful виртуальная машина KVM на аппаратной платформе x86.<br/> _ "SVA_KVM_X86" - stateless ВМ на аппаратной платформе x86. |
| cpu | int | :heavy_check_mark: | Количество процессоров |
| name | string | :heavy_check_mark: | Имя виртуальной машины. Обратите внимание, что имя должно быть уникальным в рамках ресурсной группы |
| rg_id | int | :heavy_check_mark: | Идентификатор ресурсной группы, которой принадлежит данная виртуальная машина |
| ram | int | :heavy_check_mark: | Объём оперативной памяти в МБ.<br/> Должен быть кратен 128 |
| boot_disk_size | int | :x: | Размер загрузочного диска виртуальной машины в ГБ |
| chipset | string | :x: | Тип эмулируемой системы |
| custom_fields | string (json-encoded) | :x: | Управление XML виртуальной машины |
| extra_disks | []int | :x: | Список идентификаторов дополнительных дисков, которые требуется подключить к данной виртуальной машине помимо загрузочного диска |
| image_id | int | :x: | Идентификатор образа, на базе которого создаётся загрузочный диск виртуальной машины.<br/> |
| cloud_init | string | :x: | Используется на этапе создания вм.<br/>Параметры для утилиты _cloud_init_, которая используется в платформе DYNAMIX для первичного конфигурирования виртуальной машины после её создания |
| network | []Struct [см. ниже](#описание-структуры-network) | :x: | Параметры сетевого подключения. |
| description | string | :x: | Текстовое описание виртуальной машины |
| started | bool | :x: | Флаг запуска машины,<br/>по-умолчанию - true.<br/>Если true - машина включена,<br/>если false - выключена |
| sep_id | int | :x: | Идентификатор sep |
| pool | string | :x: | Наименование пула для размещения |
| is | string | :x: | Наименование системы |
| ipa_type | string | :x: | Тип аутентификатора |
| permanently | bool | :x: | Мгновенное удаление виртуальной машины, минуя корзину. Параметр считывается только при использовании команды `terraform destroy`, то есть только при удалении ресурса |
| detach_disks | bool | :x: | Отсоединение прикрепленных к виртуальной машине дисков перед ее удалением. Параметр считывается только при использовании команды `terraform destroy`, то есть только при удалении ресурса |
| enabled | bool | :x: | Доступность вычислительной машины |
| affinity_label | string | :x: | Метка для правил affinity |
| affinity_rules | []Struct [см. ниже](#описание-структуры-affinity_rules) | :x: | Список описания правил affinity. Правил может быть несколько, одно или отсутствовать |
| anti_affinity_rules | []Struct [см. ниже](#описание-структуры-anti_affinity_rules) | :x: | Список описания правил anti-affinity. Правил может быть несколько, одно или отсутствовать |
| tags | []Struct [см. ниже](#описание-структуры-tags) | :x: | Задание тэгов компьюта |
| port_forwarding | []Struct [см. ниже](#описание-структуры-port_forwarding) | :x: | Настройка порт форвардинга для компьюта |
| user_access | []Struct [см. ниже](#описание-структуры-user_access) | :x: | Предоставление доступов к компьюту |
| snapshot | []Struct [см. ниже](#описание-структуры-snapshot) | :x: | Создание мнапшотов |
| rollback | Struct [см. ниже](#описание-структуры-rollback) | :x: | Rollback на определенный снапшот |
| cd | Struct [см. ниже](#описание-структуры-cd) | :x: | Добавление диска cd rom |
| pin_to_stack | bool | :x: | Флаг, отвечающий за добавление кмпьюта в стэк |
| pause | bool | :x: | Флаг, отвкчающий за pause/resume компьюта |
| reset | bool | :x: | Флаг, отвкчающий за reset компьюта |
| auto_start | bool | :x: | Флаг, отвечающий за авто старт при редеплое компьюта |
| force_stop | bool | :x: | Флаг, отвечающий за стоп при редеплое компьюта |
| force_resize | bool | :x: | Флаг для изменения CPU и RAM в принудительном порядке |
| data_disks | string | :x: | Указание того, что делать с дисками при редеплое. Возможные значения: "KEEP", "DETACH" и "DESTROY" |
| restore | bool | :x: | Восстановить удаленный компьют из корзины |
| cpu_pin | bool | :x: | Необходимость запускать ВМ на выделенных CPU ядрах |
| numa_affinity | string | :x: | Необходимость выравнивать ВМ по NUMA. Возможные значения - "none, "strict", "loose" |
| hp_backed | bool | :x: | Необходимость использовать для выделения RAM виртуальной машины Huge Pages ядрах |
| without_boot_disk | bool | :x: | Флаг отсутствия загрузочного диска |
| pci_devices | []int | :x: | Список ID PCI девайсов |

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

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

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

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| 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 | :x: | Значение правила |

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

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| 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 | :x: | Значение правила |

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

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

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

| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| 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

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

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

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

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

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

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

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

## Возвращаемые значения

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| account_id | int | Уникальный идентификатор подписчика-владельца ("account") данной виртуальной машины. |
| account_name | string | Имя подписчика, которому принадлежит данная виртуальная машина. |
| acl | struct[см. ниже](#описание-структуры-acl) | Список доступов |
| affinity_label | string | Метка для правил affinity |
| affinity_weight | int | weight аффинити |
| arch | string | Архитектура |
| boot_order | []string | Boot order |
| boot_disk | []Struct [см. ниже](#описание-структуры-disk) | Полная информация о бутдиске |
| boot_disk_id | int | Идентификатор загрузочного диска виртуальной машины. |
| boot_disk_size | int | Размер загрузочного диска в ГБ. |
| driver | string | Аппаратная архитектура данной виртуальной машины. |
| chipset | string | Тип эмулируемой системы |
| clone_reference | int | кол-во клонов |
| clones | []int | id клонов |
| computeci_id | int | Id computeci |
| cd_image_id | int | ID cd image id |
| cpu_pin | bool | Необходимость запускать ВМ на выделенных CPU ядрах |
| cpu | int | Количество виртуальных CPU, выделенных данному серверу. |
| created_by | string | Кем создан ресурс |
| created_time | int | Время создания ресурса |
| custom_fields | string | Кастомные поля |
| deleted_by | string | Кем удален ресурс |
| deleted_time | int | Время удаления ресурса |
| description | string | Текстовое описание виртуальной машины. |
| detach_disks | bool | Отсоединение прикрепленных к виртуальной машине дисков перед ее удалением. Параметр считывается только при использовании команды `terraform destroy`, то есть только при удалении ресурса |
| devices | string | Девайсы |
| disks | []struct [см. ниже](#описание-структуры-disk) | Полная информация о подключенных дисках |
| enabled | bool | Доступность вычислительной машины |
| extra_disks | []int | Список идентификаторов дополнительных дисков, которые подключены к данной виртуальной машине помимо загрузочного диска. Если такие диски отсутствуют, то список будет пустым. |
| gid | int | GID |
| guid | int | GUID |
| hp_backed | bool | Необходимость использовать для выделения RAM виртуальной машины Huge Pages ядрах |
| compute_id | int | Идентификатор экземпляра _compute_, соответствующего данной виртуальной машине. |
| id | int | Уникальный идентификатор этой виртуальной машины в облачной платформе. Всегда совпадает с `compute_id`. |
| image_id | int | Идентификатор образа ОС, на базе которого создан загрузочный диск этой виртуальной машины. |
| interfaces | []Struct [см. ниже](#описание-структуры-interfaces) | Информация о интерфейсах компьюта |
| ipa_type | string | Тип аутентификатора |
| is | string | Наименование системы |
| lock_status | string | Статус доступности |
| manager_id | int | Manager id |
| manager_type | string | Type manager |
| migrationjob | int | Migrationjob |
| milestones | int | Вехи |
| name | string | Имя виртуального сервера.<br>Возвращаемое значение `name` совпадает со значением соответствующего аргумента, переданного при вызове функции. |
| 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 | Флаг, указывающий, что требуется перезагрузка |
| numa_affinity | string | Необходимость выравнивать ВМ по NUMA |
| numa_node_id | int | ID узла  NUMA |
| network | []Struct [см. ниже](#описание-структуры-networks) | Параметры сетевого подключения |
| os_users | []Struct [см. ниже](#описание-структуры-os-users) | Имена и пароли пользователей гостевой ОС, установленные платформой при создании виртуального сервера. Формат структуры:<br/>_ (string) `login` - учётная запись в гостевой ОС.<br/>_ (string) `password` - пароль к этой учётной записи. |
| permanently | bool | Мгновенное удаление виртуальной машины, минуя корзину. Параметр считывается только при использовании команды `terraform destroy`, то есть только при удалении ресурса |
| pci_devices | []int | Список ID PCI девайсов |
| pinned | bool | добавлен ли компьют на стек |
| pool | string | Наименование пула для размещения |
| ram | int | Объём оперативной памяти в МБ, выделенной этой виртуальной машине. |
| reference_id | string | ID reference |
| registered | bool | Компьют зарегестрирован |
| res_name | string | Res name |
| reserved_node_cpus | []int | Количество зарезервированных CPU в узле |
| reset | bool | Флаг отвкчающий за reset компьюта |
| rg_id | int | Идентификатор ресурсной группы, к которой принадлежит виртуальная машина. |
| rg_name | string | Имя ресурсной группы, к которой принадлежит виртуальная машина. |
| sep_id | int | Идентификатор sep |
| snap_sets | []Struct [см. ниже](#описание-структуры-snap-sets) | Snap sets |
| started | bool | Опциональный параметр, флаг запуска машины,<br/>по-умолчанию - true.<br/>Если true - машина включена,<br/>если false - выключена. |
| stateless_sep_id | int | ID сепа |
| stateless_sep_type | string | Тип сепа |
| status | string | Cтатус |
| tech_status | string | Технический статус |
| updated_by | string | Кем обновлен ресурс |
| updated_time | int | Время обновления ресурса |
| user_managed | bool | User managed |
| cloud_init | string | Параметры cloud_init |
| vgpus | []int | Список vgpu |
| virtual_image_id | int | ID виртуального образа |
| virtual_image_name | string | Имя образа ОС, на базе которого создан загрузочный диск этой виртуальной машины. |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| account_acl | []struct [см. ниже](#описание-структуры-list-acl) | Информация о списке пользователей аккаунтов |
| compute_acl | []Struct [см. ниже](#описание-структуры-list-acl) | Информация о списке пользователей компьютов |
| rg_acl | []Struct [см. ниже](#описание-структуры-list-acl) | Информация о списке пользователей ресурной группы |

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

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

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| account_id | int | Уникальный идентификатор подписчика-владельца диска |
| acl | string | acl |
| boot_partition | int | boot_partition |
| bus_number | int | Номер шины |
| ckey | string | ckey |
| created_time | int | Время создания |
| deleted_time | int | Время удаления |
| desc | string | Текстовое описание диска |
| destruction_time | int | Время окончательного удаления |
| disk_id | int | Идентификатор диска |
| disk_path | string | Адрес диска |
| gid | int | Идентификатор площадки (grid id) |
| guid | int | guid |
| image_id | int | Идентификатор образа, содержимое которого было склонировано/скопировано в данный диск при его создании. 0 означает, что данный диск не создавался как клон/копия какого-либо образа |
| images | []int | Идентификаторы образов, использующих диск |
| iotune | Struct{}[см. ниже](#описание-структуры-iotune) | Информация об ограничениях IO диска |
| iqn | string | iqn |
| login | string | Логин |
| milestones | int | Milestones |
| name | string | Наименование диска |
| order | int | Номер диска |
| params | string | Параметры диска |
| parent_id | int | id родительского диска |
| passwd | string | Password |
| pci_slot | int | id pci слота, к которому подключен диск |
| pool | string | Имя пула в системе хранения, на ресурсах которой размещён данный диск |
| present_to | []int | Список ID ресурсов, которым предоставлен диск |
| purge_time | int | Время последней попытки |
| reality_device_number | int | Reality device number |
| reference_id | string | Reference id |
| replication | Struct{} [см. ниже](#описание-структуры-replication) | Информация о реплике диска |
| res_id | int | id ресурса |
| role | string | Роль диска |
| sep_id | int | Идентификатор Storage Endpoint Provider (SEP). SEP это способ идентифицировать конкретную систему хранения, на ресурсах которой размещён данный диск |
| shareable | bool | Флаг, отвечающий за доступность диска дургим ресурсам |
| size_max | int | Размер диска в ГБ |
| size_used | float | Кол-во используемого места, в ГБ |
| snapshots | []Struct{}[см. ниже](#описание-структуры-snapshots) | Снимки состояния диска |
| status | string | Статус диска |
| tech_status | string | Технический статус диска |
| type | string | Тип диска с точки зрения его роли в составе _compute_. Может принимать одно из фиксированных значений:<br/>"B" - признак загрузочного диска ("boot").<br/>"D" - признак дополнительного диска ("data") |
| vmid | int | Идентификатор виртуальной машины (устаревшее) |

### Описание структуры 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 | Максимальное число операций записей |

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

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

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| disk_id | int | id диска |
| pool_id | string | id пула |
| role | string | Роль диска (главный или реплика) |
| self_volume_id | string | id раздела |
| storage_id | int | id хранилища |
| volume_id | int | id раздела |

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

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

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

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

### Описание структуры 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 |

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

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

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

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

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| desc | string | Описание диска |
| disk_id | int | ID диска |
| disk_name | string | Наименование диска |
| disk_type | string | Тип диска (B) |
| image_id | int | ID образа диска |
| pool | string | Наименование пула |
| sep_id | int | Storage Endpoint ID |
| shareable | bool | Доступность другим ресурсам |
| size | int | Размер диска |
| size_max | int | Максимальный размер диска |
| size_used | float | Используемый размер |

## Пример использования

В нижеприведённом примере с помощью _resource_ функции **dynamix_kvmvm** создаётся виртуальная машина (экземпляр _compute_ в терминологии платформы DYNAMIX) следующими характеристиками:

- Имя виртуальной машины - "tf-managed-vm"
- Характеристики виртуальной машины - 1 CPU, 1024Мб RAM, размер загрузочного диска 10Гб
- К виртуальной машине будет подключён один дополнительный диск с идентификатором 56789
- Идентификатор ресурсной группы, в которой создаётся виртуальная машина - поступает из переменной _dynamix_resgroup.my_rg.id_
- Идентификатор образа ОС, который будет установлен на загрузочный диск - поступает из переменной _data.dynamix_image.os_image.id_
- Виртуальная машина будет иметь одно сетевое подключение - во внешнюю сеть с идентификатором 12, IP адрес этого подключения платформа установит автоматически

```terraform
resource "dynamix_kvmvm" "comp" {
  #имя compute
  #может быть изменен
  #обязательный параметр
  #тип - строка
  name = "tf-managed-vm"

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

  #тип драйвера для compute
  #обязательный параметр
  #тип - строка
  #возможные значения: "SVA_KVM_X86", "KVM_X86"
  driver = "KVM_X86"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  #правила 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"

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

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

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

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

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

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

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

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

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

  #добавление и удаление тэгов
  #опциональный параметр
  #тип - список тэгов
  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"
  }]

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

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

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

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

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

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

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

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

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

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

  #поле для редеплоя компьюта
  #опциональный параметр
  #тип - строка
  #возможные значения - "KEEP", "DETACH", "DESTROY"
  data_disks = "KEEP"

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

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

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

}
```

### initconfig.tftpl

```
{
  "users": [
    {
      "groups": "users, wheel",
      "name": "user",
      "plain_text_passwd": "examplePassword",
      "primary_group": "user",
      "ssh_authorized_keys": [
        "ssh-rsa EXAMPLE%id_rsa.pub"
      ],
      "sudo": "ALL=(ALL) NOPASSWD:ALL"
    }
  ]
}
```

Данный пример подразумевает, что ранее по тексту tf-файла :

- выполнена корректная инициализация провайдера (подробнее об инициализации Terraform провайдера DYNAMIX см. соответствующий [раздел](https://repository.basistech.ru/BASIS/wiki-terraform-provider-dynamix/src/branch/main/1.1.0/04.02-Инициализация-Terraform-провайдера-DYNAMIX.md)).
- создан ресурс типа dynamix*resgroup (см. \_resource* функцию [dynamix_resgroup](https://repository.basistech.ru/BASIS/wiki-terraform-provider-dynamix/src/branch/main/1.1.0/07.01.02-Resource_dynamix_resgroup.md)) и результат записан в переменную _dynamix_resgroup.my_rg_
- считана информация об образе ОС(см. _data_ функцию [dynamix_image](https://repository.basistech.ru/BASIS/wiki-terraform-provider-dynamix/src/branch/main/1.1.0/06.01.07-Data_dynamix_image.md)) и результат записан в переменную _dynamix_resgroup.os_image_

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