/*
Пример использования
Работа с ресурсом kvmvm (compute)
Ресурс позволяет:
1. Создавать compute
2. Редактировать compute
3. Удалять compute
*/

#Раскомментируйте этот код,
#и внесите необходимые правки в версию и путь,
#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
/*
terraform {
  required_providers {
    decort = {
      source  = "basis/decort/decort"
      version = "<VERSION>"
    }
  }
}
*/

provider "decort" {
  authenticator        = "decs3o"
  #controller_url = <DECORT_CONTROLLER_URL>
  controller_url       = "https://ds1.digitalenergy.online"
  #oauth2_url = <DECORT_SSO_URL>
  oauth2_url           = "https://sso.digitalenergy.online"
  allow_unverified_ssl = true
}

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

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

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

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

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

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

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

  #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]

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

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

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

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

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

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

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

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

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

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

  #присоединение сетей и удаление сетей в компьюте
  #опциональный параметр
  #тип - блок сетей
  #используется при создании и обновлении
  #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 = "kasim_baybikov_1@decs3o"

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

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

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

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

  #вставить/удалить СD rom
  #опциональный параметр
  #максимальное кол-во - 1
  #тип - блок cd
  #используется при создании и обновлении
  #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

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

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

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

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

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

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

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

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

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

  #тип вм
  #возможные значения - 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"   
}

output "test" {
  value = decort_kvmvm.comp
}
