## Инструкция по миграции с terraform-provider-decort на terraform-provider-dynamix
### Установка terraform-provider-dynamix
В релизном архиве находятся скрипты-инсталляторы.
Чтобы выполнить установку, необходимо:
1. Перейти по адресу: https://repository.basistech.ru/BASIS/terraform-provider-dynamix/releases
2. Выбрать необходимую версию провайдера подходящую под операционную систему.
3. Скачать архив.
4. Распаковать архив.
5. Выполнить скрипт установщика, `install.sh` или `install.bat` для Windows.<br/>
*Для запуска `install.sh` не забудьте изменить права доступа к файлу*
```bash
chmod u+x install.sh
```
6. Дождаться сообщения об успешной установке. Установщик выведет актуальный блок конфигурации провайдера, скопируйте его
```bash
DYNAMIX provider version 1.2.0 has been successfully installed

Copy this provider configuration to main.tf file:
terraform {
  required_providers {
    dynamix = {
      source  = "basistech.ru/tf/dynamix"
      version = "1.2.0"
    }
  }
}
```
7. Теперь вам необходимо отредактировать ваши конфигурационные .tf файлы terraform-provider-decort для работы с terraform-provider-dynamix.

#### Общие изменения
Измените блок подключения провайдера. Замените `decort` на `dynamix`, `source = "basis/decort/decort"` на
`source  = "basistech.ru/tf/dynamix"`, укажите нужную версию.
##### Было
```go
terraform {
  required_providers {
    decort = {
      source = "basis/decort/decort"
      version = "4.6.1"
    }
  }
}
```
##### Стало
```go
terraform {
  required_providers {
    dynamix = {
      source  = "basistech.ru/tf/dynamix"
      version = "1.2.0"
    }
  }
}
```
Измените блок настройки провайдера. Замените название провайдера с `decort` на `dynamix`.
##### Было
```go
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
}
```

##### Стало
```go
provider "dynamix" {
  authenticator = "decs3o"
  #controller_url = <DYNAMIX_CONTROLLER_URL>
  controller_url = "https://ds1.digitalenergy.online"
  #oauth2_url = <DYNAMIX_SSO_URL>
  oauth2_url           = "https://sso.digitalenergy.online"
  allow_unverified_ssl = true
}
```

Если параметры провайдера указаны в переменных окружения, замените префикс DECORT на DYNAMIX
#### Было 
`DECORT_CONTROLLER_URL`
#### Стало
`DYNAMIX_CONTROLLER_URL`

Измените блок описания самого ресурса/датасурса. Замените `decort` на `dynamix`.

##### Было
```go
data "decort_account" "a" {
  #id аккаунта
  #обязательный параметр
  #тип - целое число
  account_id = 11111
}
```
##### Стало
```go
data "dynamix_account" "a" {
  #id аккаунта
  #обязательный параметр
  #тип - целое число
  account_id = 11111
}
```

Не забудьте изменить название ресурса/датасурса в блоке вывода. Замените `decort` на `dynamix`.
##### Было
```go
output "test" {
  value = data.decort_account.a
}
```
##### Стало
```go
output "test" {
  value = data.dynamix_account.a
}
```
Для большинства конфигурационных файлов этих изменений будет достаточно. В терминале выполните команду
```bash
terraform init
```
В случае успешной установки, Terraform инициализирует провайдер и будет готов к дальнейшей работе.<br/>
Для ресурсов, которые описаны ниже необходимо сделать несколько дополнительных изменений.
#### Аккаунты account
1. data source `dynamix_account_deleted_list`
    - Data source `dynamix_account_deleted_list` теперь имеет название `dynamix_account_list_deleted` и должен быть переименован. Блок `output` так же должен быть изменен.
      ##### Было
      ```go
      data "dynamix_account_deleted_list" "adl" {
      #фильтр по id аккаунта
      #опциональный параметр
      #тип - целое число
      #by_id = 100

      #фильтр по имени аккаунта
      #опциональный параметр
      #тип - строка
      #name = "test"

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

      #сортировка по одному из поддерживаемых полей
      #опциональный параметр
      #тип - строка
      #формат - "+поле" по возрастанию / "-поле" по убыванию
      #sort_by = "+name"

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

      #размер страницы
      #опциональный параметр
      #тип - целое число
      #если не задан - выводятся все доступные данные
      #size = 3
      }

      output "test" {
        value = data.dynamix_account_deleted_list.adl
      }
      ```
      ##### Стало
      ```go
      data "dynamix_account_list_deleted" "adl" {
      #фильтр по id аккаунта
      #опциональный параметр
      #тип - целое число
      #by_id = 100

      #фильтр по имени аккаунта
      #опциональный параметр
      #тип - строка
      #name = "test"

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

      #сортировка по одному из поддерживаемых полей
      #опциональный параметр
      #тип - строка
      #формат - "+поле" по возрастанию / "-поле" по убыванию
      #sort_by = "+name"

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

      #размер страницы
      #опциональный параметр
      #тип - целое число
      #если не задан - выводятся все доступные данные
      #size = 3
      }

      output "test" {
        value = data.dynamix_account_list_deleted.adl
      }
      ```

