_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` у существующего ресурса приведёт к его пересозданию. |
| dns | []string | :x: | Список IP адресов DNS |
| 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. Правила NAT можно указать только для зарезервированных IP. Если создается resourse_decort_cb_vins и resourse, который будет использовать данный vins, то поле nat_rule необходимо указать только после подключения данной сети к resourse и резервирования ip адреса |
| 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 | :heavy_check_mark: | Внутренний IP, для NAT правила |
| int_port | int | :x: | Внутренний порт, для NAT правила |
| ext_port_start | int | :heavy_check_mark: | Начало диапазона внешних портов, для 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 |
| vnc_password | string | vnc пароль |
| 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 адрес интерфейса |
| mtu | string | Максимальный объём данных, который может быть передан за одну итерацию |
| name | string | Имя интерфейса |
| net_id | int | ID сети |
| net_mask | int | Маска |
| net_type | string | Тип сети |
| pci_slot | int | Слот pci |
| bus_number | int | Номер шины |
| qos | Struct{} [см. ниже](#описание-структуры-qos) | QOS |
| target | string | Таргет интерфейса |
| type | string | Тип интерфейса |
| vnfs | []int | Список ID vnf |
| libvirt_settings | []Struct{}[см. ниже](#описание-структуры-libvirt_settings) | Параметры libvirt virtio интерфейса |

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

| Параметр | Тип | Описание |
| --- | --- | --- |
| guid | string | GUID |
| txmode | string | TX mode |
| ioeventfd | string | IO event |
| event_idx | string | Event ID |
| queues | int | Количество очередей |
| rx_queue_size | int | Длина очереди RX |
| tx_queue_size | int | Длина очереди TX |

### Описание структуры 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 

| Параметр | Тип | Описание |
| --- | --- | --- |
| account_id | int | ID аккунта |
| 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" "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

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

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

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

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

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

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

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

  #блок для добавления natRule
  #опциональный параметр
  #тип - блок правил nat
  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

  #список dns
  #опциональный параметр
  #применяется при создании и редактировании ресурса
  #если при создании указать пустой список, то ресурс создается с полем vnfs.dhcp.config.dns, имеющим значение по умолчанию
  #если при обновлении указать пустой список, то ресурс обновит в модели поле vnfs.dhcp.config.dns с текущего значения на пустой список
  #тип - список строк
  #dns = ["1.1.1.1", "2.2.2.2"]

}
```

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