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

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

provider "dynamix" {
  authenticator = "decs3o"
  #controller_url = <DYNAMIX_CONTROLLER_URL>
  controller_url = "https://ds1.digitalenergy.online"
  #oauth2_url = <DYNAMIX_OAUTH2_URL>
  oauth2_url           = "https://sso.digitalenergy.online"
  allow_unverified_ssl = true
}

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

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

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

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

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

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

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

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

  #конфигурация cloud init
  #опциональный параметр
  #тип - файл в формате JSON/YAML
  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

  #правила 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 (для KVM_X86)
    #обязательный параметр
    #тип - строка
    net_type = "VINS"

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

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

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

}

output "test" {
  value = dynamix_kvmvm.comp
}