#### Ресурсная группа rg

1. resource `dynamix_resgroup`
    
   - Блоки `def_net`, `access`, `quota` стали атрибутами и теперь их следует задавать через знак равно.
        ##### Было
        ```go
        access [{
            #имя юзера предоставляемому права 
            #обязательный параметр при использовании блока
            #тип - строка
            user = "user@decs3o"

            #тип прав
            #опциональный параметр
            #тип - строка
            right = "RCX"
        }]
        ```
        ```go
        def_net {
            #тип сети
            #обязательный параметр при использовании блока
            #тип - строка
            net_type = "PUBLIC"

            #id сети
            #опциональный параметр
            #идентификатор сегмента сети. Если net_type — PUBLIC, а net_id — 0, 
            #то будет выбран сегмент внешней сети по умолчанию. Если net_type 
            #имеет значение PRIVATE и net_id=0, будет выбран первый vins, определенный для этой ресурсной группы 
            #в противном случае net_id идентифицирует либо существующий сегмент внешней сети, либо vins
            #тип - целое число
            net_id = 1234
        }
        ```
        ```go
        quota {
            #максимальное количество ядер процессора
            #опциональный параметр
            #значение по умолчанию: -1
            #тип - целое число
            cpu = 5

            #максимальный размер памяти в мегабайтах
            #опциональный параметр
            #значение по умолчанию: -1
            #тип - целое число
            ram = 1024

            #максимальный размер объединенных виртуальных дисков в ГБ
            #опциональный параметр
            #значение по умолчанию: -1
            #тип - целое число
            disk = 180

            #максимальное количество отправленных/полученных сетевых узлов
            #опциональный параметр
            #значение по умолчанию: -1
            #тип - целое число
            ext_traffic = 21

            #максимальное количество назначенных общедоступных IP-адресов
            #опциональный параметр
            #значение по умолчанию: -1
            #тип - целое число
            ext_ips = 29
        }
        ```
        ##### Стало
        ```go
        access = [{
            #имя юзера предоставляемому права 
            #обязательный параметр при использовании блока
            #тип - строка
            user = "user@decs3o"

            #тип прав
            #опциональный параметр
            #тип - строка
            right = "RCX"
        }]
        ```
        ```go
        def_net = {
            #тип сети
            #обязательный параметр при использовании блока
            #тип - строка
            net_type = "PUBLIC"

            #id сети
            #опциональный параметр
            #идентификатор сегмента сети. Если net_type — PUBLIC, а net_id — 0, 
            #то будет выбран сегмент внешней сети по умолчанию. Если net_type 
            #имеет значение PRIVATE и net_id=0, будет выбран первый vins, определенный для этой ресурсной группы 
            #в противном случае net_id идентифицирует либо существующий сегмент внешней сети, либо vins
            #тип - целое число
            net_id = 1234
        }
        ```
        ```go
        quota = {
            #максимальное количество ядер процессора
            #опциональный параметр
            #значение по умолчанию: -1
            #тип - целое число
            cpu = 5

            #максимальный размер памяти в мегабайтах
            #опциональный параметр
            #значение по умолчанию: -1
            #тип - целое число
            ram = 1024

            #максимальный размер объединенных виртуальных дисков в ГБ
            #опциональный параметр
            #значение по умолчанию: -1
            #тип - целое число
            disk = 180

            #максимальное количество отправленных/полученных сетевых узлов
            #опциональный параметр
            #значение по умолчанию: -1
            #тип - целое число
            ext_traffic = 21

            #максимальное количество назначенных общедоступных IP-адресов
            #опциональный параметр
            #значение по умолчанию: -1
            #тип - целое число
            ext_ips = 29
        }
        ```
