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


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_cb_kvmvm" "comp" {
  #имя compute
  #обязательный параметр
  #мб изменен
  #тип - строка
  name = "test-tf-compute-update-new"

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

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

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

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

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

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

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

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

  #stack id
  #опциональный параметр
  #тип - целое число
  #stack_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

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

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

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

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

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

    #описание диска
    #опциональный параметр
    #тип - строка
    #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]
    
  #управление XML виртуальной машины
  #опциональный параметр
  #тип - строка (json-encoded)
  #custom_fields = "{`key`:`value`}"

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

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

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

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

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

  #id stack для добавления компьюта на этот стэк
  #опциональный параметр
  #тип - целое число
  #target_stack_id = 1

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

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

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

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

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

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

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

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

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

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

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

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

output "test" {
  value = decort_cb_kvmvm.comp
}
