_Resource_ функция **decort_vins** служит для управления виртуальными сетевыми сегментами (Virtual Network Segment) в платформе DECORT.

## Изменения в 3.3.0
Добавлена обработка статусов виртуальной сети.  
Если статус __DELETED__, то при попытке изменения конфигурационного файла, сеть будет автоматически восстановлена.  
Если статус __DESTROYED__, то при попытке изменения конфигурационного файла, сеть будет автоматически пересоздана.  
Начиная с версии 3.3.0, в ресурсе vins появляется опциональное поле `enabled`, которое принимает в себя булево значение. Поле отвечает за ручную регуляцию статуса доступности виртуальной сети, автоматическая регуляция так же имеется - восстановленная и вновь созданная виртуальная сеть переводится в режим `enabled = true`.  
Добавлена возможность добалять NAT правила через блок nat_rule.  
Добавлена возможность резервировать и освобождать IP адреса для виртуальной сети с помощью блока ip.  
Добавлена возможность ручного рестарта виртуальной сети, через опциональное поле `restore` которое принимает в себя булево значение.  
Добавлена возможность ручного рестарта VNF, через опциональное поле `vnfdev_restart` которое принимает в себя булево значение.  
Добавлена возможность ручного редеплоя VNF, через опциональное поле `vnfdev_redeploy` которое принимает в себя булево значение.  
Добавлена возможность удаления ресурса в корзину и полность, через опциональное поле `permanently` которое принимает в себя булево значение.  
Добавлена возможность удаления ресурса даже если к нему присоеденены другие ресурсы, которые будут отключены от виртуальной сети, через опциональное поле `force` которое принимает в себя булево значение.  


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