#### Внутренние сети vins

1. resource `dynamix_vins`
    - В блоке `nat_rule` поля `int_ip` и `ext_port_start` стали обязательными. Ранее были опциональными. Необходимо их заполнить.
    ```go
    nat_rule {
    #ip внутренний
    #обязательный параметр
    #тип - строка
    int_ip = "192.168.0.28"

    #начало диапазона внешних портов
    #обязательный параметр
    #тип - целое число
    ext_port_start = 8001
    }
    ```

#### Виртуальные машины KVM KVMVM

1. resource `dynamix_kvmvm`
    - Необходимо полностью удалить удалить блок `disks` из конфигурационного файла. Теперь диски нужно создавать через функцию `dynamix_disk`. В `dynamix_kvmvm` их можно указать в поле `extra_disks`
    - Блоки `affinity_rules`, `anti_affinity_rules`, `network`, `tags`,`port_forwarding`, `user_access`, `snapshot`, `rollback`, `cd`,  стали атрибутами и теперь их следует задавать через знак равно.
      ##### Было
      ```go
      affinity_rules {
        #тип правила
        #обязательный параметр
        #возможные значения - compute или node
        #тип - строка
        topology = "compute"

        #строгость правила
        #обязательный параметр
        #возможные значения - RECOMMENDED и REQUIRED
        #тип - строка
        policy = "RECOMMENDED"

        #режим проверки 
        #обязательный параметр
        #возможные значения - ANY, EQ, NE
        #тип - строка
        mode = "ANY"

        #ключ правила
        #обязательный параметр
        #тип - строка
        key = "testkey"

        #ключ правила
        #необязательный параметр
        #тип - строка
        value = "testvalue"
      }
      ```
      ##### Стало
      ```go
      affinity_rules = [{
        #тип правила
        #обязательный параметр
        #возможные значения - compute или node
        #тип - строка
        topology = "compute"

        #строгость правила
        #обязательный параметр
        #возможные значения - RECOMMENDED и REQUIRED
        #тип - строка
        policy = "RECOMMENDED"

        #режим проверки 
        #обязательный параметр
        #возможные значения - ANY, EQ, NE
        #тип - строка
        mode = "ANY"

        #ключ правила
        #обязательный параметр
        #тип - строка
        key = "testkey"

        #ключ правила
        #опциональный параметр
        #тип - строка
        value = "testvalue"
      }]
      ```

      ##### Было
      ```go
      anti_affinity_rules {
        #тип правила
        #обязательный параметр
        #возможные значения - compute или node
        #тип - строка
        topology = "compute"

        #строгость правила
        #обязательный параметр
        #возможные значения - RECOMMENDED и REQUIRED
        #тип - строка
        policy = "RECOMMENDED"

        #режим проверки 
        #обязательный параметр
        #возможные значения - ANY, EQ, NE
        #тип - строка
        mode = "ANY"

        #ключ правила
        #обязательный параметр
        #тип - строка
        key = "testkey"

        #ключ правила
        #необязательный параметр
        #тип -строка
        value = "testvalue"
      }
      ```
      ##### Стало
      ```go
      anti_affinity_rules = [{
        #тип правила
        #обязательный параметр
        #возможные значения - compute или node
        #тип - строка
        topology = "compute"

        #строгость правила
        #обязательный параметр
        #возможные значения - RECOMMENDED и REQUIRED
        #тип - строка
        policy = "RECOMMENDED"

        #режим проверки 
        #обязательный параметр
        #возможные значения - ANY, EQ, NE
        #тип - строка
        mode = "ANY"

        #ключ правила
        #обязательный параметр
        #тип - строка
        key = "testkey"

        #ключ правила
        #опциональный параметр
        #тип -строка
        value = "testvalue"
      }]
      ```
      ##### Было
      ```go
      network {
        #тип сети VINS/EXTNET (для любого драйвера) и VFNIC (для KVM_X86)
        #обязательный параметр
        #тип - строка
        net_type = "VINS"

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

        #ip адрес входящий в сеть
        #опциональный параметр
        #тип - строка
        ip_address = "127.0.0.1"
      }
      ```
      ##### Стало
      ```go
      network = [{
        #тип сети VINS/EXTNET (для любого драйвера) и VFNIC (для KVM_X86)
        #обязательный параметр
        #тип - строка
        net_type = "VINS"

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

        #ip адрес входящий в сеть
        #опциональный параметр
        #тип - строка
        ip_address = "127.0.0.1"
      }]
      ```
      ##### Было
      ```go
      tags {
        #Ключ для тэга
        #Обязательный параметр
        #тип - строка
        key = "key"

        #значения тэга
        #обязательный параметр
        #тип - строка
        value = "value"
      }
      ```

      ##### Стало
      ```go
      tags = [{
        #ключ для тэга
        #обязательный параметр
        #тип - строка
        key = "key"

        #значения тэга
        #обязательный параметр
        #тип - строка
        value = "value"
      }]
      ```
      ##### Было
      ```go
      port_forwarding {
        #номер внешнего начального порта для правила
        #Обязательный параметр
        #тип - целое число
        public_port_start = 2023

        #номер внешнего последнего порта для правила
        #опциональный параметр
        #тип - целое число
        #по умолчанию - -1
        public_port_end = 2023

        #номер внутреннего базового порта
        #обязательный параметр
        #тип - целое число
        local_port = 80

        #сетевой протокол
        #Обязательный параметр
        #тип - строка
        proto = "tcp"
      }
      ```
      ##### Стало
      ```go
      port_forwarding = [{
        #номер внешнего начального порта для правила
        #Обязательный параметр
        #тип - целое число
        public_port_start = 2023

        #номер внешнего последнего порта для правила
        #опциональный параметр
        #тип - целое число
        #по умолчанию - -1
        public_port_end = 2023

        #номер внутреннего базового порта
        #обязательный параметр
        #тип - целое число
        local_port = 80

        #сетевой протокол
        #Обязательный параметр
        #тип - строка
        proto = "tcp"
      }]
      ```
      ##### Было
      ```go
      user_access {
        #имя юзера, которому предоставляем доступ
        #обязательный параметр
        #тип - строка
        username = "kasim_baybikov_1@decs3o"

        #права: 'R' - только на чтение, 'RCX' - чтение/запись, 'ARCXDU' - админ
        #обязательный параметр
        #тип - строка
        access_type = "ARCXDU"
      }
      ```

      ##### Стало
      ```go
      user_access = [{
        #имя юзера, которому предоставляем доступ
        #обязательный параметр
        #тип - строка
        username = "kasim_baybikov_1@decs3o"

        #права: 'R' - только на чтение, 'RCX' - чтение/запись, 'ARCXDU' - админ
        #обязательный параметр
        #тип - строка
        access_type = "ARCXDU"
      }]
      ```

      ##### Было
      ```go
      snapshot {
        #лейбл снапшота
        #обязательный параметр
        #тип - строка
        label = "label1"
      }
      ```

      ##### Стало
      ```go
      snapshot = [{
        #лейбл снапшота
        #обязательный параметр
        #тип - строка
        label = "label1"
      }]
      ```
      ##### Было
      ```go
      rollback {
        #Лейбл снапшота
        #Обязательный параметр
        #тип - строка
        label = "label1"
      }
      ```
      ##### Стало
      ```go
      rollback = {
        #Лейбл снапшота
        #Обязательный параметр
        #тип - строка
        label = "label1"
      }
      ```
      ##### Было
      ```go
      cd {
        #id образа диска CD rom
        #обязательный параметр
        #тип - целое число
        cdrom_id = 344
      }
      ```
      ##### Стало
      ```go
      cd = {
        #id образа диска CD rom
        #обязательный параметр
        #тип - целое число
        cdrom_id = 344
      }
      ```