Функция доступна в провайдере версии 4.2.0 и выше.

## Изменения в 4.4.0

- добавлено поле _extnet_only_
- добавлено поле _oidc_cert_
- добавлено поле _cloud_init_ (в дальнейших версиях удалено)
- добавлено поле _ha_mode_
- добавлено поле _cluster_config_

_Resource_ функция **decort_k8s_cp** служит для управления control plane кластера k8s. Функция позволяет:

- Создать кластер
- Удалить кластер
- Настроить мастер-узел
- Изменить кол-во ВМ в мастер-узле

Созданный с помощью данного ресурса кластер не имеет стандартных рабочих узлов и логики управления ими. Для управления worker-группами используется отдельный ресурс `decort_k8s_wg`. <br/>
**!** При удалении ресурса `decort_k8s_cp` удалится сам кластер и все зависимые ресурсы (worker-группы) <br/>
**!** При использовании `decort_k8s_cp` не рекомендуется параллельное использование `decort_k8s` для управления одним и тем же кластером во избежание проблем с идемпотентностью

**Данный способ управления кластерами стал предпочтительным с версии провайдера 4.2.0 - для упрощения процесса миграции обратитесь к [**статье.\*\*](https://repository.basistech.ru/BASIS/terraform-provider-decort/src/branch/main/wiki/4.5.2/05.07-Миграция-k8s-кластеров-на-версию-4.2.0.md)

## Работа с cluster_config

Для использования cluster_config конфигурации, следует:

1. Создать файл с расширением `.json` в рабочей директории.
2. Описать в созданном файле конфигурацию cluster_config в формате JSON:

### cluster_config.json

```json
{
  "apiServer": {
    "extraArgs": {
      "oidc-issuer-url": "https://dex.decs.local/",
      "oidc-client-id": "dex",
      "oidc-username-claim": "email",
      "oidc-groups-claim": "groups",
      "oidc-ca-file": "/etc/kubernetes/ssl/kc-ca.pem"
    }
  }
}
```

3. Указать путь до файла `cluster_config.json` в качестве значения параметра `cluster_config` в ресурсе `decort_k8s`:

```terraform
resource "decort_k8s" "cluster1" {
   # ...

   cluster_config = file("cluster_config.json")

   # ...
}
```

4. Выполнить `terraform apply`

## Работа с oidc\_\_cert

Для работы с oidc_cert следует:

1. Создать файл с ssl-сертификатом в формате x509 pem c названием ca.crt в рабочей директории

### ca.crt

Пример содержания файла ca.crt

```
-----BEGIN CERTIFICATE-----
MIIDzTCCArWgAwIBAgIUUW9bFlExT8f/gVX4OrYXegInXi0wDQYJKoZIhvcNAQEL
BQAwdjELMAkGA1UEBhMCUlUxDzANBgNVBAgMBk1vc2NvdzEPMA0GA1UEBwwGTW9z
Y293MQwwCgYDVQQKDANBQkMxDDAKBgNVBAsMA0FCQzEMMAoGA1UEAwwDQUJDMRsw
GQYJKoZIhvcNAQkBFgxBQkNAbWFpbC5jb20wHhcNMjMwOTI2MTQ0MzM2WhcNMjQw
OTI1MTQ0MzM2WjB2MQswCQYDVQQGEwJSVTEPMA0GA1UECAwGTW9zY293MQ8wDQYD
VQQHDAZNb3Njb3cxDDAKBgNVBAoMA0FCQzEMMAoGA1UECwwDQUJDMQwwCgYDVQQD
DANBQkMxGzAZBgkqhkiG9w0BCQEWDEFCQ0BtYWlsLmNvbTCCASIwDQYJKoZIhvcN
AQEBBQADggEPADCCAQoCggEBAOUGj6B7sBrAYBuAQ4I0f6plcrLG33cNGzcktZrS
SZRWOMwXzBCUNNOBKXZHnapUAoZW23BllpZ/y50Y01JAggdBPbODw864ZROJMt3P
xlZZJQghraFUF8H/ANsmRzfh3nD98fBSr4YUg2VGEwg+Qvzh2peiNBRer4tD6QuV
BqiJZyUNrz0JUKmFZF/uTM4rNRhmF7y95A49GDZeIzwFFARSMkQPtIjMj8h75fs3
PD41wEkQyV5SSM3YMGQeqp/7ay10ec31s6cn/PBB8bF8PTVYc+hJOfNuVrkm8CqG
w1kzKg+7ztgcCMOEL2yftgckg5PSFMQ+5RPgBieEOj3IDHsCAwEAAaNTMFEwHQYD
VR0OBBYEFPLv18WpzpwIGhqlM2EAHl7TXgNnMB8GA1UdIwQYMBaAFPLv18WpzpwI
GhqlM2EAHl7TXgNnMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB
ADbH2Y4ExwEllkKrQ+VcyajjPXV9vcG5Ag+/9DUM0aFCO4H0ZzdBKHVCGMwIx5sS
gLSLx2zoT2F3oTHaJ4T9iVx+sBleKZZbpApO51dLaVSiy69cfkZy/GOMiWuEEZPU
UdGTMAAoM1+gqx8n0EsGf96zJZ+PtjHi6RdNmPBnuRRvRRPXQKNLJF1kYDgYlFdH
KxLl/lm/Y0zhV/VNd7OXsV0LAsyrRiNpuyCaniCOTR1ZRkD4UfWkc/bbNgbLjAfb
8Y0SjvSiYpFPE0DQv0ksSrhySJtyCy71UTGzSHI+tRB9LwhnDiijAoT7LnxQgNq8
5IdaZNyYvyGubkczwBrFddU=
-----END CERTIFICATE-----
```

2. Указать путь до файла `ca.crt` в качестве значениея параметра `oidc_cert` в ресурсе `decort_k8s`

```terraform
resource "decort_k8s" "cluster1" {
   # ...

   oidc_cert = file("ca.crt")

   # ...
}
```

3. Выполнить `terraform apply`

## Работа в параллельном режиме

Рекомендуется создавать одновременно не более одного экземпляра ресурса.
В случае необходимости создания нескольких ресурсов одновременно, необходимо запускать `terraform apply/plan` в режиме `-parallelism=1`.

## Аргументы

_Resource_ функция **decort_k8s_cp** принимает следующие аргументы:

| Аргумент       | Тип    |    Обязательный    | Описание                                                                                                                                                                                                                                                                                   |
| -------------- | ------ | :----------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| name           | string | :heavy_check_mark: | Наименование кластера                                                                                                                                                                                                                                                                      |
| k8sci_id       | int    | :heavy_check_mark: | ID k8s CI                                                                                                                                                                                                                                                                                  |
| network_plugin | string | :heavy_check_mark: | Плагин сети ("flannel", "weavenet" или "calico")                                                                                                                                                                                                                                           |
| rg_id          | int    | :heavy_check_mark: | ID ресурсной группы                                                                                                                                                                                                                                                                        |
| num            | int    | :heavy_check_mark: | Кол-во ВМ в мастер-узле (1 или 3)                                                                                                                                                                                                                                                          |
| cpu            | int    |        :x:         | Кол-во ядер для мастер-узла                                                                                                                                                                                                                                                                |
| ram            | int    |        :x:         | Кол-во RAM (в мб) для мастер-узла                                                                                                                                                                                                                                                          |
| disk           | int    |        :x:         | Размер диска мастер-узла                                                                                                                                                                                                                                                                   |
| sep_id         | int    |        :x:         | Storage Endpoint ID мастер-узла                                                                                                                                                                                                                                                            |
| sep_pool       | string |        :x:         | SEP пул мастер-узла                                                                                                                                                                                                                                                                        |
| with_lb        | bool   |        :x:         | Создать кластер с/без балансировщика нагрузки                                                                                                                                                                                                                                              |
| extnet_id      | int    |        :x:         | ID внешний сети для подключения worker'ов                                                                                                                                                                                                                                                  |
| desc           | string |        :x:         | Описание кластера                                                                                                                                                                                                                                                                          |
| cluster_config | string |        :x:         | используется для определения глобальных настроек и конфигураций для всего кластера. Она включает в себя такие параметры, как имя кластера, настройки DNS, методы аутентификации и другие конфигурации в масштабах кластера. вставьте допустимую строку JSON со всеми уровнями вложенности. |
| oidc_cert      | string |        :x:         | ssl-сертификат в формате x509 pem                                                                                                                                                                                                                                                          |
| extnet_only    | bool   |        :x:         | Использовать только extnet для работы кластера                                                                                                                                                                                                                                             |
| ha_mode        | bool   |        :x:         | Режим высокой доступностью балансировщика нагрузки                                                                                                                                                                                                                                         |
| start          | bool   |        :x:         | Старт/Стоп кластера                                                                                                                                                                                                                                                                        |

## Возвращаемые значения

В случае успешного выполнения _resource_ функция **decort_k8s_cp** возвращает в указанную при вызове переменную следующие значения:

| Параметр       | Тип                                                          | Описание                            |
| -------------- | ------------------------------------------------------------ | ----------------------------------- |
| acl            | Struct{} [см. ниже](#описание-структуры-списка-acl)          | acl                                 |
| account_id     | int                                                          | ID аккаунта                         |
| account_name   | string                                                       | Имя аккаунта                        |
| bservice_id    | int                                                          | ID bservice                         |
| k8sci_id       | int                                                          | ID образа кластера                  |
| k8s_id         | int                                                          | ID кластера                         |
| detailed_info  | Struct{} [см.ниже](#описание-структуры-списка-detailed_info) | Информация о ВМ внутри мастер-узла  |
| master_id      | int                                                          | ID мастер-узла                      |
| master_name    | string                                                       | Наименование мастер-узла            |
| num            | int                                                          | Кол-во ВМ в мастер-узле (1 или 3)   |
| cpu            | int                                                          | Кол-во ядер для мастер-узла         |
| ram            | int                                                          | Кол-во RAM (в мб) для мастер-узла   |
| disk           | int                                                          | Размер диска мастер-узла            |
| sep_id         | int                                                          | Storage Endpoint ID мастер-узла     |
| sep_pool       | string                                                       | SEP пул мастер-узла                 |
| created_by     | string                                                       | Кем был создан ресурс               |
| created_time   | int                                                          | Время создания ресурса              |
| deleted_by     | string                                                       | Кем был удален ресурс               |
| deleted_time   | int                                                          | Время удаления ресурса              |
| extnet_id      | int                                                          | ID внешней сети                     |
| k8s_ci_name    | string                                                       | Имя образа кластера                 |
| lb_id          | int                                                          | ID балансировщика нагрзуки          |
| lb_ip          | string                                                       | IP балансировщика нагрзуки          |
| name           | string                                                       | Имя ресурса                         |
| network_plugin | string                                                       | Сетевой плагин                      |
| rg_id          | int                                                          | ID ресурсной группы                 |
| rg_name        | string                                                       | Имя ресурсной группы                |
| status         | string                                                       | Статус ресурса                      |
| tech_status    | string                                                       | Технический статус ресурса          |
| updated_by     | string                                                       | Кем был обновлен ресурс             |
| updated_time   | int                                                          | Время последнего обновления ресурса |
| kubeconfig     | string                                                       | Конфиг                              |
| vins_id        | int                                                          | ID виртуальной сети                 |

### Описание структуры списка acl

| Параметр      | Тип    | Описание       |
| ------------- | ------ | -------------- |
| explicit      | bool   | explicit       |
| guid          | string | ID ресурса     |
| right         | string | right          |
| status        | string | Статус ресурса |
| type          | string | Тип ресурса    |
| user_group_id | string | ID группы      |

### Описание структуры списка detailed_info

| Параметр             | Тип                                                          | Описание                         |
| -------------------- | ------------------------------------------------------------ | -------------------------------- |
| compute_id           | int                                                          | ID компьюта в составе группы     |
| name                 | string                                                       | Имя компьюта в составе группы    |
| status               | string                                                       | Статус компьюта в составе группы |
| tech_status          | string                                                       | Статус компьюта в составе группы |
| interfaces           | []Struct{} [см. ниже](#описание-структуры-списка-interfaces) | Список интерфейсов группы        |
| natable_vins_ip      | string                                                       | IP NAT                           |
| natable_vins_network | string                                                       | IP виртуальной сети              |

### Описание структуры списка interfaces

| Параметр   | Тип    | Описание          |
| ---------- | ------ | ----------------- |
| def_gw     | string | Шлюз по умолчанию |
| ip_address | string | IP интерфейса     |

## Пример использования

Пример вызова _resource_ функции **decort_k8s_cp**:

```terraform
resource "decort_k8s_cp" "cp" {
  # Название кластера
  # Обязательный параметр
  # string
  name           = <NAME>

  # K8sCI ID
  # Обязательный параметр
  # int
  k8sci_id       = <ID>

  # Плагин сети (flannel, weavenet или calico)
  # Обязательный параметр
  # string
  network_plugin = "flannel"

  # ID ресурсной группы
  # Обязательный параметр
  # int
  rg_id          = <ID>

  # Кол-во ядер мастер-узла
  # Опциональный параметр
  # int
  cpu  = 2

  # Объем RAM мастер-узла
  # Опциональный параметр
  # int
  ram  = 2048

  # Кол-во ВМ мастер-узла (1 или 3)
  # Опциональный параметр
  # int
  num  = 1

  # Размер диска мастер-узла
  # Опциональный параметр
  # int
  disk = 10

  # Описание кластера
  # Опциональный параметр
  # string
  desc = "<DESCRIPTION>"

  # ID внешней сети
  # Опциональный параметр
  # id
  extnet_id = <ID>

  # Storage Endpoint ID
  # Опциональный параметр
  # id
  sep_id = <ID>

  # SEP Pool
  # Опциональный параметр
  # string
  sep_pool = <POOL>

  # Старт/Стоп кластера
  # Опциональный параметр
  # bool
  start = <BOOL>

  # Создать кластер с/без балансировщика нагрузки
  # Опциональный параметр
  # bool
  with_lb = <BOOL>
}
```

После успешного завершения такого вызова **decort_k8s_cp** в переменной `decort_k8s_cp.cp` будут сохранены возвращаемые значения.