| Аргумент             | Тип | Обязательный | Описание |
|----------------------| --- | --- | --- |
| name                 | string | :heavy_check_mark: | Имя виртуального сетевого сегмента (ViNS), по которому требуется получить информацию. Имя не может быть пустым.<br/>ViNS идентифицируется по комбинации имени и идентификатора ресурсной группы (`rg_id`) или подписчика (`account_id`).<br>Обратите внимание, что имя ViNS является уникальным в рамках "account" и ресурсной группы. |
| rg_id                | int | :x: | Идентификатор ресурсной группы, в которой должен находиться данный ViNS.<br>Если требуется создать ViNS на уровне подписчика ("account"), то необходимо указать `rg_id = 0`.<br/>Обратите внимание, что попытка изменить `rg_id` у существующего ресурса приведёт к его пересозданию.|
| account_id           | int | :x: | Данный параметр является обязательным независимо от того, создаётся ли ViNS на уровне подписчика или на уровне ресурсной группы.<br/> Идентификатор подписчика ("account"), в котором должен находиться данный ViNS.<br/>Обратите внимание, что попытка изменить `account_id` у существующего ресурса приведёт к его пересозданию. |
| ext_net_id           | int | :x: | Идентификатор внешней сети, в которую должен быть подключён ViNS. Если подключение во внешнюю сеть не требуется, то необходимо задать `ext_net_id = 0`.<br/>Обратите внимание, что из всех ViNS, созданных на уровне одной и той же ресурсной группы, только один может иметь подключение к внешней сети. ViNS, созданные на уровне "account", не могут иметь подключений к внешним сетям. |
| ext_ip_addr          | string | :x: | IP внешней сети |
| ipcidr               | string | :x: | IP CIDR, который требуется присвоить внутреннему сегменту данного ViNS. <br/>Данный параметр не является обязательным и принимается во внимание только на стадии создания нового ViNS. Если он не задан, то платформа установит значение самостоятельно. |
| pre_reservations_num | int | :x: | Кол-во IP адресов, которое будет зарезервировано при создании |
| gid                  | int | :x: | GRID ID |
| enabled              | bool | :x: | Флаг, отвечающий за возможность переводить ресурс в состояния enable и disable |
| permanently          | bool | :x: | Безвозвратное удаление диска. Используется при удалении|
| force                | bool | :x: | Удаление ресурса, в случае если он к чему-то присоединен произойдет отсоединение его от других ресурсов и удаление|
| ip                   | Struct{} [см. ниже](#описание-структуры-ip)| :x: | Структура для резервирования IP адресов |
| nat_rule             | Struct{} [см. ниже](#описание-структуры-nat_rule)| :x: | Структура для того, чтобы задавать правила NAT |
| desc                 | string | :x: | Текстовое описание данного ViNS.<br/>Данный параметр не является обязательным, значение по умолчанию - пустая строка. |
| restore              | bool | :x: | Флаг, для восстановления ресурса |
| vnfdev_restart       | bool | :x: | Флаг, для рестарта VNF |
| vnfdev_redeploy      | bool | :x: | Флаг, для редеплоя VNF |

### Описание структуры ip
| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| type | string | :heavy_check_mark: | Тип резервирования IP адреса |
| ip_addr | string | :x: | IP адрес, который надо зарезервировать |
| mac_addr | string | :x: | MAC адрес, который надо зарезервировать |
| compute_id | int | :x: | ID компьюта, который надо зарезервировать |

### Описание структуры nat_rule
| Аргумент | Тип | Обязательный | Описание |
| --- | --- | --- | --- |
| int_ip | string | :x: | Внутренний IP, для NAT правила |
| int_port | int | :x: | Внутренний порт, для NAT правила |
| ext_port_start | int | :x: | Начало диапазона внешних портов, для NAT правила |
| ext_port_end | int | :x:| Конец диапазона внешних портов, для NAT правила |
| proto | string | :x: | Протокол для NAT. tcp или udp |

Пользователь облачной платформы, от лица которого происходит обращение к данной функции, должен иметь доступ к указанной учётной записи ("account") и/или ресурсной группе. В противном случае возникнет ошибка доступа.


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

| Параметр             | Тип                                                 | Описание                                                                                                                                  |
|----------------------|-----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------|
| vnf_dev              | []Struct{} [см. ниже](#описание-структуры-vnf_dev)  | VNFDEV                                                                                                                                    |
| \_ckey               | string                                              | CKey                                                                                                                                      |
| account_id           | int                                                 | Уникальный идентификатор подписчика-владельца ViNS.                                                                                       |
| account_name         | string                                              | Имя подписчика ("account"), которому принадлежит ViNS.                                                                                    |
| computes             | []Struct{} [см. ниже](#описание-структуры-computes) | Информация о компьютах                                                                                                                    |
| default_gw           | string                                              | Шлюз по умолчанию                                                                                                                         |
| default_qos          | []Struct{} [см. ниже](#описание-структуры-qos)      | qos виртуальной сети                                                                                                                      |
| desc                 | string                                              | Текстовое описание ViNS.                                                                                                                  |
| gid                  | int                                                 | Grid ID                                                                                                                                   |
| guid                 | int                                                 | ID ресурса                                                                                                                                |
| lock_status          | string                                              | Статус доступа виртуальной сети                                                                                                           |
| manager_id           | int                                                 | ID manager                                                                                                                                |
| manager_type         | string                                              | Type of manager                                                                                                                           |
| milestones           | int                                                 | Milestones                                                                                                                                |
| name                 | string                                              | Имя ViNS.                                                                                                                                 |
| net_mask             | int                                                 | Маска подсети                                                                                                                             |
| network              | string                                              | Сеть Vins                                                                                                                                 |
| pre_reservations_num | int                                                 | Кол-во зарезервированных ip адресов                                                                                                       |
| redundant            | bool                                                | Redudant                                                                                                                                  |
| rg_id                | int                                                 | Идентификатор ресурсной группы, на уровне которой создан ViNS. Для ViNS, существующих на уровне "account", данный параметр будет равен 0. |
| rg_name              | string                                              | Имя ресурсной группы                                                                                                                      |
| sec_vnf_dev_id       | int                                                 | ID sec vnf                                                                                                                                |
| status               | string                                              | Статус                                                                                                                                    |
| user_managed         | bool                                                | Флаг user managed                                                                                                                         |
| vnfs                 | []Struct{} [см. ниже](#описание-структуры-vnfs)     | VNFS                                                                                                                                      |
| vxlan_id             | int                                                 | ID vxlan                                                                                                                                  |
| routes               | []Struct{} [см. ниже](#описание-структуры-routes)   | Список статических маршрутов                                                                                                              |

### Описание структуры routes
| Параметр    | Тип    | Описание                                        |
|-------------|--------|-------------------------------------------------|
| compute_ids | []int  | Список ID compute, которым предоствавлен доступ |
| route_id    | int    | ID статического маршрута                        |
| guid        | string | ID ресурса                                      |
| destination | string | IP целевой сети                                 |
| netmask     | string | Маска сети                                      |
| gateway     | string | IP шлюза                                        |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| \_ckey | string | Ckey |
| account_id | int | ID аккаунта |
| capabilities | []string | Возможности vnf_dev |
| config | Struct{} [см. ниже](#описание-структуры-config)| Конфиг VNF |
| config_saved | bool | Флаг, отвечающий за то сохранен ли конфиг |
| custom_pre_cfg | bool | Custom |
| desc | string | Описание |
| gid | int | Grid ID |
| guid | int | ID ресурса |
| vnf_id | int | ID vnf |
| interfaces | []Struct{} [см. ниже](#описание-структуры-interfaces)| Информация о интерфейсах |
| lock_status | string | Статус доступа vnf_dev |
| milestones | int | Этапы |
| vnf_name | string | Имя VNF |
| status | string | Статус |
| tech_status | string | Технический статус |
| type | string | Тип vnf |
| vins | []int | Список виртуальных сетей |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| mgmt | Struct{} [см. ниже](#описание-структуры-mgmt) | Config Mgmt |
| resources | []Struct{} [см. ниже](#описание-структуры-resources)| Config resources |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| ip_addr | string | IP адрес mgmt |
| password | string | Пароль юзера |
| ssh_key | string | Публичный SSH ключ |
| user | string | Имя юзера |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| cpu | int | Кол-во cpu ресурса |
| ram | int | Кол-во ram ресурса |
| stack_id | int | ID stack ресурса |
| uuid | string | UUID ресурса |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| conn_id | int | ID коннекта |
| conn_type | string | Тип коннекта |
| def_gw | string | Шлюз по умолчанию |
| flipgroup_id | int | ID flipgroup |
| guid | string | ID ресурса |
| ip_address | string | IP адрес интерфейса |
| listen_ssh | bool | Флаг, говорящий о том, слушается ли ssh |
| mac | string | MAC адрес интерфейса |
| name | string | Имя интерфейса |
| net_id | int | ID сети |
| net_mask | int | Маска |
| net_type | string | Тип сети |
| pci_slot | int | Слот pci |
| qos | Struct{} [см. ниже](#описание-структуры-qos) | QOS |
| target | string | Таргет интерфейса |
| type | string | Тип интерфейса |
| vnfs | []int | Список ID vnf |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| compute_id | int | ID компьюта |
| compute_name | string | Имя компьюта |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| e_rate | int | E rate |
| guid | string | ID ресурса |
| in_brust | int | In brust |
| in_rate | int | In rate |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| dhcp | []Struct{} [см. ниже](#описание-структуры-dhcp) | информаиця о DHCP |
| gw | []Struct{} [см. ниже](#описание-структуры-gw) | GW |
| nat | []Struct{} [см. ниже](#описание-структуры-nat) | NAT |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| \_ckey | string | CKey |
| account_id | int | Уникальный идентификатор подписчика-владельца ViNS. |
| config | Struct{} [см. ниже](#описание-структуры-dhcp-config)| Информация о DHCP конфиге |
| created_time | int | Время создания |
| devices | []Struct{} [см. ниже](#описание-структуры-devices)| Информация о девайсах |
| gid | int | GRID ID |
| guid | int | ID ресурса |
| dhcp_id | int | ID dhcp |
| lock_status | string | Статус доступа виртуальной сети |
| milestones | int | Milestones |
| owner_id | int | ID владельца |
| owner_type | string | Тип владельца |
| pure_virtual | bool | Флаг, показывающий является ли ресурс чисто виртуальным |
| status | string | Статус |
| tech_status | string | Технический статус |
| type | string | Тип ресурса |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| default_gw | string | Шлюз по умолчанию |
| dns | []string | Список dns |
| ip_end | string | Конец диапазона IP адресов |
| ip_start | string | Старт диапазона IP адресов |
| lease | int | срок |
| netmask | int | Маска сети |
| network | string | Сеть |
| reservations | []Struct{} [см. ниже](#описание-структуры-reservations)| Информация о резервациях |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| client_type | string | Тип клиента |
| desc | string | Описание |
| domainname | string | Имя домена |
| hostname | string | Имя хоста |
| ip | string | IP адрес |
| mac | string | MAC адрес |
| type | string | Тип |
| vm_id | int | ID виртуальной машины |


### Описание структуры devices
| Параметр | Тип | Описание |
| --- | --- | --- |
| primary | Struct{} [см. ниже](#описание-структуры-primary)| Первичная информация |

### Описание структуры primary
| Параметр | Тип | Описание |
| --- | --- | --- |
| dev_id | int | ID dev |
| iface01 | string | Интерфейс 1|
| iface02 | string | Интерфейс 2|

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| \_ckey | string | CKey |
| account_id | int | Уникальный идентификатор подписчика-владельца ViNS. |
| config | Struct{} [см. ниже](#описание-структуры-gw-config)| Информация о конфиге |
| created_time | int | Время создания |
| devices | []Struct{} [см. ниже](#описание-структуры-devices)| Информация о девайсах |
| gid | int | GRID ID |
| guid | int | ID ресурса |
| gw_id | int | ID GW |
| lock_status | string | Статус доступа виртуальной сети |
| milestones | int | Milestones |
| owner_id | int | ID владельца |
| owner_type | string | Тип владельца |
| pure_virtual | bool | Флаг, показывающий является ли ресурс чисто виртуальным |
| status | string | Статус |
| tech_status | string | Технический статус |
| type | string | Тип ресурса |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| default_gw | string | Шлюз по умолчанию |
| ext_net_id | int | ID внешней сети |
| ext_net_ip | string | IP внешней сети |
| ext_netmask | int | Маска внешней сети |
| qos | Struct{} [см. ниже](#описание-структуры-qos) | QOS |

### Описание структуры nat
| Параметр | Тип | Описание |
| --- | --- | --- |
| \_ckey | string | CKey |
| account_id | int | Уникальный идентификатор подписчика-владельца ViNS. |
| created_time | int | Время создания |
| config | Struct{} [см. ниже](#описание-структуры-nat-config)| Информация о конфиге |
| devices | []Struct{} [см. ниже](#описание-структуры-devices)| Информация о девайсах |
| gid | int | GRID ID |
| guid | int | ID ресурса |
| nat_id | int | ID NAT |
| lock_status | string | Статус доступа виртуальной сети |
| milestones | int | Milestones |
| owner_id | int | ID владельца |
| owner_type | string | Тип владельца |
| pure_virtual | bool | Флаг, показывающий является ли ресурс чисто виртуальным |
| status | string | Статус |
| tech_status | string | Технический статус |
| type | string | Тип ресурса |

### Описание структуры nat config
| Параметр | Тип | Описание |
| --- | --- | --- |
| net_mask | int | Маска сети |
| network | string | Сеть |
| rules | []Struct{} [см. ниже](#описание-структуры-rules)| Правила NAT |

### Описание структуры rules
| Параметр | Тип | Описание |
| --- | --- | --- |
| rule_id | int | ID правила |
| local_ip | string | Локальный IP адрес |
| local_port | int | Локальный порт |
| protocol | string | Протокол |
| public_port_end | int | Конец диапазона портов |
| public_port_start | int | Начало диапазона портов |
| vm_id | int | ID виртуальной машины |
| vm_name | string | Имя виртуальной машины |


## Пример использования
Пример вызова _Resource_ функции **decort_vins**:

```terraform
resource "decort_vins" "my_vins" {
  #обязательный параметр
  #имя создаваемого ресурса
  #тип - строка
  name = "Test_name"

  #опциональный параметр
  #id ресурсной группы для создаения ресруса
  #тип - число
  rg_id = 10101

  #опциональный параметр
  #id аккаунта для создаения ресруса
  #тип - число
  account_id = 2023

  #опциональный параметр
  #id внешней сети для подключения к ней ресруса
  #тип - число
  ext_net_id  = 2222

  #опциональный параметр
  #ip внешней сети для подключения к нему ресруса
  #тип - строка
  ext_ip_addr = "1.1.1.1"


  #опциональный параметр
  #private network IP CIDR
  #тип - строка
  ipcidr      = "192.168.0.1"

  #опциональный параметр
  #количество зарезервированных адресов на момент создания
  #тип - число
  #значение по умолчанию 32
  pre_reservations_num = 2

  #опциональный параметр
  #grid (platform) ID
  #тип - число
  gid                  = 2002

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

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

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

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

  #опциональный параметр
  #блок для резервирования ip
  #тип - блок
  ip {
    #обязательный параметр
    #тип подключения
    #тип - строка
    type     = "DHCP"

    #опциональный параметр
    #ip который необходимо зарезервировать
    #тип - строка
    ip_addr  = "192.168.5.5"

    #опциональный параметр
    #mac который необходимо зарезервировать
    #тип - строка
    mac_addr = "ff:ff:ff:ff:ff:ff"
  }

  #опциональный параметр
  #блок для добавления natRule
  #тип - блок
  nat_rule {
    #опциональный параметр
    #ip внутренний
    #тип - строка
    int_ip         = "192.168.0.28"

    #опциональный параметр
    #внутренний порт
    #тип - число
    int_port       = 80

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

    #опциональный параметр
    #конец диапазона внешних портов
    #тип - число
    ext_port_end   = 8001

    #опциональный параметр
    #протокол natRule
    #тип - строка
    proto          = "tcp"
  }

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

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

  #опциональный параметр
  #редеплой vnfDev
  #тип - булев тип
  vnfdev_redeploy = true
}
```

После успешного завершения такого вызова **decort_vins** в переменной `decort_vins.my_vins` будут сохранены возвращаемые значения. В частности, для получения идентификатора ViNS следует использовать конструкцию `decort_vins.my_vins.id`
