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

#Расскомментируйте этот код,
#и внесите необходимые правки в версию и путь,
#чтобы работать с установленным вручную (не через 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_k8s" "cluster" {
  #имя кластера
  #обязательный параметр
  #при изменении - обновляет имя кластера
  #тип - строка
  name = "tftest"

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

  #id catalogue item 
  #обязательный параметр
  #тип - целое число
  k8sci_id = 9

  #сетевой плагин
  #обязательный параметр
  #тип - строка
  network_plugin = "flannel"

  #имя для первой worker group, созданной в кластере
  #обязательный параметр
  #тип - строка
  wg_name = "workers"

  # список labels для дефолтной worker группы
  # опциональный параметр
  # тип - массив строк 
  labels = ["key1=val1", "key2=val2"]

  # список annotations для дефолтной worker группы
  # опциональный параметр
  # В скором времени параметры labels, annotations, taints будут полностью перенесены в блок workers
  # тип - массив строк 
  annotations = ["key1=val1", "key2=val2"]

  # список taints для дефолтной worker группы
  # опциональный параметр
  # В скором времени параметры labels, annotations, taints будут полностью перенесены в блок workers
  # тип - массив строк 
  taints = ["key1=value1:NoSchedule", "key2=value2:NoExecute"]

  #настройка мастер node или nodes
  #опциональный параметр
  #максимальное кол-во элементов - 1
  #тип - список нод
  masters {
    #кол-во node (1, 3 или 5)
    #обязательный параметр
    #тип - целое число
    num = 1

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

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

    #размер диска в Гбайтах
    #обязательный параметр
    #тип - целое число
    disk = 10

    #идентификатор SEP для создания загрузочных дисков для master узлов
    #опциональный параметр
    #тип - целое число
    sep_id = 3

    #наименование MasterSEPPool используется если установлен master sepId, также может быть пустым
    #опциональный параметр
    #тип - строка
    sep_pool = "data_01"
  }

  #настройка worker группы
  #опциональный параметр
  #Первая указанная воркер-группа должна соответствовать изначально созданной вместе с кластером.
  #labels, annotations, taints для дефолтной worker группы указываются в корне ресурса при создании кластера.
  workers {
    #имя группы
    #обязательный параметр
    #тип - строка
    name = "test"

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

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

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

    #размер диска в Гбайтах
    #обязательный параметр
    #тип - целое число
    disk = 10

    #Идентификатор SEP
    #опциональный параметр
    #тип - целое число
    sep_id = 1010

    #Имя SEP pool'a
    #опциональный параметр
    #тип - строка
    sep_pool = "data01"

    #тип эмулируемой системы
    #опциональный параметр
    #тип - строка
    chipset = "i440fx"
  }

  #...Далее можно создавать произвольное кол-во дополнительных worker групп
  #labels, annotations и taints для последующих групп указываются непосредственно в блоке workers
  workers {
    #наименование worker группы
    #обязательный параметр
    #тип - строка
    name = "additional_wg"

    #кол-во node
    #обязательный параметр
    #тип - целое число
    num = 2

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

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

    #размер диска в Гбайтах
    #обязательный параметр
    #тип - целое число
    disk = 10

    #идентификатор SEP
    #опциональный параметр
    #тип - целое число
    sep_id = 1010

    #имя SEP pool'a
    #опциональный параметр
    #тип - строка
    sep_pool = "data01"

    #тип эмулируемой системы
    #опциональный параметр
    #тип - строка
    chipset = "i440fx"

    #список лейблов
    #опциональный параметр
    #тип - массив строк
    labels = ["label1=value1", "label2=value2"]

    #список аннотаций
    #опциональный параметр
    #тип - массив строк
    annotations = ["key1=value1", "key2=value2"]

    #список taints
    #опциональный параметр
    #тип - массив строк
    taints = ["key1=value1:NoSchedule", "key2=value2:NoExecute"]
  }

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

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

  #создать Kubernetes cluster с masters nodes с подключенным LB
  #опциональный параметр
  #тип - булев 
  with_lb = true

  # пользовательские значения sysctl для LB
  # опциональный параметр
  # тип - список мап
  lb_sysctl_params = [{ key1 = "value1", key2 = "value2" }]

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

  # дополнительные SAN (Subject Alternative Names) для использования в процессе автоматического выписывания сертификата Кластера Kubernetes;
  # возможность взаимодействовать с кластером по FQDN
  # параметр получает список строк – IP-адреса и/или DNS (по формату RFC 1123 c поддержкой wildcard)
  # опциональный параметр
  # тип - массив строк
  additional_sans = ["192.168.201.0", "192.168.201.1"]

  # используется для определения настроек и действий, которые должны быть выполнены перед запуском любого другого компонента в кластере
  # это позволяет вам настраивать такие вещи, как регистрация node, настройка network и другие задачи инициализации
  # опциональный параметр
  # тип - строка
  init_config = "{JSON string}"

  # используется для определения глобальных настроек и конфигураций для всего кластера
  # он включает в себя такие параметры, как имя кластера, настройки DNS, методы аутентификации и другие конфигурации в масштабах кластера
  # опциональный параметр
  # тип - строка
  cluster_config = "{JSON string}"

  # используется для настройки поведения и параметров Kubelet, который является агентом primary node, запускаемым на каждом node кластера
  # он включает в себя такие параметры, как IP-адрес node, распределение ресурсов, политики удаления модулей и другие конфигурации, специфичные для Kubelet
  # опциональный параметр
  # тип - строка
  kubelet_config = "{JSON string}"

  # используется для настройки поведения и параметров присоединения node к кластеру
  # он включает в себя такие параметры, как режим прокси-сервера, диапазоны IP-адресов кластера и другие конфигурации, специфичные для Kube-proxy
  # опциональный параметр
  # тип - строка
  kube_proxy_config = "{JSON string}"

  # используется для настройки поведения и параметров присоединения node к кластеру
  # он включает в себя такие параметры, как cluster's control plane endpoint, токен и ключ сертификата
  # опциональный параметр
  # тип - строка
  join_config = "{JSON string}"

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

  # перечень аргументов для cloud-init создаваемым группам узлов Worker
  # необязательный параметр
  # тип - файл с форматом в виде yaml
  cloud_init = file("initconfig.tftpl")

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

  # добавить ssl-сертификат в формате x509 pem
  # необязательный параметр
  # тип - файл с форматом в виде x509 pem
  oidc_cert = file("ca.crt")

  #тип эмулируемой системы
  #опциональный параметр
  #тип - строка
  chipset = "i440fx"

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

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

}

output "test_cluster" {
  value = decort_k8s.cluster
}
