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

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

}

output "test_cluster" {
  value = decort_k8s.cluster
}
