/*
Пример использования
Работа с ресурсом 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

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

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

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

  #тип эмулируемой системы
  #опциональный параметр
  #тип - строка
  #возможные значения: "i440fx", "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"

    #Размер диска
    #Обязательный для диска параметр
    #тип - целоетчисло
    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"
    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 = "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_stack = true

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

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

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

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

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

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

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

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

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

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

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

}

output "test" {
  value = decort_kvmvm.comp
}
