diff --git a/CHANGELOG.md b/CHANGELOG.md
index a49994e6..1a5ca8be 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,137 @@
-## Version 4.9.3
+## Version 4.10.0
+
+### Добавлено
+
+#### account
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-923 | Вычисляемое поле `emails` в блоке `ACL` в datasource `decort_cb_account` и в resource `decort_cb_account` в cloudbroker/account |
+| BATF-970 | Возможное значение `trunk` в поле `compute_features` в resource `decort_cb_account` в cloudbroker/account |
+| BATF-1004 | Вычисляемое поле `emails` в блоке `ACL` в datasource `decort_account` и в resource `decort_account` в cloudapi/account |
+
+#### kvmvm
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-960 | Вычисляемое поле `sdn_interface_id` в datasources `decort_kvmvm`, `decort_kvmvm_list`, `decort_kvmvm_list_deleted` в cloudapi/kvmvm и `decort_cb_kvmvm`, `decort_kvmvm_cb_list`, `decort_kvmvm_cb_list_deleted` в cloudbroker/kvmvm |
+| BATF-961 | Добавлена поддержка `net_type` SDN и опциональное поле `sdn_interface_id` в блоке `network` в resources `decort_kvmvm` в cloudapi/kvmvm и `decort_cb_kvmvm` в cloudbroker/kvmvm |
+| BATF-971 | Добавлена поддержка `net_type` TRUNK в блоке `network` в resources `decort_kvmvm` в cloudapi/kvmvm и `decort_cb_kvmvm` в cloudbroker/kvmvm |
+| BATF-976 | Добавлена возможность указания и изменения `mtu` в блоке `network` для сетей типа `EXTNET` и `DPDK` в resources `decort_kvmvm` в cloudapi/kvmvm и `decort_cb_kvmvm` в cloudbroker/kvmvm |
+| BATF-993 | Вычисляемые поля `live_migration_job_id` и `qemu_guest` в datasources `data_kvmvm` и `data_kvmvm_list` в cloudapi/kvmvm и в datasources `decort_cb_kvmvm` и `decort_cb_kvmvm_list` в cloudbroker/kvmvm |
+| BATF-1014 | Вычисляемое поле `trunk_tags` в блоке `interfaces` в datasources `decort_kvmvm`, `decort_kvmvm_list`, `decort_kvmvm_list_deleted` и resource `decort_kvmvm` в cloudapi/kvmvm и datasources `decort_cb_kvmvm`, `decort_kvmvm_cb_list`, `decort_kvmvm_cb_list_deleted` и resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
+
+#### extnet
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-972 | Опциональные поля `highly_available`, `sec_vnfdev_ip`, `mtu` в resource `decort_cb_extnet` в cloudbroker/extnet |
+| BATF-972 | Вычисляемые поля `redundant`, `sec_vnfdev_id`, `mtu` в datasource `decort_extnet` в cloudapi/extnet и в datasources `decort_cb_extnet`, `decort_cb_extnet_list` в cloudbroker/extnet |
+| BATF-972 | Вычисляемое поле `pre_reservations` в datasource `decort_extnet` в cloudapi/extnet и в datasource`decort_cb_extnet` в cloudbroker/extnet |
+
+#### grid
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-996 | Вычислительные поля `network_modes` и `sdn_support` в datasources `decort_cb_grid` и `decort_cb_grid_list` в cloudbroker/grid |
+
+#### image
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-930 | Опциональное поле `sync_mode` в resource `decort_image` в cloudapi/image |
+
+#### lb
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-952 | Вычисляемое поле `account_id` в datasource `decort_lb` в cloudapi/lb и в datasource `decort_cb_lb` в cloudbroker/lb |
+
+#### locations
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-994 | Вычисляемые поля `network_modes` и `sdn_support` в datasource `decort_locations_list` в cloudbroker/locations |
+
+#### node
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-995 | Вычисляемое поле `zone_id` в datasource `decort_cb_node` и вычисляемые поля `sdn_hypervisor_name` и `zone_id`в datasource `decort_cb_node_list` в cloudbroker/node |
+
+#### rg
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-932 | Вычисляемые поле `created_by` и `created_time` в resource `decort_resgroup` в cloudapi/rg |
+| BATF-970 | Возможное значение `trunk` в поле `compute_features` в resource `decort_cb_rg` в cloudbroker/rg |
+| BATF-959 | Опциональное поле `sdn_access_group_id` в resource `decort_resgroup` в cloudapi/rg и в resource `decort_cb_rg` в cloudbroker/rg |
+| BATF-959 | Вычисляемые поле `sdn_access_group_id` в datasources `decort_resgroup`, `decort_rg_list`, в cloudapi/rg и в datasources `decort_cb_rg` и `decort_cb_rg_list` в cloudbroker/rg |
+
+#### trunk
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-973 | Resource `decort_cb_trunk` в cloudbroker/trunk |
+| BATF-974 | Datasources `decort_trunk` и `decort_trunk_list` в cloudapi/trunk и datasources `decort_cb_trunk` и `decort_cb_trunk_list` в cloudbroker/trunk |
+
+#### vins
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-997 | Вычисляемое поле `sdn_interface_id` в datasource `decort_vins` в cloudapi/vins и в datasource `decort_cb_vins` в cloudbroker/vins |
+
+#### user
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-958 | Опциональное поле `blocked` в блоке `ACL` в resource `resource_user` в cloudbroker/user |
+| BATF-958 | Вычисляемое поле `blocked` в блоке `ACL` в datasource `data_user` и `data_user_list` в cloudbroker/user |
+| BATF-923 | Опциональное поле `email` в datasource `decort_cb_user_list` в cloudbroker/user |
+| BATF-950 | Опциональное поле `provider_name` в resource `decort_cb_user` в cloudbroker/user |
### Исправлено
+#### account
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-956 | Вычисляемое поле `zone_ids` представляет собой список maps в datasource `decort_account` в cloudapi/account и в datasource `decort_cb_account` в cloudbroker/account |
+
#### kvmvm
| Идентификатор
задачи | Описание |
| --- | --- |
-| BATF-1016 | Ошибка при изменении полей `ram` и `cpu`, приводящая к невозможности измения параметров виртуальной машины в resources `decort_kvmvm` и `decort_cb_kvmvm` в cloudapi/kvmvm и в cloudbroker/kvmvm |
-| BATF-1018 | Ошибка при изменении поля `started`, приводящая к невозможности запуска виртуальной машины в resources `decort_kvmvm` в cloudapi/kvmvm |
+| BATF-1009 | Ошибка изменения полей `cpu`, `ram` в resources `decort_kvmvm` в cloudapi/kvmvm и `decort_cb_kvmvm` в cloudbroker/kvmvm |
+| BATF-1010 | Ошибка повторного включения/отключения в resources `decort_kvmvm` в cloudapi/kvmvm и `decort_cb_kvmvm` в cloudbroker/kvmvm |
+
+#### extnet
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-972 | Вычисляемое поля `network_ids` сменило тип с int на []struct в datasource `decort_extnet` в cloudapi/extnet и в datasources `decort_cb_extnet`, `decort_cb_extnet_list`, resource `decort_cb_extnet` в cloudbroker/extnet |
+
+#### image
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-930 | Опциональное поле `sync_mode` имеет значение по умолчанию false в resource `decort_cb_image` в cloudbroker/image |
+| BATF-926 | Опциональное поле `architecture` стало вычисляемым в resource `decort_image` в cloudapi/image и в resource `decort_cb_image` в cloudbroker/image |
+| BATF-926 | Обязательное поле `architecture` стало вычисляемым в resource `decort_image_from_platform_disk` в cloudapi/image и в resource `decort_cb_image_from_platform_disk` в cloudbroker/image |
+
+#### flipgroup
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-929 | Обязательное поле `client_type` стало опциональным в resource `decort_flipgroup` в cloudapi/flipgroup и в resource `decort_cb_flipgroup` в cloudbroker/flipgroup |
+
+#### user
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-950 | Опциональное поле `groups` стало вычисляемым в resource `decort_cb_user` в cloudbroker/user |
+
+### Удалено
+
+#### account
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-990 | Опциональное поле `reason` в resource `decort_account` в cloudapi/account и в resource `decort_cb_account` в cloudbroker/account |
+
+#### image
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-998 | Значение `SVA_KVM_X86` для обязательного поля `drivers` в resource `decort_image` в cloudapi/image и в resource `decort_cb_image` в cloudbroker/image |
+
+#### kvmvm
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-977 | Вычисляемые поля `order` и `vmid` в структуре `disks` в resource `decort_kvmvm` и datasource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` и datasource `decort_cb_kvmvm` в cloudbroker/kvmvm |
+| BATF-998 | Значение `SVA_KVM_X86` для обязательного поля `drivers` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
+
+#### vins
+| Идентификатор
задачи | Описание |
+| --- | --- |
+| BATF-933 | Вычисляемое поле `routes` в блоках `NAT` и `GW` в datasource `decort_vins`, resource `decort_vins` в cloudapi/vins, datasource `decort_cb_vins`, resource `decort_cb_vins` в cloudbroker/vins |
diff --git a/Makefile b/Makefile
index 52e3325d..30cfe59f 100644
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ ZIPDIR = ./zip
BINARY=${NAME}
WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH}
MAINPATH = ./cmd/decort/
-VERSION=4.9.3
+VERSION=4.10.0
OS_ARCH=$(shell go env GOHOSTOS)_$(shell go env GOHOSTARCH)
FILES = ${BINARY}_${VERSION}_darwin_amd64\
diff --git a/README.md b/README.md
index 7f2e2ed6..0c3d8930 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,14 @@
# terraform-provider-decort
+Внимание! Данная версия предназначена только для версии платформы 4.4.0 build 963
+
Terraform provider для платформы Digital Energy Cloud Orchestration Technology (DECORT)
## Соответсвие версий платформы версиям провайдера
| Версия DECORT API | Версия провайдера Terraform |
| ------ | ------ |
+| 4.4.0 | 4.10.x |
| 4.3.0 | 4.9.x |
| 4.2.0 | 4.8.x |
| 4.1.0 | 4.7.x |
@@ -48,8 +51,10 @@ Terraform provider для платформы Digital Energy Cloud Orchestration
- Работа с resource groups,
- Работа с snapshots,
- Работа с stacks,
+ - Работа с trunk,
- Работа с VINS,
- - Работа с SEPs.
+ - Работа с SEPs,
+ - Работа с Zone.
- Режим администратора:
- Работа с accounts,
@@ -69,7 +74,9 @@ Terraform provider для платформы Digital Energy Cloud Orchestration
- Работа с seps,
- Работа с user,
- Работа с stacks,
- - Работа с VINS.
+ - Работа с trunk,
+ - Работа с VINS,
+ - Работа с Zone.
Со списком и описанием функционала всех групп можно ознамоиться на Вики проекта: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
@@ -87,13 +94,13 @@ chmod u+x install.sh
```
6. Дождаться сообщения об успешной установке. Установщик выведет актуальный блок конфигурации провайдера, скопируйте его
```bash
-DECORT provider version 4.3.0 has been successfully installed
+DECORT provider version 4.10.0 has been successfully installed
Copy this provider configuration to main.tf file:
terraform {
required_providers {
decort = {
- version = "4.3.0"
+ version = "4.10.0"
source = "basis/decort/decort"
}
}
@@ -109,7 +116,7 @@ terraform {
terraform {
required_providers {
decort = {
- version = "4.3.0"
+ version = "4.10.0"
source = "basis/decort/decort"
}
}
@@ -152,13 +159,13 @@ Windows:
- host_name - имя хоста, держателя провайдера, например, basis
- namespace - пространство имен хоста, например decort
- type - тип провайдера, может совпадать с пространством имен, например, decort
-- version - версия провайдера, например 4.3.0
+- version - версия провайдера, например 4.10.0
- target - архитектура операционной системы, например windows_amd64
В примере ниже используется путь до провайдера на машине с ОС Linux:
```bash
-~/.terraform.d/plugins/basis/decort/decort/4.3.0/linux_amd64/tf-provider
+~/.terraform.d/plugins/basis/decort/decort/4.10.0/linux_amd64/tf-provider
^ ^ ^ ^ ^ ^
host_name | | | | | |
| | | | |
@@ -183,7 +190,7 @@ Windows:
terraform {
required_providers {
decort = {
- version = "4.3.0"
+ version = "4.10.0"
source = "basis/decort/decort"
}
}
diff --git a/docs/data-sources/account.md b/docs/data-sources/account.md
index e2aa1f3d..33c66498 100644
--- a/docs/data-sources/account.md
+++ b/docs/data-sources/account.md
@@ -38,6 +38,7 @@ description: |-
- `created_time` (Number)
- `dc_location` (String)
- `deactivation_time` (Number)
+- `default_zone_id` (Number)
- `deleted_by` (String)
- `deleted_time` (Number)
- `desc` (String)
@@ -54,6 +55,7 @@ description: |-
- `version` (Number)
- `vins` (List of Number)
- `vinses` (Number)
+- `zone_ids` (List of Object) (see [below for nested schema](#nestedatt--zone_ids))
### Nested Schema for `timeouts`
@@ -70,6 +72,7 @@ Optional:
Read-Only:
- `can_be_deleted` (Boolean)
+- `emails` (List of String)
- `explicit` (Boolean)
- `guid` (String)
- `right` (String)
@@ -108,3 +111,12 @@ Read-Only:
- `cu_m` (Number)
- `cu_np` (Number)
- `gpu_units` (Number)
+
+
+
+### Nested Schema for `zone_ids`
+
+Read-Only:
+
+- `id` (Number)
+- `name` (String)
diff --git a/docs/data-sources/bservice.md b/docs/data-sources/bservice.md
index 854fdbc3..b1481c10 100644
--- a/docs/data-sources/bservice.md
+++ b/docs/data-sources/bservice.md
@@ -54,6 +54,7 @@ description: |-
- `updated_by` (String)
- `updated_time` (Number)
- `user_managed` (Boolean)
+- `zone_id` (Number)
### Nested Schema for `timeouts`
diff --git a/docs/data-sources/bservice_deleted_list.md b/docs/data-sources/bservice_deleted_list.md
index 4acb29d5..c4be4bff 100644
--- a/docs/data-sources/bservice_deleted_list.md
+++ b/docs/data-sources/bservice_deleted_list.md
@@ -66,3 +66,4 @@ Read-Only:
- `updated_by` (String)
- `updated_time` (Number)
- `user_managed` (Boolean)
+- `zone_id` (Number)
diff --git a/docs/data-sources/bservice_list.md b/docs/data-sources/bservice_list.md
index 64a14cc4..22896550 100644
--- a/docs/data-sources/bservice_list.md
+++ b/docs/data-sources/bservice_list.md
@@ -72,3 +72,4 @@ Read-Only:
- `updated_by` (String)
- `updated_time` (Number)
- `user_managed` (Boolean)
+- `zone_id` (Number)
diff --git a/docs/data-sources/cb_account.md b/docs/data-sources/cb_account.md
index b574a417..ba22e7bc 100644
--- a/docs/data-sources/cb_account.md
+++ b/docs/data-sources/cb_account.md
@@ -37,6 +37,7 @@ description: |-
- `created_time` (Number)
- `dc_location` (String)
- `deactivation_time` (Number)
+- `default_zone_id` (Number)
- `deleted_by` (String)
- `deleted_time` (Number)
- `desc` (String)
@@ -51,6 +52,7 @@ description: |-
- `updated_time` (Number)
- `version` (Number)
- `vins` (List of Number)
+- `zone_ids` (List of Object) (see [below for nested schema](#nestedatt--zone_ids))
### Nested Schema for `timeouts`
@@ -66,6 +68,7 @@ Optional:
Read-Only:
+- `emails` (List of String)
- `explicit` (Boolean)
- `guid` (String)
- `right` (String)
@@ -86,3 +89,12 @@ Read-Only:
- `cu_m` (Number)
- `cu_np` (Number)
- `gpu_units` (Number)
+
+
+
+### Nested Schema for `zone_ids`
+
+Read-Only:
+
+- `id` (Number)
+- `name` (String)
diff --git a/docs/data-sources/cb_account_list.md b/docs/data-sources/cb_account_list.md
index d7b06c8e..4622e0d3 100644
--- a/docs/data-sources/cb_account_list.md
+++ b/docs/data-sources/cb_account_list.md
@@ -59,6 +59,7 @@ Read-Only:
- `created_time` (Number)
- `dc_location` (String)
- `deactivation_time` (Number)
+- `default_zone_id` (Number)
- `deleted_by` (String)
- `deleted_time` (Number)
- `desc` (String)
@@ -73,6 +74,7 @@ Read-Only:
- `updated_time` (Number)
- `version` (Number)
- `vins` (List of Number)
+- `zone_ids` (List of Number)
### Nested Schema for `items.acl`
diff --git a/docs/data-sources/cb_account_list_deleted.md b/docs/data-sources/cb_account_list_deleted.md
index 8ebf8cea..92f2f36a 100644
--- a/docs/data-sources/cb_account_list_deleted.md
+++ b/docs/data-sources/cb_account_list_deleted.md
@@ -58,6 +58,7 @@ Read-Only:
- `created_time` (Number)
- `dc_location` (String)
- `deactivation_time` (Number)
+- `default_zone_id` (Number)
- `deleted_by` (String)
- `deleted_time` (Number)
- `desc` (String)
@@ -72,6 +73,7 @@ Read-Only:
- `updated_time` (Number)
- `version` (Number)
- `vins` (List of Number)
+- `zone_ids` (List of Number)
### Nested Schema for `items.acl`
diff --git a/docs/data-sources/cb_extnet.md b/docs/data-sources/cb_extnet.md
index 7e33852b..ac985f5c 100644
--- a/docs/data-sources/cb_extnet.md
+++ b/docs/data-sources/cb_extnet.md
@@ -40,19 +40,24 @@ description: |-
- `ipcidr` (String)
- `meta` (List of String) meta
- `milestones` (Number)
+- `mtu` (Number)
- `name` (String)
- `network` (String)
-- `network_id` (Number)
+- `network_ids` (List of Object) (see [below for nested schema](#nestedatt--network_ids))
- `ntp` (List of String)
- `ovs_bridge` (String)
+- `pre_reservations` (List of Object) (see [below for nested schema](#nestedatt--pre_reservations))
- `pre_reservations_num` (Number)
- `prefix` (Number)
- `pri_vnfdev_id` (Number)
+- `redundant` (Boolean)
- `reservations` (List of Object) (see [below for nested schema](#nestedatt--reservations))
+- `sec_vnfdev_id` (Number)
- `shared_with` (List of Number)
- `status` (String)
- `vlan_id` (Number)
- `vnfs` (List of Object) (see [below for nested schema](#nestedatt--vnfs))
+- `zone_id` (Number)
### Nested Schema for `timeouts`
@@ -89,6 +94,31 @@ Read-Only:
- `vm_id` (Number)
+
+### Nested Schema for `network_ids`
+
+Read-Only:
+
+- `primary` (Number)
+- `secondary` (Number)
+
+
+
+### Nested Schema for `pre_reservations`
+
+Read-Only:
+
+- `account_id` (Number)
+- `client_type` (String)
+- `desc` (String)
+- `domain_name` (String)
+- `hostname` (String)
+- `ip` (String)
+- `mac` (String)
+- `type` (String)
+- `vm_id` (Number)
+
+
### Nested Schema for `reservations`
diff --git a/docs/data-sources/cb_extnet_list.md b/docs/data-sources/cb_extnet_list.md
index b11455b7..d0c7994a 100644
--- a/docs/data-sources/cb_extnet_list.md
+++ b/docs/data-sources/cb_extnet_list.md
@@ -61,15 +61,19 @@ Read-Only:
- `ipcidr` (String)
- `meta` (List of String)
- `milestones` (Number)
+- `mtu` (Number)
- `name` (String)
-- `network_id` (Number)
+- `network_ids` (List of Object) (see [below for nested schema](#nestedobjatt--items--network_ids))
- `ovs_bridge` (String)
- `pre_reservations_num` (Number)
- `pri_vnfdev_id` (Number)
+- `redundant` (Boolean)
+- `sec_vnfdev_id` (Number)
- `shared_with` (List of Number)
- `status` (String)
- `vlan_id` (Number)
- `vnfs` (List of Object) (see [below for nested schema](#nestedobjatt--items--vnfs))
+- `zone_id` (Number)
### Nested Schema for `items.default_qos`
@@ -82,6 +86,15 @@ Read-Only:
- `in_rate` (Number)
+
+### Nested Schema for `items.network_ids`
+
+Read-Only:
+
+- `primary` (Number)
+- `secondary` (Number)
+
+
### Nested Schema for `items.vnfs`
diff --git a/docs/data-sources/cb_grid.md b/docs/data-sources/cb_grid.md
index 48893c82..caaf7925 100644
--- a/docs/data-sources/cb_grid.md
+++ b/docs/data-sources/cb_grid.md
@@ -34,6 +34,8 @@ description: |-
- `location_code` (String)
- `meta` (List of String) meta
- `name` (String)
+- `network_modes` (List of String)
+- `sdn_support` (Boolean)
### Nested Schema for `timeouts`
diff --git a/docs/data-sources/cb_grid_list.md b/docs/data-sources/cb_grid_list.md
index 5ca3b1e7..a30b0b00 100644
--- a/docs/data-sources/cb_grid_list.md
+++ b/docs/data-sources/cb_grid_list.md
@@ -51,7 +51,9 @@ Read-Only:
- `id` (Number)
- `location_code` (String)
- `name` (String)
+- `network_modes` (List of String)
- `resources` (List of Object) (see [below for nested schema](#nestedobjatt--items--resources))
+- `sdn_support` (Boolean)
### Nested Schema for `items.resources`
diff --git a/docs/data-sources/cb_k8s.md b/docs/data-sources/cb_k8s.md
index 58f6f924..6a66b649 100644
--- a/docs/data-sources/cb_k8s.md
+++ b/docs/data-sources/cb_k8s.md
@@ -56,6 +56,7 @@ description: |-
- `updated_by` (String)
- `updated_time` (Number)
- `vins_id` (Number)
+- `zone_id` (Number)
### Nested Schema for `timeouts`
diff --git a/docs/data-sources/cb_k8s_list.md b/docs/data-sources/cb_k8s_list.md
index 9e11ff1b..64e821aa 100644
--- a/docs/data-sources/cb_k8s_list.md
+++ b/docs/data-sources/cb_k8s_list.md
@@ -80,6 +80,7 @@ Read-Only:
- `updated_time` (Number)
- `vins_id` (Number)
- `workers_groups` (List of Object) (see [below for nested schema](#nestedobjatt--items--workers_groups))
+- `zone_id` (Number)
### Nested Schema for `items.service_account`
diff --git a/docs/data-sources/cb_k8s_list_deleted.md b/docs/data-sources/cb_k8s_list_deleted.md
index 2a6de395..476d36ff 100644
--- a/docs/data-sources/cb_k8s_list_deleted.md
+++ b/docs/data-sources/cb_k8s_list_deleted.md
@@ -78,6 +78,7 @@ Read-Only:
- `updated_time` (Number)
- `vins_id` (Number)
- `workers_groups` (List of Object) (see [below for nested schema](#nestedobjatt--items--workers_groups))
+- `zone_id` (Number)
### Nested Schema for `items.service_account`
diff --git a/docs/data-sources/cb_kvmvm.md b/docs/data-sources/cb_kvmvm.md
index da2b4334..427285da 100644
--- a/docs/data-sources/cb_kvmvm.md
+++ b/docs/data-sources/cb_kvmvm.md
@@ -62,6 +62,7 @@ description: |-
- `image_id` (Number)
- `image_name` (String)
- `interfaces` (List of Object) (see [below for nested schema](#nestedatt--interfaces))
+- `live_migration_job_id` (Number)
- `loader_type` (String)
- `lock_status` (String)
- `manager_id` (Number)
@@ -83,6 +84,7 @@ description: |-
- `pinned` (Number)
- `pool` (String)
- `preferred_cpu` (List of Number)
+- `qemu_guest` (List of Object) (see [below for nested schema](#nestedatt--qemu_guest))
- `ram` (Number)
- `reference_id` (String)
- `registered` (Boolean)
@@ -107,6 +109,7 @@ description: |-
- `virtual_image_id` (Number)
- `virtual_image_name` (String)
- `vnc_password` (String)
+- `zone_id` (Number)
### Nested Schema for `timeouts`
@@ -122,7 +125,7 @@ Optional:
Read-Only:
-- `explicit` (String)
+- `explicit` (Boolean)
- `guid` (String)
- `right` (String)
- `status` (String)
@@ -181,7 +184,6 @@ Read-Only:
- `meta` (List of String)
- `milestones` (Number)
- `name` (String)
-- `order` (Number)
- `params` (String)
- `parent_id` (Number)
- `passwd` (String)
@@ -205,7 +207,6 @@ Read-Only:
- `status` (String)
- `tech_status` (String)
- `type` (String)
-- `vmid` (Number)
### Nested Schema for `disks.iotune`
@@ -278,7 +279,9 @@ Read-Only:
- `node_id` (Number)
- `pci_slot` (Number)
- `qos` (List of Object) (see [below for nested schema](#nestedobjatt--interfaces--qos))
+- `sdn_interface_id` (String)
- `target` (String)
+- `trunk_tags` (String)
- `type` (String)
- `vnfs` (List of Number)
@@ -319,6 +322,18 @@ Read-Only:
- `public_key` (String)
+
+### Nested Schema for `qemu_guest`
+
+Read-Only:
+
+- `enabled` (Boolean)
+- `enabled_agent_features` (List of String)
+- `guid` (String)
+- `last_update` (Number)
+- `user` (String)
+
+
### Nested Schema for `snap_sets`
diff --git a/docs/data-sources/cb_kvmvm_list.md b/docs/data-sources/cb_kvmvm_list.md
index 8ebacf96..195193ad 100644
--- a/docs/data-sources/cb_kvmvm_list.md
+++ b/docs/data-sources/cb_kvmvm_list.md
@@ -93,6 +93,7 @@ Read-Only:
- `hp_backed` (Boolean)
- `image_id` (Number)
- `interfaces` (List of Object) (see [below for nested schema](#nestedobjatt--items--interfaces))
+- `live_migration_job_id` (Number)
- `loader_type` (String)
- `lock_status` (String)
- `manager_id` (Number)
@@ -108,6 +109,7 @@ Read-Only:
- `os_users` (List of Object) (see [below for nested schema](#nestedobjatt--items--os_users))
- `pinned` (Number)
- `preferred_cpu` (List of Number)
+- `qemu_guest` (List of Object) (see [below for nested schema](#nestedobjatt--items--qemu_guest))
- `ram` (Number)
- `reference_id` (String)
- `registered` (Boolean)
@@ -131,13 +133,14 @@ Read-Only:
- `vgpus` (List of Number)
- `vins_connected` (Number)
- `virtual_image_id` (Number)
+- `zone_id` (Number)
### Nested Schema for `items.acl`
Read-Only:
-- `explicit` (String)
+- `explicit` (Boolean)
- `guid` (String)
- `right` (String)
- `status` (String)
@@ -205,7 +208,9 @@ Read-Only:
- `node_id` (Number)
- `pci_slot` (Number)
- `qos` (List of Object) (see [below for nested schema](#nestedobjatt--items--interfaces--qos))
+- `sdn_interface_id` (String)
- `target` (String)
+- `trunk_tags` (String)
- `type` (String)
- `vnfs` (List of Number)
@@ -246,6 +251,18 @@ Read-Only:
- `public_key` (String)
+
+### Nested Schema for `items.qemu_guest`
+
+Read-Only:
+
+- `enabled` (Boolean)
+- `enabled_agent_features` (List of String)
+- `guid` (String)
+- `last_update` (Number)
+- `user` (String)
+
+
### Nested Schema for `items.snap_sets`
diff --git a/docs/data-sources/cb_kvmvm_list_deleted.md b/docs/data-sources/cb_kvmvm_list_deleted.md
index a085bb8a..27160e91 100644
--- a/docs/data-sources/cb_kvmvm_list_deleted.md
+++ b/docs/data-sources/cb_kvmvm_list_deleted.md
@@ -124,13 +124,14 @@ Read-Only:
- `vgpus` (List of Number)
- `vins_connected` (Number)
- `virtual_image_id` (Number)
+- `zone_id` (Number)
### Nested Schema for `items.acl`
Read-Only:
-- `explicit` (String)
+- `explicit` (Boolean)
- `guid` (String)
- `right` (String)
- `status` (String)
@@ -197,7 +198,9 @@ Read-Only:
- `node_id` (Number)
- `pci_slot` (Number)
- `qos` (List of Object) (see [below for nested schema](#nestedobjatt--items--interfaces--qos))
+- `sdn_interface_id` (String)
- `target` (String)
+- `trunk_tags` (String)
- `type` (String)
- `vnfs` (List of Number)
diff --git a/docs/data-sources/cb_lb.md b/docs/data-sources/cb_lb.md
index 79209400..a37845ce 100644
--- a/docs/data-sources/cb_lb.md
+++ b/docs/data-sources/cb_lb.md
@@ -22,9 +22,11 @@ description: |-
### Optional
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+- `zone_id` (Number)
### Read-Only
+- `account_id` (Number)
- `acl` (String)
- `backend_haip` (String)
- `backends` (List of Object) (see [below for nested schema](#nestedatt--backends))
diff --git a/docs/data-sources/cb_lb_list.md b/docs/data-sources/cb_lb_list.md
index 1267fb2c..993cd4a5 100644
--- a/docs/data-sources/cb_lb_list.md
+++ b/docs/data-sources/cb_lb_list.md
@@ -83,6 +83,7 @@ Read-Only:
- `updated_time` (Number)
- `user_managed` (Boolean)
- `vins_id` (Number)
+- `zone_id` (Number)
### Nested Schema for `items.backends`
diff --git a/docs/data-sources/cb_lb_list_deleted.md b/docs/data-sources/cb_lb_list_deleted.md
index 82851999..80afc2bc 100644
--- a/docs/data-sources/cb_lb_list_deleted.md
+++ b/docs/data-sources/cb_lb_list_deleted.md
@@ -81,6 +81,7 @@ Read-Only:
- `updated_time` (Number)
- `user_managed` (Boolean)
- `vins_id` (Number)
+- `zone_id` (Number)
### Nested Schema for `items.backends`
@@ -92,6 +93,7 @@ Read-Only:
- `name` (String)
- `server_default_settings` (List of Object) (see [below for nested schema](#nestedobjatt--items--backends--server_default_settings))
- `servers` (List of Object) (see [below for nested schema](#nestedobjatt--items--backends--servers))
+- `zone_id` (Number)
### Nested Schema for `items.backends.server_default_settings`
diff --git a/docs/data-sources/cb_node.md b/docs/data-sources/cb_node.md
index bff91a36..2f0ebb25 100644
--- a/docs/data-sources/cb_node.md
+++ b/docs/data-sources/cb_node.md
@@ -49,6 +49,7 @@ description: |-
- `to_maintenance` (List of Object) (see [below for nested schema](#nestedatt--to_maintenance))
- `to_restricted` (List of Object) (see [below for nested schema](#nestedatt--to_restricted))
- `version` (String)
+- `zone_id` (Number)
### Nested Schema for `timeouts`
diff --git a/docs/data-sources/cb_node_list.md b/docs/data-sources/cb_node_list.md
index ccbf946d..89ea2516 100644
--- a/docs/data-sources/cb_node_list.md
+++ b/docs/data-sources/cb_node_list.md
@@ -80,6 +80,7 @@ Read-Only:
- `release` (String)
- `reserved_cpus` (List of String)
- `roles` (List of String)
+- `sdn_hypervisor_name` (String)
- `seps` (List of Number)
- `serial_num` (String)
- `sriov_enabled` (Boolean)
@@ -89,6 +90,7 @@ Read-Only:
- `type` (String)
- `uefi_firmware_file` (String)
- `version` (String)
+- `zone_id` (Number)
### Nested Schema for `items.cpu_info`
diff --git a/docs/data-sources/cb_rg.md b/docs/data-sources/cb_rg.md
index 0b1e32a3..84f4937a 100644
--- a/docs/data-sources/cb_rg.md
+++ b/docs/data-sources/cb_rg.md
@@ -48,6 +48,7 @@ description: |-
- `name` (String)
- `resource_limits` (List of Object) (see [below for nested schema](#nestedatt--resource_limits))
- `resource_types` (List of String)
+- `sdn_access_group_id` (String)
- `secret` (String)
- `status` (String)
- `uniq_pools` (List of String)
diff --git a/docs/data-sources/cb_rg_list.md b/docs/data-sources/cb_rg_list.md
index c8d4c9e7..950bffc3 100644
--- a/docs/data-sources/cb_rg_list.md
+++ b/docs/data-sources/cb_rg_list.md
@@ -73,6 +73,7 @@ Read-Only:
- `resource_limits` (List of Object) (see [below for nested schema](#nestedobjatt--items--resource_limits))
- `resource_types` (List of String)
- `rg_id` (Number)
+- `sdn_access_group_id` (String)
- `secret` (String)
- `status` (String)
- `uniq_pools` (List of String)
diff --git a/docs/data-sources/cb_trunk.md b/docs/data-sources/cb_trunk.md
new file mode 100644
index 00000000..bfd864d8
--- /dev/null
+++ b/docs/data-sources/cb_trunk.md
@@ -0,0 +1,51 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "decort_cb_trunk Data Source - terraform-provider-decort"
+subcategory: ""
+description: |-
+
+---
+
+# decort_cb_trunk (Data Source)
+
+
+
+
+
+
+## Schema
+
+### Required
+
+- `trunk_id` (Number) trunk id
+
+### Optional
+
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `account_ids` (Set of Number) List of account IDs with access to this trunk
+- `created_at` (Number) when the trunk was created
+- `created_by` (String) who created the trunk
+- `deleted_at` (Number) when the trunk was updated
+- `deleted_by` (String) who updated the trunk
+- `description` (String) Description of the trunk
+- `guid` (Number) GUID
+- `id` (String) The ID of this resource.
+- `mac` (String) MAC address
+- `name` (String) Name of the trunk
+- `native_vlan_id` (Number) Native VLAN ID
+- `ovs_bridge` (String) OVS bridge name
+- `status` (String) if the trunk is enabled
+- `trunk_tags` (String) List of trunk tags (values between 1-4095)
+- `updated_at` (Number) when the trunk was updated
+- `updated_by` (String) who updated the trunk
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `default` (String)
+- `read` (String)
diff --git a/docs/data-sources/cb_trunk_list.md b/docs/data-sources/cb_trunk_list.md
new file mode 100644
index 00000000..874fc73c
--- /dev/null
+++ b/docs/data-sources/cb_trunk_list.md
@@ -0,0 +1,64 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "decort_cb_trunk_list Data Source - terraform-provider-decort"
+subcategory: ""
+description: |-
+
+---
+
+# decort_cb_trunk_list (Data Source)
+
+
+
+
+
+
+## Schema
+
+### Optional
+
+- `account_ids` (List of Number) Account access ID(s) to filter by
+- `page` (Number) Page number.
+- `size` (Number) Page size.
+- `sort_by` (String) Sort by one of supported fields, format ±
+- `status` (String) find by status
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+- `trunk_ids` (List of Number) ID of the trunk(s) to filter by
+- `trunk_tags` (String) Trunk tags to filter by (value between 1-4095)
+
+### Read-Only
+
+- `entry_count` (Number)
+- `id` (String) The ID of this resource.
+- `items` (List of Object) (see [below for nested schema](#nestedatt--items))
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `default` (String)
+- `read` (String)
+
+
+
+### Nested Schema for `items`
+
+Read-Only:
+
+- `account_ids` (Set of Number)
+- `created_at` (Number)
+- `created_by` (String)
+- `deleted_at` (Number)
+- `deleted_by` (String)
+- `description` (String)
+- `guid` (Number)
+- `id` (Number)
+- `mac` (String)
+- `name` (String)
+- `native_vlan_id` (Number)
+- `ovs_bridge` (String)
+- `status` (String)
+- `trunk_tags` (String)
+- `updated_at` (Number)
+- `updated_by` (String)
diff --git a/docs/data-sources/cb_user.md b/docs/data-sources/cb_user.md
index 194622bf..161328cd 100644
--- a/docs/data-sources/cb_user.md
+++ b/docs/data-sources/cb_user.md
@@ -29,6 +29,7 @@ description: |-
- `api_access` (Map of String) api_access
- `authkey` (String) authkey
- `authkeys` (List of String) authkeys
+- `blocked` (Boolean) is the user blocked
- `ckey` (String) ckey
- `data` (String) data
- `description` (String) description
diff --git a/docs/data-sources/cb_user_list.md b/docs/data-sources/cb_user_list.md
index 8afdeb0d..b0e84aa8 100644
--- a/docs/data-sources/cb_user_list.md
+++ b/docs/data-sources/cb_user_list.md
@@ -19,6 +19,7 @@ description: |-
- `active` (Boolean) find by active. True or False
- `by_id` (String) find by id
+- `email` (String) find by email
- `page` (Number) Page number
- `service_account` (Boolean) find by service account. True or False
- `size` (Number) Page size
@@ -49,6 +50,7 @@ Read-Only:
- `apiaccess` (Map of String)
- `authkey` (String)
- `authkeys` (List of String)
+- `blocked` (Boolean)
- `ckey` (String)
- `data` (String)
- `description` (String)
diff --git a/docs/data-sources/cb_vins.md b/docs/data-sources/cb_vins.md
index f2df62c3..a5644528 100644
--- a/docs/data-sources/cb_vins.md
+++ b/docs/data-sources/cb_vins.md
@@ -56,6 +56,7 @@ description: |-
- `vnf_dev` (List of Object) vnf dev (see [below for nested schema](#nestedatt--vnf_dev))
- `vnfs` (List of Object) vnfs (see [below for nested schema](#nestedatt--vnfs))
- `vxlan_id` (Number) vxlan id
+- `zone_id` (Number)
### Nested Schema for `timeouts`
@@ -158,6 +159,7 @@ Read-Only:
- `node_id` (Number)
- `pci_slot` (Number)
- `qos` (List of Object) (see [below for nested schema](#nestedobjatt--vnf_dev--interfaces--qos))
+- `sdn_interface_id` (String)
- `target` (String)
- `type` (String)
- `vnfs` (List of Number)
@@ -300,7 +302,6 @@ Read-Only:
- `owner_id` (Number)
- `owner_type` (String)
- `pure_virtual` (Boolean)
-- `routes` (List of Object) (see [below for nested schema](#nestedobjatt--vnfs--gw--routes))
- `status` (String)
- `tech_status` (String)
- `type` (String)
@@ -346,19 +347,6 @@ Read-Only:
-
-### Nested Schema for `vnfs.gw.routes`
-
-Read-Only:
-
-- `compute_ids` (List of Number)
-- `destination` (String)
-- `gateway` (String)
-- `guid` (String)
-- `netmask` (String)
-- `route_id` (Number)
-
-
### Nested Schema for `vnfs.nat`
@@ -379,7 +367,6 @@ Read-Only:
- `owner_id` (Number)
- `owner_type` (String)
- `pure_virtual` (Boolean)
-- `routes` (List of Object) (see [below for nested schema](#nestedobjatt--vnfs--nat--routes))
- `status` (String)
- `tech_status` (String)
- `type` (String)
@@ -424,17 +411,3 @@ Read-Only:
- `dev_id` (Number)
- `iface01` (String)
- `iface02` (String)
-
-
-
-
-### Nested Schema for `vnfs.nat.routes`
-
-Read-Only:
-
-- `compute_ids` (List of Number)
-- `destination` (String)
-- `gateway` (String)
-- `guid` (String)
-- `netmask` (String)
-- `route_id` (Number)
diff --git a/docs/data-sources/cb_vins_list.md b/docs/data-sources/cb_vins_list.md
index 2d011cc3..7000d36e 100644
--- a/docs/data-sources/cb_vins_list.md
+++ b/docs/data-sources/cb_vins_list.md
@@ -84,6 +84,7 @@ Read-Only:
- `vins_id` (Number)
- `vnfs` (List of Object) (see [below for nested schema](#nestedobjatt--items--vnfs))
- `vxlan_id` (Number)
+- `zone_id` (Number)
### Nested Schema for `items.default_qos`
diff --git a/docs/data-sources/cb_vins_list_deleted.md b/docs/data-sources/cb_vins_list_deleted.md
index 47a37c7b..8a915845 100644
--- a/docs/data-sources/cb_vins_list_deleted.md
+++ b/docs/data-sources/cb_vins_list_deleted.md
@@ -80,6 +80,7 @@ Read-Only:
- `vins_id` (Number)
- `vnfs` (List of Object) (see [below for nested schema](#nestedobjatt--items--vnfs))
- `vxlan_id` (Number)
+- `zone_id` (Number)
### Nested Schema for `items.default_qos`
diff --git a/docs/data-sources/cb_zone.md b/docs/data-sources/cb_zone.md
new file mode 100644
index 00000000..eea08c2b
--- /dev/null
+++ b/docs/data-sources/cb_zone.md
@@ -0,0 +1,45 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "decort_cb_zone Data Source - terraform-provider-decort"
+subcategory: ""
+description: |-
+
+---
+
+# decort_cb_zone (Data Source)
+
+
+
+
+
+
+## Schema
+
+### Required
+
+- `zone_id` (Number)
+
+### Optional
+
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `created_time` (Number)
+- `deletable` (Boolean)
+- `description` (String)
+- `gid` (Number)
+- `guid` (Number)
+- `id` (String) The ID of this resource.
+- `name` (String)
+- `node_ids` (List of Number)
+- `status` (String)
+- `updated_time` (Number)
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `default` (String)
+- `read` (String)
diff --git a/docs/data-sources/cb_zone_list.md b/docs/data-sources/cb_zone_list.md
new file mode 100644
index 00000000..e29e5866
--- /dev/null
+++ b/docs/data-sources/cb_zone_list.md
@@ -0,0 +1,61 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "decort_cb_zone_list Data Source - terraform-provider-decort"
+subcategory: ""
+description: |-
+
+---
+
+# decort_cb_zone_list (Data Source)
+
+
+
+
+
+
+## Schema
+
+### Optional
+
+- `by_id` (Number) Find by ID
+- `deletable` (Boolean) Find by deletable
+- `description` (String) Find by description
+- `gid` (Number) Find by Grid ID
+- `name` (String) Find by name
+- `node_id` (Number) Find by nodeId
+- `page` (Number) Page number
+- `size` (Number) Page size
+- `sort_by` (String) sort by one of supported fields, format +|-(field)
+- `status` (String) Find by status
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `entry_count` (Number)
+- `id` (String) The ID of this resource.
+- `items` (List of Object) (see [below for nested schema](#nestedatt--items))
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `default` (String)
+- `read` (String)
+
+
+
+### Nested Schema for `items`
+
+Read-Only:
+
+- `created_time` (Number)
+- `deletable` (Boolean)
+- `description` (String)
+- `gid` (Number)
+- `guid` (Number)
+- `name` (String)
+- `node_ids` (List of Number)
+- `status` (String)
+- `updated_time` (Number)
+- `zone_id` (Number)
diff --git a/docs/data-sources/disk.md b/docs/data-sources/disk.md
index 20ce5575..9e2acef5 100644
--- a/docs/data-sources/disk.md
+++ b/docs/data-sources/disk.md
@@ -40,7 +40,7 @@ description: |-
- `gid` (Number) ID of the grid (platform)
- `id` (String) The ID of this resource.
- `image_id` (Number) Image ID
-- `images` (List of String) IDs of images using the disk
+- `images` (List of Number) IDs of images using the disk
- `iotune` (List of Object) (see [below for nested schema](#nestedatt--iotune))
- `machine_id` (Number)
- `machine_name` (String)
diff --git a/docs/data-sources/disk_list.md b/docs/data-sources/disk_list.md
index 52f3cb0b..92e57439 100644
--- a/docs/data-sources/disk_list.md
+++ b/docs/data-sources/disk_list.md
@@ -67,7 +67,7 @@ Read-Only:
- `disk_name` (String)
- `gid` (Number)
- `image_id` (Number)
-- `images` (List of String)
+- `images` (List of Number)
- `iotune` (List of Object) (see [below for nested schema](#nestedobjatt--items--iotune))
- `machine_id` (Number)
- `machine_name` (String)
diff --git a/docs/data-sources/disk_list_deleted.md b/docs/data-sources/disk_list_deleted.md
index 791227fd..32b91432 100644
--- a/docs/data-sources/disk_list_deleted.md
+++ b/docs/data-sources/disk_list_deleted.md
@@ -64,7 +64,7 @@ Read-Only:
- `disk_name` (String)
- `gid` (Number)
- `image_id` (Number)
-- `images` (List of String)
+- `images` (List of Number)
- `iotune` (List of Object) (see [below for nested schema](#nestedobjatt--items--iotune))
- `machine_id` (Number)
- `machine_name` (String)
diff --git a/docs/data-sources/disk_list_unattached.md b/docs/data-sources/disk_list_unattached.md
index ca20a400..f8ab8333 100644
--- a/docs/data-sources/disk_list_unattached.md
+++ b/docs/data-sources/disk_list_unattached.md
@@ -66,7 +66,7 @@ Read-Only:
- `gid` (Number)
- `guid` (Number)
- `image_id` (Number)
-- `images` (List of String)
+- `images` (List of Number)
- `iotune` (List of Object) (see [below for nested schema](#nestedobjatt--items--iotune))
- `iqn` (String)
- `login` (String)
diff --git a/docs/data-sources/disk_replication.md b/docs/data-sources/disk_replication.md
index 65ba62b1..555eda6e 100644
--- a/docs/data-sources/disk_replication.md
+++ b/docs/data-sources/disk_replication.md
@@ -39,7 +39,7 @@ description: |-
- `gid` (Number) ID of the grid (platform)
- `id` (String) The ID of this resource.
- `image_id` (Number) Image ID
-- `images` (List of String) IDs of images using the disk
+- `images` (List of Number) IDs of images using the disk
- `iotune` (List of Object) (see [below for nested schema](#nestedatt--iotune))
- `order` (Number) Disk order
- `params` (String) Disk params
diff --git a/docs/data-sources/extnet.md b/docs/data-sources/extnet.md
index 2db74495..11d0d7bf 100644
--- a/docs/data-sources/extnet.md
+++ b/docs/data-sources/extnet.md
@@ -40,18 +40,23 @@ description: |-
- `ipcidr` (String)
- `meta` (List of String) meta
- `milestones` (Number)
+- `mtu` (Number)
- `net_name` (String)
- `network` (String)
-- `network_id` (Number)
+- `network_ids` (List of Object) (see [below for nested schema](#nestedatt--network_ids))
- `ntp` (List of String)
+- `pre_reservations` (List of Object) (see [below for nested schema](#nestedatt--pre_reservations))
- `pre_reservations_num` (Number)
- `prefix` (Number)
- `pri_vnf_dev_id` (Number)
+- `redundant` (Boolean)
- `reservations` (List of Object) (see [below for nested schema](#nestedatt--reservations))
+- `sec_vnfdev_id` (Number)
- `shared_with` (List of Number)
- `status` (String)
- `vlan_id` (Number)
- `vnfs` (List of Object) (see [below for nested schema](#nestedatt--vnfs))
+- `zone_id` (Number)
### Nested Schema for `timeouts`
@@ -86,6 +91,31 @@ Read-Only:
- `vm_id` (Number)
+
+### Nested Schema for `network_ids`
+
+Read-Only:
+
+- `primary` (Number)
+- `secondary` (Number)
+
+
+
+### Nested Schema for `pre_reservations`
+
+Read-Only:
+
+- `account_id` (Number)
+- `client_type` (String)
+- `desc` (String)
+- `domain_name` (String)
+- `hostname` (String)
+- `ip` (String)
+- `mac` (String)
+- `type` (String)
+- `vm_id` (Number)
+
+
### Nested Schema for `reservations`
diff --git a/docs/data-sources/k8s.md b/docs/data-sources/k8s.md
index 735292fd..b4531170 100644
--- a/docs/data-sources/k8s.md
+++ b/docs/data-sources/k8s.md
@@ -52,6 +52,7 @@ description: |-
- `updated_time` (Number)
- `vins_id` (Number)
- `workers` (List of Object) (see [below for nested schema](#nestedatt--workers))
+- `zone_id` (Number)
### Nested Schema for `timeouts`
diff --git a/docs/data-sources/k8s_list.md b/docs/data-sources/k8s_list.md
index f3d054b0..5c0882cd 100644
--- a/docs/data-sources/k8s_list.md
+++ b/docs/data-sources/k8s_list.md
@@ -79,6 +79,7 @@ Read-Only:
- `updated_time` (Number)
- `vins_id` (Number)
- `workers_groups` (List of Object) (see [below for nested schema](#nestedobjatt--items--workers_groups))
+- `zone_id` (Number)
### Nested Schema for `items.service_account`
diff --git a/docs/data-sources/k8s_list_deleted.md b/docs/data-sources/k8s_list_deleted.md
index a3c34b6b..6c10da26 100644
--- a/docs/data-sources/k8s_list_deleted.md
+++ b/docs/data-sources/k8s_list_deleted.md
@@ -77,6 +77,7 @@ Read-Only:
- `updated_time` (Number)
- `vins_id` (Number)
- `workers_groups` (List of Object) (see [below for nested schema](#nestedobjatt--items--workers_groups))
+- `zone_id` (Number)
### Nested Schema for `items.service_account`
diff --git a/docs/data-sources/kvmvm.md b/docs/data-sources/kvmvm.md
index 309ab6a8..5d6e2340 100644
--- a/docs/data-sources/kvmvm.md
+++ b/docs/data-sources/kvmvm.md
@@ -60,6 +60,7 @@ description: |-
- `id` (String) The ID of this resource.
- `image_id` (Number)
- `interfaces` (List of Object) (see [below for nested schema](#nestedatt--interfaces))
+- `live_migration_job_id` (Number)
- `loader_type` (String)
- `lock_status` (String)
- `manager_id` (Number)
@@ -80,6 +81,7 @@ description: |-
- `pci_devices` (List of Number)
- `pinned` (Boolean)
- `preferred_cpu` (List of Number)
+- `qemu_guest` (List of Object) (see [below for nested schema](#nestedatt--qemu_guest))
- `ram` (Number)
- `reference_id` (String)
- `registered` (Boolean)
@@ -101,6 +103,7 @@ description: |-
- `virtual_image_id` (Number)
- `virtual_image_name` (String)
- `vnc_password` (String)
+- `zone_id` (Number)
### Nested Schema for `timeouts`
@@ -212,7 +215,6 @@ Read-Only:
- `login` (String)
- `milestones` (Number)
- `name` (String)
-- `order` (Number)
- `params` (String)
- `parent_id` (Number)
- `passwd` (String)
@@ -233,7 +235,6 @@ Read-Only:
- `status` (String)
- `tech_status` (String)
- `type` (String)
-- `vmid` (Number)
### Nested Schema for `disks.iotune`
@@ -307,7 +308,9 @@ Read-Only:
- `node_id` (Number)
- `pci_slot` (Number)
- `qos` (List of Object) (see [below for nested schema](#nestedobjatt--interfaces--qos))
+- `sdn_interface_id` (String)
- `target` (String)
+- `trunk_tags` (String)
- `type` (String)
- `vnfs` (List of Number)
@@ -348,6 +351,18 @@ Read-Only:
- `public_key` (String)
+
+### Nested Schema for `qemu_guest`
+
+Read-Only:
+
+- `enabled` (Boolean)
+- `enabled_agent_features` (List of String)
+- `guid` (String)
+- `last_update` (Number)
+- `user` (String)
+
+
### Nested Schema for `snap_sets`
diff --git a/docs/data-sources/kvmvm_list.md b/docs/data-sources/kvmvm_list.md
index e8100355..364aae79 100644
--- a/docs/data-sources/kvmvm_list.md
+++ b/docs/data-sources/kvmvm_list.md
@@ -89,6 +89,7 @@ Read-Only:
- `hp_backed` (Boolean)
- `image_id` (Number)
- `interfaces` (List of Object) (see [below for nested schema](#nestedobjatt--items--interfaces))
+- `live_migration_job_id` (Number)
- `loader_type` (String)
- `lock_status` (String)
- `manager_id` (Number)
@@ -102,6 +103,7 @@ Read-Only:
- `numa_node_id` (Number)
- `pinned` (Boolean)
- `preferred_cpu` (List of Number)
+- `qemu_guest` (List of Object) (see [below for nested schema](#nestedobjatt--items--qemu_guest))
- `ram` (Number)
- `reference_id` (String)
- `registered` (Boolean)
@@ -122,6 +124,7 @@ Read-Only:
- `vgpus` (List of Number)
- `vins_connected` (Number)
- `virtual_image_id` (Number)
+- `zone_id` (Number)
### Nested Schema for `items.acl`
@@ -196,7 +199,9 @@ Read-Only:
- `node_id` (Number)
- `pci_slot` (Number)
- `qos` (List of Object) (see [below for nested schema](#nestedobjatt--items--interfaces--qos))
+- `sdn_interface_id` (String)
- `target` (String)
+- `trunk_tags` (String)
- `type` (String)
- `vnfs` (List of Number)
@@ -226,6 +231,18 @@ Read-Only:
+
+### Nested Schema for `items.qemu_guest`
+
+Read-Only:
+
+- `enabled` (Boolean)
+- `enabled_agent_features` (List of String)
+- `guid` (String)
+- `last_update` (Number)
+- `user` (String)
+
+
### Nested Schema for `items.snap_sets`
diff --git a/docs/data-sources/kvmvm_list_deleted.md b/docs/data-sources/kvmvm_list_deleted.md
index fc63f9f0..600485a5 100644
--- a/docs/data-sources/kvmvm_list_deleted.md
+++ b/docs/data-sources/kvmvm_list_deleted.md
@@ -87,6 +87,7 @@ Read-Only:
- `hp_backed` (Boolean)
- `image_id` (Number)
- `interfaces` (List of Object) (see [below for nested schema](#nestedobjatt--items--interfaces))
+- `live_migration_job_id` (Number)
- `loader_type` (String)
- `lock_status` (String)
- `manager_id` (Number)
@@ -100,6 +101,7 @@ Read-Only:
- `numa_node_id` (Number)
- `pinned` (Boolean)
- `preferred_cpu` (List of Number)
+- `qemu_guest` (List of Object) (see [below for nested schema](#nestedobjatt--items--qemu_guest))
- `ram` (Number)
- `reference_id` (String)
- `registered` (Boolean)
@@ -120,6 +122,7 @@ Read-Only:
- `vgpus` (List of Number)
- `vins_connected` (Number)
- `virtual_image_id` (Number)
+- `zone_id` (Number)
### Nested Schema for `items.acl`
@@ -194,7 +197,9 @@ Read-Only:
- `node_id` (Number)
- `pci_slot` (Number)
- `qos` (List of Object) (see [below for nested schema](#nestedobjatt--items--interfaces--qos))
+- `sdn_interface_id` (String)
- `target` (String)
+- `trunk_tags` (String)
- `type` (String)
- `vnfs` (List of Number)
@@ -224,6 +229,18 @@ Read-Only:
+
+### Nested Schema for `items.qemu_guest`
+
+Read-Only:
+
+- `enabled` (Boolean)
+- `enabled_agent_features` (List of String)
+- `guid` (String)
+- `last_update` (Number)
+- `user` (String)
+
+
### Nested Schema for `items.snap_sets`
diff --git a/docs/data-sources/lb.md b/docs/data-sources/lb.md
index 5c2ca3b0..f60c32b6 100644
--- a/docs/data-sources/lb.md
+++ b/docs/data-sources/lb.md
@@ -22,9 +22,11 @@ description: |-
### Optional
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+- `zone_id` (Number)
### Read-Only
+- `account_id` (Number)
- `backend_haip` (String)
- `backends` (List of Object) (see [below for nested schema](#nestedatt--backends))
- `created_by` (String)
diff --git a/docs/data-sources/lb_list.md b/docs/data-sources/lb_list.md
index b587cc15..9c878f61 100644
--- a/docs/data-sources/lb_list.md
+++ b/docs/data-sources/lb_list.md
@@ -51,6 +51,7 @@ Optional:
Read-Only:
+- `account_id` (Number)
- `backend_haip` (String)
- `backends` (List of Object) (see [below for nested schema](#nestedobjatt--items--backends))
- `created_by` (String)
@@ -83,6 +84,7 @@ Read-Only:
- `updated_time` (Number)
- `user_managed` (Boolean)
- `vins_id` (Number)
+- `zone_id` (Number)
### Nested Schema for `items.backends`
diff --git a/docs/data-sources/lb_list_deleted.md b/docs/data-sources/lb_list_deleted.md
index 7477be45..be7badea 100644
--- a/docs/data-sources/lb_list_deleted.md
+++ b/docs/data-sources/lb_list_deleted.md
@@ -49,6 +49,7 @@ Optional:
Read-Only:
+- `account_id` (Number)
- `backend_haip` (String)
- `backends` (List of Object) (see [below for nested schema](#nestedobjatt--items--backends))
- `created_by` (String)
@@ -81,6 +82,7 @@ Read-Only:
- `updated_time` (Number)
- `user_managed` (Boolean)
- `vins_id` (Number)
+- `zone_id` (Number)
### Nested Schema for `items.backends`
diff --git a/docs/data-sources/locations_list.md b/docs/data-sources/locations_list.md
index e70fcdd0..1a104cf8 100644
--- a/docs/data-sources/locations_list.md
+++ b/docs/data-sources/locations_list.md
@@ -55,4 +55,5 @@ Read-Only:
- `location_code` (String)
- `meta` (List of String)
- `name` (String)
+- `network_modes` (List of String)
- `sdn_support` (Boolean)
diff --git a/docs/data-sources/resgroup.md b/docs/data-sources/resgroup.md
index 3c1a75b7..00adb396 100644
--- a/docs/data-sources/resgroup.md
+++ b/docs/data-sources/resgroup.md
@@ -48,6 +48,7 @@ description: |-
- `name` (String)
- `res_types` (List of String)
- `resource_limits` (List of Object) (see [below for nested schema](#nestedatt--resource_limits))
+- `sdn_access_group_id` (String)
- `secret` (String)
- `status` (String)
- `uniq_pools` (List of String)
diff --git a/docs/data-sources/rg_list.md b/docs/data-sources/rg_list.md
index f1af8db0..8b60250b 100644
--- a/docs/data-sources/rg_list.md
+++ b/docs/data-sources/rg_list.md
@@ -73,6 +73,7 @@ Read-Only:
- `resource_limits` (List of Object) (see [below for nested schema](#nestedobjatt--items--resource_limits))
- `resource_types` (List of String)
- `rg_id` (Number)
+- `sdn_access_group_id` (String)
- `secret` (String)
- `status` (String)
- `uniq_pools` (List of String)
diff --git a/docs/data-sources/trunk.md b/docs/data-sources/trunk.md
new file mode 100644
index 00000000..f22d1f41
--- /dev/null
+++ b/docs/data-sources/trunk.md
@@ -0,0 +1,51 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "decort_trunk Data Source - terraform-provider-decort"
+subcategory: ""
+description: |-
+
+---
+
+# decort_trunk (Data Source)
+
+
+
+
+
+
+## Schema
+
+### Required
+
+- `trunk_id` (Number) trunk id
+
+### Optional
+
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `account_ids` (Set of Number) List of account IDs with access to this trunk
+- `created_at` (Number) when the trunk was created
+- `created_by` (String) who created the trunk
+- `deleted_at` (Number) when the trunk was updated
+- `deleted_by` (String) who updated the trunk
+- `description` (String) Description of the trunk
+- `guid` (Number) GUID
+- `id` (String) The ID of this resource.
+- `mac` (String) MAC address
+- `name` (String) Name of the trunk
+- `native_vlan_id` (Number) Native VLAN ID
+- `ovs_bridge` (String) OVS bridge name
+- `status` (String) if the trunk is enabled
+- `trunk_tags` (String) List of trunk tags (values between 1-4095)
+- `updated_at` (Number) when the trunk was updated
+- `updated_by` (String) who updated the trunk
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `default` (String)
+- `read` (String)
diff --git a/docs/data-sources/trunk_list.md b/docs/data-sources/trunk_list.md
new file mode 100644
index 00000000..97b4ee10
--- /dev/null
+++ b/docs/data-sources/trunk_list.md
@@ -0,0 +1,64 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "decort_trunk_list Data Source - terraform-provider-decort"
+subcategory: ""
+description: |-
+
+---
+
+# decort_trunk_list (Data Source)
+
+
+
+
+
+
+## Schema
+
+### Optional
+
+- `account_ids` (List of Number) Account access ID(s) to filter by
+- `page` (Number) Page number.
+- `size` (Number) Page size.
+- `sort_by` (String) Sort by one of supported fields, format ±
+- `status` (String) find by status
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+- `trunk_ids` (List of Number) ID of the trunk(s) to filter by
+- `trunk_tags` (String) Trunk tags to filter by (value between 1-4095)
+
+### Read-Only
+
+- `entry_count` (Number)
+- `id` (String) The ID of this resource.
+- `items` (List of Object) (see [below for nested schema](#nestedatt--items))
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `default` (String)
+- `read` (String)
+
+
+
+### Nested Schema for `items`
+
+Read-Only:
+
+- `account_ids` (Set of Number)
+- `created_at` (Number)
+- `created_by` (String)
+- `deleted_at` (Number)
+- `deleted_by` (String)
+- `description` (String)
+- `guid` (Number)
+- `id` (Number)
+- `mac` (String)
+- `name` (String)
+- `native_vlan_id` (Number)
+- `ovs_bridge` (String)
+- `status` (String)
+- `trunk_tags` (String)
+- `updated_at` (Number)
+- `updated_by` (String)
diff --git a/docs/data-sources/vins.md b/docs/data-sources/vins.md
index 4a21d7ff..a7e68e88 100644
--- a/docs/data-sources/vins.md
+++ b/docs/data-sources/vins.md
@@ -57,6 +57,7 @@ description: |-
- `vnf_dev` (List of Object) (see [below for nested schema](#nestedatt--vnf_dev))
- `vnfs` (List of Object) (see [below for nested schema](#nestedatt--vnfs))
- `vxlan_id` (Number)
+- `zone_id` (Number)
### Nested Schema for `timeouts`
@@ -167,6 +168,7 @@ Read-Only:
- `node_id` (Number)
- `pci_slot` (Number)
- `qos` (List of Object) (see [below for nested schema](#nestedobjatt--vnf_dev--interfaces--qos))
+- `sdn_interface_id` (String)
- `target` (String)
- `type` (String)
- `vnfs` (List of Number)
@@ -307,7 +309,6 @@ Read-Only:
- `owner_id` (Number)
- `owner_type` (String)
- `pure_virtual` (Boolean)
-- `routes` (List of Object) (see [below for nested schema](#nestedobjatt--vnfs--gw--routes))
- `status` (String)
- `tech_status` (String)
- `type` (String)
@@ -353,19 +354,6 @@ Read-Only:
-
-### Nested Schema for `vnfs.gw.routes`
-
-Read-Only:
-
-- `compute_ids` (List of Number)
-- `destination` (String)
-- `gateway` (String)
-- `guid` (String)
-- `netmask` (String)
-- `route_id` (Number)
-
-
### Nested Schema for `vnfs.nat`
@@ -385,7 +373,6 @@ Read-Only:
- `owner_id` (Number)
- `owner_type` (String)
- `pure_virtual` (Boolean)
-- `routes` (List of Object) (see [below for nested schema](#nestedobjatt--vnfs--nat--routes))
- `status` (String)
- `tech_status` (String)
- `type` (String)
@@ -430,17 +417,3 @@ Read-Only:
- `dev_id` (Number)
- `iface01` (String)
- `iface02` (String)
-
-
-
-
-### Nested Schema for `vnfs.nat.routes`
-
-Read-Only:
-
-- `compute_ids` (List of Number)
-- `destination` (String)
-- `gateway` (String)
-- `guid` (String)
-- `netmask` (String)
-- `route_id` (Number)
diff --git a/docs/data-sources/zone.md b/docs/data-sources/zone.md
new file mode 100644
index 00000000..5a0081a5
--- /dev/null
+++ b/docs/data-sources/zone.md
@@ -0,0 +1,45 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "decort_zone Data Source - terraform-provider-decort"
+subcategory: ""
+description: |-
+
+---
+
+# decort_zone (Data Source)
+
+
+
+
+
+
+## Schema
+
+### Required
+
+- `zone_id` (Number)
+
+### Optional
+
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `created_time` (Number)
+- `deletable` (Boolean)
+- `description` (String)
+- `gid` (Number)
+- `guid` (Number)
+- `id` (String) The ID of this resource.
+- `name` (String)
+- `node_ids` (List of Number)
+- `status` (String)
+- `updated_time` (Number)
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `default` (String)
+- `read` (String)
diff --git a/docs/data-sources/zone_list.md b/docs/data-sources/zone_list.md
new file mode 100644
index 00000000..1d02960c
--- /dev/null
+++ b/docs/data-sources/zone_list.md
@@ -0,0 +1,61 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "decort_zone_list Data Source - terraform-provider-decort"
+subcategory: ""
+description: |-
+
+---
+
+# decort_zone_list (Data Source)
+
+
+
+
+
+
+## Schema
+
+### Optional
+
+- `by_id` (Number) Find by ID
+- `deletable` (Boolean) Find by deletable
+- `description` (String) Find by description
+- `gid` (Number) Find by Grid ID
+- `name` (String) Find by name
+- `node_id` (Number) Find by nodeId
+- `page` (Number) Page number
+- `size` (Number) Page size
+- `sort_by` (String) sort by one of supported fields, format +|-(field)
+- `status` (String) Find by status
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `entry_count` (Number)
+- `id` (String) The ID of this resource.
+- `items` (List of Object) (see [below for nested schema](#nestedatt--items))
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `default` (String)
+- `read` (String)
+
+
+
+### Nested Schema for `items`
+
+Read-Only:
+
+- `created_time` (Number)
+- `deletable` (Boolean)
+- `description` (String)
+- `gid` (Number)
+- `guid` (Number)
+- `name` (String)
+- `node_ids` (List of Number)
+- `status` (String)
+- `updated_time` (Number)
+- `zone_id` (Number)
diff --git a/docs/resources/account.md b/docs/resources/account.md
index 58874f89..b667c638 100644
--- a/docs/resources/account.md
+++ b/docs/resources/account.md
@@ -21,16 +21,17 @@ description: |-
### Optional
+- `default_zone_id` (Number) email
- `desc` (String) description
- `emailaddress` (String) email
- `enable` (Boolean) enable/disable account
- `permanently` (Boolean) whether to completely delete the account
-- `reason` (String) reason for deactivation
- `resource_limits` (Block List, Max: 1) (see [below for nested schema](#nestedblock--resource_limits))
- `restore` (Boolean) restore a deleted account
- `send_access_emails` (Boolean) if true send emails when a user is granted access to resources
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `users` (Block List) (see [below for nested schema](#nestedblock--users))
+- `zone_ids` (List of Number)
### Read-Only
@@ -100,6 +101,7 @@ Required:
Read-Only:
- `can_be_deleted` (Boolean)
+- `emails` (List of String)
- `explicit` (Boolean)
- `guid` (String)
- `right` (String)
diff --git a/docs/resources/bservice.md b/docs/resources/bservice.md
index 114103c1..42b3089d 100644
--- a/docs/resources/bservice.md
+++ b/docs/resources/bservice.md
@@ -31,6 +31,7 @@ description: |-
- `ssh_user` (String) name of the user to deploy SSH key for. Pass empty string if no SSH key deployment is required
- `start` (Boolean) Start service. Starting a service technically means starting computes from all service groups according to group relations
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+- `zone_id` (Number) ID of the zone where this service will be placed
### Read-Only
diff --git a/docs/resources/cb_account.md b/docs/resources/cb_account.md
index 472cc465..42d347e7 100644
--- a/docs/resources/cb_account.md
+++ b/docs/resources/cb_account.md
@@ -27,17 +27,18 @@ description: |-
- `compute_features` (Set of String)
- `cpu_allocation_parameter` (String) set cpu allocation parameter
- `cpu_allocation_ratio` (Number) set cpu allocation ratio
+- `default_zone_id` (Number) email
- `desc` (String) description
- `emailaddress` (String) email
- `enable` (Boolean) enable/disable account
- `permanently` (Boolean) whether to completely delete the account
-- `reason` (String) reason for restore or deactivation
- `resource_limits` (Block List, Max: 1) (see [below for nested schema](#nestedblock--resource_limits))
- `restore` (Boolean) restore a deleted account
- `send_access_emails` (Boolean) if true send emails when a user is granted access to resources
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `uniq_pools` (List of String)
- `users` (Block List) (see [below for nested schema](#nestedblock--users))
+- `zone_ids` (List of Number)
### Read-Only
@@ -103,6 +104,7 @@ Required:
Read-Only:
+- `emails` (List of String)
- `explicit` (Boolean)
- `guid` (String)
- `right` (String)
diff --git a/docs/resources/cb_disk.md b/docs/resources/cb_disk.md
index 92d9e641..b126584f 100644
--- a/docs/resources/cb_disk.md
+++ b/docs/resources/cb_disk.md
@@ -53,7 +53,7 @@ description: |-
- `guid` (Number)
- `id` (String) The ID of this resource.
- `image_id` (Number)
-- `images` (List of String)
+- `images` (List of Number)
- `iqn` (String)
- `login` (String)
- `machine_id` (Number)
diff --git a/docs/resources/cb_extnet.md b/docs/resources/cb_extnet.md
index 87da86e5..a8f44c32 100644
--- a/docs/resources/cb_extnet.md
+++ b/docs/resources/cb_extnet.md
@@ -33,18 +33,22 @@ description: |-
- `excluded_ips` (Set of String) IPs to exclude in current extnet pool
- `excluded_ips_range` (Block Set) Range of IPs to exclude in current extnet pool (see [below for nested schema](#nestedblock--excluded_ips_range))
- `gateway` (String) External network gateway IP address
+- `highly_available` (Boolean)
- `migrate` (Number)
+- `mtu` (Number)
- `ntp` (List of String) List of NTP addresses
- `ovs_bridge` (String) OpenvSwith bridge name for ExtNet connection
- `pre_reservations_num` (Number) Number of pre created reservations
- `reserved_ip` (Block Set) (see [below for nested schema](#nestedblock--reserved_ip))
- `restart` (Boolean) restart extnet vnf device
+- `sec_vnfdev_ip` (String)
- `set_default` (Boolean) Set current extnet as default (can not be undone)
- `shared_with` (Set of Number)
- `start_ip` (String) Start of IP range to be explicitly included
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `virtual` (Boolean) If true - platform DHCP server will not be created
- `vnfdev_ip` (String) IP to create VNFDev with
+- `zone_id` (Number)
### Read-Only
@@ -58,7 +62,7 @@ description: |-
- `meta` (List of String) meta
- `milestones` (Number)
- `network` (String)
-- `network_id` (Number)
+- `network_ids` (List of Object) (see [below for nested schema](#nestedatt--network_ids))
- `prefix` (Number)
- `pri_vnfdev_id` (Number)
- `reservations` (List of Object) (see [below for nested schema](#nestedatt--reservations))
@@ -128,6 +132,15 @@ Read-Only:
- `vm_id` (Number)
+
+### Nested Schema for `network_ids`
+
+Read-Only:
+
+- `primary` (Number)
+- `secondary` (Number)
+
+
### Nested Schema for `reservations`
diff --git a/docs/resources/cb_flipgroup.md b/docs/resources/cb_flipgroup.md
index bbd719d2..95b9ab3e 100644
--- a/docs/resources/cb_flipgroup.md
+++ b/docs/resources/cb_flipgroup.md
@@ -18,7 +18,6 @@ description: |-
### Required
- `account_id` (Number) Account ID
-- `client_type` (String) Type of client, 'compute' ('vins' will be later)
- `name` (String) Flipgroup name
- `net_id` (Number) EXTNET or ViNS ID
- `net_type` (String) Network type, EXTNET or VINS
@@ -26,6 +25,7 @@ description: |-
### Optional
- `client_ids` (List of Number) List of clients attached to this Flipgroup instance
+- `client_type` (String) Type of client, 'compute' ('vins' will be later)
- `desc` (String) Text description of this Flipgroup instance
- `ip` (String) IP address to associate with this group. If empty, the platform will autoselect IP address
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
diff --git a/docs/resources/cb_image.md b/docs/resources/cb_image.md
index a3fddfb5..166891ea 100644
--- a/docs/resources/cb_image.md
+++ b/docs/resources/cb_image.md
@@ -25,7 +25,6 @@ description: |-
### Optional
- `account_id` (Number) AccountId to make the image exclusive
-- `architecture` (String) binary architecture of this image, one of X86_64
- `bootable` (Boolean) Does this image boot OS
- `computeci_id` (Number)
- `drivers` (List of String) List of types of compute suitable for image. Example: [ "KVM_X86" ]
@@ -46,6 +45,7 @@ description: |-
### Read-Only
- `acl` (List of Object) (see [below for nested schema](#nestedatt--acl))
+- `architecture` (String) binary architecture of this image, one of X86_64
- `cd_presented_to` (String)
- `deleted_time` (Number)
- `desc` (String)
diff --git a/docs/resources/cb_image_from_platform_disk.md b/docs/resources/cb_image_from_platform_disk.md
index c29ba9a9..1c1af90a 100644
--- a/docs/resources/cb_image_from_platform_disk.md
+++ b/docs/resources/cb_image_from_platform_disk.md
@@ -17,7 +17,6 @@ description: |-
### Required
-- `architecture` (String) Image type linux, windows or other
- `boot_type` (String) Boot type of image BIOS or UEFI
- `disk_id` (Number) Disk Id
- `drivers` (List of String) List of types of compute suitable for image. Example: [ "KVM_X86" ]
@@ -43,6 +42,7 @@ description: |-
### Read-Only
- `acl` (List of Object) (see [below for nested schema](#nestedatt--acl))
+- `architecture` (String)
- `cd_presented_to` (String)
- `deleted_time` (Number)
- `desc` (String)
diff --git a/docs/resources/cb_k8s_cp.md b/docs/resources/cb_k8s_cp.md
index c4664d92..85e62292 100644
--- a/docs/resources/cb_k8s_cp.md
+++ b/docs/resources/cb_k8s_cp.md
@@ -50,6 +50,7 @@ description: |-
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `vins_id` (Number) ID of default vins for this instace.
- `with_lb` (Boolean) Create k8s with load balancer if true.
+- `zone_id` (Number)
### Read-Only
diff --git a/docs/resources/cb_kvmvm.md b/docs/resources/cb_kvmvm.md
index dab7495d..d25ea249 100644
--- a/docs/resources/cb_kvmvm.md
+++ b/docs/resources/cb_kvmvm.md
@@ -73,6 +73,7 @@ description: |-
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `user_access` (Block Set) (see [below for nested schema](#nestedblock--user_access))
- `without_boot_disk` (Boolean) If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state.
+- `zone_id` (Number)
### Read-Only
@@ -221,13 +222,14 @@ Optional:
Required:
- `net_id` (Number) ID of the network for this connection.
-- `net_type` (String) Type of the network for this connection, either EXTNET or VINS.
+- `net_type` (String) Type of the network for this connection
Optional:
- `ip_address` (String) Optional IP address to assign to this connection. This IP should belong to the selected network and free for use.
- `mac` (String) MAC address associated with this connection. MAC address is assigned automatically.
- `mtu` (Number) Maximum transmission unit, used only for DPDK type, must be 1-9216
+- `sdn_interface_id` (String) unique_identifier of LogicalPort on SDN side
- `weight` (Number) weight the network if you need to sort network list, the smallest attach first. zero or null weight attach last
@@ -300,7 +302,7 @@ Required:
Read-Only:
-- `explicit` (String)
+- `explicit` (Boolean)
- `guid` (String)
- `right` (String)
- `status` (String)
@@ -332,7 +334,9 @@ Read-Only:
- `node_id` (Number)
- `pci_slot` (Number)
- `qos` (List of Object) (see [below for nested schema](#nestedobjatt--interfaces--qos))
+- `sdn_interface_id` (String)
- `target` (String)
+- `trunk_tags` (String)
- `type` (String)
- `vnfs` (List of Number)
diff --git a/docs/resources/cb_lb.md b/docs/resources/cb_lb.md
index 4e3a7c46..ab6da12b 100644
--- a/docs/resources/cb_lb.md
+++ b/docs/resources/cb_lb.md
@@ -35,6 +35,7 @@ description: |-
- `sysctl_params` (List of Map of String) Custom sysctl values for Load Balancer instance. Applied on boot
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `vins_id` (Number)
+- `zone_id` (Number)
### Read-Only
diff --git a/docs/resources/cb_rg.md b/docs/resources/cb_rg.md
index 5f19188d..a9aea38e 100644
--- a/docs/resources/cb_rg.md
+++ b/docs/resources/cb_rg.md
@@ -39,6 +39,7 @@ description: |-
- `permanently` (Boolean) flag to permanently delete resource group
- `resource_limits` (Block List, Max: 1) (see [below for nested schema](#nestedblock--resource_limits))
- `restore` (Boolean) restore deleted rg
+- `sdn_access_group_id` (String) ID of the SDN access group
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `uniq_pools` (List of String)
diff --git a/docs/resources/cb_trunk.md b/docs/resources/cb_trunk.md
new file mode 100644
index 00000000..609d65ab
--- /dev/null
+++ b/docs/resources/cb_trunk.md
@@ -0,0 +1,55 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "decort_cb_trunk Resource - terraform-provider-decort"
+subcategory: ""
+description: |-
+
+---
+
+# decort_cb_trunk (Resource)
+
+
+
+
+
+
+## Schema
+
+### Required
+
+- `name` (String) Name of the trunk
+- `ovs_bridge` (String) OVS bridge name
+- `trunk_tags` (String) List of trunk tags (values between 1-4095)
+
+### Optional
+
+- `account_ids` (Set of Number) List of account IDs with access to this trunk
+- `description` (String) Description of the trunk
+- `enable` (Boolean) Whether the trunk should be enabled
+- `native_vlan_id` (Number) Native VLAN ID
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `created_at` (Number) when the trunk was created
+- `created_by` (String) who created the trunk
+- `deleted_at` (Number) when the trunk was updated
+- `deleted_by` (String) who updated the trunk
+- `guid` (Number) GUID
+- `id` (String) The ID of this resource.
+- `mac` (String) MAC address
+- `status` (String) if the trunk is enabled
+- `trunk_id` (Number) trunk id
+- `updated_at` (Number) when the trunk was updated
+- `updated_by` (String) who updated the trunk
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `create` (String)
+- `default` (String)
+- `delete` (String)
+- `read` (String)
+- `update` (String)
diff --git a/docs/resources/cb_user.md b/docs/resources/cb_user.md
index da53fd4d..861d3607 100644
--- a/docs/resources/cb_user.md
+++ b/docs/resources/cb_user.md
@@ -23,8 +23,9 @@ description: |-
### Optional
- `apiaccess` (Set of Number) list of apiaccess groups this user belongs to
-- `groups` (List of String) list of groups this user belongs to
+- `blocked` (Boolean) is the user blocked
- `password` (String) password of user
+- `provider_name` (String) provider
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
### Read-Only
@@ -37,6 +38,7 @@ description: |-
- `description` (String) description
- `domain` (String) domain
- `gid` (Number) gid
+- `groups` (List of String) list of groups this user belongs to
- `guid` (String) guid
- `id` (String) The ID of this resource.
- `last_check` (Number) last_check
diff --git a/docs/resources/cb_vins.md b/docs/resources/cb_vins.md
index f93bfbb7..6033bccf 100644
--- a/docs/resources/cb_vins.md
+++ b/docs/resources/cb_vins.md
@@ -42,6 +42,7 @@ description: |-
- `vnfdev_reset` (Boolean)
- `vnfdev_restart` (Boolean)
- `vnfdev_start` (Boolean) true to start vnfdev, false to stop vnfdev
+- `zone_id` (Number) zone id
### Read-Only
@@ -283,7 +284,6 @@ Read-Only:
- `owner_id` (Number)
- `owner_type` (String)
- `pure_virtual` (Boolean)
-- `routes` (List of Object) (see [below for nested schema](#nestedobjatt--vnfs--dhcp--routes))
- `status` (String)
- `tech_status` (String)
- `type` (String)
@@ -333,19 +333,6 @@ Read-Only:
-
-### Nested Schema for `vnfs.dhcp.routes`
-
-Read-Only:
-
-- `compute_ids` (List of Number)
-- `destination` (String)
-- `gateway` (String)
-- `guid` (String)
-- `netmask` (String)
-- `route_id` (Number)
-
-
### Nested Schema for `vnfs.gw`
@@ -366,7 +353,6 @@ Read-Only:
- `owner_id` (Number)
- `owner_type` (String)
- `pure_virtual` (Boolean)
-- `routes` (List of Object) (see [below for nested schema](#nestedobjatt--vnfs--gw--routes))
- `status` (String)
- `tech_status` (String)
- `type` (String)
@@ -412,19 +398,6 @@ Read-Only:
-
-### Nested Schema for `vnfs.gw.routes`
-
-Read-Only:
-
-- `compute_ids` (List of Number)
-- `destination` (String)
-- `gateway` (String)
-- `guid` (String)
-- `netmask` (String)
-- `route_id` (Number)
-
-
### Nested Schema for `vnfs.nat`
@@ -445,7 +418,6 @@ Read-Only:
- `owner_id` (Number)
- `owner_type` (String)
- `pure_virtual` (Boolean)
-- `routes` (List of Object) (see [below for nested schema](#nestedobjatt--vnfs--nat--routes))
- `status` (String)
- `tech_status` (String)
- `type` (String)
@@ -490,17 +462,3 @@ Read-Only:
- `dev_id` (Number)
- `iface01` (String)
- `iface02` (String)
-
-
-
-
-### Nested Schema for `vnfs.nat.routes`
-
-Read-Only:
-
-- `compute_ids` (List of Number)
-- `destination` (String)
-- `gateway` (String)
-- `guid` (String)
-- `netmask` (String)
-- `route_id` (Number)
diff --git a/docs/resources/cb_zone.md b/docs/resources/cb_zone.md
new file mode 100644
index 00000000..94beb14c
--- /dev/null
+++ b/docs/resources/cb_zone.md
@@ -0,0 +1,48 @@
+---
+# generated by https://github.com/hashicorp/terraform-plugin-docs
+page_title: "decort_cb_zone Resource - terraform-provider-decort"
+subcategory: ""
+description: |-
+
+---
+
+# decort_cb_zone (Resource)
+
+
+
+
+
+
+## Schema
+
+### Required
+
+- `name` (String)
+
+### Optional
+
+- `description` (String)
+- `node_ids` (List of Number)
+- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
+
+### Read-Only
+
+- `created_time` (Number)
+- `deletable` (Boolean)
+- `gid` (Number)
+- `guid` (Number)
+- `id` (String) The ID of this resource.
+- `status` (String)
+- `updated_time` (Number)
+- `zone_id` (Number)
+
+
+### Nested Schema for `timeouts`
+
+Optional:
+
+- `create` (String)
+- `default` (String)
+- `delete` (String)
+- `read` (String)
+- `update` (String)
diff --git a/docs/resources/disk.md b/docs/resources/disk.md
index c80b4d45..c61749a3 100644
--- a/docs/resources/disk.md
+++ b/docs/resources/disk.md
@@ -47,7 +47,7 @@ description: |-
- `gid` (Number) ID of the grid (platform)
- `id` (String) The ID of this resource.
- `image_id` (Number) Image ID
-- `images` (List of String) IDs of images using the disk
+- `images` (List of Number) IDs of images using the disk
- `machine_id` (Number)
- `machine_name` (String)
- `order` (Number) Disk order
diff --git a/docs/resources/flipgroup.md b/docs/resources/flipgroup.md
index 627c6806..9ba30166 100644
--- a/docs/resources/flipgroup.md
+++ b/docs/resources/flipgroup.md
@@ -18,7 +18,6 @@ description: |-
### Required
- `account_id` (Number) Account ID
-- `client_type` (String) Type of client, 'compute' ('vins' will be later)
- `name` (String) Flipgroup name
- `net_id` (Number) EXTNET or ViNS ID
- `net_type` (String) Network type, EXTNET or VINS
@@ -26,6 +25,7 @@ description: |-
### Optional
- `client_ids` (List of Number) List of clients attached to this Flipgroup instance
+- `client_type` (String) Type of client, 'compute' ('vins' will be later)
- `desc` (String) Text description of this Flipgroup instance
- `ip` (String) IP address to associate with this group. If empty, the platform will autoselect IP address
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
diff --git a/docs/resources/image.md b/docs/resources/image.md
index bac9ba6f..3cf97749 100644
--- a/docs/resources/image.md
+++ b/docs/resources/image.md
@@ -26,7 +26,6 @@ description: |-
### Optional
-- `architecture` (String) binary architecture of this image, one of X86_64
- `hot_resize` (Boolean) Does this machine supports hot resize
- `image_id` (Number) image id
- `network_interface_naming` (String) select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming
@@ -34,6 +33,7 @@ description: |-
- `password_dl` (String) password for upload binary media
- `pool_name` (String) pool for image create
- `sep_id` (Number) storage endpoint provider ID
+- `sync_mode` (Boolean) Create image from a media identified by URL (in synchronous mode)
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `username` (String) Optional username for the image
- `username_dl` (String) username for upload binary media
@@ -41,6 +41,7 @@ description: |-
### Read-Only
- `acl` (String)
+- `architecture` (String)
- `bootable` (Boolean)
- `cd_presented_to` (String)
- `ckey` (String)
diff --git a/docs/resources/image_from_platform_disk.md b/docs/resources/image_from_platform_disk.md
index ba871621..127e2aa3 100644
--- a/docs/resources/image_from_platform_disk.md
+++ b/docs/resources/image_from_platform_disk.md
@@ -17,7 +17,6 @@ description: |-
### Required
-- `architecture` (String) binary architecture of this image, one of X86_64
- `boot_type` (String) Boot type of image BIOS or UEFI
- `disk_id` (Number) Disk Id
- `drivers` (List of String) List of types of compute suitable for image. Example: [ "KVM_X86" ]
@@ -38,6 +37,7 @@ description: |-
### Read-Only
- `acl` (String)
+- `architecture` (String)
- `cd_presented_to` (String)
- `ckey` (String)
- `compute_ci_id` (Number)
diff --git a/docs/resources/k8s.md b/docs/resources/k8s.md
index a8f11dd4..030ce268 100644
--- a/docs/resources/k8s.md
+++ b/docs/resources/k8s.md
@@ -49,6 +49,7 @@ description: |-
- `vins_id` (Number) ID of default vins for this instace.
- `with_lb` (Boolean) Create k8s with load balancer if true.
- `workers` (Block List) Worker node(s) configuration. (see [below for nested schema](#nestedblock--workers))
+- `zone_id` (Number) ID of the zone to put the cluster into.
### Read-Only
diff --git a/docs/resources/k8s_cp.md b/docs/resources/k8s_cp.md
index 9567b4b7..842cf8b9 100644
--- a/docs/resources/k8s_cp.md
+++ b/docs/resources/k8s_cp.md
@@ -48,6 +48,7 @@ description: |-
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `vins_id` (Number) ID of default vins for this instace.
- `with_lb` (Boolean) Create k8s with load balancer if true.
+- `zone_id` (Number) ID of the zone to put the cluster into.
### Read-Only
diff --git a/docs/resources/kvmvm.md b/docs/resources/kvmvm.md
index 874051be..a3bc3798 100644
--- a/docs/resources/kvmvm.md
+++ b/docs/resources/kvmvm.md
@@ -70,6 +70,7 @@ description: |-
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `user_access` (Block Set) (see [below for nested schema](#nestedblock--user_access))
- `without_boot_disk` (Boolean) If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state.
+- `zone_id` (Number)
### Read-Only
@@ -196,13 +197,14 @@ Read-Only:
Required:
- `net_id` (Number) ID of the network for this connection.
-- `net_type` (String) Type of the network for this connection, either EXTNET or VINS.
+- `net_type` (String) Type of the network for this connection
Optional:
- `ip_address` (String) Optional IP address to assign to this connection. This IP should belong to the selected network and free for use.
- `mac` (String) MAC address associated with this connection. MAC address is assigned automatically.
- `mtu` (Number) Maximum transmission unit, used only for DPDK type, must be 1-9216
+- `sdn_interface_id` (String) unique_identifier of LogicalPort on SDN side
- `weight` (Number) weight the network if you need to sort network list, the smallest attach first. zero or null weight attach last
@@ -310,7 +312,9 @@ Read-Only:
- `node_id` (Number)
- `pci_slot` (Number)
- `qos` (List of Object) (see [below for nested schema](#nestedobjatt--interfaces--qos))
+- `sdn_interface_id` (String)
- `target` (String)
+- `trunk_tags` (String)
- `type` (String)
- `vnfs` (List of Number)
diff --git a/docs/resources/lb.md b/docs/resources/lb.md
index 833475d2..aed0ab28 100644
--- a/docs/resources/lb.md
+++ b/docs/resources/lb.md
@@ -35,9 +35,11 @@ description: |-
- `sysctl_params` (List of Map of String)
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `vins_id` (Number)
+- `zone_id` (Number)
### Read-Only
+- `account_id` (Number)
- `backend_haip` (String)
- `backends` (List of Object) (see [below for nested schema](#nestedatt--backends))
- `created_by` (String)
diff --git a/docs/resources/resgroup.md b/docs/resources/resgroup.md
index 4381e6ab..0635944c 100644
--- a/docs/resources/resgroup.md
+++ b/docs/resources/resgroup.md
@@ -36,6 +36,7 @@ description: |-
- `permanently` (Boolean) Set to True if you want force delete non-empty RG
- `quota` (Block List, Max: 1) Quota settings for this resource group. (see [below for nested schema](#nestedblock--quota))
- `restore` (Boolean)
+- `sdn_access_group_id` (String) ID of the SDN access group
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `uniq_pools` (List of String)
@@ -46,6 +47,8 @@ description: |-
- `compute_features` (List of String)
- `cpu_allocation_parameter` (String)
- `cpu_allocation_ratio` (Number)
+- `created_by` (String)
+- `created_time` (Number)
- `def_net_id` (Number) ID of the default network for this resource group (if any).
- `deleted_by` (String)
- `deleted_time` (Number)
diff --git a/docs/resources/vins.md b/docs/resources/vins.md
index ebf2fce9..7e2b2d89 100644
--- a/docs/resources/vins.md
+++ b/docs/resources/vins.md
@@ -40,6 +40,7 @@ description: |-
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `vnfdev_redeploy` (Boolean)
- `vnfdev_restart` (Boolean)
+- `zone_id` (Number) ID of the Zone to put ViNS into
### Read-Only
@@ -222,6 +223,7 @@ Read-Only:
- `node_id` (Number)
- `pci_slot` (Number)
- `qos` (List of Object) (see [below for nested schema](#nestedobjatt--vnf_dev--interfaces--qos))
+- `sdn_interface_id` (String)
- `target` (String)
- `type` (String)
- `vnfs` (List of Number)
@@ -362,7 +364,6 @@ Read-Only:
- `owner_id` (Number)
- `owner_type` (String)
- `pure_virtual` (Boolean)
-- `routes` (List of Object) (see [below for nested schema](#nestedobjatt--vnfs--gw--routes))
- `status` (String)
- `tech_status` (String)
- `type` (String)
@@ -408,19 +409,6 @@ Read-Only:
-
-### Nested Schema for `vnfs.gw.routes`
-
-Read-Only:
-
-- `compute_ids` (List of Number)
-- `destination` (String)
-- `gateway` (String)
-- `guid` (String)
-- `netmask` (String)
-- `route_id` (Number)
-
-
### Nested Schema for `vnfs.nat`
@@ -440,7 +428,6 @@ Read-Only:
- `owner_id` (Number)
- `owner_type` (String)
- `pure_virtual` (Boolean)
-- `routes` (List of Object) (see [below for nested schema](#nestedobjatt--vnfs--nat--routes))
- `status` (String)
- `tech_status` (String)
- `type` (String)
@@ -485,17 +472,3 @@ Read-Only:
- `dev_id` (Number)
- `iface01` (String)
- `iface02` (String)
-
-
-
-
-### Nested Schema for `vnfs.nat.routes`
-
-Read-Only:
-
-- `compute_ids` (List of Number)
-- `destination` (String)
-- `gateway` (String)
-- `guid` (String)
-- `netmask` (String)
-- `route_id` (Number)
diff --git a/go.mod b/go.mod
index a5eb68cc..f695b772 100644
--- a/go.mod
+++ b/go.mod
@@ -8,7 +8,7 @@ require (
github.com/hashicorp/terraform-plugin-sdk/v2 v2.33.0
github.com/sirupsen/logrus v1.9.0
golang.org/x/net v0.23.0
- repository.basistech.ru/BASIS/decort-golang-sdk v1.11.6
+ repository.basistech.ru/BASIS/decort-golang-sdk v1.12.1
)
require (
diff --git a/go.sum b/go.sum
index 5c66ff3d..54175227 100644
--- a/go.sum
+++ b/go.sum
@@ -273,5 +273,5 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-repository.basistech.ru/BASIS/decort-golang-sdk v1.11.6 h1:CTcMkUJgwDsUA+Az8FI5iLpZDk4ubOO4JnAfbOwDnM0=
-repository.basistech.ru/BASIS/decort-golang-sdk v1.11.6/go.mod h1:OaUynHHuSjWMzpfyoL4au6oLcUogqUkPPBKA15pbHWo=
+repository.basistech.ru/BASIS/decort-golang-sdk v1.12.1 h1:kd7P/A53hsIW2BttrbQ1fuHAYOsbWv8EKfElkPfl9qQ=
+repository.basistech.ru/BASIS/decort-golang-sdk v1.12.1/go.mod h1:OaUynHHuSjWMzpfyoL4au6oLcUogqUkPPBKA15pbHWo=
diff --git a/internal/provider/data_sources_map.go b/internal/provider/data_sources_map.go
index c7b8cf0d..b4bc89a6 100644
--- a/internal/provider/data_sources_map.go
+++ b/internal/provider/data_sources_map.go
@@ -38,8 +38,10 @@ import (
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/sep"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/snapshot"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/stack"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/trunk"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vfpool"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vins"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/zone"
cb_account "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/account"
cb_audit "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/audit"
@@ -58,9 +60,11 @@ import (
cb_rg "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/rg"
cb_sep "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/sep"
cb_stack "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/stack"
+ cb_trunk "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/trunk"
cb_user "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/user"
cb_vfpool "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vfpool"
cb_vins "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vins"
+ cb_zone "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/zone"
// cb_vgpu "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vgpu"
)
@@ -161,6 +165,10 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_rg_resource_consumption_list": rg.DataSourceRGResourceConsumptionList(),
"decort_rg_resource_consumption_get": rg.DataSourceRGResourceConsumptionGet(),
"decort_sep_and_pools_available_list": sep.DataSourceAvailableSEPAndPoolsList(),
+ "decort_trunk": trunk.DataSourceTrunk(),
+ "decort_trunk_list": trunk.DataSourceTrunkList(),
+ "decort_zone": zone.DataSourceZone(),
+ "decort_zone_list": zone.DataSourceZoneList(),
"decort_cb_account": cb_account.DataSourceAccount(),
"decort_cb_account_list": cb_account.DataSourceAccountList(),
@@ -256,6 +264,8 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_cb_flipgroup": cb_flipgroup.DataSourceFlipgroup(),
"decort_cb_stack_list": cb_stack.DataSourceStacksList(),
"decort_cb_stack": cb_stack.DataSourceStack(),
+ "decort_cb_trunk": cb_trunk.DataSourceTrunk(),
+ "decort_cb_trunk_list": cb_trunk.DataSourceTrunkList(),
"decort_cb_user": cb_user.DataSourceUser(),
"decort_cb_user_get_audit": cb_user.DataSourceUserGetAudit(),
"decort_cb_user_list": cb_user.DataSourceUserList(),
@@ -280,5 +290,7 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_cb_k8s_wg_cloud_init": cb_k8s.DataSourceK8sWgCloudInit(),
"decort_cb_k8s_wg_list": cb_k8s.DataSourceK8sWgList(),
"decort_cb_k8s_computes": cb_k8s.DataSourceK8sComputes(),
+ "decort_cb_zone": cb_zone.DataSourceZone(),
+ "decort_cb_zone_list": cb_zone.DataSourceZoneList(),
}
}
diff --git a/internal/provider/resource_map.go b/internal/provider/resource_map.go
index efb11131..f589d3d2 100644
--- a/internal/provider/resource_map.go
+++ b/internal/provider/resource_map.go
@@ -48,9 +48,11 @@ import (
cb_pcidevice "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/pcidevice"
cb_rg "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/rg"
cb_sep "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/sep"
+ cb_trunk "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/trunk"
cb_user "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/user"
cb_vfpool "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vfpool"
cb_vins "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vins"
+ cb_zone "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/zone"
)
func newResourcesMap() map[string]*schema.Resource {
@@ -109,7 +111,9 @@ func newResourcesMap() map[string]*schema.Resource {
"decort_cb_lb_frontend": cb_lb.ResourceLBFrontend(),
"decort_cb_lb_frontend_bind": cb_lb.ResourceLBFrontendBind(),
"decort_cb_rg": cb_rg.ResourceResgroup(),
+ "decort_cb_trunk": cb_trunk.ResourceTrunk(),
"decort_cb_user": cb_user.ResourceUser(),
"decort_cb_vfpool": cb_vfpool.ResourceVFPool(),
+ "decort_cb_zone": cb_zone.ResourceZone(),
}
}
diff --git a/internal/service/cloudapi/account/data_source_account.go b/internal/service/cloudapi/account/data_source_account.go
index 4698ed86..3b3d8b11 100644
--- a/internal/service/cloudapi/account/data_source_account.go
+++ b/internal/service/cloudapi/account/data_source_account.go
@@ -85,6 +85,13 @@ func aclSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "emails": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
+ },
}
return res
@@ -292,6 +299,26 @@ func dataSourceAccountSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
+ "zone_ids": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "name": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ },
+ },
+ },
+ "default_zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"acl": {
Type: schema.TypeList,
Computed: true,
diff --git a/internal/service/cloudapi/account/data_source_account_list.go b/internal/service/cloudapi/account/data_source_account_list.go
index 6cca41ad..c1d2bf7b 100644
--- a/internal/service/cloudapi/account/data_source_account_list.go
+++ b/internal/service/cloudapi/account/data_source_account_list.go
@@ -61,7 +61,7 @@ func flattenAccountList(al *account.ListAccounts) []map[string]interface{} {
return res
}
-func flattenRgAcl(rgAcls []account.RecordACL) []map[string]interface{} {
+func flattenRgAcl(rgAcls []account.ListRecordACL) []map[string]interface{} {
res := make([]map[string]interface{}, 0)
for _, rgAcl := range rgAcls {
temp := map[string]interface{}{
diff --git a/internal/service/cloudapi/account/flattens.go b/internal/service/cloudapi/account/flattens.go
index 36c7d342..5703ad00 100644
--- a/internal/service/cloudapi/account/flattens.go
+++ b/internal/service/cloudapi/account/flattens.go
@@ -36,6 +36,8 @@ func flattenAccount(d *schema.ResourceData, acc account.RecordAccount) error {
d.Set("machines", flattenAccMachines(acc.Machines))
d.Set("cpu_allocation_parameter", acc.CPUAllocationParameter)
d.Set("cpu_allocation_ratio", acc.CPUAllocationRatio)
+ d.Set("default_zone_id", acc.DefaultZoneID)
+ d.Set("zone_ids", flattenZones(acc.ZoneIDs))
if username, ok := d.GetOk("username"); ok {
d.Set("username", username)
@@ -80,6 +82,7 @@ func flattenAccAcl(acls []account.RecordACL) []map[string]interface{} {
"right": acls.Rights,
"status": acls.Status,
"type": acls.Type,
+ "emails": acls.Emails,
"user_group_id": acls.UgroupID,
}
res = append(res, temp)
@@ -165,3 +168,15 @@ func flattenAccResourceConsumption(lrc *account.ListResourceConsumption) []map[s
}
return res
}
+
+func flattenZones(zones []account.ZoneID) []map[string]interface{} {
+ res := make([]map[string]interface{}, 0)
+ for _, zone := range zones {
+ temp := map[string]interface{}{
+ "id": zone.ID,
+ "name": zone.Name,
+ }
+ res = append(res, temp)
+ }
+ return res
+}
diff --git a/internal/service/cloudapi/account/resource_account.go b/internal/service/cloudapi/account/resource_account.go
index cef45835..ef4d879c 100644
--- a/internal/service/cloudapi/account/resource_account.go
+++ b/internal/service/cloudapi/account/resource_account.go
@@ -34,13 +34,16 @@ package account
import (
"context"
+ "fmt"
"strconv"
"strings"
+ "time"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/account"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/tasks"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/status"
@@ -116,11 +119,32 @@ func resourceAccountDelete(ctx context.Context, d *schema.ResourceData, m interf
Permanently: d.Get("permanently").(bool),
}
- _, err = c.CloudAPI().Account().Delete(ctx, req)
+ taskID, err := c.CloudAPI().Account().Delete(ctx, req)
if err != nil {
return diag.FromErr(err)
}
+ taskReq := tasks.GetRequest{
+ AuditID: strings.Trim(taskID, `"`),
+ }
+
+ for {
+ time.Sleep(time.Second * 5)
+ task, err := c.CloudAPI().Tasks().Get(ctx, taskReq)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ log.Debugf("resourceAccountDelete: delete account - %s", task.Stage)
+
+ if task.Completed {
+ if task.Error != "" {
+ return diag.FromErr(fmt.Errorf("cannot delete account: %v", task.Error))
+ }
+ break
+ }
+ }
+
d.SetId("")
return nil
@@ -153,11 +177,32 @@ func resourceAccountUpdate(ctx context.Context, d *schema.ResourceData, m interf
AccountID: accountId,
}
- _, err := c.CloudAPI().Account().Restore(ctx, req)
+ taskID, err := c.CloudAPI().Account().Restore(ctx, req)
if err != nil {
return diag.FromErr(err)
}
+ taskReq := tasks.GetRequest{
+ AuditID: strings.Trim(taskID, `"`),
+ }
+
+ for {
+ time.Sleep(time.Second * 5)
+ task, err := c.CloudAPI().Tasks().Get(ctx, taskReq)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ log.Debugf("resourceAccountUpdate: restore account - %s", task.Stage)
+
+ if task.Completed {
+ if task.Error != "" {
+ return diag.FromErr(fmt.Errorf("cannot restore account: %v", task.Error))
+ }
+ break
+ }
+ }
+
hasChanged = true
}
case status.Disabled:
@@ -176,7 +221,6 @@ func resourceAccountUpdate(ctx context.Context, d *schema.ResourceData, m interf
if d.HasChange("enable") {
reqSwitch := account.DisableEnableRequest{
AccountID: accountId,
- Reason: d.Get("reason").(string),
}
enable := d.Get("enable").(bool)
@@ -285,6 +329,18 @@ func resourceAccountUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
+ if d.HasChange("default_zone_id") {
+ req.DefaultZoneID = uint64(d.Get("default_zone_id").(int))
+ updated = true
+ }
+
+ if updated {
+ _, err := c.CloudAPI().Account().Update(ctx, req)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
if d.HasChange("users") {
deletedUsers := make([]interface{}, 0)
addedUsers := make([]interface{}, 0)
@@ -431,10 +487,19 @@ func resourceAccountSchemaMake() map[string]*schema.Schema {
},
},
},
- "reason": {
- Type: schema.TypeString,
+ "default_zone_id": {
+ Type: schema.TypeInt,
Optional: true,
- Description: "reason for deactivation",
+ Computed: true,
+ Description: "email",
+ },
+ "zone_ids": {
+ Type: schema.TypeList,
+ Optional: true,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
},
"restore": {
Type: schema.TypeBool,
diff --git a/internal/service/cloudapi/bservice/data_source_bservice.go b/internal/service/cloudapi/bservice/data_source_bservice.go
index 9f5e42f8..079984ad 100644
--- a/internal/service/cloudapi/bservice/data_source_bservice.go
+++ b/internal/service/cloudapi/bservice/data_source_bservice.go
@@ -73,6 +73,10 @@ func dataSourceBasicServiceSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"computes": {
Type: schema.TypeList,
Computed: true,
diff --git a/internal/service/cloudapi/bservice/data_source_bservice_list.go b/internal/service/cloudapi/bservice/data_source_bservice_list.go
index c032d94b..7a98fad0 100644
--- a/internal/service/cloudapi/bservice/data_source_bservice_list.go
+++ b/internal/service/cloudapi/bservice/data_source_bservice_list.go
@@ -68,6 +68,7 @@ func flattenBasicServiceList(bsl *bservice.ListBasicServices) []map[string]inter
"updated_by": bs.UpdatedBy,
"updated_time": bs.UpdatedTime,
"user_managed": bs.UserManaged,
+ "zone_id": bs.ZoneID,
}
res = append(res, temp)
}
@@ -183,6 +184,10 @@ func dataSourceBasicServiceListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"groups": {
Type: schema.TypeList,
Computed: true,
diff --git a/internal/service/cloudapi/bservice/flattens.go b/internal/service/cloudapi/bservice/flattens.go
index f3ef692b..108f48f0 100644
--- a/internal/service/cloudapi/bservice/flattens.go
+++ b/internal/service/cloudapi/bservice/flattens.go
@@ -86,6 +86,7 @@ func flattenService(d *schema.ResourceData, bs *bservice.RecordBasicService) {
d.Set("updated_by", bs.UpdatedBy)
d.Set("updated_time", bs.UpdatedTime)
d.Set("user_managed", bs.UserManaged)
+ d.Set("zone_id", bs.ZoneID)
}
func flattenBasicServiceComputes(bscs bservice.ListComputes) []map[string]interface{} {
diff --git a/internal/service/cloudapi/bservice/resource_bservice.go b/internal/service/cloudapi/bservice/resource_bservice.go
index 7c2cfbac..49347d76 100644
--- a/internal/service/cloudapi/bservice/resource_bservice.go
+++ b/internal/service/cloudapi/bservice/resource_bservice.go
@@ -64,6 +64,9 @@ func resourceBasicServiceCreate(ctx context.Context, d *schema.ResourceData, m i
req.Name = d.Get("service_name").(string)
req.RGID = uint64(d.Get("rg_id").(int))
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ req.ZoneID = uint64(zoneID.(int))
+ }
if sshKey, ok := d.GetOk("ssh_key"); ok {
req.SSHKey = sshKey.(string)
}
@@ -314,6 +317,43 @@ func resourceBasicServiceUpdate(ctx context.Context, d *schema.ResourceData, m i
}
}
+ if d.HasChange("zone_id") {
+ zoneID := uint64(d.Get("zone_id").(int))
+
+ start := d.Get("start").(bool)
+ if start {
+ reqStop := bservice.StopRequest{
+ ServiceID: uint64(d.Get("service_id").(int)),
+ }
+
+ _, err := c.CloudAPI().BService().Stop(ctx, reqStop)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
+ req := bservice.MigrateToZoneRequest{
+ ServiceID: uint64(d.Get("service_id").(int)),
+ ZoneID: zoneID,
+ }
+
+ _, err = c.CloudAPI().BService().MigrateToZone(ctx, req)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ if start {
+ startReq := bservice.StartRequest{
+ ServiceID: uint64(d.Get("service_id").(int)),
+ }
+
+ _, err = c.CloudAPI().BService().Start(ctx, startReq)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ }
+ }
+
if d.HasChange("start") {
if d.Get("start").(bool) {
req := bservice.StartRequest{
@@ -444,6 +484,12 @@ func resourceBasicServiceSchemaMake() map[string]*schema.Schema {
Required: true,
Description: "ID of the Resource Group where this service will be placed",
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ Description: "ID of the zone where this service will be placed",
+ },
"ssh_key": {
Type: schema.TypeString,
Optional: true,
diff --git a/internal/service/cloudapi/disks/data_source_disk.go b/internal/service/cloudapi/disks/data_source_disk.go
index 9b3e8e2d..f569b9a6 100644
--- a/internal/service/cloudapi/disks/data_source_disk.go
+++ b/internal/service/cloudapi/disks/data_source_disk.go
@@ -158,7 +158,7 @@ func dataSourceDiskSchemaMake() map[string]*schema.Schema {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
- Type: schema.TypeString,
+ Type: schema.TypeInt,
},
Description: "IDs of images using the disk",
},
diff --git a/internal/service/cloudapi/disks/data_source_disk_list.go b/internal/service/cloudapi/disks/data_source_disk_list.go
index 8f7f2047..4cf849c2 100644
--- a/internal/service/cloudapi/disks/data_source_disk_list.go
+++ b/internal/service/cloudapi/disks/data_source_disk_list.go
@@ -221,7 +221,7 @@ func dataSourceDiskListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
- Type: schema.TypeString,
+ Type: schema.TypeInt,
},
Description: "IDs of images using the disk",
},
diff --git a/internal/service/cloudapi/disks/data_source_disk_list_unattached.go b/internal/service/cloudapi/disks/data_source_disk_list_unattached.go
index a673186e..ecb9a80c 100644
--- a/internal/service/cloudapi/disks/data_source_disk_list_unattached.go
+++ b/internal/service/cloudapi/disks/data_source_disk_list_unattached.go
@@ -214,7 +214,7 @@ func dataSourceDiskListUnattachedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
- Type: schema.TypeString,
+ Type: schema.TypeInt,
},
Description: "IDs of images using the disk",
},
diff --git a/internal/service/cloudapi/disks/data_source_disk_replication.go b/internal/service/cloudapi/disks/data_source_disk_replication.go
index e120a498..7fcda844 100644
--- a/internal/service/cloudapi/disks/data_source_disk_replication.go
+++ b/internal/service/cloudapi/disks/data_source_disk_replication.go
@@ -175,7 +175,7 @@ func dataSourceDiskReplicationSchemaMake() map[string]*schema.Schema {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
- Type: schema.TypeString,
+ Type: schema.TypeInt,
},
Description: "IDs of images using the disk",
},
diff --git a/internal/service/cloudapi/disks/data_source_list_deleted.go b/internal/service/cloudapi/disks/data_source_list_deleted.go
index 89e3c925..a2a10ffc 100644
--- a/internal/service/cloudapi/disks/data_source_list_deleted.go
+++ b/internal/service/cloudapi/disks/data_source_list_deleted.go
@@ -211,7 +211,7 @@ func dataSourceDiskDeletedListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
- Type: schema.TypeString,
+ Type: schema.TypeInt,
},
Description: "IDs of images using the disk",
},
diff --git a/internal/service/cloudapi/disks/resource_disk.go b/internal/service/cloudapi/disks/resource_disk.go
index 8114f88c..11aae807 100644
--- a/internal/service/cloudapi/disks/resource_disk.go
+++ b/internal/service/cloudapi/disks/resource_disk.go
@@ -580,7 +580,7 @@ func resourceDiskSchemaMake() map[string]*schema.Schema {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
- Type: schema.TypeString,
+ Type: schema.TypeInt,
},
Description: "IDs of images using the disk",
},
diff --git a/internal/service/cloudapi/disks/resource_disk_replication.go b/internal/service/cloudapi/disks/resource_disk_replication.go
index 1c28cf90..ac391d32 100644
--- a/internal/service/cloudapi/disks/resource_disk_replication.go
+++ b/internal/service/cloudapi/disks/resource_disk_replication.go
@@ -336,7 +336,7 @@ func resourceDiskReplicationSchemaMake() map[string]*schema.Schema {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
- Type: schema.TypeString,
+ Type: schema.TypeInt,
},
Description: "IDs of images using the disk",
},
diff --git a/internal/service/cloudapi/extnet/data_source_extnet.go b/internal/service/cloudapi/extnet/data_source_extnet.go
index 4ac0a370..c2a44a16 100644
--- a/internal/service/cloudapi/extnet/data_source_extnet.go
+++ b/internal/service/cloudapi/extnet/data_source_extnet.go
@@ -167,6 +167,10 @@ func dataSourceExtnetSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"ipcidr": {
Type: schema.TypeString,
Computed: true,
@@ -183,9 +187,21 @@ func dataSourceExtnetSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
- "network_id": {
- Type: schema.TypeInt,
+ "network_ids": {
+ Type: schema.TypeList,
Computed: true,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "primary": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "secondary": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ },
+ },
},
"pre_reservations_num": {
Type: schema.TypeInt,
@@ -277,6 +293,62 @@ func dataSourceExtnetSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
+ "redundant": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
+ "sec_vnfdev_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "mtu": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "pre_reservations": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "account_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "client_type": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "domain_name": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "hostname": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "desc": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "ip": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "mac": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "type": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "vm_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ },
+ },
+ },
}
return res
}
diff --git a/internal/service/cloudapi/extnet/flattens.go b/internal/service/cloudapi/extnet/flattens.go
index 2da36fd2..c7e0330c 100644
--- a/internal/service/cloudapi/extnet/flattens.go
+++ b/internal/service/cloudapi/extnet/flattens.go
@@ -23,7 +23,7 @@ func flattenExtnet(d *schema.ResourceData, e *extnet.RecordExtNet) {
d.Set("milestones", e.Milestones)
d.Set("net_name", e.Name)
d.Set("network", e.Network)
- d.Set("network_id", e.NetworkID)
+ d.Set("network_ids", flattenNetworkIDs(e.NetworkIDs))
d.Set("ntp", e.NTP)
d.Set("pre_reservations_num", e.PreReservationsNum)
d.Set("prefix", e.Prefix)
@@ -33,6 +33,11 @@ func flattenExtnet(d *schema.ResourceData, e *extnet.RecordExtNet) {
d.Set("status", e.Status)
d.Set("vlan_id", e.VLANID)
d.Set("vnfs", flattenExtnetVNFS(e.VNFs))
+ d.Set("zone_id", e.ZoneID)
+ d.Set("pre_reservations", flattenExtnetReservations(e.PreReservations))
+ d.Set("sec_vnfdev_id", e.SecVNFDevID)
+ d.Set("redundant", e.Redundant)
+ d.Set("mtu", e.MTU)
}
func flattenExcluded(ex []extnet.Excluded) []map[string]interface{} {
@@ -163,3 +168,14 @@ func flattenExtnetReservedIp(el []extnet.RecordReservedIP) []map[string]interfac
}
return res
}
+
+func flattenNetworkIDs(ex extnet.NetworkIDs) []map[string]interface{} {
+ res := make([]map[string]interface{}, 0, 1)
+ temp := map[string]interface{}{
+ "primary": ex.Primary,
+ "secondary": ex.Secondary,
+ }
+ res = append(res, temp)
+
+ return res
+}
diff --git a/internal/service/cloudapi/flipgroup/resource_flipgroup.go b/internal/service/cloudapi/flipgroup/resource_flipgroup.go
index bc43028c..3892d32e 100644
--- a/internal/service/cloudapi/flipgroup/resource_flipgroup.go
+++ b/internal/service/cloudapi/flipgroup/resource_flipgroup.go
@@ -57,7 +57,6 @@ func resourceFlipgroupCreate(ctx context.Context, d *schema.ResourceData, m inte
Name: d.Get("name").(string),
NetType: d.Get("net_type").(string),
NetID: uint64(d.Get("net_id").(int)),
- ClientType: d.Get("client_type").(string),
IP: d.Get("ip").(string),
Description: d.Get("desc").(string),
}
@@ -72,6 +71,10 @@ func resourceFlipgroupCreate(ctx context.Context, d *schema.ResourceData, m inte
var warnings dc.Warnings
+ if clientType, ok := d.GetOk("client_type"); ok {
+ req.ClientType = clientType.(string)
+ }
+
if client_ids, ok := d.GetOk("client_ids"); ok {
casted := client_ids.([]interface{})
addComputesAfterCreation(ctx, &warnings, c, casted, resp.ID)
@@ -180,7 +183,8 @@ func resourceFlipgroupSchemaMake() map[string]*schema.Schema {
},
"client_type": {
Type: schema.TypeString,
- Required: true,
+ Optional: true,
+ Default: "compute",
Description: "Type of client, 'compute' ('vins' will be later)",
ValidateFunc: validation.StringInSlice([]string{"compute"}, true),
},
diff --git a/internal/service/cloudapi/image/image_rs_subresource.go b/internal/service/cloudapi/image/image_rs_subresource.go
index 3a883701..9afdda33 100644
--- a/internal/service/cloudapi/image/image_rs_subresource.go
+++ b/internal/service/cloudapi/image/image_rs_subresource.go
@@ -35,6 +35,7 @@ package image
import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/statefuncs"
)
func resourceImageSchemaMake(sch map[string]*schema.Schema) map[string]*schema.Schema {
@@ -125,19 +126,13 @@ func resourceImageSchemaMake(sch map[string]*schema.Schema) map[string]*schema.S
Description: "storage endpoint provider ID",
}
- sch["architecture"] = &schema.Schema{
- Type: schema.TypeString,
- Optional: true,
- Computed: true,
- ValidateFunc: validation.StringInSlice([]string{"X86_64"}, true),
- Description: "binary architecture of this image, one of X86_64",
- }
-
sch["drivers"] = &schema.Schema{
- Type: schema.TypeList,
- Required: true,
+ Type: schema.TypeList,
+ Required: true,
+ StateFunc: statefuncs.StateFuncToUpper,
Elem: &schema.Schema{
- Type: schema.TypeString,
+ Type: schema.TypeString,
+ ValidateFunc: validation.StringInSlice([]string{"KVM_X86"}, false),
},
}
@@ -149,5 +144,12 @@ func resourceImageSchemaMake(sch map[string]*schema.Schema) map[string]*schema.S
Description: "select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming",
}
+ sch["sync_mode"] = &schema.Schema{
+ Type: schema.TypeBool,
+ Optional: true,
+ Default: false,
+ Description: "Create image from a media identified by URL (in synchronous mode)",
+ }
+
return sch
}
diff --git a/internal/service/cloudapi/image/resource_image.go b/internal/service/cloudapi/image/resource_image.go
index 6a8bb29b..db57231e 100644
--- a/internal/service/cloudapi/image/resource_image.go
+++ b/internal/service/cloudapi/image/resource_image.go
@@ -34,12 +34,16 @@ package image
import (
"context"
+ "fmt"
"strconv"
+ "strings"
+ "time"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/image"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/tasks"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/status"
@@ -94,17 +98,56 @@ func resourceImageCreate(ctx context.Context, d *schema.ResourceData, m interfac
if poolName, ok := d.GetOk("pool_name"); ok {
req.Pool = poolName.(string)
}
- if architecture, ok := d.GetOk("architecture"); ok {
- req.Architecture = architecture.(string)
- }
if networkInterfaceNaming, ok := d.GetOk("network_interface_naming"); ok {
req.NetworkInterfaceNaming = networkInterfaceNaming.(string)
}
- imageId, err := c.CloudAPI().Image().Create(ctx, req)
- if err != nil {
- d.SetId("")
- return diag.FromErr(err)
+ syncMode := d.Get("sync_mode").(bool)
+ var imageId uint64
+
+ if syncMode {
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ imageId, err = c.CloudAPI().Image().Create(ctx, req)
+ log.Debugf("resourceImageCreate: imageID = %d", imageId)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ } else {
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ taskID, err := c.CloudAPI().Image().AsyncCreate(ctx, req)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ taskReq := tasks.GetRequest{
+ AuditID: strings.Trim(taskID, `"`),
+ }
+
+ for {
+ time.Sleep(time.Second * 15)
+ task, err := c.CloudAPI().Tasks().Get(ctx, taskReq)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ log.Debugf("resourceAccountDelete: delete account - %s", task.Stage)
+
+ if task.Completed {
+ if task.Error != "" {
+ return diag.FromErr(fmt.Errorf("cannot delete account: %v", task.Error))
+ }
+ id, err := task.Result.ID()
+ imageId = uint64(id)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ break
+ }
+ }
}
d.SetId(strconv.FormatUint(imageId, 10))
diff --git a/internal/service/cloudapi/image/resource_image_from_platform_disk.go b/internal/service/cloudapi/image/resource_image_from_platform_disk.go
index d535973e..fd588dad 100644
--- a/internal/service/cloudapi/image/resource_image_from_platform_disk.go
+++ b/internal/service/cloudapi/image/resource_image_from_platform_disk.go
@@ -76,12 +76,11 @@ func resourceImageFromPlatformDiskCreate(ctx context.Context, d *schema.Resource
c := m.(*controller.ControllerCfg)
req := disks.FromPlatformDiskRequest{
- DiskID: diskId,
- Name: name,
- BootType: d.Get("boot_type").(string),
- ImageType: d.Get("type").(string),
- Architecture: d.Get("architecture").(string),
- Bootable: d.Get("bootable").(bool), // default value - true
+ DiskID: diskId,
+ Name: name,
+ BootType: d.Get("boot_type").(string),
+ ImageType: d.Get("type").(string),
+ Bootable: d.Get("bootable").(bool), // default value - true
}
if username, ok := d.GetOk("username"); ok {
@@ -292,13 +291,6 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema {
ValidateFunc: validation.StringInSlice([]string{"linux", "windows", "unknown"}, true),
Description: "Image type linux, windows or unknown",
},
- "architecture": {
- Type: schema.TypeString,
- Required: true,
- ValidateFunc: validation.StringInSlice([]string{"X86_64"}, true),
- Description: "binary architecture of this image, one of X86_64",
- },
-
"username": {
Type: schema.TypeString,
Optional: true,
@@ -357,6 +349,10 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema {
Description: "create an image in async/sync mode",
},
+ "architecture": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"image_id": {
Type: schema.TypeInt,
Computed: true,
diff --git a/internal/service/cloudapi/image/utility_image_list.go b/internal/service/cloudapi/image/utility_image_list.go
index 6f9a6ee7..f0685118 100644
--- a/internal/service/cloudapi/image/utility_image_list.go
+++ b/internal/service/cloudapi/image/utility_image_list.go
@@ -62,10 +62,6 @@ func utilityImageListCheckPresence(ctx context.Context, d *schema.ResourceData,
req.Status = status.(string)
}
- if architecture, ok := d.GetOk("architecture"); ok {
- req.Architecture = architecture.(string)
- }
-
if typeImage, ok := d.GetOk("type_image"); ok {
req.TypeImage = typeImage.(string)
}
diff --git a/internal/service/cloudapi/k8s/data_source_k8s.go b/internal/service/cloudapi/k8s/data_source_k8s.go
index 72be4009..44f75119 100644
--- a/internal/service/cloudapi/k8s/data_source_k8s.go
+++ b/internal/service/cloudapi/k8s/data_source_k8s.go
@@ -337,6 +337,10 @@ func dataSourceK8sSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"account_name": {
Type: schema.TypeString,
Computed: true,
diff --git a/internal/service/cloudapi/k8s/data_source_k8s_list.go b/internal/service/cloudapi/k8s/data_source_k8s_list.go
index bda432bc..7adff403 100644
--- a/internal/service/cloudapi/k8s/data_source_k8s_list.go
+++ b/internal/service/cloudapi/k8s/data_source_k8s_list.go
@@ -217,6 +217,10 @@ func createK8sListSchema() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"ci_id": {
Type: schema.TypeInt,
Computed: true,
diff --git a/internal/service/cloudapi/k8s/flattens.go b/internal/service/cloudapi/k8s/flattens.go
index 9a01ee9c..0b3456d7 100644
--- a/internal/service/cloudapi/k8s/flattens.go
+++ b/internal/service/cloudapi/k8s/flattens.go
@@ -259,6 +259,7 @@ func flattenK8sData(d *schema.ResourceData, cluster k8s.RecordK8S, masters []com
d.Set("address_vip", flattenAddressVIP(cluster.AddressVIP))
d.Set("extnet_only", cluster.ExtnetOnly)
d.Set("with_lb", cluster.WithLB)
+ d.Set("zone_id", cluster.ZoneID)
}
func flattenAddressVIP(addressVIP k8s.K8SAddressVIP) []map[string]interface{} {
@@ -333,6 +334,7 @@ func flattenK8sItems(k8sItems *k8s.ListK8SClusters) []map[string]interface{} {
"updated_by": item.UpdatedBy,
"updated_time": item.UpdatedTime,
"vins_id": item.VINSID,
+ "zone_id": item.ZoneID,
"workers_groups": flattenWorkersGroup(item.WorkersGroup),
}
@@ -369,6 +371,7 @@ func flattenResourceK8sCP(d *schema.ResourceData, k8s k8s.RecordK8S, masters []c
d.Set("updated_by", k8s.UpdatedBy)
d.Set("updated_time", k8s.UpdatedTime)
d.Set("network_plugin", k8s.NetworkPlugin)
+ d.Set("zone_id", k8s.ZoneID)
flattenCPParams(d, k8s.K8SGroups.Masters, masters)
}
@@ -412,6 +415,7 @@ func flattenResourceK8s(d *schema.ResourceData, k8s k8s.RecordK8S, masters []com
d.Set("updated_time", k8s.UpdatedTime)
d.Set("default_wg_id", k8s.K8SGroups.Workers[0].ID)
d.Set("network_plugin", k8s.NetworkPlugin)
+ d.Set("zone_id", k8s.ZoneID)
}
func flattenWg(d *schema.ResourceData, wg k8s.ItemK8SGroup, computes []compute.RecordCompute) {
diff --git a/internal/service/cloudapi/k8s/resource_k8s.go b/internal/service/cloudapi/k8s/resource_k8s.go
index aee87ccd..596887d6 100644
--- a/internal/service/cloudapi/k8s/resource_k8s.go
+++ b/internal/service/cloudapi/k8s/resource_k8s.go
@@ -143,6 +143,10 @@ func resourceK8sCreate(ctx context.Context, d *schema.ResourceData, m interface{
}
}
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ createReq.ZoneID = uint64(zoneID.(int))
+ }
+
createReq.WithLB = d.Get("with_lb").(bool)
///4.4.0
@@ -514,6 +518,45 @@ func resourceK8sUpdate(ctx context.Context, d *schema.ResourceData, m interface{
}
}
+ if d.HasChange("zone_id") {
+ id, _ := strconv.ParseUint(d.Id(), 10, 64)
+ zoneID := uint64(d.Get("zone_id").(int))
+
+ start := d.Get("start").(bool)
+
+ if start {
+ stopReq := k8s.StopRequest{
+ K8SID: id,
+ }
+
+ _, err := c.CloudAPI().K8S().Stop(ctx, stopReq)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
+ req := k8s.MigrateToZoneRequest{
+ K8SID: id,
+ ZoneID: zoneID,
+ }
+
+ _, err := c.CloudAPI().K8S().MigrateToZone(ctx, req)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ if start {
+ startReq := k8s.StartRequest{
+ K8SID: id,
+ }
+
+ _, err = c.CloudAPI().K8S().Start(ctx, startReq)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ }
+ }
+
if d.HasChange("start") {
if d.Get("start").(bool) {
if cluster.TechStatus == "STOPPED" {
@@ -622,6 +665,12 @@ func resourceK8sSchemaMake() map[string]*schema.Schema {
Description: "Network plugin to be used",
ValidateFunc: validation.StringInSlice([]string{"flannel", "weavenet", "calico"}, true),
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ Description: "ID of the zone to put the cluster into.",
+ },
"labels": {
Type: schema.TypeList,
Optional: true,
diff --git a/internal/service/cloudapi/k8s/resource_k8s_cp.go b/internal/service/cloudapi/k8s/resource_k8s_cp.go
index 646b39c1..561c3bb2 100644
--- a/internal/service/cloudapi/k8s/resource_k8s_cp.go
+++ b/internal/service/cloudapi/k8s/resource_k8s_cp.go
@@ -96,6 +96,10 @@ func resourceK8sCPCreate(ctx context.Context, d *schema.ResourceData, m interfac
createReq.WorkerGroupName = "temp"
createReq.NetworkPlugin = d.Get("network_plugin").(string)
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ createReq.ZoneID = uint64(zoneID.(int))
+ }
+
if num, ok := d.GetOk("num"); ok {
createReq.MasterNum = uint(num.(int))
} else {
@@ -532,6 +536,45 @@ func resourceK8sCPUpdate(ctx context.Context, d *schema.ResourceData, m interfac
}
}
+ if d.HasChange("zone_id") {
+ id, _ := strconv.ParseUint(d.Id(), 10, 64)
+ zoneID := uint64(d.Get("zone_id").(int))
+
+ start := d.Get("start").(bool)
+
+ if start {
+ stopReq := k8s.StopRequest{
+ K8SID: id,
+ }
+
+ _, err := c.CloudAPI().K8S().Stop(ctx, stopReq)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
+ req := k8s.MigrateToZoneRequest{
+ K8SID: id,
+ ZoneID: zoneID,
+ }
+
+ _, err := c.CloudAPI().K8S().MigrateToZone(ctx, req)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ if start {
+ startReq := k8s.StartRequest{
+ K8SID: id,
+ }
+
+ _, err := c.CloudAPI().K8S().Start(ctx, startReq)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ }
+ }
+
if d.HasChange("num") {
oldVal, newVal := d.GetChange("num")
@@ -637,6 +680,12 @@ func resourceK8sCPSchemaMake() map[string]*schema.Schema {
Description: "Network plugin to be used",
ValidateFunc: validation.StringInSlice([]string{"flannel", "weavenet", "calico"}, true),
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ Description: "ID of the zone to put the cluster into.",
+ },
"num": {
Type: schema.TypeInt,
Optional: true,
diff --git a/internal/service/cloudapi/kvmvm/data_source_compute.go b/internal/service/cloudapi/kvmvm/data_source_compute.go
index fa20bfd1..af9f19cc 100644
--- a/internal/service/cloudapi/kvmvm/data_source_compute.go
+++ b/internal/service/cloudapi/kvmvm/data_source_compute.go
@@ -334,10 +334,6 @@ func computeListDisksSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
- "order": {
- Type: schema.TypeInt,
- Computed: true,
- },
"params": {
Type: schema.TypeString,
Computed: true,
@@ -453,10 +449,6 @@ func computeListDisksSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
- "vmid": {
- Type: schema.TypeInt,
- Computed: true,
- },
}
}
@@ -565,6 +557,10 @@ func computeInterfacesSchemaMake() map[string]*schema.Schema {
Schema: computeLibvirtSettingsSchemaMake(),
},
},
+ "sdn_interface_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"target": {
Type: schema.TypeString,
Computed: true,
@@ -573,6 +569,10 @@ func computeInterfacesSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "trunk_tags": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"vnfs": {
Type: schema.TypeList,
Computed: true,
@@ -826,6 +826,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "live_migration_job_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"manager_id": {
Type: schema.TypeInt,
Computed: true,
@@ -896,6 +900,37 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
},
},
+ "qemu_guest": {
+ Type: schema.TypeList,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "enabled": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
+ "enabled_agent_features": {
+ Type: schema.TypeList,
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
+ Computed: true,
+ },
+ "guid": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "last_update": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "user": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ },
+ },
+ Computed: true,
+ },
"ram": {
Type: schema.TypeInt,
Computed: true,
@@ -1086,6 +1121,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
}
}
diff --git a/internal/service/cloudapi/kvmvm/data_source_compute_list.go b/internal/service/cloudapi/kvmvm/data_source_compute_list.go
index 1b7ed9a0..918f1444 100644
--- a/internal/service/cloudapi/kvmvm/data_source_compute_list.go
+++ b/internal/service/cloudapi/kvmvm/data_source_compute_list.go
@@ -237,6 +237,10 @@ func itemComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "live_migration_job_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"manager_id": {
Type: schema.TypeInt,
Computed: true,
@@ -280,6 +284,37 @@ func itemComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
},
},
+ "qemu_guest": {
+ Type: schema.TypeList,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "enabled": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
+ "enabled_agent_features": {
+ Type: schema.TypeList,
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
+ Computed: true,
+ },
+ "guid": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "last_update": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "user": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ },
+ },
+ Computed: true,
+ },
"ram": {
Type: schema.TypeInt,
Computed: true,
@@ -397,6 +432,10 @@ func itemComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
}
}
diff --git a/internal/service/cloudapi/kvmvm/flattens.go b/internal/service/cloudapi/kvmvm/flattens.go
index d634f377..06e8f2e1 100644
--- a/internal/service/cloudapi/kvmvm/flattens.go
+++ b/internal/service/cloudapi/kvmvm/flattens.go
@@ -88,8 +88,10 @@ func flattenInterfaces(interfaces compute.ListInterfaces) []map[string]interface
"node_id": interfaceItem.NodeID,
"pci_slot": interfaceItem.PCISlot,
"qos": flattenQOS(interfaceItem.QOS),
+ "sdn_interface_id": interfaceItem.SDNInterfaceID,
"target": interfaceItem.Target,
"type": interfaceItem.Type,
+ "trunk_tags": interfaceItem.TrunkTags,
"vnfs": interfaceItem.VNFs,
"libvirt_settings": flattenLibvirtSettings(interfaceItem.LibvirtSettings),
}
@@ -175,50 +177,52 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
customFields, _ := json.Marshal(compute.CustomFields)
devices, _ := json.Marshal(compute.Devices)
temp := map[string]interface{}{
- "acl": flattenListACL(compute.ACL),
- "account_id": compute.AccountID,
- "account_name": compute.AccountName,
- "affinity_label": compute.AffinityLabel,
- "affinity_rules": flattenListRules(compute.AffinityRules),
- "affinity_weight": compute.AffinityWeight,
- "anti_affinity_rules": flattenListRules(compute.AntiAffinityRules),
- "arch": compute.Architecture,
- "auto_start_w_node": compute.AutoStart,
- "boot_order": compute.BootOrder,
- "bootdisk_size": compute.BootDiskSize,
- "chipset": compute.Chipset,
- "cd_image_id": compute.CdImageId,
- "clone_reference": compute.CloneReference,
- "clones": compute.Clones,
- "computeci_id": compute.ComputeCIID,
- "cpu_pin": compute.CPUPin,
- "cpus": compute.CPU,
- "created_by": compute.CreatedBy,
- "created_time": compute.CreatedTime,
- "custom_fields": string(customFields),
- "deleted_by": compute.DeletedBy,
- "deleted_time": compute.DeletedTime,
- "desc": compute.Description,
- "devices": string(devices),
- "disks": flattenDisks(compute.Disks),
- "driver": compute.Driver,
- "gid": compute.GID,
- "guid": compute.GUID,
- "hp_backed": compute.HPBacked,
- "compute_id": compute.ID,
- "image_id": compute.ImageID,
- "interfaces": flattenInterfaces(compute.Interfaces),
- "lock_status": compute.LockStatus,
- "manager_id": compute.ManagerID,
- "manager_type": compute.ManagerType,
- "migrationjob": compute.MigrationJob,
- "milestones": compute.Milestones,
- "name": compute.Name,
- "need_reboot": compute.NeedReboot,
- "numa_affinity": compute.NumaAffinity,
- "numa_node_id": compute.NumaNodeId,
+ "acl": flattenListACL(compute.ACL),
+ "account_id": compute.AccountID,
+ "account_name": compute.AccountName,
+ "affinity_label": compute.AffinityLabel,
+ "affinity_rules": flattenListRules(compute.AffinityRules),
+ "affinity_weight": compute.AffinityWeight,
+ "anti_affinity_rules": flattenListRules(compute.AntiAffinityRules),
+ "arch": compute.Architecture,
+ "auto_start_w_node": compute.AutoStart,
+ "boot_order": compute.BootOrder,
+ "bootdisk_size": compute.BootDiskSize,
+ "chipset": compute.Chipset,
+ "cd_image_id": compute.CdImageId,
+ "clone_reference": compute.CloneReference,
+ "clones": compute.Clones,
+ "computeci_id": compute.ComputeCIID,
+ "cpu_pin": compute.CPUPin,
+ "cpus": compute.CPU,
+ "created_by": compute.CreatedBy,
+ "created_time": compute.CreatedTime,
+ "custom_fields": string(customFields),
+ "deleted_by": compute.DeletedBy,
+ "deleted_time": compute.DeletedTime,
+ "desc": compute.Description,
+ "devices": string(devices),
+ "disks": flattenDisks(compute.Disks),
+ "driver": compute.Driver,
+ "gid": compute.GID,
+ "guid": compute.GUID,
+ "hp_backed": compute.HPBacked,
+ "compute_id": compute.ID,
+ "image_id": compute.ImageID,
+ "interfaces": flattenInterfaces(compute.Interfaces),
+ "live_migration_job_id": compute.LiveMigrationJobID,
+ "lock_status": compute.LockStatus,
+ "manager_id": compute.ManagerID,
+ "manager_type": compute.ManagerType,
+ "migrationjob": compute.MigrationJob,
+ "milestones": compute.Milestones,
+ "name": compute.Name,
+ "need_reboot": compute.NeedReboot,
+ "numa_affinity": compute.NumaAffinity,
+ "numa_node_id": compute.NumaNodeId,
// "pinned": compute.Pinned,
"preferred_cpu": compute.PreferredCPU,
+ "qemu_guest": flattenQemuQuest(compute.QemuQuest),
"ram": compute.RAM,
"reference_id": compute.ReferenceID,
"registered": compute.Registered,
@@ -320,12 +324,13 @@ func flattenNetwork(networks []interface{}, interfaces compute.ListInterfaces) [
for _, network := range interfaces {
temp := map[string]interface{}{
- "net_id": network.NetID,
- "net_type": network.NetType,
- "ip_address": network.IPAddress,
- "mac": network.MAC,
- "mtu": network.MTU,
- "weight": flattenNetworkWeight(networks, network.NetID, network.NetType),
+ "net_id": network.NetID,
+ "net_type": network.NetType,
+ "ip_address": network.IPAddress,
+ "mac": network.MAC,
+ "mtu": network.MTU,
+ "sdn_interface_id": network.SDNInterfaceID,
+ "weight": flattenNetworkWeight(networks, network.NetID, network.NetType),
}
res = append(res, temp)
}
@@ -447,6 +452,7 @@ func flattenCompute(d *schema.ResourceData, computeRec compute.RecordCompute, pc
d.Set("boot_type", computeRec.BootType)
d.Set("hot_resize", computeRec.HotResize)
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
+ d.Set("zone_id", computeRec.ZoneID)
d.Set("enabled", false)
if computeRec.Status == status.Enabled {
@@ -557,7 +563,6 @@ func flattenListComputeDisks(disks compute.ListComputeDisks) []map[string]interf
"login": disk.Login,
"milestones": disk.Milestones,
"name": disk.Name,
- "order": disk.Order,
"params": disk.Params,
"parent_id": disk.ParentID,
"passwd": disk.Passwd,
@@ -578,7 +583,6 @@ func flattenListComputeDisks(disks compute.ListComputeDisks) []map[string]interf
"status": disk.Status,
"tech_status": disk.TechStatus,
"type": disk.Type,
- "vmid": disk.VMID,
}
res = append(res, temp)
}
@@ -656,6 +660,7 @@ func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute
d.Set("image_id", computeRec.ImageID)
d.Set("image_name", computeRec.ImageName)
d.Set("interfaces", flattenInterfaces(computeRec.Interfaces))
+ d.Set("live_migration_job_id", computeRec.LiveMigrationJobID)
d.Set("lock_status", computeRec.LockStatus)
d.Set("manager_id", computeRec.ManagerID)
d.Set("manager_type", computeRec.ManagerType)
@@ -671,8 +676,9 @@ func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute
d.Set("natable_vins_network", computeRec.NatableVINSNetwork)
d.Set("natable_vins_network_name", computeRec.NatableVINSNetworkName)
d.Set("os_users", flattenOsUsers(computeRec.OSUsers))
- // d.Set("pinned", computeRec.Pinned)
+ d.Set("pinned", computeRec.PinnedToStack)
d.Set("preferred_CPU", computeRec.PreferredCPU)
+ d.Set("qemu_guest", flattenQemuQuest(computeRec.QemuQuest))
d.Set("ram", computeRec.RAM)
d.Set("reference_id", computeRec.ReferenceID)
d.Set("registered", computeRec.Registered)
@@ -699,6 +705,7 @@ func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute
d.Set("boot_type", computeRec.BootType)
d.Set("hot_resize", computeRec.HotResize)
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
+ d.Set("zone_id", computeRec.ZoneID)
}
func flattenPCI(pciList compute.ListPCIDevices) []uint64 {
@@ -867,3 +874,19 @@ func flattenVGPUs(vgpus []compute.VGPUItem) []map[string]interface{} {
return res
}
+
+func flattenQemuQuest(qemuQuest compute.QemuQuest) []map[string]interface{} {
+ res := make([]map[string]interface{}, 0)
+
+ temp := map[string]interface{}{
+ "enabled": qemuQuest.Enabled,
+ "enabled_agent_features": qemuQuest.EnabledAgentFeatures,
+ "guid": qemuQuest.GUID,
+ "last_update": uint64(qemuQuest.LastUpdate),
+ "user": qemuQuest.User,
+ }
+
+ res = append(res, temp)
+
+ return res
+}
diff --git a/internal/service/cloudapi/kvmvm/network_subresource.go b/internal/service/cloudapi/kvmvm/network_subresource.go
index fea40865..065e92b6 100644
--- a/internal/service/cloudapi/kvmvm/network_subresource.go
+++ b/internal/service/cloudapi/kvmvm/network_subresource.go
@@ -128,8 +128,8 @@ func networkSubresourceSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Required: true,
StateFunc: statefuncs.StateFuncToUpper,
- ValidateFunc: validation.StringInSlice([]string{"EXTNET", "VINS", "VFNIC", "DPDK"}, false), // observe case while validating
- Description: "Type of the network for this connection, either EXTNET or VINS.",
+ ValidateFunc: validation.StringInSlice([]string{"EXTNET", "VINS", "VFNIC", "DPDK", "SDN", "TRUNK"}, false), // observe case while validating
+ Description: "Type of the network for this connection",
},
"net_id": {
@@ -169,6 +169,14 @@ func networkSubresourceSchemaMake() map[string]*schema.Schema {
ValidateFunc: validation.IntBetween(1, 9216),
Description: "Maximum transmission unit, used only for DPDK type, must be 1-9216",
},
+
+ "sdn_interface_id": {
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ DiffSuppressFunc: networkSubresIPAddreDiffSupperss,
+ Description: "unique_identifier of LogicalPort on SDN side",
+ },
}
return rets
}
diff --git a/internal/service/cloudapi/kvmvm/resource_check_input_values.go b/internal/service/cloudapi/kvmvm/resource_check_input_values.go
index fcec08e3..bf5e087d 100644
--- a/internal/service/cloudapi/kvmvm/resource_check_input_values.go
+++ b/internal/service/cloudapi/kvmvm/resource_check_input_values.go
@@ -42,6 +42,7 @@ import (
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/extnet"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/image"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/rg"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/trunk"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vfpool"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vins"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
@@ -154,7 +155,7 @@ func existDPDKNetId(ctx context.Context, m interface{}, id int) (int, bool) {
dpdkList, err := c.CloudAPI().DPDKNet().List(ctx, req)
if err != nil {
- log.Debugf("Unable to retrieve vfpool list, %s", err)
+ log.Debugf("Unable to retrieve dpdk list, %s", err)
return id, false
}
@@ -165,6 +166,23 @@ func existDPDKNetId(ctx context.Context, m interface{}, id int) (int, bool) {
return id, false
}
+func existTRUNKId(ctx context.Context, m interface{}, id int) (int, bool) {
+ c := m.(*controller.ControllerCfg)
+ req := trunk.ListRequest{IDs: []uint64{uint64(id)}}
+
+ trunkList, err := c.CloudAPI().Trunk().List(ctx, req)
+ if err != nil {
+ log.Debugf("Unable to retrieve trunk list, %s", err)
+ return id, false
+ }
+
+ if len(trunkList.Data) == 1 {
+ return 0, true
+ }
+
+ return id, false
+}
+
func isMoreThanOneDisksTypeB(ctx context.Context, disks interface{}) bool {
count := 0
diff --git a/internal/service/cloudapi/kvmvm/resource_compute.go b/internal/service/cloudapi/kvmvm/resource_compute.go
index 26999f43..2dbc948a 100644
--- a/internal/service/cloudapi/kvmvm/resource_compute.go
+++ b/internal/service/cloudapi/kvmvm/resource_compute.go
@@ -78,6 +78,10 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
return diag.Errorf("resourceComputeCreate: can't create Compute because imageID %d is not allowed or does not exist", d.Get("image_id").(int))
}
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ createReqX86.ZoneID = uint64(zoneID.(int))
+ }
+
if disks, ok := d.GetOk("disks"); ok {
if isMoreThanOneDisksTypeB(ctx, disks) {
return diag.Errorf("resourceComputeCreate: can't create Compute because block disks have more 1 disk type 'B'")
@@ -106,6 +110,12 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
if dpdkId, ok := existDPDKNetId(ctx, m, networkData["net_id"].(int)); !ok {
return diag.Errorf("resourceComputeCreate: can't create compute because DPDK ID %d is not allowed or does not exist", dpdkId)
}
+ case "TRUNK":
+ if trunkId, ok := existTRUNKId(ctx, m, networkData["net_id"].(int)); !ok {
+ return diag.Errorf("resourceComputeCreate: can't create compute because TRUNK ID %d is not allowed or does not exist", trunkId)
+ }
+ //TODO
+ //SDN check
default:
continue
}
@@ -162,7 +172,7 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
NetID: uint64(netInterfaceVal["net_id"].(int)),
}
- if reqInterface.NetType == "DPDK" {
+ if reqInterface.NetType == "DPDK" || reqInterface.NetType == "EXTNET" {
reqInterface.MTU = uint64(netInterfaceVal["mtu"].(int))
}
@@ -176,6 +186,11 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
reqInterface.MAC = macaddr.(string)
}
+ sdnID, sdnSet := netInterfaceVal["sdn_interface_id"]
+ if sdnSet {
+ reqInterface.SDNInterfaceID = sdnID.(string)
+ }
+
interfaces = append(interfaces, reqInterface)
}
@@ -693,6 +708,12 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
return diag.Errorf("resourceComputeUpdate: can't update Compute because imageID %d not allowed or does not exist", d.Get("image_id").(int))
}
+ if d.HasChange("zone_id") {
+ if err := utilityComputeUpdateZoneID(ctx, d, m); err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
if disks, ok := d.GetOk("disks"); ok {
if isMoreThanOneDisksTypeB(ctx, disks) {
return diag.Errorf("resourceComputeUpdate: can't update Compute because block disks have more 1 disk type 'B'")
@@ -721,6 +742,12 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
if dpdkId, ok := existDPDKNetId(ctx, m, networkData["net_id"].(int)); !ok {
return diag.Errorf("resourceComputeCreate: can't create compute because DPDK ID %d is not allowed or does not exist", dpdkId)
}
+ case "TRUNK":
+ if trunkId, ok := existTRUNKId(ctx, m, networkData["net_id"].(int)); !ok {
+ return diag.Errorf("resourceComputeCreate: can't create compute because TRUNK ID %d is not allowed or does not exist", trunkId)
+ }
+ //TODO
+ //SDNCheck
default:
continue
}
@@ -824,24 +851,6 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
log.Debugf("resourceComputeUpdate: enable=%s Compute ID %v after completing its resource configuration", d.Id(), enabled)
}
- if d.HasChange("started") {
- start := d.Get("started").(bool)
- if start {
- req := compute.StartRequest{ComputeID: computeRec.ID}
-
- if _, err := c.CloudAPI().Compute().Start(ctx, req); err != nil {
- return diag.FromErr(err)
- }
- }
- if !start {
- req := compute.StopRequest{ComputeID: computeRec.ID}
-
- if _, err := c.CloudAPI().Compute().Stop(ctx, req); err != nil {
- return diag.FromErr(err)
- }
- }
- }
-
oldSize, newSize := d.GetChange("boot_disk_size")
if oldSize.(int) < newSize.(int) {
req := compute.DiskResizeRequest{ComputeID: computeRec.ID}
@@ -901,10 +910,10 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
- // Note bene: numa_affinity, cpu_pin and hp_backed, cpu, ram are not allowed to be changed for compute in STARTED tech status.
+ // Note bene: numa_affinity, cpu_pin, cpu, ram and hp_backed are not allowed to be changed for compute in STARTED tech status.
// If STARTED, we need to stop it before update
var isStopRequired bool
- if d.HasChanges("numa_affinity", "cpu_pin", "hp_backed", "chipset", "preferred_cpu") && d.Get("started").(bool) {
+ if d.HasChanges("numa_affinity", "cpu_pin", "hp_backed", "chipset", "preferred_cpu", "cpu", "ram") && d.Get("started").(bool) {
isStopRequired = true
}
if isStopRequired {
@@ -1698,6 +1707,27 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
+ if d.HasChange("started") {
+ if d.Get("started").(bool) {
+ req := compute.StartRequest{
+ ComputeID: computeRec.ID,
+ }
+ if !isStopRequired {
+ if _, err := c.CloudAPI().Compute().Start(ctx, req); err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
+ } else {
+ req := compute.StopRequest{
+ ComputeID: computeRec.ID,
+ }
+ if _, err := c.CloudAPI().Compute().Stop(ctx, req); err != nil {
+ return diag.FromErr(err)
+ }
+ }
+ }
+
// we may reuse dataSourceComputeRead here as we maintain similarity
// between Compute resource and Compute data source schemas
@@ -1977,7 +2007,7 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
Required: true,
// ForceNew: true,
StateFunc: statefuncs.StateFuncToUpper,
- ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86"}, false), // observe case while validating
+ ValidateFunc: validation.StringInSlice([]string{"KVM_X86"}, false), // observe case while validating
Description: "Hardware architecture of this compute instance.",
},
"cpu": {
@@ -2008,6 +2038,11 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
//ForceNew: true, //REDEPLOY
Description: "ID of the OS image to base this compute instance on.",
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ },
"chipset": {
Type: schema.TypeString,
Optional: true,
diff --git a/internal/service/cloudapi/kvmvm/utility_compute.go b/internal/service/cloudapi/kvmvm/utility_compute.go
index acd4c8ab..e3d975a9 100644
--- a/internal/service/cloudapi/kvmvm/utility_compute.go
+++ b/internal/service/cloudapi/kvmvm/utility_compute.go
@@ -164,7 +164,7 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
oldList := oldSet.(*schema.Set).List()
newList := newSet.(*schema.Set).List()
- detachMap, changeIpMap, changeMacMap, attachMap := differenceNetwork(oldList, newList)
+ detachMap, changeIpMap, changeMacMap, changeMTUMap, attachMap := differenceNetwork(oldList, newList)
apiErrCount := 0
var lastSavedError error
@@ -266,6 +266,10 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
req.MACAddr = netData["mac"].(string)
}
+ if netData["sdn_interface_id"].(string) != "" {
+ req.SDNInterfaceID = netData["sdn_interface_id"].(string)
+ }
+
if req.NetType == "DPDK" {
req.MTU = uint64(netData["mtu"].(int))
}
@@ -287,6 +291,24 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
}
}
+ log.Debugf("utilityComputeNetworksConfigure: changeMTU set has %d items for Compute ID %s", len(changeMTUMap), d.Id())
+ for _, netData := range changeMTUMap {
+ computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
+ req := compute.ChangeMTURequest{
+ ComputeID: computeId,
+ Interface: netData["mac"].(string),
+ MTU: uint64(netData["mtu"].(int)),
+ }
+
+ _, err := c.CloudAPI().Compute().ChangeMTU(ctx, req)
+ if err != nil {
+ log.Errorf("utilityComputeNetworksConfigure: failed to change MTU ID %d of type %s from Compute ID %s: %s",
+ netData["net_id"].(int), netData["net_type"].(string), d.Id(), err)
+ apiErrCount++
+ lastSavedError = err
+ }
+ }
+
if apiErrCount > 0 {
log.Errorf("utilityComputeNetworksConfigure: there were %d error(s) when managing networks of Compute ID %s. Last error was: %s",
apiErrCount, d.Id(), lastSavedError)
@@ -385,17 +407,18 @@ func utilityComputeUpdatePciDevices(ctx context.Context, d *schema.ResourceData,
return nil
}
-func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap, changeMacMap, attachMap []map[string]interface{}) {
+func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap, changeMacMap, changeMTUMap, attachMap []map[string]interface{}) {
attachMap = make([]map[string]interface{}, 0)
changeIpMap = make([]map[string]interface{}, 0)
changeMacMap = make([]map[string]interface{}, 0)
+ changeMTUMap = make([]map[string]interface{}, 0)
detachMap = make([]map[string]interface{}, 0)
for _, oldNetwork := range oldList {
oldMap := oldNetwork.(map[string]interface{})
found := false
for _, newNetwork := range newList {
newMap := newNetwork.(map[string]interface{})
- if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] && (newMap["mtu"] == oldMap["mtu"] || newMap["mtu"].(int) == 0) {
+ if compareNetwork(newMap, oldMap) {
found = true
if (newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "VINS") && (newMap["ip_address"] != oldMap["ip_address"] && newMap["ip_address"].(string) != "") {
changeIpMap = append(changeIpMap, newMap)
@@ -404,6 +427,9 @@ func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap,
newMap["old_mac"] = oldMap["mac"]
changeMacMap = append(changeMacMap, newMap)
}
+ if (newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "DPDK") && (newMap["mtu"] != oldMap["mtu"] && newMap["mtu"].(int) != 0) {
+ changeMTUMap = append(changeMTUMap, newMap)
+ }
}
if found {
break
@@ -420,7 +446,7 @@ func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap,
found := false
for _, oldNetwork := range oldList {
oldMap := oldNetwork.(map[string]interface{})
- if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] && (newMap["mtu"] == oldMap["mtu"] || newMap["mtu"].(int) == 0) {
+ if compareNetwork(newMap, oldMap) {
found = true
break
}
@@ -433,3 +459,29 @@ func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap,
return
}
+
+func compareNetwork(newMap, oldMap map[string]interface{}) bool {
+ return newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["sdn_interface_id"] == oldMap["sdn_interface_id"] && newMap["weight"] == oldMap["weight"]
+}
+
+func utilityComputeUpdateZoneID(ctx context.Context, d *schema.ResourceData, m interface{}) error {
+ c := m.(*controller.ControllerCfg)
+
+ computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
+
+ req := compute.MigrateToZoneRequest{
+ ComputeID: computeId,
+ }
+
+ zoneID, ok := d.GetOk("zone_id")
+ if ok {
+ req.ZoneID = uint64(zoneID.(int))
+ }
+
+ _, err := c.CloudAPI().Compute().MigrateToZone(ctx, req)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
diff --git a/internal/service/cloudapi/lb/flattens.go b/internal/service/cloudapi/lb/flattens.go
index f1c813a6..fc064dd5 100644
--- a/internal/service/cloudapi/lb/flattens.go
+++ b/internal/service/cloudapi/lb/flattens.go
@@ -121,10 +121,12 @@ func flattenResourceLB(d *schema.ResourceData, lb *lb.RecordLB) {
d.Set("updated_time", lb.UpdatedTime)
d.Set("user_managed", lb.UserManaged)
d.Set("vins_id", lb.VINSID)
+ d.Set("zone_id", lb.ZoneID)
}
func flattenLB(d *schema.ResourceData, lb *lb.RecordLB) {
+ d.Set("account_id", lb.AccountID)
d.Set("ha_mode", lb.HAMode)
d.Set("backend_haip", lb.BackendHAIP)
d.Set("backends", flattenLBBackends(lb.Backends))
@@ -155,6 +157,7 @@ func flattenLB(d *schema.ResourceData, lb *lb.RecordLB) {
d.Set("updated_time", lb.UpdatedTime)
d.Set("user_managed", lb.UserManaged)
d.Set("vins_id", lb.VINSID)
+ d.Set("zone_id", lb.ZoneID)
}
func flattenNode(node lb.RecordNode) []map[string]interface{} {
@@ -289,6 +292,7 @@ func flattenLBList(lbl *lb.ListLB) []map[string]interface{} {
"user_managed": lb.UserManaged,
"vins_id": lb.VINSID,
"lb_id": lb.ID,
+ "zone_id": lb.ZoneID,
}
res = append(res, temp)
}
diff --git a/internal/service/cloudapi/lb/lb_data_subresource.go b/internal/service/cloudapi/lb/lb_data_subresource.go
index b4a4e9f9..7d87b16b 100644
--- a/internal/service/cloudapi/lb/lb_data_subresource.go
+++ b/internal/service/cloudapi/lb/lb_data_subresource.go
@@ -40,6 +40,10 @@ func dsLBSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Required: true,
}
+ sch["zone_id"] = &schema.Schema{
+ Type: schema.TypeInt,
+ Optional: true,
+ }
return sch
}
@@ -191,5 +195,9 @@ func dsLBItemSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
}
+ sch["zone_id"] = &schema.Schema{
+ Type: schema.TypeInt,
+ Optional: true,
+ }
return sch
}
diff --git a/internal/service/cloudapi/lb/lb_resource_subresource.go b/internal/service/cloudapi/lb/lb_resource_subresource.go
index 16753aad..a64956eb 100644
--- a/internal/service/cloudapi/lb/lb_resource_subresource.go
+++ b/internal/service/cloudapi/lb/lb_resource_subresource.go
@@ -44,7 +44,11 @@ func lbResourceSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Required: true,
}
-
+ sch["zone_id"] = &schema.Schema{
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ }
sch["extnet_id"] = &schema.Schema{
Type: schema.TypeInt,
Optional: true,
@@ -78,7 +82,7 @@ func lbResourceSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool,
Optional: true,
}
-
+
sch["safe"] = &schema.Schema{
Type: schema.TypeBool,
Default: true,
diff --git a/internal/service/cloudapi/lb/lb_schema.go b/internal/service/cloudapi/lb/lb_schema.go
index c725bb87..841c5f72 100644
--- a/internal/service/cloudapi/lb/lb_schema.go
+++ b/internal/service/cloudapi/lb/lb_schema.go
@@ -36,6 +36,10 @@ import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
func createLBSchema() map[string]*schema.Schema {
return map[string]*schema.Schema{
+ "account_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"ha_mode": {
Type: schema.TypeBool,
Computed: true,
diff --git a/internal/service/cloudapi/lb/resource_lb.go b/internal/service/cloudapi/lb/resource_lb.go
index 66c8f23e..307a3b00 100644
--- a/internal/service/cloudapi/lb/resource_lb.go
+++ b/internal/service/cloudapi/lb/resource_lb.go
@@ -91,6 +91,9 @@ func resourceLBCreate(ctx context.Context, d *schema.ResourceData, m interface{}
if haMode, ok := d.GetOk("ha_mode"); ok {
req.HighlyAvailable = haMode.(bool)
}
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ req.ZoneID = uint64(zoneID.(int))
+ }
if sysctlParams, ok := d.GetOk("sysctl_params"); ok {
syscrlSliceMaps := sysctlParams.([]interface{})
res := make([]map[string]interface{}, 0, len(syscrlSliceMaps))
@@ -437,6 +440,44 @@ func resourceLBUpdate(ctx context.Context, d *schema.ResourceData, m interface{}
}
}
+ if d.HasChange("zone_id") {
+ start := d.Get("start").(bool)
+
+ if start {
+ reqStop := lb.StopRequest{
+ LBID: uint64(d.Get("lb_id").(int)),
+ }
+
+ _, err := c.CloudAPI().LB().Stop(ctx, reqStop)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ start = false
+ }
+
+ req := lb.MigrateToZoneRequest{
+ LBID: uint64(d.Get("lb_id").(int)),
+ ZoneID: uint64(d.Get("zone_id").(int)),
+ }
+
+ _, err := c.CloudAPI().LB().MigrateToZone(ctx, req)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ if start {
+ reqStart := lb.StartRequest{
+ LBID: uint64(d.Get("lb_id").(int)),
+ }
+
+ _, err := c.CloudAPI().LB().Start(ctx, reqStart)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ }
+ }
+
if d.HasChange("restart") {
restart := d.Get("restart").(bool)
if restart {
diff --git a/internal/service/cloudapi/locations/data_source_locations_list.go b/internal/service/cloudapi/locations/data_source_locations_list.go
index bc4097d4..acfd2814 100644
--- a/internal/service/cloudapi/locations/data_source_locations_list.go
+++ b/internal/service/cloudapi/locations/data_source_locations_list.go
@@ -56,6 +56,7 @@ func flattenLocationsList(ll *locations.ListLocations) []map[string]interface{}
"id": l.ID,
"location_code": l.LocationCode,
"name": l.Name,
+ "network_modes": l.NetworkModes,
"sdn_support": l.SDNSupport,
}
res = append(res, temp)
@@ -170,6 +171,13 @@ func dataSourceLocationsListSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "Location name",
},
+ "network_modes": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
+ },
"sdn_support": {
Type: schema.TypeBool,
Computed: true,
diff --git a/internal/service/cloudapi/locations/models.go b/internal/service/cloudapi/locations/models.go
index 492ae287..7c4d76ad 100644
--- a/internal/service/cloudapi/locations/models.go
+++ b/internal/service/cloudapi/locations/models.go
@@ -26,6 +26,8 @@ type Location struct {
Guid int `json:"guid"`
LocationCode string `json:"locationCode"`
Name string `json:"name"`
+ NetworkModes []string `json:"network_modes"`
+ SDNSupport bool `json:"sdn_support"`
Flag string `json:"flag"`
Meta []interface{} `json:"_meta"`
CKey string `json:"_ckey"`
diff --git a/internal/service/cloudapi/rg/data_source_rg.go b/internal/service/cloudapi/rg/data_source_rg.go
index 7437eab3..c66f85ec 100644
--- a/internal/service/cloudapi/rg/data_source_rg.go
+++ b/internal/service/cloudapi/rg/data_source_rg.go
@@ -414,6 +414,10 @@ func dataSourceRgSchemaMake() map[string]*schema.Schema {
Type: schema.TypeFloat,
Computed: true,
},
+ "sdn_access_group_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
}
return res
}
diff --git a/internal/service/cloudapi/rg/data_source_rg_list.go b/internal/service/cloudapi/rg/data_source_rg_list.go
index 6e354eea..4dcd5658 100644
--- a/internal/service/cloudapi/rg/data_source_rg_list.go
+++ b/internal/service/cloudapi/rg/data_source_rg_list.go
@@ -261,6 +261,10 @@ func dataSourceRgListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
+ "sdn_access_group_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
},
},
},
diff --git a/internal/service/cloudapi/rg/flattens.go b/internal/service/cloudapi/rg/flattens.go
index 02c777a4..d604715d 100644
--- a/internal/service/cloudapi/rg/flattens.go
+++ b/internal/service/cloudapi/rg/flattens.go
@@ -115,6 +115,7 @@ func flattenResgroup(d *schema.ResourceData, details rg.RecordResourceGroup) err
d.Set("vins", details.VINS)
d.Set("cpu_allocation_parameter", details.CPUAllocationParameter)
d.Set("cpu_allocation_ratio", details.CPUAllocationRatio)
+ d.Set("sdn_access_group_id", details.SDNAccessGroupID)
return nil
}
@@ -202,6 +203,7 @@ func flattenRg(d *schema.ResourceData, itemRg rg.RecordResourceGroup) {
d.Set("vins", itemRg.VINS)
d.Set("cpu_allocation_parameter", itemRg.CPUAllocationParameter)
d.Set("cpu_allocation_ratio", itemRg.CPUAllocationRatio)
+ d.Set("sdn_access_group_id", itemRg.SDNAccessGroupID)
}
func flattenRgAudits(rgAudits rg.ListAudits) []map[string]interface{} {
@@ -254,6 +256,7 @@ func flattenRgList(rgl *rg.ListResourceGroups) []map[string]interface{} {
"uniq_pools": rg.UniqPools,
"cpu_allocation_parameter": rg.CPUAllocationParameter,
"cpu_allocation_ratio": rg.CPUAllocationRatio,
+ "sdn_access_group_id": rg.SDNAccessGroupID,
}
res = append(res, temp)
}
diff --git a/internal/service/cloudapi/rg/resource_rg.go b/internal/service/cloudapi/rg/resource_rg.go
index d379e9a1..86b889a7 100644
--- a/internal/service/cloudapi/rg/resource_rg.go
+++ b/internal/service/cloudapi/rg/resource_rg.go
@@ -160,6 +160,10 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter
req.ExtIP = extIp.(string)
}
+ if sdnAccessGroupID, ok := d.GetOk("sdn_access_group_id"); ok {
+ req.SDNAccessGroupID = sdnAccessGroupID.(string)
+ }
+
apiResp, err := c.CloudAPI().RG().Create(ctx, req)
if err != nil {
return diag.FromErr(err)
@@ -703,6 +707,12 @@ func ResourceRgSchemaMake() map[string]*schema.Schema {
Default: true,
Description: "flag for enable/disable RG",
},
+ "sdn_access_group_id": {
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ Description: "ID of the SDN access group",
+ },
"account_name": {
Type: schema.TypeString,
@@ -731,6 +741,14 @@ func ResourceRgSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
+ "created_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "created_time": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"deleted_by": {
Type: schema.TypeString,
Computed: true,
diff --git a/internal/service/cloudapi/trunk/data_source_trunk.go b/internal/service/cloudapi/trunk/data_source_trunk.go
new file mode 100644
index 00000000..3fc924ad
--- /dev/null
+++ b/internal/service/cloudapi/trunk/data_source_trunk.go
@@ -0,0 +1,45 @@
+package trunk
+
+import (
+ "context"
+
+ "github.com/google/uuid"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
+)
+
+func dataSourceTrunkRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+
+ log.Debugf("dataSourceTrunkRead: called with name %s", d.Get("name").(string))
+
+ w := dc.Warnings{}
+ trunkItem, err := utilityTrunkCheckPresence(ctx, d, m)
+ if err != nil {
+ d.SetId("")
+ return diag.FromErr(err)
+ }
+
+ id := uuid.New()
+ d.SetId(id.String())
+ flattenTrunk(d, trunkItem)
+
+ return w.Get()
+}
+
+func DataSourceTrunk() *schema.Resource {
+ return &schema.Resource{
+ SchemaVersion: 1,
+
+ ReadContext: dataSourceTrunkRead,
+
+ Timeouts: &schema.ResourceTimeout{
+ Read: &constants.Timeout30s,
+ Default: &constants.Timeout60s,
+ },
+
+ Schema: dataSourceTrunkSchemaMake(),
+ }
+}
diff --git a/internal/service/cloudapi/trunk/data_source_trunk_list.go b/internal/service/cloudapi/trunk/data_source_trunk_list.go
new file mode 100644
index 00000000..76ea5eeb
--- /dev/null
+++ b/internal/service/cloudapi/trunk/data_source_trunk_list.go
@@ -0,0 +1,43 @@
+package trunk
+
+import (
+ "context"
+
+ "github.com/google/uuid"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
+)
+
+func dataSourceTrunkListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ w := dc.Warnings{}
+ trunkList, err := utilityTrunkListCheckPresence(ctx, d, m)
+ if err != nil {
+ d.SetId("")
+ return diag.FromErr(err)
+ }
+
+ id := uuid.New()
+ d.SetId(id.String())
+
+ d.Set("items", flattenTrunkList(trunkList))
+ d.Set("entry_count", trunkList.EntryCount)
+
+ return w.Get()
+}
+
+func DataSourceTrunkList() *schema.Resource {
+ return &schema.Resource{
+ SchemaVersion: 1,
+
+ ReadContext: dataSourceTrunkListRead,
+
+ Timeouts: &schema.ResourceTimeout{
+ Read: &constants.Timeout30s,
+ Default: &constants.Timeout60s,
+ },
+
+ Schema: dataSourceTrunkListSchemaMake(),
+ }
+}
diff --git a/internal/service/cloudapi/trunk/flattens.go b/internal/service/cloudapi/trunk/flattens.go
new file mode 100644
index 00000000..f4fb0cef
--- /dev/null
+++ b/internal/service/cloudapi/trunk/flattens.go
@@ -0,0 +1,56 @@
+package trunk
+
+import (
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/trunk"
+)
+
+func flattenTrunk(d *schema.ResourceData, trunkItem *trunk.ItemTrunk) {
+ log.Debugf("flattenTrunk: decoded Trunk ID %d",
+ trunkItem.ID)
+
+ d.Set("trunk_id", trunkItem.ID)
+ d.Set("guid", trunkItem.GUID)
+ d.Set("name", trunkItem.Name)
+ d.Set("mac", trunkItem.MAC)
+ d.Set("description", trunkItem.Description)
+ d.Set("account_ids", trunkItem.AccountIDs)
+ d.Set("ovs_bridge", trunkItem.OVSBridge)
+ d.Set("native_vlan_id", trunkItem.NativeVLANID)
+ d.Set("status", trunkItem.Status)
+ d.Set("trunk_tags", trunkItem.TrunkTags)
+ d.Set("created_at", trunkItem.CreatedAt)
+ d.Set("created_by", trunkItem.CreatedBy)
+ d.Set("updated_at", trunkItem.UpdatedAt)
+ d.Set("updated_by", trunkItem.UpdatedBy)
+ d.Set("deleted_at", trunkItem.DeletedAt)
+ d.Set("deleted_by", trunkItem.DeletedBy)
+}
+
+func flattenTrunkList(trunkList *trunk.ListTrunks) []map[string]interface{} {
+ res := make([]map[string]interface{}, 0, len(trunkList.Data))
+ for _, trunkItem := range trunkList.Data {
+ temp := map[string]interface{}{
+ "account_ids": trunkItem.AccountIDs,
+ "created_at": trunkItem.CreatedAt,
+ "created_by": trunkItem.CreatedBy,
+ "deleted_at": trunkItem.DeletedAt,
+ "deleted_by": trunkItem.DeletedBy,
+ "description": trunkItem.Description,
+ "guid": trunkItem.GUID,
+ "id": trunkItem.ID,
+ "mac": trunkItem.MAC,
+ "name": trunkItem.Name,
+ "native_vlan_id": trunkItem.NativeVLANID,
+ "ovs_bridge": trunkItem.OVSBridge,
+ "status": trunkItem.Status,
+ "trunk_tags": trunkItem.TrunkTags,
+ "updated_at": trunkItem.UpdatedAt,
+ "updated_by": trunkItem.UpdatedBy,
+ }
+ res = append(res, temp)
+ }
+
+ return res
+}
diff --git a/internal/service/cloudapi/trunk/schema.go b/internal/service/cloudapi/trunk/schema.go
new file mode 100644
index 00000000..dc25ce6d
--- /dev/null
+++ b/internal/service/cloudapi/trunk/schema.go
@@ -0,0 +1,241 @@
+package trunk
+
+import (
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+)
+
+func dataSourceTrunkSchemaMake() map[string]*schema.Schema {
+ log.Debugf("dataSourceTrunkSchemaMake: invoked")
+
+ res := map[string]*schema.Schema{
+ "trunk_id": {
+ Type: schema.TypeInt,
+ Required: true,
+ Description: "trunk id",
+ },
+ "guid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "GUID",
+ },
+ "name": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Name of the trunk",
+ },
+ "mac": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "MAC address",
+ },
+ "description": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Description of the trunk",
+ },
+ "account_ids": {
+ Type: schema.TypeSet,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ Description: "List of account IDs with access to this trunk",
+ },
+ "ovs_bridge": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "OVS bridge name",
+ },
+ "native_vlan_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "Native VLAN ID",
+ },
+ "status": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "if the trunk is enabled",
+ },
+ "trunk_tags": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "List of trunk tags (values between 1-4095)",
+ },
+ "created_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was created",
+ },
+ "created_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who created the trunk",
+ },
+ "updated_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was updated",
+ },
+ "updated_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who updated the trunk",
+ },
+ "deleted_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was updated",
+ },
+ "deleted_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who updated the trunk",
+ },
+ }
+
+ return res
+}
+
+func dataSourceTrunkListSchemaMake() map[string]*schema.Schema {
+ res := map[string]*schema.Schema{
+ "trunk_ids": {
+ Type: schema.TypeList,
+ Optional: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ Description: "ID of the trunk(s) to filter by",
+ },
+ "account_ids": {
+ Type: schema.TypeList,
+ Optional: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ Description: "Account access ID(s) to filter by",
+ },
+ "trunk_tags": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Trunk tags to filter by (value between 1-4095)",
+ },
+ "page": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Page number.",
+ },
+ "size": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Page size.",
+ },
+ "status": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "find by status",
+ },
+ "sort_by": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Sort by one of supported fields, format ±",
+ },
+ "items": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "account_ids": {
+ Type: schema.TypeSet,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ Description: "List of account IDs with access to this trunk",
+ },
+ "created_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was created",
+ },
+ "created_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who created the trunk",
+ },
+ "deleted_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was updated",
+ },
+ "deleted_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who updated the trunk",
+ },
+ "description": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Description of the trunk",
+ },
+ "guid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "GUID",
+ },
+ "id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "Trunk ID",
+ },
+ "mac": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "MAC address",
+ },
+ "name": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Name of the trunk",
+ },
+ "native_vlan_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "Native VLAN ID",
+ },
+ "ovs_bridge": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "OVS bridge name",
+ },
+ "status": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "if the trunk is enabled",
+ },
+ "trunk_tags": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "List of trunk tags (values between 1-4095)",
+ },
+ "updated_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was updated",
+ },
+ "updated_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who updated the trunk",
+ },
+ },
+ },
+ },
+ "entry_count": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ }
+
+ return res
+}
diff --git a/internal/service/cloudapi/trunk/utility_trunk.go b/internal/service/cloudapi/trunk/utility_trunk.go
new file mode 100644
index 00000000..6e1c227c
--- /dev/null
+++ b/internal/service/cloudapi/trunk/utility_trunk.go
@@ -0,0 +1,45 @@
+package trunk
+
+import (
+ "context"
+ "strconv"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/trunk"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
+)
+
+func utilityTrunkCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*trunk.ItemTrunk, error) {
+ c := m.(*controller.ControllerCfg)
+ req := trunk.GetRequest{}
+
+ if d.Get("trunk_id") != nil {
+ if d.Get("trunk_id").(int) == 0 {
+ id, err := strconv.ParseUint(d.Id(), 10, 64)
+ if err != nil {
+ return nil, err
+ }
+
+ req.TrunkID = id
+ } else {
+ req.TrunkID = uint64(d.Get("trunk_id").(int))
+ }
+ } else {
+ id, err := strconv.ParseUint(d.Id(), 10, 64)
+ if err != nil {
+ return nil, err
+ }
+
+ req.TrunkID = id
+ }
+
+ log.Debugf("utilityTrunkCheckPresence: get trunk network")
+
+ trunkItem, err := c.CloudAPI().Trunk().Get(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+
+ return trunkItem, nil
+}
diff --git a/internal/service/cloudapi/trunk/utility_trunk_list.go b/internal/service/cloudapi/trunk/utility_trunk_list.go
new file mode 100644
index 00000000..5b33b0f5
--- /dev/null
+++ b/internal/service/cloudapi/trunk/utility_trunk_list.go
@@ -0,0 +1,48 @@
+package trunk
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/trunk"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
+)
+
+func utilityTrunkListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*trunk.ListTrunks, error) {
+ c := m.(*controller.ControllerCfg)
+ req := trunk.ListRequest{}
+
+ if trunkIDs, ok := d.GetOk("trunk_ids"); ok {
+ IDs := trunkIDs.([]interface{})
+ for _, id := range IDs {
+ req.IDs = append(req.IDs, uint64(id.(int)))
+ }
+ }
+ if accountIDs, ok := d.GetOk("account_ids"); ok {
+ IDs := accountIDs.([]interface{})
+ for _, id := range IDs {
+ req.AccountIDs = append(req.AccountIDs, uint64(id.(int)))
+ }
+ }
+ if trunkTags, ok := d.GetOk("trunk_tags"); ok {
+ req.TrunkTags = trunkTags.(string)
+ }
+ if sortBy, ok := d.GetOk("sort_by"); ok {
+ req.SortBy = sortBy.(string)
+ }
+ if page, ok := d.GetOk("page"); ok {
+ req.Page = uint64(page.(int))
+ }
+ if size, ok := d.GetOk("size"); ok {
+ req.Size = uint64(size.(int))
+ }
+
+ log.Debugf("utilityTrunkListCheckPresence: load trunk network list")
+ trunkList, err := c.CloudAPI().Trunk().List(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+
+ return trunkList, nil
+}
diff --git a/internal/service/cloudapi/vins/data_source_vins.go b/internal/service/cloudapi/vins/data_source_vins.go
index 3f946d67..5fb9b9b2 100644
--- a/internal/service/cloudapi/vins/data_source_vins.go
+++ b/internal/service/cloudapi/vins/data_source_vins.go
@@ -230,6 +230,10 @@ func vnfInterfaceSchemaMake() map[string]*schema.Schema {
Schema: qosSchemaMake(),
},
},
+ "sdn_interface_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"target": {
Type: schema.TypeString,
Computed: true,
@@ -674,13 +678,6 @@ func gwSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool,
Computed: true,
},
- "routes": {
- Type: schema.TypeList,
- Computed: true,
- Elem: &schema.Resource{
- Schema: routesSchemaMake(),
- },
- },
"status": {
Type: schema.TypeString,
Computed: true,
@@ -813,13 +810,6 @@ func natSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool,
Computed: true,
},
- "routes": {
- Type: schema.TypeList,
- Computed: true,
- Elem: &schema.Resource{
- Schema: routesSchemaMake(),
- },
- },
"status": {
Type: schema.TypeString,
Computed: true,
@@ -1008,6 +998,10 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
}
return rets
}
diff --git a/internal/service/cloudapi/vins/flattens.go b/internal/service/cloudapi/vins/flattens.go
index 633e3b95..cef37d93 100644
--- a/internal/service/cloudapi/vins/flattens.go
+++ b/internal/service/cloudapi/vins/flattens.go
@@ -105,6 +105,7 @@ func flattenInterfaces(interfaces []vins.ItemVNFInterface) []map[string]interfac
"pci_slot": vnfInterface.PCISlot,
"bus_number": vnfInterface.BusNumber,
"qos": flattenQOS(vnfInterface.QOS),
+ "sdn_interface_id": vnfInterface.SDNInterfaceID,
"target": vnfInterface.Target,
"type": vnfInterface.Type,
"vnfs": vnfInterface.VNFs,
@@ -284,7 +285,6 @@ func flattenGW(gw vins.RecordGW) []map[string]interface{} {
"owner_id": gw.OwnerID,
"owner_type": gw.OwnerType,
"pure_virtual": gw.PureVirtual,
- "routes": flattenStaticRoute(gw.Routes),
"status": gw.Status,
"tech_status": gw.TechStatus,
"type": gw.Type,
@@ -341,7 +341,6 @@ func flattenNAT(nat vins.RecordNAT) []map[string]interface{} {
"owner_id": nat.OwnerID,
"owner_type": nat.OwnerType,
"pure_virtual": nat.PureVirtual,
- "routes": flattenStaticRoute(nat.Routes),
"status": nat.Status,
"tech_status": nat.TechStatus,
"type": nat.Type,
@@ -413,6 +412,7 @@ func flattenVins(d *schema.ResourceData, vins *vins.RecordVINS) {
d.Set("vnfs", flattenVNFS(vins.VNFs))
d.Set("vxlan_id", vins.VXLANID)
d.Set("nat_rule", flattenRuleBlock(vins.VNFs.NAT.Config.Rules))
+ d.Set("zone_id", vins.ZoneID)
}
func flattenVinsData(d *schema.ResourceData, vins *vins.RecordVINS) {
@@ -448,6 +448,7 @@ func flattenVinsData(d *schema.ResourceData, vins *vins.RecordVINS) {
d.Set("user_managed", vins.UserManaged)
d.Set("vnfs", flattenVNFS(vins.VNFs))
d.Set("vxlan_id", vins.VXLANID)
+ d.Set("zone_id", vins.ZoneID)
}
func flattenVinsAudits(audits vins.ListAudits) []map[string]interface{} {
diff --git a/internal/service/cloudapi/vins/resource_vins.go b/internal/service/cloudapi/vins/resource_vins.go
index fba76886..0efcf1c7 100644
--- a/internal/service/cloudapi/vins/resource_vins.go
+++ b/internal/service/cloudapi/vins/resource_vins.go
@@ -140,6 +140,10 @@ func resourceVinsCreate(ctx context.Context, d *schema.ResourceData, m interface
}
}
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ req.ZoneID = uint64(zoneID.(int))
+ }
+
id, err := c.CloudAPI().VINS().CreateInRG(ctx, req)
if err != nil {
d.SetId("")
@@ -173,6 +177,10 @@ func resourceVinsCreate(ctx context.Context, d *schema.ResourceData, m interface
}
}
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ req.ZoneID = uint64(zoneID.(int))
+ }
+
id, err := c.CloudAPI().VINS().CreateInAccount(ctx, req)
if err != nil {
d.SetId("")
@@ -676,6 +684,21 @@ func resourceVinsUpdate(ctx context.Context, d *schema.ResourceData, m interface
}
}
}
+
+ if d.HasChange("zone_id") {
+ zoneID := uint64(d.Get("zone_id").(int))
+
+ req := vins.MigrateToZoneRequest{
+ VINSID: vinsData.ID,
+ ZoneID: zoneID,
+ }
+
+ _, err := c.CloudAPI().VINS().MigrateToZone(ctx, req)
+ if err != nil {
+ warnings.Add(err)
+ }
+ }
+
return append(warnings.Get(), resourceVinsRead(ctx, d, m)...)
}
@@ -879,6 +902,12 @@ func resourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "Unique ID of the ViNS. If ViNS ID is specified, then ViNS name, rg_id and account_id are ignored.",
}
+ rets["zone_id"] = &schema.Schema{
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ Description: "ID of the Zone to put ViNS into",
+ }
return rets
}
diff --git a/internal/service/cloudapi/zone/data_source_zone.go b/internal/service/cloudapi/zone/data_source_zone.go
new file mode 100644
index 00000000..80126f4b
--- /dev/null
+++ b/internal/service/cloudapi/zone/data_source_zone.go
@@ -0,0 +1,116 @@
+/*
+Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
+Authors:
+Petr Krutov,
+Stanislav Solovev,
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
+Orchestration Technology) with Terraform by Hashicorp.
+
+Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
+
+Please see README.md to learn where to place source code so that it
+builds seamlessly.
+
+Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
+*/
+
+package zone
+
+import (
+ "context"
+ "strconv"
+
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+)
+
+func dataSourceZoneRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ zone, err := utilityZoneCheckPresence(ctx, d, m)
+ if err != nil {
+ d.SetId("") // ensure ID is empty in this case
+ return diag.FromErr(err)
+ }
+ d.SetId(strconv.Itoa(d.Get("zone_id").(int)))
+ flattenZone(d, zone)
+ return nil
+}
+
+func dataSourceZoneSchemaMake() map[string]*schema.Schema {
+ return map[string]*schema.Schema{
+ "zone_id": {
+ Type: schema.TypeInt,
+ Required: true,
+ },
+ "guid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "gid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "name": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "description": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "deletable": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
+ "status": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "created_time": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "updated_time": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "node_ids": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ },
+ }
+}
+
+func DataSourceZone() *schema.Resource {
+ return &schema.Resource{
+ SchemaVersion: 1,
+
+ ReadContext: dataSourceZoneRead,
+
+ Timeouts: &schema.ResourceTimeout{
+ Read: &constants.Timeout30s,
+ Default: &constants.Timeout60s,
+ },
+
+ Schema: dataSourceZoneSchemaMake(),
+ }
+}
diff --git a/internal/service/cloudapi/zone/data_source_zone_list.go b/internal/service/cloudapi/zone/data_source_zone_list.go
new file mode 100644
index 00000000..0ef22887
--- /dev/null
+++ b/internal/service/cloudapi/zone/data_source_zone_list.go
@@ -0,0 +1,182 @@
+/*
+Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
+Authors:
+Petr Krutov,
+Stanislav Solovev,
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
+Orchestration Technology) with Terraform by Hashicorp.
+
+Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
+
+Please see README.md to learn where to place source code so that it
+builds seamlessly.
+
+Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
+*/
+
+package zone
+
+import (
+ "context"
+
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
+
+ "github.com/google/uuid"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+)
+
+func dataSourceZoneListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ zoneList, err := utilityZoneListCheckPresence(ctx, d, m)
+ if err != nil {
+ d.SetId("") // ensure ID is empty in this case
+ return diag.FromErr(err)
+ }
+ id := uuid.New()
+ d.SetId(id.String())
+ d.Set("items", flattenZoneList(zoneList))
+ d.Set("entry_count", zoneList.EntryCount)
+ return nil
+}
+
+func dataSourceZoneListSchemaMake() map[string]*schema.Schema {
+ res := map[string]*schema.Schema{
+ "by_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Find by ID",
+ },
+ "gid": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Find by Grid ID",
+ },
+ "name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Find by name",
+ },
+ "description": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Find by description",
+ },
+ "status": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Find by status",
+ },
+ "deletable": {
+ Type: schema.TypeBool,
+ Optional: true,
+ Description: "Find by deletable",
+ },
+ "node_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Find by nodeId",
+ },
+ "sort_by": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "sort by one of supported fields, format +|-(field)",
+ },
+ "page": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Page number",
+ },
+ "size": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Page size",
+ },
+ "items": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "zone_id": {
+ Type: schema.TypeInt,
+ Required: true,
+ },
+ "guid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "gid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "name": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "description": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "deletable": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
+ "status": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "created_time": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "updated_time": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "node_ids": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ },
+ },
+ },
+ },
+ "entry_count": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ }
+
+ return res
+}
+
+func DataSourceZoneList() *schema.Resource {
+ return &schema.Resource{
+ SchemaVersion: 1,
+
+ ReadContext: dataSourceZoneListRead,
+
+ Timeouts: &schema.ResourceTimeout{
+ Read: &constants.Timeout30s,
+ Default: &constants.Timeout60s,
+ },
+
+ Schema: dataSourceZoneListSchemaMake(),
+ }
+}
diff --git a/internal/service/cloudapi/zone/flattens.go b/internal/service/cloudapi/zone/flattens.go
new file mode 100644
index 00000000..2eae26b7
--- /dev/null
+++ b/internal/service/cloudapi/zone/flattens.go
@@ -0,0 +1,82 @@
+/*
+Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
+Authors:
+Petr Krutov,
+Stanislav Solovev,
+Kasim Baybikov,
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
+Orchestration Technology) with Terraform by Hashicorp.
+
+Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
+
+Please see README.md to learn where to place source code so that it
+builds seamlessly.
+
+Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
+*/
+
+package zone
+
+import (
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone"
+)
+
+func flattenZone(d *schema.ResourceData, item *zone.RecordZone) error {
+ log.Debugf("flattenZone: start decoding RecordZone name %q / ID %d",
+ item.Name, item.ID)
+
+ d.Set("zone_id", int(item.ID))
+ d.Set("guid", int(item.GUID))
+ d.Set("gid", int(item.GID))
+ d.Set("name", item.Name)
+ d.Set("description", item.Description)
+ d.Set("deletable", item.Deletable)
+ d.Set("status", item.Status)
+ d.Set("created_time", item.CreatedTime)
+ d.Set("updated_time", item.UpdatedTime)
+ d.Set("node_ids", item.NodeIDs)
+
+ log.Debugf("flattenZone: decoded RecordZone name %q / ID %d, complete",
+ item.Name, item.ID)
+ return nil
+}
+
+func flattenZoneList(zone *zone.ListZones) []map[string]interface{} {
+ log.Debugf("flattenZoneList start")
+ res := make([]map[string]interface{}, 0, len(zone.Data))
+ for _, zone := range zone.Data {
+ temp := map[string]interface{}{
+ "zone_id": int(zone.ID),
+ "guid": int(zone.GUID),
+ "gid": int(zone.GID),
+ "name": zone.Name,
+ "description": zone.Description,
+ "deletable": zone.Deletable,
+ "status": zone.Status,
+ "created_time": zone.CreatedTime,
+ "updated_time": zone.UpdatedTime,
+ "node_ids": zone.NodeIDs,
+ }
+ res = append(res, temp)
+ }
+ log.Debugf("flattenZoneList end")
+ return res
+
+}
diff --git a/internal/service/cloudapi/zone/utility_zone.go b/internal/service/cloudapi/zone/utility_zone.go
new file mode 100644
index 00000000..c1ac64bd
--- /dev/null
+++ b/internal/service/cloudapi/zone/utility_zone.go
@@ -0,0 +1,62 @@
+/*
+Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
+Authors:
+Petr Krutov,
+Stanislav Solovev,
+Kasim Baybikov,
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
+Orchestration Technology) with Terraform by Hashicorp.
+
+Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
+
+Please see README.md to learn where to place source code so that it
+builds seamlessly.
+
+Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
+*/
+
+package zone
+
+import (
+ "context"
+ "strconv"
+
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+)
+
+func utilityZoneCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.RecordZone, error) {
+ c := m.(*controller.ControllerCfg)
+ req := zone.GetRequest{}
+
+ if d.Id() != "" {
+ zoneId, _ := strconv.ParseUint(d.Id(), 10, 64)
+ req.ID = zoneId
+ } else {
+ req.ID = uint64(d.Get("zone_id").(int))
+ }
+
+ zoneData, err := c.CloudAPI().Zone().Get(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+
+ return zoneData, nil
+}
diff --git a/internal/service/cloudapi/zone/utility_zone_list.go b/internal/service/cloudapi/zone/utility_zone_list.go
new file mode 100644
index 00000000..65eb3e5f
--- /dev/null
+++ b/internal/service/cloudapi/zone/utility_zone_list.go
@@ -0,0 +1,85 @@
+/*
+Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
+Authors:
+Petr Krutov,
+Stanislav Solovev,
+Kasim Baybikov,
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
+Orchestration Technology) with Terraform by Hashicorp.
+
+Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
+
+Please see README.md to learn where to place source code so that it
+builds seamlessly.
+
+Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
+*/
+
+package zone
+
+import (
+ "context"
+
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/zone"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+)
+
+func utilityZoneListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.ListZones, error) {
+ c := m.(*controller.ControllerCfg)
+ req := zone.ListRequest{}
+
+ if byId, ok := d.GetOk("by_id"); ok {
+ req.ByID = uint64(byId.(int))
+ }
+ if gid, ok := d.GetOk("gid"); ok {
+ req.GID = uint64(gid.(int))
+ }
+ if name, ok := d.GetOk("name"); ok {
+ req.Name = name.(string)
+ }
+ if description, ok := d.GetOk("description"); ok {
+ req.Description = description.(string)
+ }
+ if status, ok := d.GetOk("status"); ok {
+ req.Status = status.(string)
+ }
+ if deletable, ok := d.GetOk("deletable"); ok {
+ req.Deletable = deletable.(bool)
+ }
+ if nodeID, ok := d.GetOk("nodeId"); ok {
+ req.NodeID = uint64(nodeID.(int))
+ }
+ if sortBy, ok := d.GetOk("sort_by"); ok {
+ req.SortBy = sortBy.(string)
+ }
+ if size, ok := d.GetOk("size"); ok {
+ req.Size = uint64(size.(int))
+ }
+ if page, ok := d.GetOk("page"); ok {
+ req.Page = uint64(page.(int))
+ }
+
+ zoneList, err := c.CloudAPI().Zone().List(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+
+ return zoneList, nil
+}
diff --git a/internal/service/cloudbroker/account/flattens.go b/internal/service/cloudbroker/account/flattens.go
index 98e7350e..ccdfc3f4 100644
--- a/internal/service/cloudbroker/account/flattens.go
+++ b/internal/service/cloudbroker/account/flattens.go
@@ -34,6 +34,7 @@ func flattenResourceAccount(d *schema.ResourceData, acc *account.RecordAccount)
d.Set("updated_time", acc.UpdatedTime)
d.Set("version", acc.Version)
d.Set("vins", acc.VINS)
+ d.Set("zone_ids", acc.ZoneIDs)
}
func flattenDataAccount(d *schema.ResourceData, acc *account.RecordAccount) {
@@ -54,12 +55,14 @@ func flattenDataAccount(d *schema.ResourceData, acc *account.RecordAccount) {
d.Set("displayname", acc.DisplayName)
d.Set("guid", acc.GUID)
d.Set("account_id", acc.ID)
+ d.Set("default_zone_id", acc.DefaultZoneID)
d.Set("account_name", acc.Name)
d.Set("resource_limits", flattenRgResourceLimits(acc.ResourceLimits))
d.Set("resource_types", acc.ResTypes)
d.Set("send_access_emails", acc.SendAccessEmails)
d.Set("status", acc.Status)
d.Set("uniq_pools", acc.UniqPools)
+ d.Set("zone_ids", flattenZones(acc.ZoneIDs))
d.Set("updated_time", acc.UpdatedTime)
d.Set("version", acc.Version)
d.Set("vins", acc.VINS)
@@ -144,10 +147,16 @@ func flattenAccResource(r account.Resource) []map[string]interface{} {
return res
}
-func flattenAccAcl(acls []account.ACL) []map[string]interface{} {
+func flattenAccAcl(acls []account.ACLWithEmails) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(acls))
for _, acls := range acls {
+ tempEmails := make([]string, 0, len(acls.Emails))
+ for _, email := range acls.Emails {
+ tempEmails = append(tempEmails, email)
+ }
+
temp := map[string]interface{}{
+ "emails": tempEmails,
"explicit": acls.Explicit,
"guid": acls.GUID,
"right": acls.Right,
@@ -220,6 +229,8 @@ func flattenListDeleted(al *account.ListAccounts) []map[string]interface{} {
"send_access_emails": acc.SendAccessEmails,
"status": acc.Status,
"uniq_pools": acc.UniqPools,
+ "default_zone_id": acc.DefaultZoneID,
+ "zone_ids": acc.ZoneIDs,
"updated_time": acc.UpdatedTime,
"version": acc.Version,
"vins": acc.VINS,
@@ -257,6 +268,8 @@ func flattenAccountList(al *account.ListAccounts) []map[string]interface{} {
"send_access_emails": acc.SendAccessEmails,
"status": acc.Status,
"uniq_pools": acc.UniqPools,
+ "default_zone_id": acc.DefaultZoneID,
+ "zone_ids": acc.ZoneIDs,
"updated_time": acc.UpdatedTime,
"version": acc.Version,
"vins": acc.VINS,
@@ -427,3 +440,15 @@ func flattenAccResourceConsumption(lrc *account.ListResources) []map[string]inte
func flattenEnabled(status string) bool {
return status == "CONFIRMED"
}
+
+func flattenZones(zones []account.ZoneID) []map[string]interface{} {
+ res := make([]map[string]interface{}, 0)
+ for _, zone := range zones {
+ temp := map[string]interface{}{
+ "id": zone.ID,
+ "name": zone.Name,
+ }
+ res = append(res, temp)
+ }
+ return res
+}
diff --git a/internal/service/cloudbroker/account/resource_account.go b/internal/service/cloudbroker/account/resource_account.go
index 1c662fa6..a3dfe1d1 100644
--- a/internal/service/cloudbroker/account/resource_account.go
+++ b/internal/service/cloudbroker/account/resource_account.go
@@ -33,12 +33,18 @@ package account
import (
"context"
+ "fmt"
+ "strings"
+ "time"
+
+ //"log"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/account"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/tasks"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
@@ -59,6 +65,10 @@ func resourceAccountCreate(ctx context.Context, d *schema.ResourceData, m interf
req.Description = desc.(string)
}
+ if zoneID, ok := d.GetOk("default_zone_id"); ok {
+ req.DefaultZoneID = uint64(zoneID.(int))
+ }
+
if emailaddress, ok := d.GetOk("emailaddress"); ok {
req.EmailAddress = emailaddress.(string)
}
@@ -74,6 +84,13 @@ func resourceAccountCreate(ctx context.Context, d *schema.ResourceData, m interf
}
}
+ if zones, ok := d.GetOk("zone_ids"); ok {
+ zones := zones.([]interface{})
+ for _, zone := range zones {
+ req.ZoneIDs = append(req.ZoneIDs, uint64(zone.(int)))
+ }
+ }
+
if resLimits, ok := d.GetOk("resource_limits"); ok {
resLimits := resLimits.([]interface{})[0]
resLimitsConv := resLimits.(map[string]interface{})
@@ -200,7 +217,6 @@ func resourceAccountCreate(ctx context.Context, d *schema.ResourceData, m interf
if !d.Get("enable").(bool) {
_, err := c.CloudBroker().Account().Disable(ctx, account.DisableRequest{
AccountID: accountId,
- Reason: d.Get("reason").(string),
})
if err != nil {
@@ -245,14 +261,34 @@ func resourceAccountDelete(ctx context.Context, d *schema.ResourceData, m interf
AccountID: accountData.ID,
Permanently: d.Get("permanently").(bool),
Name: d.Get("account_name").(string),
- Reason: d.Get("reason").(string),
}
- _, err = c.CloudBroker().Account().Delete(ctx, req)
+ taskID, err := c.CloudBroker().Account().Delete(ctx, req)
if err != nil {
return diag.FromErr(err)
}
+ taskReq := tasks.GetRequest{
+ AuditID: strings.Trim(taskID, `"`),
+ }
+
+ for {
+ time.Sleep(time.Second * 5)
+ task, err := c.CloudBroker().Tasks().Get(ctx, taskReq)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ log.Debugf("resourceAccountDelete: delete account - %s", task.Stage)
+
+ if task.Completed {
+ if task.Error != "" {
+ return diag.FromErr(fmt.Errorf("cannot delete account: %v", task.Error))
+ }
+ break
+ }
+ }
+
d.SetId("")
return nil
@@ -282,14 +318,34 @@ func resourceAccountUpdate(ctx context.Context, d *schema.ResourceData, m interf
return diag.Errorf("The account is in progress with status: %s", acc.Status)
case status.Deleted:
if d.Get("restore").(bool) {
- _, err := c.CloudBroker().Account().Restore(ctx, account.RestoreRequest{
+ taskID, err := c.CloudBroker().Account().Restore(ctx, account.RestoreRequest{
AccountID: accountId,
- Reason: d.Get("reason").(string),
})
if err != nil {
return diag.FromErr(err)
}
+
+ taskReq := tasks.GetRequest{
+ AuditID: strings.Trim(taskID, `"`),
+ }
+
+ for {
+ time.Sleep(time.Second * 5)
+ task, err := c.CloudBroker().Tasks().Get(ctx, taskReq)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ log.Debugf("resourceAccountUpdate: restore account - %s", task.Stage)
+
+ if task.Completed {
+ if task.Error != "" {
+ return diag.FromErr(fmt.Errorf("cannot restore account: %v", task.Error))
+ }
+ break
+ }
+ }
if _, ok := d.GetOk("enable"); ok {
if err := utilityAccountEnableUpdate(ctx, d, m, acc); err != nil {
return diag.FromErr(err)
@@ -316,7 +372,7 @@ func resourceAccountUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
- if d.HasChanges("account_name", "send_access_emails", "uniq_pools", "resource_limits", "desc") {
+ if d.HasChanges("account_name", "send_access_emails", "uniq_pools", "resource_limits", "desc", "default_zone_id") {
if err := utilityAccountUpdate(ctx, d, m); err != nil {
return diag.FromErr(err)
}
@@ -352,6 +408,21 @@ func resourceAccountUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
+ if d.HasChange("zone_ids") {
+ old, new := d.GetChange("zone_ids")
+
+ //toAddSet := old.(*schema.Set).Difference(new.(*schema.Set))
+ toRemoveSet := new.(*schema.Set).Difference(old.(*schema.Set))
+
+ /*if err := utilityZoneIDsUpdate(ctx, d, m, toAddSet); err != nil {
+ return diag.FromErr(err)
+ }*/
+ if err := utilityZoneIDsRemove(ctx, d, m, toRemoveSet); err != nil {
+ return diag.FromErr(err)
+ }
+
+ }
+
return resourceAccountRead(ctx, d, m)
}
diff --git a/internal/service/cloudbroker/account/schema.go b/internal/service/cloudbroker/account/schema.go
index 505e2595..39fba592 100644
--- a/internal/service/cloudbroker/account/schema.go
+++ b/internal/service/cloudbroker/account/schema.go
@@ -27,12 +27,25 @@ func resourceAccountSchemaMake() map[string]*schema.Schema {
Optional: true,
Description: "email",
},
+ "default_zone_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "email",
+ },
"send_access_emails": {
Type: schema.TypeBool,
Optional: true,
Default: true,
Description: "if true send emails when a user is granted access to resources",
},
+ "zone_ids": {
+ Type: schema.TypeList,
+ Optional: true,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ },
"uniq_pools": {
Type: schema.TypeList,
Optional: true,
@@ -77,11 +90,6 @@ func resourceAccountSchemaMake() map[string]*schema.Schema {
},
Description: "Share images with account",
},
- "reason": {
- Type: schema.TypeString,
- Optional: true,
- Description: "reason for restore or deactivation",
- },
"restore": {
Type: schema.TypeBool,
Optional: true,
@@ -148,7 +156,7 @@ func resourceAccountSchemaMake() map[string]*schema.Schema {
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
- ValidateFunc: validation.StringInSlice([]string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac"}, true),
+ ValidateFunc: validation.StringInSlice([]string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac", "trunk"}, true),
},
},
"account_id": {
@@ -176,6 +184,13 @@ func resourceAccountSchemaMake() map[string]*schema.Schema {
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
+ "emails": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
+ },
"explicit": {
Type: schema.TypeBool,
Computed: true,
@@ -665,6 +680,10 @@ func dataSourceAccountListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "default_zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"uniq_pools": {
Type: schema.TypeList,
Computed: true,
@@ -672,6 +691,13 @@ func dataSourceAccountListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
+ "zone_ids": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ },
"updated_time": {
Type: schema.TypeInt,
Computed: true,
@@ -1252,6 +1278,10 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
+ "default_zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"account_name": {
Type: schema.TypeString,
Computed: true,
@@ -1314,6 +1344,13 @@ func dataSourceAccountListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
+ "zone_ids": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ },
"updated_time": {
Type: schema.TypeInt,
Computed: true,
@@ -1928,11 +1965,38 @@ func dataSourceAccountSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "default_zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "zone_ids": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "name": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ },
+ },
+ },
"acl": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
+ "emails": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
+ },
"explicit": {
Type: schema.TypeBool,
Computed: true,
diff --git a/internal/service/cloudbroker/account/utility_account.go b/internal/service/cloudbroker/account/utility_account.go
index f7c5a726..55a722a9 100644
--- a/internal/service/cloudbroker/account/utility_account.go
+++ b/internal/service/cloudbroker/account/utility_account.go
@@ -226,6 +226,10 @@ func utilityAccountUpdate(ctx context.Context, d *schema.ResourceData, m interfa
req.SendAccessEmails = d.Get("send_access_emails").(bool)
}
+ if d.HasChange("default_zone_id") {
+ req.DefaultZoneID = uint64(d.Get("default_zone_id").(int))
+ }
+
if d.HasChange("uniq_pools") {
uniq_pools := d.Get("uniq_pools").([]interface{})
@@ -401,6 +405,56 @@ func utilityAccountComputeFeaturesUpdate(ctx context.Context, d *schema.Resource
return nil
}
+func utilityZoneIDsAdd(ctx context.Context, d *schema.ResourceData, m interface{}, toUpdate *schema.Set) error {
+ c := m.(*controller.ControllerCfg)
+
+ accountId, _ := strconv.ParseUint(d.Id(), 10, 64)
+ zones := toUpdate.List()
+
+ compZones := make([]uint64, 0, len(zones))
+ for _, item := range zones {
+ compZones = append(compZones, uint64(item.(int)))
+
+ }
+
+ req := account.AddZoneRequest{
+ AccountID: accountId,
+ ZoneIDs: compZones,
+ }
+
+ _, err := c.CloudBroker().Account().AddZone(ctx, req)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func utilityZoneIDsRemove(ctx context.Context, d *schema.ResourceData, m interface{}, toRemove *schema.Set) error {
+ c := m.(*controller.ControllerCfg)
+
+ accountId, _ := strconv.ParseUint(d.Id(), 10, 64)
+ zones := toRemove.List()
+
+ compZones := make([]uint64, 0, len(zones))
+ for _, item := range zones {
+ compZones = append(compZones, uint64(item.(int)))
+
+ }
+
+ req := account.RemoveZoneRequest{
+ AccountID: accountId,
+ ZoneIDs: compZones,
+ }
+
+ _, err := c.CloudBroker().Account().RemoveZone(ctx, req)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
func isContainsUser(els []interface{}, el interface{}) bool {
for _, elOld := range els {
elOldConv := elOld.(map[string]interface{})
diff --git a/internal/service/cloudbroker/disks/schema.go b/internal/service/cloudbroker/disks/schema.go
index 2d89cfdf..781e081d 100644
--- a/internal/service/cloudbroker/disks/schema.go
+++ b/internal/service/cloudbroker/disks/schema.go
@@ -2002,7 +2002,7 @@ func resourceDiskSchemaMake() map[string]*schema.Schema {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
- Type: schema.TypeString,
+ Type: schema.TypeInt,
},
},
"iotune": {
diff --git a/internal/service/cloudbroker/extnet/flattens.go b/internal/service/cloudbroker/extnet/flattens.go
index 1683454e..080ee6a5 100644
--- a/internal/service/cloudbroker/extnet/flattens.go
+++ b/internal/service/cloudbroker/extnet/flattens.go
@@ -55,7 +55,7 @@ func flattenListExtnet(extList *extnet.ListExtNet) []map[string]interface{} {
"ipcidr": item.IPCIDR,
"milestones": item.Milestones,
"name": item.Name,
- "network_id": item.NetworkID,
+ "network_ids": item.NetworkIDs,
"ovs_bridge": item.OVSBridge,
"pre_reservations_num": item.PreReservationsNum,
"pri_vnfdev_id": item.PriVNFDevID,
@@ -64,6 +64,10 @@ func flattenListExtnet(extList *extnet.ListExtNet) []map[string]interface{} {
"vlan_id": item.VLANID,
"check_ips": item.CheckIPs,
"vnfs": flattenExtnetVNFS(item.VNFs),
+ "zone_id": item.ZoneID,
+ "sec_vnfdev_id": item.SecVNFDevID,
+ "redundant": item.Redundant,
+ "mtu": item.MTU,
}
res = append(res, temp)
@@ -84,7 +88,7 @@ func flattenRecordExtnet(d *schema.ResourceData, recNet *extnet.RecordExtNet) {
d.Set("ipcidr", recNet.IPCIDR)
d.Set("milestones", recNet.Milestones)
d.Set("name", recNet.Name)
- d.Set("network_id", recNet.NetworkID)
+ d.Set("network_ids", recNet.NetworkIDs)
d.Set("ntp", recNet.NTP)
d.Set("ovs_bridge", recNet.OVSBridge)
d.Set("pre_reservations_num", recNet.PreReservationsNum)
@@ -101,6 +105,11 @@ func flattenRecordExtnet(d *schema.ResourceData, recNet *extnet.RecordExtNet) {
d.Set("default_qos", flattenExtnetDefaultQos(recNet.DefaultQOS))
d.Set("vnfs", flattenExtnetVNFS(recNet.VNFs))
d.Set("reservations", flattenExtnetReservations(recNet.Reservations))
+ d.Set("zone_id", recNet.ZoneID)
+ d.Set("pre_reservations", flattenExtnetReservations(recNet.PreReservations))
+ d.Set("sec_vnfdev_id", recNet.SecVNFDevID)
+ d.Set("redundant", recNet.Redundant)
+ d.Set("mtu", recNet.MTU)
}
func flattenRecordExtnetResource(d *schema.ResourceData, recNet *extnet.RecordExtNet, staticRouteList *extnet.ListStaticRoutes) {
@@ -115,7 +124,7 @@ func flattenRecordExtnetResource(d *schema.ResourceData, recNet *extnet.RecordEx
d.Set("ipcidr", recNet.IPCIDR)
d.Set("milestones", recNet.Milestones)
d.Set("name", recNet.Name)
- d.Set("network_id", recNet.NetworkID)
+ d.Set("network_ids", flattenNetworkIDs(recNet.NetworkIDs))
d.Set("ovs_bridge", recNet.OVSBridge)
d.Set("pre_reservations_num", recNet.PreReservationsNum)
d.Set("pri_vnfdev_id", recNet.PriVNFDevID)
@@ -127,11 +136,13 @@ func flattenRecordExtnetResource(d *schema.ResourceData, recNet *extnet.RecordEx
d.Set("excluded", flattenExtnetExcluded(recNet.Excluded))
d.Set("gateway", recNet.Gateway)
d.Set("network", recNet.Network)
+ d.Set("ntp", recNet.NTP)
d.Set("prefix", recNet.Prefix)
d.Set("default_qos", flattenExtnetDefaultQos(recNet.DefaultQOS))
d.Set("vnfs", flattenExtnetVNFS(recNet.VNFs))
d.Set("reservations", flattenExtnetReservations(recNet.Reservations))
d.Set("routes", flattenStaticRouteList(staticRouteList))
+ d.Set("zone_id", recNet.ZoneID)
}
func flattenExtnetExcluded(ers extnet.ListReservations) []map[string]interface{} {
@@ -245,3 +256,14 @@ func flattenExtnetReservedIp(el []extnet.RecordReservedIP) []map[string]interfac
}
return res
}
+
+func flattenNetworkIDs(ex extnet.NetworkIDs) []map[string]interface{} {
+ res := make([]map[string]interface{}, 0, 1)
+ temp := map[string]interface{}{
+ "primary": ex.Primary,
+ "secondary": ex.Secondary,
+ }
+ res = append(res, temp)
+
+ return res
+}
diff --git a/internal/service/cloudbroker/extnet/resource_extnet.go b/internal/service/cloudbroker/extnet/resource_extnet.go
index 1eb63af7..267e4abf 100644
--- a/internal/service/cloudbroker/extnet/resource_extnet.go
+++ b/internal/service/cloudbroker/extnet/resource_extnet.go
@@ -100,6 +100,10 @@ func resourceExtnetCreate(ctx context.Context, d *schema.ResourceData, m interfa
req.Virtual = virtual.(bool)
}
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ req.ZoneID = uint64(zoneID.(int))
+ }
+
if desc, ok := d.GetOk("desc"); ok {
req.Description = desc.(string)
}
@@ -112,10 +116,6 @@ func resourceExtnetCreate(ctx context.Context, d *schema.ResourceData, m interfa
req.EndIP = end_ip.(string)
}
- if vnfdev_ip, ok := d.GetOk("vnfdev_ip"); ok {
- req.VNFDevIP = vnfdev_ip.(string)
- }
-
if pre_reservations_num, ok := d.GetOk("pre_reservations_num"); ok {
req.PreReservationsNum = uint64(pre_reservations_num.(int))
}
@@ -124,6 +124,18 @@ func resourceExtnetCreate(ctx context.Context, d *schema.ResourceData, m interfa
req.OVSBridge = ovs_bridge.(string)
}
+ if highly_available, ok := d.GetOk("highly_available"); ok {
+ req.HAMode = highly_available.(bool)
+ }
+
+ if sec_vnfdev_ip, ok := d.GetOk("sec_vnfdev_ip"); ok {
+ req.SecVNFDevIP = sec_vnfdev_ip.(string)
+ }
+
+ if mtu, ok := d.GetOk("mtu"); ok {
+ req.MTU = mtu.(uint)
+ }
+
log.Debugf("cloudbroker: Sent create request")
netID, err := c.CloudBroker().ExtNet().Create(ctx, req)
if err != nil {
@@ -331,6 +343,18 @@ func resourceExtnetUpdate(ctx context.Context, d *schema.ResourceData, m interfa
}
}
+ if d.HasChange("zone_id") {
+ if err := handleZoneIDUpdate(ctx, d, c, recNet); err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
+ if d.HasChange("highly_available") {
+ if err := handleHAUpdate(ctx, d, c, recNet); err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
return resourceExtnetRead(ctx, d, m)
}
diff --git a/internal/service/cloudbroker/extnet/schema.go b/internal/service/cloudbroker/extnet/schema.go
index 0b2d97f2..481ccdeb 100644
--- a/internal/service/cloudbroker/extnet/schema.go
+++ b/internal/service/cloudbroker/extnet/schema.go
@@ -86,6 +86,10 @@ func dataSourceExtnetListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"default_qos": {
Type: schema.TypeList,
Computed: true,
@@ -142,9 +146,21 @@ func dataSourceExtnetListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
- "network_id": {
- Type: schema.TypeInt,
+ "network_ids": {
+ Type: schema.TypeList,
Computed: true,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "primary": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "secondary": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ },
+ },
},
"ovs_bridge": {
Type: schema.TypeString,
@@ -192,6 +208,18 @@ func dataSourceExtnetListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
+ "redundant": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
+ "sec_vnfdev_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "mtu": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
},
},
},
@@ -351,6 +379,10 @@ func dataSourceExtnetSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"ipcidr": {
Type: schema.TypeString,
Computed: true,
@@ -363,9 +395,21 @@ func dataSourceExtnetSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
- "network_id": {
- Type: schema.TypeInt,
+ "network_ids": {
+ Type: schema.TypeList,
Computed: true,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "primary": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "secondary": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ },
+ },
},
"ovs_bridge": {
Type: schema.TypeString,
@@ -523,6 +567,62 @@ func dataSourceExtnetSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
+ "redundant": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
+ "sec_vnfdev_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "mtu": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "pre_reservations": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "account_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "client_type": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "domain_name": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "hostname": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "desc": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "ip": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "mac": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "type": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "vm_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ },
+ },
+ },
}
}
@@ -595,6 +695,11 @@ func resourceExtnetSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "External network gateway IP address",
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ },
"dns": {
Type: schema.TypeList,
Optional: true,
@@ -607,6 +712,7 @@ func resourceExtnetSchemaMake() map[string]*schema.Schema {
"ntp": {
Type: schema.TypeList,
Optional: true,
+ Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
@@ -766,6 +872,21 @@ func resourceExtnetSchemaMake() map[string]*schema.Schema {
},
},
},
+ "highly_available": {
+ Type: schema.TypeBool,
+ Optional: true,
+ Computed: true,
+ },
+ "sec_vnfdev_ip": {
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ },
+ "mtu": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ },
"ckey": {
Type: schema.TypeString,
Computed: true,
@@ -798,9 +919,21 @@ func resourceExtnetSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
- "network_id": {
- Type: schema.TypeInt,
+ "network_ids": {
+ Type: schema.TypeList,
Computed: true,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "primary": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "secondary": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ },
+ },
},
"pri_vnfdev_id": {
Type: schema.TypeInt,
diff --git a/internal/service/cloudbroker/extnet/utility_extnet_resource.go b/internal/service/cloudbroker/extnet/utility_extnet_resource.go
index 991467d7..3e8d3474 100644
--- a/internal/service/cloudbroker/extnet/utility_extnet_resource.go
+++ b/internal/service/cloudbroker/extnet/utility_extnet_resource.go
@@ -118,6 +118,10 @@ func handleBasicUpdate(ctx context.Context, d *schema.ResourceData, c *controlle
basiUpdateReq.Description = d.Get("desc").(string)
doBasicUpdate = true
}
+ if d.HasChange("mtu") {
+ basiUpdateReq.MTU = d.Get("mtu").(uint64)
+ doBasicUpdate = true
+ }
if doBasicUpdate {
_, err := c.CloudBroker().ExtNet().Update(ctx, basiUpdateReq)
@@ -343,6 +347,38 @@ func handleMigrateUpdate(ctx context.Context, d *schema.ResourceData, c *control
return nil
}
+func handleZoneIDUpdate(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg, recNet *extnet.RecordExtNet) error {
+ zoneID := uint64(d.Get("zone_id").(int))
+
+ req := extnet.MigrateToZoneRequest{
+ NetID: recNet.ID,
+ ZoneID: zoneID,
+ }
+
+ _, err := c.CloudBroker().ExtNet().MigrateToZone(ctx, req)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func handleHAUpdate(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg, recNet *extnet.RecordExtNet) error {
+ highlyAvailable := d.Get("highly_available").(bool)
+
+ req := extnet.SetHAModeRequest{
+ NetID: recNet.ID,
+ HAMode: highlyAvailable,
+ }
+
+ _, err := c.CloudBroker().ExtNet().SetHAMode(ctx, req)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
func checkReserveIp(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg) error {
var err error
if d.Get("reserved_ip").(*schema.Set).Len() > 0 {
diff --git a/internal/service/cloudbroker/flipgroup/resource_flipgroup.go b/internal/service/cloudbroker/flipgroup/resource_flipgroup.go
index efbaf100..5e5a5ac0 100644
--- a/internal/service/cloudbroker/flipgroup/resource_flipgroup.go
+++ b/internal/service/cloudbroker/flipgroup/resource_flipgroup.go
@@ -37,6 +37,7 @@ package flipgroup
import (
"context"
"fmt"
+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/flipgroup"
@@ -58,16 +59,18 @@ func resourceFlipgroupCreate(ctx context.Context, d *schema.ResourceData, m inte
}
req := flipgroup.CreateRequest{
- Name: d.Get("name").(string),
- NetType: d.Get("net_type").(string),
- ClientType: d.Get("client_type").(string),
- AccountID: uint64(d.Get("account_id").(int)),
- NetID: uint64(d.Get("net_id").(int)),
+ Name: d.Get("name").(string),
+ NetType: d.Get("net_type").(string),
+ AccountID: uint64(d.Get("account_id").(int)),
+ NetID: uint64(d.Get("net_id").(int)),
}
if IP, ok := d.GetOk("ip"); ok {
req.IP = IP.(string)
}
+ if clientType, ok := d.GetOk("client_type"); ok {
+ req.ClientType = clientType.(string)
+ }
if description, ok := d.GetOk("desc"); ok {
req.Description = description.(string)
}
diff --git a/internal/service/cloudbroker/flipgroup/schema.go b/internal/service/cloudbroker/flipgroup/schema.go
index 96e9b316..0539f69c 100644
--- a/internal/service/cloudbroker/flipgroup/schema.go
+++ b/internal/service/cloudbroker/flipgroup/schema.go
@@ -369,7 +369,8 @@ func resourceFlipgroupSchemaMake() map[string]*schema.Schema {
},
"client_type": {
Type: schema.TypeString,
- Required: true,
+ Optional: true,
+ Default: "compute",
Description: "Type of client, 'compute' ('vins' will be later)",
ValidateFunc: validation.StringInSlice([]string{"compute"}, true),
},
diff --git a/internal/service/cloudbroker/grid/flattens.go b/internal/service/cloudbroker/grid/flattens.go
index 4e28336f..12d444c5 100644
--- a/internal/service/cloudbroker/grid/flattens.go
+++ b/internal/service/cloudbroker/grid/flattens.go
@@ -18,6 +18,9 @@ func flattenGrid(d *schema.ResourceData, grid *grid.RecordGrid) {
d.Set("guid", grid.GUID)
d.Set("location_code", grid.LocationCode)
d.Set("id", grid.ID)
+ d.Set("network_modes", grid.NetworkModes)
+ d.Set("sdn_support", grid.SDNSupport)
+
}
func flattenGridList(gl *grid.ListGrids) []map[string]interface{} {
@@ -32,6 +35,8 @@ func flattenGridList(gl *grid.ListGrids) []map[string]interface{} {
"guid": item.GUID,
"location_code": item.LocationCode,
"id": item.ID,
+ "network_modes": item.NetworkModes,
+ "sdn_support": item.SDNSupport,
}
res = append(res, temp)
}
diff --git a/internal/service/cloudbroker/grid/schema.go b/internal/service/cloudbroker/grid/schema.go
index 5b866d7e..7cf7bee6 100644
--- a/internal/service/cloudbroker/grid/schema.go
+++ b/internal/service/cloudbroker/grid/schema.go
@@ -51,6 +51,17 @@ func dataSourceGetGridSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "network_modes": {
+ Type: schema.TypeList,
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
+ Computed: true,
+ },
+ "sdn_support": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
}
}
@@ -246,6 +257,17 @@ func dataSourceGridListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "network_modes": {
+ Type: schema.TypeList,
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
+ Computed: true,
+ },
+ "sdn_support": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
},
},
},
diff --git a/internal/service/cloudbroker/ic/input_checks.go b/internal/service/cloudbroker/ic/input_checks.go
index 4ccc77bc..c5839e48 100644
--- a/internal/service/cloudbroker/ic/input_checks.go
+++ b/internal/service/cloudbroker/ic/input_checks.go
@@ -17,6 +17,7 @@ import (
cb_lb "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/lb"
cb_rg "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/rg"
cb_stack "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/stack"
+ cb_trunk "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk"
cb_vfpool "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vfpool"
cb_vins "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vins"
@@ -318,6 +319,39 @@ func ExistDPDKNet(ctx context.Context, dpdkIds []uint64, c *controller.Controlle
return errs
}
+func ExistTrunkNet(ctx context.Context, trunkIds []uint64, c *controller.ControllerCfg) []error {
+ var errs []error
+
+ if len(trunkIds) == 0 {
+ return errs
+ }
+
+ req := cb_trunk.ListRequest{}
+
+ trunkList, err := c.CloudBroker().Trunk().List(ctx, req)
+ if err != nil {
+ errs = append(errs, err)
+ return errs
+ }
+
+ for _, trunkId := range trunkIds {
+ found := false
+
+ for _, trunk := range trunkList.Data {
+ if trunkId == trunk.ID {
+ found = true
+ break
+ }
+ }
+
+ if !found {
+ errs = append(errs, fmt.Errorf("TRUNK Net with ID %v not found", trunkId))
+ }
+ }
+
+ return errs
+}
+
func ExistExtNetInLb(ctx context.Context, extNetId uint64, c *controller.ControllerCfg) error {
if extNetId == 0 {
return nil
diff --git a/internal/service/cloudbroker/image/resource_cdrom_image.go b/internal/service/cloudbroker/image/resource_cdrom_image.go
index 817a17dd..1fa8689a 100644
--- a/internal/service/cloudbroker/image/resource_cdrom_image.go
+++ b/internal/service/cloudbroker/image/resource_cdrom_image.go
@@ -73,9 +73,6 @@ func resourceCDROMImageCreate(ctx context.Context, d *schema.ResourceData, m int
if poolName, ok := d.GetOk("pool_name"); ok {
req.PoolName = poolName.(string)
}
- if architecture, ok := d.GetOk("architecture"); ok {
- req.Architecture = architecture.(string)
- }
imageId, err := c.CloudBroker().Image().CreateCDROMImage(ctx, req)
if err != nil {
diff --git a/internal/service/cloudbroker/image/resource_image.go b/internal/service/cloudbroker/image/resource_image.go
index 53b28c0f..08c0f1f8 100644
--- a/internal/service/cloudbroker/image/resource_image.go
+++ b/internal/service/cloudbroker/image/resource_image.go
@@ -33,13 +33,16 @@ package image
import (
"context"
+ "fmt"
"strconv"
+ "strings"
"time"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/image"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/tasks"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
@@ -54,26 +57,54 @@ func resourceImageCreate(ctx context.Context, d *schema.ResourceData, m interfac
c := m.(*controller.ControllerCfg)
syncMode := d.Get("sync_mode").(bool)
+ log.Debugf("resourceImageCreate: sync_mode = %t", d.Get("sync_mode").(bool))
var imageId uint64
+ req, err := CreateRequest(ctx, d, m, url.(string))
+
if syncMode {
- req, err := SyncCreateRequest(ctx, d, m, url.(string))
if err != nil {
return diag.FromErr(err)
}
- imageId, err = c.CloudBroker().Image().SyncCreate(ctx, req)
+ imageId, err = c.CloudBroker().Image().CreateImage(ctx, req)
+ log.Debugf("resourceImageCreate: imageID = %d", imageId)
if err != nil {
return diag.FromErr(err)
}
} else {
- req, err := CreateRequest(ctx, d, m, url.(string))
if err != nil {
return diag.FromErr(err)
}
- imageId, err = c.CloudBroker().Image().CreateImage(ctx, req)
+ taskID, err := c.CloudBroker().Image().AsyncCreateImage(ctx, req)
if err != nil {
return diag.FromErr(err)
}
+
+ taskReq := tasks.GetRequest{
+ AuditID: strings.Trim(taskID, `"`),
+ }
+
+ for {
+ time.Sleep(time.Second * 15)
+ task, err := c.CloudBroker().Tasks().Get(ctx, taskReq)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ log.Debugf("resourceAccountDelete: delete account - %s", task.Stage)
+
+ if task.Completed {
+ if task.Error != "" {
+ return diag.FromErr(fmt.Errorf("cannot delete account: %v", task.Error))
+ }
+ id, err := task.Result.ID()
+ imageId = uint64(id)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ break
+ }
+ }
}
d.SetId(strconv.FormatUint(imageId, 10))
diff --git a/internal/service/cloudbroker/image/resource_image_from_platform_disk.go b/internal/service/cloudbroker/image/resource_image_from_platform_disk.go
index 2ff185e2..6a52a95d 100644
--- a/internal/service/cloudbroker/image/resource_image_from_platform_disk.go
+++ b/internal/service/cloudbroker/image/resource_image_from_platform_disk.go
@@ -59,12 +59,11 @@ func resourceImageFromPlatformDiskCreate(ctx context.Context, d *schema.Resource
}
req := disks.FromPlatformDiskRequest{
- DiskID: uint64(d.Get("disk_id").(int)),
- Name: d.Get("name").(string),
- BootType: d.Get("boot_type").(string),
- ImageType: d.Get("image_type").(string),
- Architecture: d.Get("architecture").(string),
- Bootable: d.Get("bootable").(bool), // default is true
+ DiskID: uint64(d.Get("disk_id").(int)),
+ Name: d.Get("name").(string),
+ BootType: d.Get("boot_type").(string),
+ ImageType: d.Get("image_type").(string),
+ Bootable: d.Get("bootable").(bool), // default is true
}
if username, ok := d.GetOk("username"); ok {
diff --git a/internal/service/cloudbroker/image/schema.go b/internal/service/cloudbroker/image/schema.go
index fbc026ec..4be234fd 100644
--- a/internal/service/cloudbroker/image/schema.go
+++ b/internal/service/cloudbroker/image/schema.go
@@ -1192,7 +1192,8 @@ func resourceImageSchemaMake() map[string]*schema.Schema {
Optional: true,
Computed: true,
Elem: &schema.Schema{
- Type: schema.TypeString,
+ Type: schema.TypeString,
+ ValidateFunc: validation.StringInSlice([]string{"KVM_X86"}, false),
},
Description: "List of types of compute suitable for image. Example: [ \"KVM_X86\" ]",
},
@@ -1253,7 +1254,6 @@ func resourceImageSchemaMake() map[string]*schema.Schema {
},
"architecture": {
Type: schema.TypeString,
- Optional: true,
Computed: true,
Description: "binary architecture of this image, one of X86_64",
},
@@ -1991,13 +1991,6 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema {
ValidateFunc: validation.StringInSlice([]string{"linux", "windows", "unknown"}, true),
Description: "Image type linux, windows or unknown",
},
- "architecture": {
- Type: schema.TypeString,
- Required: true,
- ValidateFunc: validation.StringInSlice([]string{"X86_64"}, true),
- Description: "Image type linux, windows or other",
- },
-
"username": {
Type: schema.TypeString,
Optional: true,
@@ -2016,6 +2009,10 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "AccountId to make the image exclusive",
},
+ "architecture": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"sep_id": {
Type: schema.TypeInt,
Computed: true,
diff --git a/internal/service/cloudbroker/image/utility_image_list.go b/internal/service/cloudbroker/image/utility_image_list.go
index ed17f600..b824f1ef 100644
--- a/internal/service/cloudbroker/image/utility_image_list.go
+++ b/internal/service/cloudbroker/image/utility_image_list.go
@@ -57,9 +57,6 @@ func utilityImageListCheckPresence(ctx context.Context, d *schema.ResourceData,
if status, ok := d.GetOk("status"); ok {
req.Status = status.(string)
}
- if architecture, ok := d.GetOk("architecture"); ok {
- req.Architecture = architecture.(string)
- }
if typeImage, ok := d.GetOk("type_image"); ok {
req.TypeImage = typeImage.(string)
}
diff --git a/internal/service/cloudbroker/image/utility_resource_create.go b/internal/service/cloudbroker/image/utility_resource_create.go
index 2c8cbbef..b1afc99e 100644
--- a/internal/service/cloudbroker/image/utility_resource_create.go
+++ b/internal/service/cloudbroker/image/utility_resource_create.go
@@ -38,58 +38,6 @@ import (
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/image"
)
-func SyncCreateRequest(ctx context.Context, d *schema.ResourceData, m interface{}, url string) (image.SyncCreateRequest, error) {
- req := image.SyncCreateRequest{
- Name: d.Get("name").(string),
- URL: url,
- BootType: d.Get("boot_type").(string),
- ImageType: d.Get("image_type").(string),
- }
-
- if _, ok := d.GetOk("drivers"); ok {
- drivers := []string{}
- for _, driver := range d.Get("drivers").([]interface{}) {
- drivers = append(drivers, driver.(string))
- }
- req.Drivers = drivers
- }
-
- if hotresize, ok := d.GetOk("hot_resize"); ok {
- req.HotResize = hotresize.(bool)
- }
- if username, ok := d.GetOk("username"); ok {
- req.Username = username.(string)
- }
- if password, ok := d.GetOk("password"); ok {
- req.Password = password.(string)
- }
- if accountId, ok := d.GetOk("account_id"); ok {
- req.AccountID = uint64(accountId.(int))
- }
- if usernameDL, ok := d.GetOk("username_dl"); ok {
- req.UsernameDL = usernameDL.(string)
- }
- if passwordDL, ok := d.GetOk("password_dl"); ok {
- req.PasswordDL = passwordDL.(string)
- }
- if sepId, ok := d.GetOk("sep_id"); ok {
- req.SEPID = uint64(sepId.(int))
- }
- if poolName, ok := d.GetOk("pool_name"); ok {
- req.PoolName = poolName.(string)
- }
- if architecture, ok := d.GetOk("architecture"); ok {
- req.Architecture = architecture.(string)
- }
- if bootable, ok := d.GetOk("bootable"); ok {
- req.Bootable = bootable.(bool)
- }
- if networkInterfaceNaming, ok := d.GetOk("network_interface_naming"); ok {
- req.NetworkInterfaceNaming = networkInterfaceNaming.(string)
- }
- return req, nil
-}
-
func CreateRequest(ctx context.Context, d *schema.ResourceData, m interface{}, url string) (image.CreateRequest, error) {
req := image.CreateRequest{
Name: d.Get("name").(string),
@@ -130,9 +78,6 @@ func CreateRequest(ctx context.Context, d *schema.ResourceData, m interface{}, u
if poolName, ok := d.GetOk("pool_name"); ok {
req.PoolName = poolName.(string)
}
- if architecture, ok := d.GetOk("architecture"); ok {
- req.Architecture = architecture.(string)
- }
if bootable, ok := d.GetOk("bootable"); ok {
req.Bootable = bootable.(bool)
}
diff --git a/internal/service/cloudbroker/k8s/flattens.go b/internal/service/cloudbroker/k8s/flattens.go
index 17e10bc9..b505f1b8 100644
--- a/internal/service/cloudbroker/k8s/flattens.go
+++ b/internal/service/cloudbroker/k8s/flattens.go
@@ -68,6 +68,7 @@ func flattenResourceK8sCP(d *schema.ResourceData, k8s k8s.RecordK8S, masters []c
d.Set("highly_available_lb", k8s.HighlyAvailableLB)
d.Set("address_vip", flattenAddressVIP(k8s.AddressVIP))
d.Set("extnet_only", k8s.ExtnetOnly)
+ d.Set("zone_id", k8s.ZoneID)
flattenCPParams(d, k8s.K8SGroups.Masters, masters)
}
@@ -109,6 +110,7 @@ func flattenK8sData(d *schema.ResourceData, cluster *k8s.RecordK8S, masters []co
d.Set("address_vip", flattenAddressVIP(cluster.AddressVIP))
d.Set("extnet_only", cluster.ExtnetOnly)
d.Set("with_lb", cluster.WithLB)
+ d.Set("zone_id", cluster.ZoneID)
}
func flattenAddressVIP(addressVIP k8s.K8SAddressVIP) []map[string]interface{} {
@@ -295,6 +297,7 @@ func flattenK8sItems(k8sList *k8s.ListK8S) []map[string]interface{} {
"updated_by": item.UpdatedBy,
"updated_time": item.UpdatedTime,
"vins_id": item.VINSID,
+ "zone_id": item.ZoneID,
"workers_groups": flattenWorkersGroupList(item.WorkersGroup),
}
diff --git a/internal/service/cloudbroker/k8s/resource_k8s_cp.go b/internal/service/cloudbroker/k8s/resource_k8s_cp.go
index f8c765f4..7b6bba7b 100644
--- a/internal/service/cloudbroker/k8s/resource_k8s_cp.go
+++ b/internal/service/cloudbroker/k8s/resource_k8s_cp.go
@@ -114,6 +114,10 @@ func resourceK8sCPCreate(ctx context.Context, d *schema.ResourceData, m interfac
createReq.ExtNetID = 0
}
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ createReq.ZoneID = uint64(zoneID.(int))
+ }
+
if vins, ok := d.GetOk("vins_id"); ok {
createReq.VinsId = uint64(vins.(int))
} else {
@@ -398,6 +402,14 @@ func resourceK8sCPUpdate(ctx context.Context, d *schema.ResourceData, m interfac
}
}
+ if d.HasChange("zone_id") {
+ start := d.Get("start").(bool)
+ err := handleZoneID(ctx, c, k8sData.ID, uint64(d.Get("zone_id").(int)), start)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
if d.HasChange("start") {
err := handleStart(ctx, c, d.Get("start").(bool), k8sData)
if err != nil {
@@ -588,6 +600,43 @@ func handleStart(ctx context.Context, c *controller.ControllerCfg, start bool, k
return nil
}
+func handleZoneID(ctx context.Context, c *controller.ControllerCfg, k8sId uint64, zoneID uint64, start bool) error {
+
+ if start {
+ stopReq := k8s.StopRequest{
+ K8SID: k8sId,
+ }
+
+ _, err := c.CloudBroker().K8S().Stop(ctx, stopReq)
+ if err != nil {
+ return err
+ }
+ }
+
+ req := k8s.MigrateToZoneRequest{
+ K8SID: k8sId,
+ ZoneID: zoneID,
+ }
+
+ _, err := c.CloudBroker().K8S().MigrateToZone(ctx, req)
+ if err != nil {
+ return err
+ }
+
+ if start {
+ startReq := k8s.StartRequest{
+ K8SID: k8sId,
+ }
+
+ _, err := c.CloudBroker().K8S().Start(ctx, startReq)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
func handleUpdateLbSysctlParams(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg, k8sData *k8s.RecordK8S) error {
lbSysctlParams := d.Get("lb_sysctl_params").([]interface{})
diff --git a/internal/service/cloudbroker/k8s/schema.go b/internal/service/cloudbroker/k8s/schema.go
index ce9c1be9..4aac5ab9 100644
--- a/internal/service/cloudbroker/k8s/schema.go
+++ b/internal/service/cloudbroker/k8s/schema.go
@@ -179,6 +179,10 @@ func dataSourceK8sListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"k8sci_id": {
Type: schema.TypeInt,
Computed: true,
@@ -491,6 +495,10 @@ func dataSourceK8sListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"k8sci_id": {
Type: schema.TypeInt,
Computed: true,
@@ -1017,6 +1025,10 @@ func dataSourceK8sSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"created_by": {
Type: schema.TypeString,
Computed: true,
@@ -1343,6 +1355,11 @@ func resourceK8sCPSchemaMake() map[string]*schema.Schema {
Description: "Network plugin to be used",
ValidateFunc: validation.StringInSlice([]string{"flannel", "weavenet", "calico"}, true),
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ },
"num": {
Type: schema.TypeInt,
Optional: true,
diff --git a/internal/service/cloudbroker/kvmvm/flattens.go b/internal/service/cloudbroker/kvmvm/flattens.go
index 519a7cd6..5c183ce9 100644
--- a/internal/service/cloudbroker/kvmvm/flattens.go
+++ b/internal/service/cloudbroker/kvmvm/flattens.go
@@ -103,6 +103,7 @@ func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute, p
d.Set("boot_type", computeRec.BootType)
d.Set("hot_resize", computeRec.HotResize)
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
+ d.Set("zone_id", computeRec.ZoneID)
return nil
}
@@ -161,7 +162,6 @@ func flattenOSUsers(users compute.ListOSUsers) []map[string]interface{} {
func flattenInterfaces(ifaces compute.ListInterfaces) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(ifaces))
-
for _, iface := range ifaces {
res = append(res, map[string]interface{}{
"bus_number": iface.BusNumber,
@@ -182,13 +182,14 @@ func flattenInterfaces(ifaces compute.ListInterfaces) []map[string]interface{} {
"node_id": iface.NodeID,
"pci_slot": iface.PCISlot,
"qos": flattenQOS(iface.QOS),
+ "sdn_interface_id": iface.SDNInterfaceID,
"target": iface.Target,
"type": iface.Type,
+ "trunk_tags": iface.TrunkTags,
"vnfs": iface.VNFs,
"libvirt_settings": flattenLibvirtSettings(iface.LibvirtSettings),
})
}
-
return res
}
@@ -290,6 +291,7 @@ func flattenAffinityRules(rules compute.ListRules) []map[string]interface{} {
func flattenComputeList(computes *compute.ListComputes) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(computes.Data))
for _, computeItem := range computes.Data {
+
customFields, _ := json.Marshal(computeItem.CustomFields)
devices, _ := json.Marshal(computeItem.Devices)
userData, _ := json.Marshal(computeItem.Userdata)
@@ -327,6 +329,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"cpu_pin": computeItem.CPUPin,
"image_id": computeItem.ImageID,
"interfaces": flattenInterfaces(computeItem.Interfaces),
+ "live_migration_job_id": computeItem.LiveMigrationJobID,
"lock_status": computeItem.LockStatus,
"manager_id": computeItem.ManagerID,
"manager_type": computeItem.ManagerType,
@@ -340,6 +343,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"os_users": flattenOSUsers(computeItem.OSUsers),
"pinned": computeItem.PinnedToStack,
"preferred_cpu": computeItem.PreferredCPU,
+ "qemu_guest": flattenQemuQuest(computeItem.QemuQuest),
"ram": computeItem.RAM,
"reference_id": computeItem.ReferenceID,
"registered": computeItem.Registered,
@@ -367,9 +371,11 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"boot_type": computeItem.BootType,
"hot_resize": computeItem.HotResize,
"network_interface_naming": computeItem.NetworkInterfaceNaming,
+ "zone_id": computeItem.ZoneID,
}
res = append(res, temp)
}
+
return res
}
@@ -452,6 +458,7 @@ func flattenDeletedComputeList(computes *compute.ListDeletedComputes) []map[stri
"boot_type": computeItem.BootType,
"hot_resize": computeItem.HotResize,
"network_interface_naming": computeItem.NetworkInterfaceNaming,
+ "zone_id": computeItem.ZoneID,
}
res = append(res, temp)
}
@@ -738,6 +745,7 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
d.Set("image_id", compFacts.ImageID)
d.Set("image_name", compFacts.ImageName)
d.Set("interfaces", flattenInterfaces(compFacts.Interfaces))
+ d.Set("live_migration_job_id", compFacts.LiveMigrationJobID)
d.Set("lock_status", compFacts.LockStatus)
d.Set("manager_id", compFacts.ManagerID)
d.Set("manager_type", compFacts.ManagerType)
@@ -755,6 +763,7 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
d.Set("os_users", flattenOSUsers(compFacts.OSUsers))
d.Set("pinned", compFacts.PinnedToStack)
d.Set("preferred_cpu", compFacts.PreferredCPU)
+ d.Set("qemu_guest", flattenQemuQuest(compFacts.QemuQuest))
d.Set("ram", compFacts.RAM)
d.Set("reference_id", compFacts.ReferenceID)
d.Set("registered", compFacts.Registered)
@@ -783,6 +792,7 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
d.Set("boot_type", compFacts.BootType)
d.Set("hot_resize", compFacts.HotResize)
d.Set("network_interface_naming", compFacts.NetworkInterfaceNaming)
+ d.Set("zone_id", compFacts.ZoneID)
//extra fields setting
bootDisk := findBootDisk(compFacts.Disks)
if bootDisk != nil {
@@ -811,6 +821,7 @@ func parseComputeInterfacesToNetworks(networks []interface{}, ifaces compute.Lis
elem["ip_address"] = value.IPAddress
elem["mac"] = value.MAC
elem["mtu"] = value.MTU
+ elem["sdn_interface_id"] = value.SDNInterfaceID
elem["weight"] = flattenNetworkWeight(networks, value.NetID, value.NetType)
result = append(result, elem)
@@ -854,7 +865,6 @@ func flattenDisk(diskList compute.ListDisks) []map[string]interface{} {
"login": disk.Login,
"milestones": disk.Milestones,
"name": disk.Name,
- "order": disk.Order,
"params": disk.Params,
"parent_id": disk.ParentID,
"passwd": disk.Password,
@@ -878,7 +888,6 @@ func flattenDisk(diskList compute.ListDisks) []map[string]interface{} {
"status": disk.Status,
"tech_status": disk.TechStatus,
"type": disk.Type,
- "vmid": disk.VMID,
}
res = append(res, temp)
}
@@ -969,3 +978,19 @@ func flattenVGPUs(vgpus []compute.VGPUItem) []map[string]interface{} {
return res
}
+
+func flattenQemuQuest(qemuQuest compute.QemuQuest) []map[string]interface{} {
+ res := make([]map[string]interface{}, 0)
+
+ temp := map[string]interface{}{
+ "enabled": qemuQuest.Enabled,
+ "enabled_agent_features": qemuQuest.EnabledAgentFeatures,
+ "guid": qemuQuest.GUID,
+ "last_update": uint64(qemuQuest.LastUpdate),
+ "user": qemuQuest.User,
+ }
+
+ res = append(res, temp)
+
+ return res
+}
diff --git a/internal/service/cloudbroker/kvmvm/resource_check_input_values.go b/internal/service/cloudbroker/kvmvm/resource_check_input_values.go
index b3ba89e6..c0969933 100644
--- a/internal/service/cloudbroker/kvmvm/resource_check_input_values.go
+++ b/internal/service/cloudbroker/kvmvm/resource_check_input_values.go
@@ -36,7 +36,9 @@ func checkParamsExistence(ctx context.Context, d *schema.ResourceData, c *contro
func existNetworks(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg) []error {
var errs []error
- var vinsIds, extNetIds, vfpoolIds, dpdkIds []uint64
+ var vinsIds, extNetIds, vfpoolIds, dpdkIds, trunkIds []uint64
+ //TODO
+ //var sdnIds []string
networksIface, ok := d.GetOk("network")
if !ok {
@@ -56,6 +58,12 @@ func existNetworks(ctx context.Context, d *schema.ResourceData, c *controller.Co
vfpoolIds = append(vfpoolIds, uint64(network["net_id"].(int)))
case "DPDK":
dpdkIds = append(dpdkIds, uint64(network["net_id"].(int)))
+ case "TRUNK":
+ trunkIds = append(trunkIds, uint64(network["net_id"].(int)))
+
+ //TODO
+ //case "SDN": sdnIds = append(sdnIds, network["sdn_interface_id"].(string))
+
default:
continue
}
@@ -77,5 +85,14 @@ func existNetworks(ctx context.Context, d *schema.ResourceData, c *controller.Co
errs = append(errs, dpdkErrs...)
}
+ if trunkErrs := ic.ExistTrunkNet(ctx, trunkIds, c); trunkErrs != nil {
+ errs = append(errs, trunkErrs...)
+ }
+
+ //TODO
+ //if sdnErrs := ic.ExistSDNNet(ctx, sdnIds, c); sdnErrs != nil {
+ // errs = append(errs, sdnErrs...)
+ //}
+
return errs
}
diff --git a/internal/service/cloudbroker/kvmvm/resource_compute.go b/internal/service/cloudbroker/kvmvm/resource_compute.go
index 9f163d96..dd7498c4 100644
--- a/internal/service/cloudbroker/kvmvm/resource_compute.go
+++ b/internal/service/cloudbroker/kvmvm/resource_compute.go
@@ -87,6 +87,10 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
createReqX86.IS = IS.(string)
}
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ createReqX86.ZoneID = uint64(zoneID.(int))
+ }
+
createReqX86.Interfaces = make([]kvmx86.Interface, 0)
if networks, ok := d.GetOk("network"); ok {
@@ -112,7 +116,7 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
NetID: uint64(netInterfaceVal["net_id"].(int)),
}
- if reqInterface.NetType == "DPDK" {
+ if reqInterface.NetType == "DPDK" || reqInterface.NetType == "EXTNET" {
reqInterface.MTU = uint64(netInterfaceVal["mtu"].(int))
}
@@ -126,6 +130,11 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
reqInterface.MAC = macaddr.(string)
}
+ sdnID, sdnSet := netInterfaceVal["sdn_interface_id"]
+ if sdnSet {
+ reqInterface.SDNInterfaceID = sdnID.(string)
+ }
+
interfacesX86 = append(interfacesX86, reqInterface)
}
createReqX86.Interfaces = interfacesX86
@@ -861,6 +870,12 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
+ if d.HasChange("zone_id") {
+ if err := utilityComputeUpdateZoneID(ctx, d, m); err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
return append(resourceComputeRead(ctx, d, m), warnings.Get()...)
}
diff --git a/internal/service/cloudbroker/kvmvm/schema.go b/internal/service/cloudbroker/kvmvm/schema.go
index 22ec4a03..52e5c134 100644
--- a/internal/service/cloudbroker/kvmvm/schema.go
+++ b/internal/service/cloudbroker/kvmvm/schema.go
@@ -32,7 +32,7 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"explicit": {
- Type: schema.TypeString,
+ Type: schema.TypeBool,
Computed: true,
},
"guid": {
@@ -366,10 +366,6 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
- "order": {
- Type: schema.TypeInt,
- Computed: true,
- },
"params": {
Type: schema.TypeString,
Computed: true,
@@ -522,10 +518,6 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
- "vmid": {
- Type: schema.TypeInt,
- Computed: true,
- },
},
},
},
@@ -702,6 +694,14 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "trunk_tags": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "sdn_interface_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"vnfs": {
Type: schema.TypeList,
Computed: true,
@@ -712,6 +712,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
},
},
},
+ "live_migration_job_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"lock_status": {
Type: schema.TypeString,
Computed: true,
@@ -803,6 +807,37 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
},
},
+ "qemu_guest": {
+ Type: schema.TypeList,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "enabled": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
+ "enabled_agent_features": {
+ Type: schema.TypeList,
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
+ Computed: true,
+ },
+ "guid": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "last_update": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "user": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ },
+ },
+ Computed: true,
+ },
"ram": {
Type: schema.TypeInt,
Computed: true,
@@ -1047,6 +1082,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
}
return res
}
@@ -1146,7 +1185,6 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Default: false,
Description: "If set to true, ignores any VMs associated with any k8s cluster",
},
-
"items": {
Type: schema.TypeList,
Computed: true,
@@ -1158,7 +1196,7 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"explicit": {
- Type: schema.TypeString,
+ Type: schema.TypeBool,
Computed: true,
},
"guid": {
@@ -1519,6 +1557,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
},
},
},
+ "sdn_interface_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"target": {
Type: schema.TypeString,
Computed: true,
@@ -1527,6 +1569,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "trunk_tags": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"vnfs": {
Type: schema.TypeList,
Computed: true,
@@ -1537,6 +1583,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
},
},
},
+ "live_migration_job_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"lock_status": {
Type: schema.TypeString,
Computed: true,
@@ -1612,6 +1662,37 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
},
},
+ "qemu_guest": {
+ Type: schema.TypeList,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "enabled": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
+ "enabled_agent_features": {
+ Type: schema.TypeList,
+ Elem: &schema.Schema{
+ Type: schema.TypeString,
+ },
+ Computed: true,
+ },
+ "guid": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "last_update": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "user": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ },
+ },
+ Computed: true,
+ },
"ram": {
Type: schema.TypeInt,
Computed: true,
@@ -1762,6 +1843,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
},
},
},
@@ -1851,7 +1936,7 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"explicit": {
- Type: schema.TypeString,
+ Type: schema.TypeBool,
Computed: true,
},
"guid": {
@@ -2208,6 +2293,10 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
},
},
},
+ "sdn_interface_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"target": {
Type: schema.TypeString,
Computed: true,
@@ -2216,6 +2305,10 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "trunk_tags": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"vnfs": {
Type: schema.TypeList,
Computed: true,
@@ -2447,6 +2540,10 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
},
},
},
@@ -3133,7 +3230,7 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Required: true,
StateFunc: statefuncs.StateFuncToUpper,
- ValidateFunc: validation.StringInSlice([]string{"SVA_KVM_X86", "KVM_X86"}, false), // observe case while validating
+ ValidateFunc: validation.StringInSlice([]string{"KVM_X86"}, false), // observe case while validating
Description: "Hardware architecture of this compute instance.",
},
"cpu": {
@@ -3156,6 +3253,11 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Optional: true,
Description: "ID of the OS image to base this compute instance on.",
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ },
"chipset": {
Type: schema.TypeString,
Optional: true,
@@ -3241,8 +3343,8 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Required: true,
StateFunc: statefuncs.StateFuncToUpper,
- ValidateFunc: validation.StringInSlice([]string{"EXTNET", "VINS", "VFNIC", "DPDK"}, false), // observe case while validating
- Description: "Type of the network for this connection, either EXTNET or VINS.",
+ ValidateFunc: validation.StringInSlice([]string{"EXTNET", "VINS", "VFNIC", "DPDK", "SDN", "TRUNK"}, false), // observe case while validating
+ Description: "Type of the network for this connection",
},
"net_id": {
Type: schema.TypeInt,
@@ -3277,6 +3379,13 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
ValidateFunc: validation.IntBetween(1, 9216),
Description: "Maximum transmission unit, used only for DPDK type, must be 1-9216",
},
+ "sdn_interface_id": {
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ DiffSuppressFunc: networkSubresIPAddreDiffSupperss,
+ Description: "unique_identifier of LogicalPort on SDN side",
+ },
},
},
Description: "Optional network connection(s) for this compute. You may specify several network blocks, one for each connection.",
@@ -3749,7 +3858,7 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"explicit": {
- Type: schema.TypeString,
+ Type: schema.TypeBool,
Computed: true,
},
"guid": {
@@ -3979,6 +4088,10 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
},
},
},
+ "sdn_interface_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"target": {
Type: schema.TypeString,
Computed: true,
@@ -3987,6 +4100,10 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "trunk_tags": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"vnfs": {
Type: schema.TypeList,
Computed: true,
diff --git a/internal/service/cloudbroker/kvmvm/utility_compute.go b/internal/service/cloudbroker/kvmvm/utility_compute.go
index 5728ecce..81119a94 100644
--- a/internal/service/cloudbroker/kvmvm/utility_compute.go
+++ b/internal/service/cloudbroker/kvmvm/utility_compute.go
@@ -589,8 +589,7 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
oldList := oldSet.(*schema.Set).List()
newList := newSet.(*schema.Set).List()
- detachMap, changeIpMap, changeMacMap, attachMap := differenceNetwork(oldList, newList)
-
+ detachMap, changeIpMap, changeMacMap, changeMTUMap, attachMap := differenceNetwork(oldList, newList)
apiErrCount := 0
var lastSavedError error
@@ -697,6 +696,14 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
req.MACAddr = netData["mac"].(string)
}
+ if req.NetType == "DPDK" {
+ req.MTU = uint64(netData["mtu"].(int))
+ }
+
+ if netData["sdn_interface_id"].(string) != "" {
+ req.SDNInterfaceID = netData["sdn_interface_id"].(string)
+ }
+
_, err := c.CloudBroker().Compute().NetAttach(ctx, req)
if err != nil {
log.Errorf("utilityComputeNetworksConfigure: failed to attach net ID %d of type %s to Compute ID %s: %s",
@@ -759,6 +766,24 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
}
}
+ log.Debugf("utilityComputeNetworksConfigure: changeMTU set has %d items for Compute ID %s", len(changeMTUMap), d.Id())
+ for _, netData := range changeMTUMap {
+ computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
+ req := compute.ChangeMTURequest{
+ ComputeID: computeId,
+ Interface: netData["mac"].(string),
+ MTU: uint64(netData["mtu"].(int)),
+ }
+
+ _, err := c.CloudBroker().Compute().ChangeMTU(ctx, req)
+ if err != nil {
+ log.Errorf("utilityComputeNetworksConfigure: failed to change MTU ID %d of type %s from Compute ID %s: %s",
+ netData["net_id"].(int), netData["net_type"].(string), d.Id(), err)
+ apiErrCount++
+ lastSavedError = err
+ }
+ }
+
if apiErrCount > 0 {
log.Errorf("utilityComputeNetworksConfigure: there were %d error(s) when managing networks of Compute ID %s. Last error was: %s",
apiErrCount, d.Id(), lastSavedError)
@@ -768,17 +793,18 @@ func utilityComputeNetworksConfigure(ctx context.Context, d *schema.ResourceData
return nil
}
-func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap, changeMacMap, attachMap []map[string]interface{}) {
+func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap, changeMacMap, changeMTUMap, attachMap []map[string]interface{}) {
attachMap = make([]map[string]interface{}, 0)
changeIpMap = make([]map[string]interface{}, 0)
changeMacMap = make([]map[string]interface{}, 0)
+ changeMTUMap = make([]map[string]interface{}, 0)
detachMap = make([]map[string]interface{}, 0)
for _, oldNetwork := range oldList {
oldMap := oldNetwork.(map[string]interface{})
found := false
for _, newNetwork := range newList {
newMap := newNetwork.(map[string]interface{})
- if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] && (newMap["mtu"] == oldMap["mtu"] || newMap["mtu"].(int) == 0) {
+ if compareNetwork(newMap, oldMap) {
found = true
if (newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "VINS") && (newMap["ip_address"] != oldMap["ip_address"] && newMap["ip_address"].(string) != "") {
changeIpMap = append(changeIpMap, newMap)
@@ -787,6 +813,9 @@ func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap,
newMap["old_mac"] = oldMap["mac"]
changeMacMap = append(changeMacMap, newMap)
}
+ if (newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "DPDK") && (newMap["mtu"] != oldMap["mtu"] && newMap["mtu"].(int) != 0) {
+ changeMTUMap = append(changeMTUMap, newMap)
+ }
}
if found {
break
@@ -803,7 +832,7 @@ func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap,
found := false
for _, oldNetwork := range oldList {
oldMap := oldNetwork.(map[string]interface{})
- if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] && (newMap["mtu"] == oldMap["mtu"] || newMap["mtu"].(int) == 0) {
+ if compareNetwork(newMap, oldMap) {
found = true
break
}
@@ -817,6 +846,10 @@ func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap,
return
}
+func compareNetwork(newMap, oldMap map[string]interface{}) bool {
+ return newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["sdn_interface_id"] == oldMap["sdn_interface_id"] && newMap["weight"] == oldMap["weight"]
+}
+
func hasDPDKnetwork(networkAttachMap []map[string]interface{}) bool {
for _, elem := range networkAttachMap {
if elem["net_type"].(string) == "DPDK" {
@@ -1587,6 +1620,28 @@ func utilityComputeUpdateImage(ctx context.Context, d *schema.ResourceData, m in
return nil
}
+func utilityComputeUpdateZoneID(ctx context.Context, d *schema.ResourceData, m interface{}) error {
+ c := m.(*controller.ControllerCfg)
+
+ computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
+
+ req := compute.MigrateToZoneRequest{
+ ComputeID: computeId,
+ }
+
+ zoneID, ok := d.GetOk("zone_id")
+ if ok {
+ req.ZoneID = uint64(zoneID.(int))
+ }
+
+ _, err := c.CloudBroker().Compute().MigrateToZone(ctx, req)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
func utilityComputeUpdateCustomFields(ctx context.Context, d *schema.ResourceData, m interface{}) error {
c := m.(*controller.ControllerCfg)
diff --git a/internal/service/cloudbroker/lb/flattens.go b/internal/service/cloudbroker/lb/flattens.go
index b3c17da4..40a26e56 100644
--- a/internal/service/cloudbroker/lb/flattens.go
+++ b/internal/service/cloudbroker/lb/flattens.go
@@ -93,6 +93,7 @@ func flattenResourceLBBackend(d *schema.ResourceData, b *lb.ItemBackend, lbId in
}
func flattenLB(d *schema.ResourceData, lb *lb.RecordLB) {
+ d.Set("account_id", lb.AccountID)
d.Set("ha_mode", lb.HAMode)
d.Set("ckey", lb.CKey)
d.Set("meta", flattens.FlattenMeta(lb.Meta))
@@ -121,6 +122,7 @@ func flattenLB(d *schema.ResourceData, lb *lb.RecordLB) {
d.Set("tech_status", lb.TechStatus)
d.Set("user_managed", lb.UserManaged)
d.Set("vins_id", lb.VINSID)
+ d.Set("zone_id", lb.ZoneID)
}
func flattenNode(node lb.Node) []map[string]interface{} {
@@ -253,6 +255,7 @@ func flattenLBList(lbl *lb.ListLB) []map[string]interface{} {
"updated_time": lb.UpdatedTime,
"user_managed": lb.UserManaged,
"vins_id": lb.VINSID,
+ "zone_id": lb.ZoneID,
}
res = append(res, temp)
}
diff --git a/internal/service/cloudbroker/lb/resource_lb.go b/internal/service/cloudbroker/lb/resource_lb.go
index 320d2a7c..4838ddda 100644
--- a/internal/service/cloudbroker/lb/resource_lb.go
+++ b/internal/service/cloudbroker/lb/resource_lb.go
@@ -67,6 +67,9 @@ func resourceLBCreate(ctx context.Context, d *schema.ResourceData, m interface{}
if desc, ok := d.GetOk("desc"); ok {
req.Description = desc.(string)
}
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ req.ZoneID = uint64(zoneID.(int))
+ }
if haMode, ok := d.GetOk("ha_mode"); ok {
req.HighlyAvailable = haMode.(bool)
}
@@ -303,6 +306,12 @@ func resourceLBUpdate(ctx context.Context, d *schema.ResourceData, m interface{}
}
}
+ if d.HasChange("zone_id") {
+ if err := resourceLbChangeZoneID(ctx, d, lbRec.ID, m); err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
if d.HasChange("sysctl_params") {
if err := resourceLbChangeSysctlParams(ctx, d, lbRec.ID, m); err != nil {
return diag.FromErr(err)
@@ -436,6 +445,46 @@ func resourceLbChangeHaMode(ctx context.Context, d *schema.ResourceData, lbId ui
return nil
}
+func resourceLbChangeZoneID(ctx context.Context, d *schema.ResourceData, lbId uint64, m interface{}) error {
+ c := m.(*controller.ControllerCfg)
+
+ start := d.Get("start").(bool)
+
+ if start {
+ reqStop := lb.StopRequest{
+ LBID: uint64(d.Get("lb_id").(int)),
+ }
+
+ _, err := c.CloudBroker().LB().Stop(ctx, reqStop)
+ if err != nil {
+ return err
+ }
+ }
+
+ req := lb.MigrateToZoneRequest{
+ LBID: uint64(d.Get("lb_id").(int)),
+ ZoneID: uint64(d.Get("zone_id").(int)),
+ }
+
+ _, err := c.CloudBroker().LB().MigrateToZone(ctx, req)
+ if err != nil {
+ return err
+ }
+
+ if start {
+ reqStart := lb.StartRequest{
+ LBID: uint64(d.Get("lb_id").(int)),
+ }
+
+ _, err = c.CloudBroker().LB().Start(ctx, reqStart)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
func resourceLbChangeStart(ctx context.Context, d *schema.ResourceData, lbId uint64, m interface{}) error {
c := m.(*controller.ControllerCfg)
start := d.Get("start").(bool)
diff --git a/internal/service/cloudbroker/lb/schema.go b/internal/service/cloudbroker/lb/schema.go
index 735dfef9..dc3db8b1 100644
--- a/internal/service/cloudbroker/lb/schema.go
+++ b/internal/service/cloudbroker/lb/schema.go
@@ -43,6 +43,10 @@ func dsLBSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Required: true,
},
+ "account_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"ha_mode": {
Type: schema.TypeBool,
Computed: true,
@@ -51,6 +55,11 @@ func dsLBSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ },
"meta": {
Type: schema.TypeList,
Computed: true,
@@ -456,6 +465,10 @@ func dsLBListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"backends": {
Type: schema.TypeList,
Computed: true,
@@ -473,6 +486,10 @@ func dsLBListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"server_default_settings": {
Type: schema.TypeList,
Computed: true,
@@ -885,6 +902,10 @@ func dsLBListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
"backend_haip": {
Type: schema.TypeString,
Computed: true,
@@ -1258,6 +1279,11 @@ func lbResourceSchemaMake() map[string]*schema.Schema {
Optional: true,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ },
"vins_id": {
Type: schema.TypeInt,
Optional: true,
diff --git a/internal/service/cloudbroker/node/flattens.go b/internal/service/cloudbroker/node/flattens.go
index 6a5e3fca..0b1003e5 100644
--- a/internal/service/cloudbroker/node/flattens.go
+++ b/internal/service/cloudbroker/node/flattens.go
@@ -66,6 +66,7 @@ func flattenNode(d *schema.ResourceData, item *node.RecordNode) {
d.Set("to_maintenance", flattenRole(item.ToMaintenance))
d.Set("to_restricted", flattenRole(item.ToRestricted))
d.Set("version", item.Version)
+ d.Set("zone_id", item.ZoneID)
}
func flattenConsumption(info node.ConsumptionInfo) []map[string]interface{} {
@@ -113,46 +114,48 @@ func flattenNodeList(nodes *node.ListNodes) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(nodes.Data))
for _, item := range nodes.Data {
temp := map[string]interface{}{
- "additional_pkgs": flattenNodeItem(item.AdditionalPkgs),
- "cpu_info": flattenCpuInfo(item.CpuInfo),
- "description": item.Description,
- "dpdk": flattenDPDKItem(item.DPDK),
- "gid": item.GID,
- "guid": item.GUID,
- "hostkey": item.HostKey,
- "node_id": item.ID,
- "ipaddr": item.IPAddr,
- "isolated_cpus": flattenNodeItem(item.IsolatedCpus),
- "lastcheck": item.LastCheck,
- "machine_guid": item.MachineGUID,
- "mainboard_sn": item.MainboardSN,
- "memory": item.Memory,
- "milestones": item.Milestones,
- "model": item.Model,
- "name": item.Name,
- "need_reboot": item.NeedReboot,
- "net_addr": flattenNetAddr(item.NetAddr),
- "network_mode": item.NetworkMode,
- "nic_info": flattenNicInfo(item.NicInfo),
- "node_uuid": item.NodeUUID,
- "numa_topology": flattenNumaTopology(item.NumaTopology),
- "peer_backup": item.PeerBackup,
- "peer_log": item.PeerLog,
- "peer_stats": item.PeerStats,
- "pgpus": item.Pgpus,
- "public_keys": item.PublicKeys,
- "release": item.Release,
- "reserved_cpus": flattenNodeItem(item.ReservedCPUs),
- "roles": item.Roles,
- "seps": item.Seps,
- "serial_num": item.SerialNum,
- "sriov_enabled": item.SriovEnabled,
- "stack_id": item.StackID,
- "status": item.Status,
- "tags": item.Tags,
- "type": item.Type,
- "uefi_firmware_file": item.UEFIFirmwareFile,
- "version": item.Version,
+ "additional_pkgs": flattenNodeItem(item.AdditionalPkgs),
+ "cpu_info": flattenCpuInfo(item.CpuInfo),
+ "description": item.Description,
+ "dpdk": flattenDPDKItem(item.DPDK),
+ "gid": item.GID,
+ "guid": item.GUID,
+ "hostkey": item.HostKey,
+ "node_id": item.ID,
+ "ipaddr": item.IPAddr,
+ "isolated_cpus": flattenNodeItem(item.IsolatedCpus),
+ "lastcheck": item.LastCheck,
+ "machine_guid": item.MachineGUID,
+ "mainboard_sn": item.MainboardSN,
+ "memory": item.Memory,
+ "milestones": item.Milestones,
+ "model": item.Model,
+ "name": item.Name,
+ "need_reboot": item.NeedReboot,
+ "net_addr": flattenNetAddr(item.NetAddr),
+ "network_mode": item.NetworkMode,
+ "nic_info": flattenNicInfo(item.NicInfo),
+ "node_uuid": item.NodeUUID,
+ "numa_topology": flattenNumaTopology(item.NumaTopology),
+ "peer_backup": item.PeerBackup,
+ "peer_log": item.PeerLog,
+ "peer_stats": item.PeerStats,
+ "pgpus": item.Pgpus,
+ "public_keys": item.PublicKeys,
+ "release": item.Release,
+ "reserved_cpus": flattenNodeItem(item.ReservedCPUs),
+ "roles": item.Roles,
+ "sdn_hypervisor_name": item.SDNHypervisorName,
+ "seps": item.Seps,
+ "serial_num": item.SerialNum,
+ "sriov_enabled": item.SriovEnabled,
+ "stack_id": item.StackID,
+ "status": item.Status,
+ "tags": item.Tags,
+ "type": item.Type,
+ "uefi_firmware_file": item.UEFIFirmwareFile,
+ "version": item.Version,
+ "zone_id": item.ZoneID,
}
res = append(res, temp)
}
diff --git a/internal/service/cloudbroker/node/schema.go b/internal/service/cloudbroker/node/schema.go
index ed48196e..8de1a6b5 100644
--- a/internal/service/cloudbroker/node/schema.go
+++ b/internal/service/cloudbroker/node/schema.go
@@ -409,6 +409,10 @@ func dataSourceNodeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
}
}
@@ -798,6 +802,10 @@ func dataSourceNodeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
+ "sdn_hypervisor_name": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"seps": {
Type: schema.TypeList,
Computed: true,
@@ -840,6 +848,10 @@ func dataSourceNodeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
},
},
},
diff --git a/internal/service/cloudbroker/rg/flattens.go b/internal/service/cloudbroker/rg/flattens.go
index 0737f187..5b1360aa 100644
--- a/internal/service/cloudbroker/rg/flattens.go
+++ b/internal/service/cloudbroker/rg/flattens.go
@@ -40,6 +40,7 @@ func flattenResgroup(d *schema.ResourceData, rgData *rg.RecordRG) {
d.Set("updated_time", rgData.UpdatedTime)
d.Set("vins", rgData.VINS)
d.Set("computes", rgData.VMs)
+ d.Set("sdn_access_group_id", rgData.SDNAccessGroupID)
}
func flattenRgAcl(rgACLs rg.ListACL) []map[string]interface{} {
@@ -411,6 +412,7 @@ func flattenRgList(rgl *rg.ListRG) []map[string]interface{} {
"updated_time": rg.UpdatedTime,
"vins": rg.VINS,
"vms": rg.VMs,
+ "sdn_access_group_id": rg.SDNAccessGroupID,
}
res = append(res, temp)
}
@@ -495,4 +497,5 @@ func flattenResourceRG(d *schema.ResourceData, rgData *rg.RecordRG) {
d.Set("updated_time", rgData.UpdatedTime)
d.Set("vins", rgData.VINS)
d.Set("vms", rgData.VMs)
+ d.Set("sdn_access_group_id", rgData.SDNAccessGroupID)
}
diff --git a/internal/service/cloudbroker/rg/resource_rg.go b/internal/service/cloudbroker/rg/resource_rg.go
index eb5c55cb..d771a8a7 100644
--- a/internal/service/cloudbroker/rg/resource_rg.go
+++ b/internal/service/cloudbroker/rg/resource_rg.go
@@ -137,6 +137,10 @@ func resourceResgroupCreate(ctx context.Context, d *schema.ResourceData, m inter
}
}
+ if sdnAccessGroupID, ok := d.GetOk("sdn_access_group_id"); ok {
+ req.SDNAccessGroupID = sdnAccessGroupID.(string)
+ }
+
rgID, err := c.CloudBroker().RG().Create(ctx, req)
if err != nil {
d.SetId("")
diff --git a/internal/service/cloudbroker/rg/schema.go b/internal/service/cloudbroker/rg/schema.go
index afab8651..8d496b44 100644
--- a/internal/service/cloudbroker/rg/schema.go
+++ b/internal/service/cloudbroker/rg/schema.go
@@ -199,6 +199,10 @@ func dataSourceRgSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
},
},
+ "sdn_access_group_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
}
}
@@ -1967,6 +1971,10 @@ func dataSourceRgListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString,
},
},
+ "sdn_access_group_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
},
},
},
@@ -2375,9 +2383,15 @@ func resourceRgSchemaMake() map[string]*schema.Schema {
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
- ValidateFunc: validation.StringInSlice([]string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac"}, true),
+ ValidateFunc: validation.StringInSlice([]string{"hugepages", "numa", "cpupin", "vfnic", "dpdk", "changemac", "trunk"}, true),
},
},
+ "sdn_access_group_id": {
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ Description: "ID of the SDN access group",
+ },
"acl": {
Type: schema.TypeList,
diff --git a/internal/service/cloudbroker/trunk/data_source_trunk.go b/internal/service/cloudbroker/trunk/data_source_trunk.go
new file mode 100644
index 00000000..3fc924ad
--- /dev/null
+++ b/internal/service/cloudbroker/trunk/data_source_trunk.go
@@ -0,0 +1,45 @@
+package trunk
+
+import (
+ "context"
+
+ "github.com/google/uuid"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
+)
+
+func dataSourceTrunkRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+
+ log.Debugf("dataSourceTrunkRead: called with name %s", d.Get("name").(string))
+
+ w := dc.Warnings{}
+ trunkItem, err := utilityTrunkCheckPresence(ctx, d, m)
+ if err != nil {
+ d.SetId("")
+ return diag.FromErr(err)
+ }
+
+ id := uuid.New()
+ d.SetId(id.String())
+ flattenTrunk(d, trunkItem)
+
+ return w.Get()
+}
+
+func DataSourceTrunk() *schema.Resource {
+ return &schema.Resource{
+ SchemaVersion: 1,
+
+ ReadContext: dataSourceTrunkRead,
+
+ Timeouts: &schema.ResourceTimeout{
+ Read: &constants.Timeout30s,
+ Default: &constants.Timeout60s,
+ },
+
+ Schema: dataSourceTrunkSchemaMake(),
+ }
+}
diff --git a/internal/service/cloudbroker/trunk/data_source_trunk_list.go b/internal/service/cloudbroker/trunk/data_source_trunk_list.go
new file mode 100644
index 00000000..76ea5eeb
--- /dev/null
+++ b/internal/service/cloudbroker/trunk/data_source_trunk_list.go
@@ -0,0 +1,43 @@
+package trunk
+
+import (
+ "context"
+
+ "github.com/google/uuid"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
+)
+
+func dataSourceTrunkListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ w := dc.Warnings{}
+ trunkList, err := utilityTrunkListCheckPresence(ctx, d, m)
+ if err != nil {
+ d.SetId("")
+ return diag.FromErr(err)
+ }
+
+ id := uuid.New()
+ d.SetId(id.String())
+
+ d.Set("items", flattenTrunkList(trunkList))
+ d.Set("entry_count", trunkList.EntryCount)
+
+ return w.Get()
+}
+
+func DataSourceTrunkList() *schema.Resource {
+ return &schema.Resource{
+ SchemaVersion: 1,
+
+ ReadContext: dataSourceTrunkListRead,
+
+ Timeouts: &schema.ResourceTimeout{
+ Read: &constants.Timeout30s,
+ Default: &constants.Timeout60s,
+ },
+
+ Schema: dataSourceTrunkListSchemaMake(),
+ }
+}
diff --git a/internal/service/cloudbroker/trunk/flattens.go b/internal/service/cloudbroker/trunk/flattens.go
new file mode 100644
index 00000000..b7591780
--- /dev/null
+++ b/internal/service/cloudbroker/trunk/flattens.go
@@ -0,0 +1,78 @@
+package trunk
+
+import (
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk"
+)
+
+func flattenTrunkResource(d *schema.ResourceData, details *trunk.ItemTrunk) {
+ log.Debugf("flattenTrunk: decoded Trunk ID %s",
+ details.ID)
+
+ d.Set("trunk_id", details.ID)
+ d.Set("guid", details.GUID)
+ d.Set("name", details.Name)
+ d.Set("mac", details.MAC)
+ d.Set("description", details.Description)
+ d.Set("accountIds", details.AccountIDs)
+ d.Set("ovsBridge", details.OVSBridge)
+ d.Set("nativeVlanId", details.NativeVLANID)
+ d.Set("status", details.Status)
+ d.Set("trunkTags", details.TrunkTags)
+ d.Set("created_at", details.CreatedAt)
+ d.Set("created_by", details.CreatedBy)
+ d.Set("updated_at", details.UpdatedAt)
+ d.Set("updated_by", details.UpdatedBy)
+ d.Set("deleted_at", details.DeletedAt)
+ d.Set("deleted_by", details.DeletedBy)
+}
+
+func flattenTrunk(d *schema.ResourceData, trunkItem *trunk.ItemTrunk) {
+ log.Debugf("flattenTrunk: decoded Trunk ID %d",
+ trunkItem.ID)
+
+ d.Set("trunk_id", trunkItem.ID)
+ d.Set("guid", trunkItem.GUID)
+ d.Set("name", trunkItem.Name)
+ d.Set("mac", trunkItem.MAC)
+ d.Set("description", trunkItem.Description)
+ d.Set("account_ids", trunkItem.AccountIDs)
+ d.Set("ovs_bridge", trunkItem.OVSBridge)
+ d.Set("native_vlan_id", trunkItem.NativeVLANID)
+ d.Set("status", trunkItem.Status)
+ d.Set("trunk_tags", trunkItem.TrunkTags)
+ d.Set("created_at", trunkItem.CreatedAt)
+ d.Set("created_by", trunkItem.CreatedBy)
+ d.Set("updated_at", trunkItem.UpdatedAt)
+ d.Set("updated_by", trunkItem.UpdatedBy)
+ d.Set("deleted_at", trunkItem.DeletedAt)
+ d.Set("deleted_by", trunkItem.DeletedBy)
+}
+
+func flattenTrunkList(trunkList *trunk.ListTrunks) []map[string]interface{} {
+ res := make([]map[string]interface{}, 0, len(trunkList.Data))
+ for _, trunkItem := range trunkList.Data {
+ temp := map[string]interface{}{
+ "account_ids": trunkItem.AccountIDs,
+ "created_at": trunkItem.CreatedAt,
+ "created_by": trunkItem.CreatedBy,
+ "deleted_at": trunkItem.DeletedAt,
+ "deleted_by": trunkItem.DeletedBy,
+ "description": trunkItem.Description,
+ "guid": trunkItem.GUID,
+ "id": trunkItem.ID,
+ "mac": trunkItem.MAC,
+ "name": trunkItem.Name,
+ "native_vlan_id": trunkItem.NativeVLANID,
+ "ovs_bridge": trunkItem.OVSBridge,
+ "status": trunkItem.Status,
+ "trunk_tags": trunkItem.TrunkTags,
+ "updated_at": trunkItem.UpdatedAt,
+ "updated_by": trunkItem.UpdatedBy,
+ }
+ res = append(res, temp)
+ }
+
+ return res
+}
diff --git a/internal/service/cloudbroker/trunk/resource_trunk.go b/internal/service/cloudbroker/trunk/resource_trunk.go
new file mode 100644
index 00000000..b9bdc867
--- /dev/null
+++ b/internal/service/cloudbroker/trunk/resource_trunk.go
@@ -0,0 +1,211 @@
+package trunk
+
+import (
+ "context"
+ "strconv"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
+)
+
+func resourceTrunkCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+
+ log.Debugf("resourceTrunkCreate: called with name %s, trunk_tags %s, ovs_bridge %s", d.Get("name").(string), d.Get("trunk_tags").(string), d.Get("ovs_bridge").(string))
+
+ c := m.(*controller.ControllerCfg)
+
+ warnings := dc.Warnings{}
+
+ name := d.Get("name").(string)
+
+ trunkTags := d.Get("trunk_tags").(string)
+
+ ovsBridge := d.Get("ovs_bridge").(string)
+
+ createReq := trunk.CreateRequest{
+ Name: name,
+ TrunkTags: trunkTags,
+ OVSBridge: ovsBridge,
+ }
+
+ if description, ok := d.GetOk("description"); ok {
+ createReq.Description = description.(string)
+ }
+
+ accountIDs := make([]uint64, 0)
+
+ if accountAccess, ok := d.GetOk("account_ids"); ok {
+ IDs := accountAccess.(*schema.Set).List()
+
+ for _, ID := range IDs {
+ accountIDs = append(accountIDs, uint64(ID.(int)))
+ }
+ createReq.AccountIDs = accountIDs
+ }
+
+ if nativeVLANID, ok := d.GetOk("native_vlan_id"); ok {
+ createReq.NativeVLANID = uint64(nativeVLANID.(int))
+ }
+
+ trunkID, err := c.CloudBroker().Trunk().Create(ctx, createReq)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ d.SetId(strconv.FormatUint(trunkID, 10))
+ d.Set("trunk_id", trunkID)
+
+ if _, ok := d.GetOk("enable"); ok {
+ if err := handleTrunkEnabling(ctx, d, c, trunkID); err != nil {
+ warnings.Add(err)
+ }
+ }
+
+ return append(warnings.Get(), resourceTrunkRead(ctx, d, m)...)
+}
+
+func resourceTrunkRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+
+ log.Debugf("resourceTrunkRead: called with name %s", d.Get("name").(string))
+
+ w := dc.Warnings{}
+
+ trunkItem, err := utilityTrunkCheckPresence(ctx, d, m)
+ if err != nil {
+
+ d.SetId("")
+
+ return diag.FromErr(err)
+ }
+ flattenTrunkResource(d, trunkItem)
+
+ return w.Get()
+}
+
+func resourceTrunkUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+
+ log.Debugf("resourceTrunkUpdate: called with id %s", d.Id())
+ c := m.(*controller.ControllerCfg)
+
+ trunkItem, err := utilityTrunkCheckPresence(ctx, d, m)
+ if err != nil {
+
+ d.SetId("")
+
+ return diag.FromErr(err)
+ }
+
+ id, err := strconv.ParseInt(d.Id(), 10, 64)
+ if err != nil {
+
+ d.SetId("")
+
+ return diag.FromErr(err)
+ }
+
+ if d.HasChanges("name", "trunk_tags", "description", "native_vlan_id") {
+ req := trunk.UpdateRequest{
+ TrunkID: uint64(id),
+ Name: d.Get("name").(string),
+ TrunkTags: d.Get("trunk_tags").(string),
+ }
+
+ if d.HasChange("description") {
+ description := d.Get("description").(string)
+ req.Description = description
+ }
+
+ if d.HasChange("native_vlan_id") {
+ nativeVLANID := uint64(d.Get("native_vlan_id").(int))
+ req.NativeVLANID = nativeVLANID
+ }
+
+ if _, err := c.CloudBroker().Trunk().Update(ctx, req); err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
+ if d.HasChange("enable") {
+ if err := handleTrunkEnabling(ctx, d, c, uint64(id)); err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
+ if d.HasChange("account_ids") {
+ if err := handleAccountAccessUpdate(ctx, d, c, trunkItem); err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
+ return resourceTrunkRead(ctx, d, m)
+}
+
+func resourceTrunkDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+
+ log.Debugf("resourceTrunkDelete: called with id %s", d.Id())
+
+ trunkItem, err := utilityTrunkCheckPresence(ctx, d, m)
+ if err != nil {
+
+ d.SetId("")
+ return diag.FromErr(err)
+ }
+
+ c := m.(*controller.ControllerCfg)
+
+ req := trunk.DestroyRequest{
+ TrunkID: trunkItem.ID,
+ }
+
+ _, err = c.CloudBroker().Trunk().Destroy(ctx, req)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ d.SetId("")
+
+ return nil
+}
+
+func ResourceTrunk() *schema.Resource {
+ return &schema.Resource{
+ SchemaVersion: 2,
+
+ CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, i interface{}) error {
+ if diff.HasChanges() || diff.HasChanges("name", "trunk_tags", "description", "native_vlan_id", "account_ids") {
+ diff.SetNewComputed("updated_time")
+ diff.SetNewComputed("updated_by")
+ }
+ if diff.HasChanges("enable") {
+ diff.SetNewComputed("status")
+ diff.SetNewComputed("updated_time")
+ diff.SetNewComputed("updated_by")
+ }
+ return nil
+ },
+
+ CreateContext: resourceTrunkCreate,
+ ReadContext: resourceTrunkRead,
+ UpdateContext: resourceTrunkUpdate,
+ DeleteContext: resourceTrunkDelete,
+
+ Importer: &schema.ResourceImporter{
+ StateContext: schema.ImportStatePassthroughContext,
+ },
+
+ Timeouts: &schema.ResourceTimeout{
+ Create: &constants.Timeout600s,
+ Read: &constants.Timeout600s,
+ Update: &constants.Timeout600s,
+ Delete: &constants.Timeout600s,
+ Default: &constants.Timeout600s,
+ },
+
+ Schema: resourceTrunkSchemaMake(),
+ }
+}
diff --git a/internal/service/cloudbroker/trunk/schema.go b/internal/service/cloudbroker/trunk/schema.go
new file mode 100644
index 00000000..a22ab4e7
--- /dev/null
+++ b/internal/service/cloudbroker/trunk/schema.go
@@ -0,0 +1,336 @@
+package trunk
+
+import (
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+)
+
+func resourceTrunkSchemaMake() map[string]*schema.Schema {
+ log.Debugf("resourceTrunkSchemaMake: invoked")
+ return map[string]*schema.Schema{
+ "trunk_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "trunk id",
+ },
+ "name": {
+ Type: schema.TypeString,
+ Required: true,
+ Description: "Name of the trunk",
+ },
+ "trunk_tags": {
+ Type: schema.TypeString,
+ Required: true,
+ Description: "List of trunk tags (values between 1-4095)",
+ },
+ "ovs_bridge": {
+ Type: schema.TypeString,
+ Required: true,
+ Description: "OVS bridge name",
+ },
+ "description": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Description of the trunk",
+ },
+ "account_ids": {
+ Type: schema.TypeSet,
+ Optional: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ Description: "List of account IDs with access to this trunk",
+ },
+ "native_vlan_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Native VLAN ID",
+ },
+ "enable": {
+ Type: schema.TypeBool,
+ Optional: true,
+ Default: true,
+ Description: "Whether the trunk should be enabled",
+ },
+ "guid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "GUID",
+ },
+ "mac": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "MAC address",
+ },
+ "status": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "if the trunk is enabled",
+ },
+ "created_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was created",
+ },
+ "created_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who created the trunk",
+ },
+ "updated_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was updated",
+ },
+ "updated_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who updated the trunk",
+ },
+ "deleted_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was updated",
+ },
+ "deleted_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who updated the trunk",
+ },
+ }
+}
+
+func dataSourceTrunkSchemaMake() map[string]*schema.Schema {
+ log.Debugf("dataSourceTrunkSchemaMake: invoked")
+
+ res := map[string]*schema.Schema{
+ "trunk_id": {
+ Type: schema.TypeInt,
+ Required: true,
+ Description: "trunk id",
+ },
+ "guid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "GUID",
+ },
+ "name": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Name of the trunk",
+ },
+ "mac": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "MAC address",
+ },
+ "description": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Description of the trunk",
+ },
+ "account_ids": {
+ Type: schema.TypeSet,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ Description: "List of account IDs with access to this trunk",
+ },
+ "ovs_bridge": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "OVS bridge name",
+ },
+ "native_vlan_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "Native VLAN ID",
+ },
+ "status": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "if the trunk is enabled",
+ },
+ "trunk_tags": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "List of trunk tags (values between 1-4095)",
+ },
+ "created_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was created",
+ },
+ "created_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who created the trunk",
+ },
+ "updated_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was updated",
+ },
+ "updated_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who updated the trunk",
+ },
+ "deleted_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was updated",
+ },
+ "deleted_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who updated the trunk",
+ },
+ }
+
+ return res
+}
+
+func dataSourceTrunkListSchemaMake() map[string]*schema.Schema {
+ res := map[string]*schema.Schema{
+ "trunk_ids": {
+ Type: schema.TypeList,
+ Optional: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ Description: "ID of the trunk(s) to filter by",
+ },
+ "account_ids": {
+ Type: schema.TypeList,
+ Optional: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ Description: "Account access ID(s) to filter by",
+ },
+ "trunk_tags": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Trunk tags to filter by (value between 1-4095)",
+ },
+ "page": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Page number.",
+ },
+ "size": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Page size.",
+ },
+ "status": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "find by status",
+ },
+ "sort_by": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Sort by one of supported fields, format ±",
+ },
+ "items": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "account_ids": {
+ Type: schema.TypeSet,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ Description: "List of account IDs with access to this trunk",
+ },
+ "created_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was created",
+ },
+ "created_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who created the trunk",
+ },
+ "deleted_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was updated",
+ },
+ "deleted_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who updated the trunk",
+ },
+ "description": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Description of the trunk",
+ },
+ "guid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "GUID",
+ },
+ "id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "Trunk ID",
+ },
+ "mac": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "MAC address",
+ },
+ "name": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "Name of the trunk",
+ },
+ "native_vlan_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "Native VLAN ID",
+ },
+ "ovs_bridge": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "OVS bridge name",
+ },
+ "status": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "if the trunk is enabled",
+ },
+ "trunk_tags": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "List of trunk tags (values between 1-4095)",
+ },
+ "updated_at": {
+ Type: schema.TypeInt,
+ Computed: true,
+ Description: "when the trunk was updated",
+ },
+ "updated_by": {
+ Type: schema.TypeString,
+ Computed: true,
+ Description: "who updated the trunk",
+ },
+ },
+ },
+ },
+ "entry_count": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ }
+
+ return res
+}
diff --git a/internal/service/cloudbroker/trunk/utility_trunk.go b/internal/service/cloudbroker/trunk/utility_trunk.go
new file mode 100644
index 00000000..2960d839
--- /dev/null
+++ b/internal/service/cloudbroker/trunk/utility_trunk.go
@@ -0,0 +1,104 @@
+package trunk
+
+import (
+ "context"
+ "strconv"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
+)
+
+func utilityTrunkCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*trunk.ItemTrunk, error) {
+ c := m.(*controller.ControllerCfg)
+ req := trunk.GetRequest{}
+
+ if d.Id() != "" {
+ id, err := strconv.ParseInt(d.Id(), 10, 64)
+ if err != nil {
+ return nil, err
+ }
+
+ req.TrunkID = uint64(id)
+ } else {
+ req.TrunkID = uint64(d.Get("trunk_id").(int))
+ }
+
+ trunkInfo, err := c.CloudBroker().Trunk().Get(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+
+ return trunkInfo, nil
+}
+
+func handleAccountAccessUpdate(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg, trnk *trunk.ItemTrunk) error {
+ oldSet, newSet := d.GetChange("account_ids")
+
+ revokeSet := oldSet.(*schema.Set).Difference(newSet.(*schema.Set))
+ if revokeSet.Len() > 0 {
+ accountIDs := make([]uint64, 0)
+ for _, revokeAccountID := range revokeSet.List() {
+ accountIDs = append(accountIDs, uint64(revokeAccountID.(int)))
+ }
+
+ log.Debugf("cloudbroker: revoking access from %d account IDs", revokeSet.Len())
+
+ req := trunk.AccessRevokeRequest{
+ TrunkID: trnk.ID,
+ AccountIDs: accountIDs,
+ }
+
+ _, err := c.CloudBroker().Trunk().AccessRevoke(ctx, req)
+ if err != nil {
+ return err
+ }
+ }
+
+ grantSet := newSet.(*schema.Set).Difference(oldSet.(*schema.Set))
+ if grantSet.Len() > 0 {
+ accountIDs := make([]uint64, 0)
+ for _, grantAccountID := range grantSet.List() {
+ accountIDs = append(accountIDs, uint64(grantAccountID.(int)))
+ }
+
+ log.Debugf("cloudbroker: granting access to %d account IDs", grantSet.Len())
+
+ req := trunk.AccessGrantRequest{
+ TrunkID: trnk.ID,
+ AccountIDs: accountIDs,
+ }
+
+ _, err := c.CloudBroker().Trunk().AccessGrant(ctx, req)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+func handleTrunkEnabling(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg, trunkID uint64) error {
+ if d.Get("enable").(bool) {
+ req := trunk.EnableRequest{
+ TrunkID: trunkID,
+ }
+
+ _, err := c.CloudBroker().Trunk().Enable(ctx, req)
+ if err != nil {
+ return err
+ }
+ } else {
+ req := trunk.DisableRequest{
+ TrunkID: trunkID,
+ }
+
+ _, err := c.CloudBroker().Trunk().Disable(ctx, req)
+ if err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
diff --git a/internal/service/cloudbroker/trunk/utility_trunk_list.go b/internal/service/cloudbroker/trunk/utility_trunk_list.go
new file mode 100644
index 00000000..9b359aca
--- /dev/null
+++ b/internal/service/cloudbroker/trunk/utility_trunk_list.go
@@ -0,0 +1,48 @@
+package trunk
+
+import (
+ "context"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/trunk"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
+)
+
+func utilityTrunkListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*trunk.ListTrunks, error) {
+ c := m.(*controller.ControllerCfg)
+ req := trunk.ListRequest{}
+
+ if trunkIDs, ok := d.GetOk("trunk_ids"); ok {
+ IDs := trunkIDs.([]interface{})
+ for _, id := range IDs {
+ req.IDs = append(req.IDs, uint64(id.(int)))
+ }
+ }
+ if accountIDs, ok := d.GetOk("account_ids"); ok {
+ IDs := accountIDs.([]interface{})
+ for _, id := range IDs {
+ req.AccountIDs = append(req.AccountIDs, uint64(id.(int)))
+ }
+ }
+ if trunkTags, ok := d.GetOk("trunk_tags"); ok {
+ req.TrunkTags = trunkTags.(string)
+ }
+ if sortBy, ok := d.GetOk("sort_by"); ok {
+ req.SortBy = sortBy.(string)
+ }
+ if page, ok := d.GetOk("page"); ok {
+ req.Page = uint64(page.(int))
+ }
+ if size, ok := d.GetOk("size"); ok {
+ req.Size = uint64(size.(int))
+ }
+
+ log.Debugf("utilityTrunkListCheckPresence: load trunk network list")
+ trunkList, err := c.CloudBroker().Trunk().List(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+
+ return trunkList, nil
+}
diff --git a/internal/service/cloudbroker/user/flattens.go b/internal/service/cloudbroker/user/flattens.go
index 459b77ed..8c3de595 100644
--- a/internal/service/cloudbroker/user/flattens.go
+++ b/internal/service/cloudbroker/user/flattens.go
@@ -53,6 +53,7 @@ func flattenUserDataSource(d *schema.ResourceData, details *user.ItemUser) {
d.Set("active", details.Active)
d.Set("authkey", details.AuthKey)
d.Set("auth_keys", flattenItemUser(details.AuthKeys))
+ d.Set("blocked", details.Blocked)
d.Set("data", details.Data)
d.Set("description", details.Description)
d.Set("domain", details.Domain)
@@ -80,6 +81,7 @@ func flattenUserResource(d *schema.ResourceData, details *user.ItemUser) {
d.Set("active", details.Active)
d.Set("authkey", details.AuthKey)
d.Set("auth_keys", flattenItemUser(details.AuthKeys))
+ d.Set("blocked", details.Blocked)
d.Set("data", details.Data)
d.Set("description", details.Description)
d.Set("domain", details.Domain)
@@ -144,6 +146,7 @@ func flattenUserList(users *user.ListUsers) []map[string]interface{} {
"active": item.Active,
"authkey": item.AuthKey,
"authkeys": flattenItemUser(item.AuthKeys),
+ "blocked": item.Blocked,
"data": item.Data,
"description": item.Description,
"domain": item.Domain,
diff --git a/internal/service/cloudbroker/user/resource_user.go b/internal/service/cloudbroker/user/resource_user.go
index 8be3360b..a86ee35b 100644
--- a/internal/service/cloudbroker/user/resource_user.go
+++ b/internal/service/cloudbroker/user/resource_user.go
@@ -38,6 +38,10 @@ func resourceUserCreate(ctx context.Context, d *schema.ResourceData, m interface
createReq.Password = passwd.(string)
}
+ if provider, ok := d.GetOk("provider_name"); ok {
+ createReq.Provider = provider.(string)
+ }
+
if aa, ok := d.GetOk("apiaccess"); ok {
apiaccess := aa.(*schema.Set)
@@ -48,14 +52,6 @@ func resourceUserCreate(ctx context.Context, d *schema.ResourceData, m interface
}
}
- if groups, ok := d.GetOk("groups"); ok {
-
- for _, v := range groups.([]interface{}) {
-
- createReq.Groups = append(createReq.Groups, v.(string))
- }
- }
-
_, err := c.CloudBroker().User().Create(ctx, createReq)
if err != nil {
return diag.FromErr(err)
@@ -90,10 +86,33 @@ func resourceUserUpdate(ctx context.Context, d *schema.ResourceData, m interface
err := utilityUserAPIAccessGroupsConfigure(ctx, d, m)
if err != nil {
-
return diag.FromErr(err)
}
}
+
+ c := m.(*controller.ControllerCfg)
+
+ if d.HasChange("blocked") {
+ blocked := d.Get("blocked").(bool)
+ if blocked {
+ req := user.BlockRequest{
+ UserID: d.Id(),
+ }
+
+ if _, err := c.CloudBroker().User().Block(ctx, req); err != nil {
+ return diag.FromErr(err)
+ }
+ } else {
+ req := user.UnblockRequest{
+ UserID: d.Id(),
+ }
+
+ if _, err := c.CloudBroker().User().Unblock(ctx, req); err != nil {
+ return diag.FromErr(err)
+ }
+ }
+ }
+
return resourceUserRead(ctx, d, m)
}
diff --git a/internal/service/cloudbroker/user/schema.go b/internal/service/cloudbroker/user/schema.go
index 68981646..164581c3 100644
--- a/internal/service/cloudbroker/user/schema.go
+++ b/internal/service/cloudbroker/user/schema.go
@@ -2,6 +2,7 @@ package user
import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
log "github.com/sirupsen/logrus"
)
@@ -51,6 +52,11 @@ func dataSourceUserSchemaMake() map[string]*schema.Schema {
},
Description: "authkeys",
},
+ "blocked": {
+ Type: schema.TypeBool,
+ Computed: true,
+ Description: "is the user blocked",
+ },
"data": {
Type: schema.TypeString,
Computed: true,
@@ -225,6 +231,11 @@ func dataSourceUserListSchemaMake() map[string]*schema.Schema {
Optional: true,
Description: "find by active. True or False",
},
+ "email": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "find by email",
+ },
"service_account": {
Type: schema.TypeBool,
Optional: true,
@@ -290,6 +301,11 @@ func dataSourceUserListSchemaMake() map[string]*schema.Schema {
},
Description: "authkeys",
},
+ "blocked": {
+ Type: schema.TypeBool,
+ Computed: true,
+ Description: "is the user blocked",
+ },
"data": {
Type: schema.TypeString,
Computed: true,
@@ -409,12 +425,18 @@ func resourceUserSchemaMake() map[string]*schema.Schema {
},
"password": {
Type: schema.TypeString,
+ Default: "strongpassword",
Optional: true,
Description: "password of user",
},
+ "provider_name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "provider",
+ ValidateFunc: validation.StringInSlice([]string{"bvs", "decs3o"}, false),
+ },
"groups": {
Type: schema.TypeList,
- Optional: true,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
@@ -448,6 +470,12 @@ func resourceUserSchemaMake() map[string]*schema.Schema {
},
Description: "list of apiaccess groups this user belongs to",
},
+ "blocked": {
+ Type: schema.TypeBool,
+ Optional: true,
+ Computed: true,
+ Description: "is the user blocked",
+ },
"authkey": {
Type: schema.TypeString,
Computed: true,
diff --git a/internal/service/cloudbroker/user/utility_user_list.go b/internal/service/cloudbroker/user/utility_user_list.go
index dcb745b3..3ddc91a7 100644
--- a/internal/service/cloudbroker/user/utility_user_list.go
+++ b/internal/service/cloudbroker/user/utility_user_list.go
@@ -52,6 +52,10 @@ func utilityUserListCheckPresence(ctx context.Context, d *schema.ResourceData, m
req.Active = active.(bool)
}
+ if email, ok := d.GetOk("email"); ok {
+ req.Email = email.(string)
+ }
+
if serviceAccount, ok := d.GetOk("service_account"); ok {
req.ServiceAccount = serviceAccount.(bool)
}
diff --git a/internal/service/cloudbroker/vins/flattens.go b/internal/service/cloudbroker/vins/flattens.go
index 841f56ea..10d83baa 100644
--- a/internal/service/cloudbroker/vins/flattens.go
+++ b/internal/service/cloudbroker/vins/flattens.go
@@ -73,6 +73,7 @@ func flattenVins(d *schema.ResourceData, vinsRecord *vins.RecordVINS) {
d.Set("vxlan_id", vinsRecord.VXLANID)
d.Set("nat_rule", flattenRuleBlock(vinsRecord.VNFs.NAT.Config.Rules))
d.Set("computes", flattenComputes(vinsRecord.Computes))
+ d.Set("zone_id", vinsRecord.ZoneID)
}
func flattenVinsData(d *schema.ResourceData, vinsRecord *vins.RecordVINS) {
@@ -111,6 +112,7 @@ func flattenVinsData(d *schema.ResourceData, vinsRecord *vins.RecordVINS) {
d.Set("vnfs", flattenVinsRecordVNFs(vinsRecord.VNFs))
d.Set("vxlan_id", vinsRecord.VXLANID)
d.Set("computes", flattenComputes(vinsRecord.Computes))
+ d.Set("zone_id", vinsRecord.ZoneID)
}
@@ -223,7 +225,6 @@ func flattenVinsRecordGW(rg vins.RecordGW) []map[string]interface{} {
"owner_id": rg.OwnerID,
"owner_type": rg.OwnerType,
"pure_virtual": rg.PureVirtual,
- "routes": flattenVinsRoutes(rg.Routes),
"status": rg.Status,
"tech_status": rg.TechStatus,
"type": rg.Type,
@@ -249,7 +250,6 @@ func flattenVinsRecordNAT(rn vins.RecordNAT) []map[string]interface{} {
"owner_id": rn.OwnerID,
"owner_type": rn.OwnerType,
"pure_virtual": rn.PureVirtual,
- "routes": flattenVinsRoutes(rn.Routes),
"status": rn.Status,
"tech_status": rn.TechStatus,
"type": rn.Type,
@@ -439,6 +439,7 @@ func flattenVinsListInterfaces(i vins.ListInterfaces) []map[string]interface{} {
"pci_slot": v.PCISlot,
"bus_number": v.BusNumber,
"qos": flattenVinsQOS(v.QOS),
+ "sdn_interface_id": v.SDNInterfaceID,
"target": v.Target,
"type": v.Type,
"vnfs": v.VNFs,
@@ -487,6 +488,7 @@ func flattenVinsList(vl *vins.ListVINS) []map[string]interface{} {
"user_managed": v.UserManaged,
"vnfs": flattenVinsVNFs(v.VNFs),
"vxlan_id": v.VXLANID,
+ "zone_id": v.ZoneID,
}
res = append(res, temp)
}
@@ -529,6 +531,7 @@ func flattenVinsListDeleted(vl *vins.ListVINS) []map[string]interface{} {
"user_managed": v.UserManaged,
"vnfs": flattenVinsVNFs(v.VNFs),
"vxlan_id": v.VXLANID,
+ "zone_id": v.ZoneID,
}
res = append(res, temp)
}
diff --git a/internal/service/cloudbroker/vins/resource_utility.go b/internal/service/cloudbroker/vins/resource_utility.go
index e99d395d..a6890404 100644
--- a/internal/service/cloudbroker/vins/resource_utility.go
+++ b/internal/service/cloudbroker/vins/resource_utility.go
@@ -84,6 +84,10 @@ func createVinsInAcc(ctx context.Context, d *schema.ResourceData, m interface{},
}
}
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ req.ZoneID = uint64(zoneID.(int))
+ }
+
return req, nil
}
@@ -135,6 +139,10 @@ func createVinsInRG(ctx context.Context, d *schema.ResourceData, m interface{},
}
}
+ if zoneID, ok := d.GetOk("zone_id"); ok {
+ req.ZoneID = uint64(zoneID.(int))
+ }
+
return req, nil
}
diff --git a/internal/service/cloudbroker/vins/resource_vins.go b/internal/service/cloudbroker/vins/resource_vins.go
index c71d1be2..3b06d175 100644
--- a/internal/service/cloudbroker/vins/resource_vins.go
+++ b/internal/service/cloudbroker/vins/resource_vins.go
@@ -320,6 +320,12 @@ func resourceVinsUpdate(ctx context.Context, d *schema.ResourceData, m interface
}
}
+ if d.HasChange("zone_id") {
+ if err := resourceVinsChangeZoneID(ctx, d, m); err != nil {
+ warnings.Add(err)
+ }
+ }
+
return append(warnings.Get(), dataSourceVinsRead(ctx, d, m)...)
}
@@ -772,6 +778,21 @@ func resourceVinsChangeVnfStartStop(ctx context.Context, d *schema.ResourceData,
return err
}
+func resourceVinsChangeZoneID(ctx context.Context, d *schema.ResourceData, m interface{}) error {
+ c := m.(*controller.ControllerCfg)
+
+ vinsId := uint64(d.Get("vins_id").(int))
+ zoneID := uint64(d.Get("zone_id").(int))
+
+ req := vins.MigrateToZoneRequest{
+ VINSID: vinsId,
+ ZoneID: zoneID,
+ }
+
+ _, err := c.CloudBroker().VINS().MigrateToZone(ctx, req)
+ return err
+}
+
func ResourceVins() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
diff --git a/internal/service/cloudbroker/vins/schema.go b/internal/service/cloudbroker/vins/schema.go
index 628850a7..16537bd4 100644
--- a/internal/service/cloudbroker/vins/schema.go
+++ b/internal/service/cloudbroker/vins/schema.go
@@ -290,6 +290,10 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema {
},
},
},
+ "sdn_interface_id": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
"target": {
Type: schema.TypeString,
Computed: true,
@@ -907,42 +911,6 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "pure virtual",
},
- "routes": {
- Type: schema.TypeList,
- Computed: true,
- Description: "routes",
- Elem: &schema.Resource{
- Schema: map[string]*schema.Schema{
- "compute_ids": {
- Type: schema.TypeList,
- Computed: true,
- Elem: &schema.Schema{
- Type: schema.TypeInt,
- },
- },
- "route_id": {
- Type: schema.TypeInt,
- Computed: true,
- },
- "guid": {
- Type: schema.TypeString,
- Computed: true,
- },
- "destination": {
- Type: schema.TypeString,
- Computed: true,
- },
- "netmask": {
- Type: schema.TypeString,
- Computed: true,
- },
- "gateway": {
- Type: schema.TypeString,
- Computed: true,
- },
- },
- },
- },
"status": {
Type: schema.TypeString,
Computed: true,
@@ -1127,42 +1095,6 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "pure virtual",
},
- "routes": {
- Type: schema.TypeList,
- Computed: true,
- Description: "routes",
- Elem: &schema.Resource{
- Schema: map[string]*schema.Schema{
- "compute_ids": {
- Type: schema.TypeList,
- Computed: true,
- Elem: &schema.Schema{
- Type: schema.TypeInt,
- },
- },
- "route_id": {
- Type: schema.TypeInt,
- Computed: true,
- },
- "guid": {
- Type: schema.TypeString,
- Computed: true,
- },
- "destination": {
- Type: schema.TypeString,
- Computed: true,
- },
- "netmask": {
- Type: schema.TypeString,
- Computed: true,
- },
- "gateway": {
- Type: schema.TypeString,
- Computed: true,
- },
- },
- },
- },
"status": {
Type: schema.TypeString,
Computed: true,
@@ -1189,6 +1121,10 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "vxlan id",
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
}
return rets
@@ -1441,6 +1377,10 @@ func dataSourceVinsListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
},
},
},
@@ -1681,6 +1621,10 @@ func dataSourceVinsListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
},
},
},
@@ -1948,6 +1892,12 @@ func resourceVinsSchemaMake() map[string]*schema.Schema {
Optional: true,
Computed: true,
},
+ "zone_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Computed: true,
+ Description: "zone id",
+ },
"gid": {
Type: schema.TypeInt,
Optional: true,
@@ -2801,47 +2751,6 @@ func resourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "prune virtual",
},
- "routes": {
- Type: schema.TypeList,
- Computed: true,
- Elem: &schema.Resource{
- Schema: map[string]*schema.Schema{
- "compute_ids": {
- Type: schema.TypeList,
- Computed: true,
- Description: "compute ids",
- Elem: &schema.Schema{
- Type: schema.TypeInt,
- },
- },
- "route_id": {
- Type: schema.TypeInt,
- Computed: true,
- Description: "route id",
- },
- "guid": {
- Type: schema.TypeString,
- Computed: true,
- Description: "guid",
- },
- "destination": {
- Type: schema.TypeString,
- Computed: true,
- Description: "destination",
- },
- "netmask": {
- Type: schema.TypeString,
- Computed: true,
- Description: "net mask",
- },
- "gateway": {
- Type: schema.TypeString,
- Computed: true,
- Description: "gateway",
- },
- },
- },
- },
"status": {
Type: schema.TypeString,
Computed: true,
@@ -3012,42 +2921,6 @@ func resourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "pure virtual",
},
- "routes": {
- Type: schema.TypeList,
- Computed: true,
- Description: "routes",
- Elem: &schema.Resource{
- Schema: map[string]*schema.Schema{
- "compute_ids": {
- Type: schema.TypeList,
- Computed: true,
- Elem: &schema.Schema{
- Type: schema.TypeInt,
- },
- },
- "route_id": {
- Type: schema.TypeInt,
- Computed: true,
- },
- "guid": {
- Type: schema.TypeString,
- Computed: true,
- },
- "destination": {
- Type: schema.TypeString,
- Computed: true,
- },
- "netmask": {
- Type: schema.TypeString,
- Computed: true,
- },
- "gateway": {
- Type: schema.TypeString,
- Computed: true,
- },
- },
- },
- },
"status": {
Type: schema.TypeString,
Computed: true,
@@ -3232,42 +3105,6 @@ func resourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true,
Description: "pure virtual",
},
- "routes": {
- Type: schema.TypeList,
- Computed: true,
- Description: "routes",
- Elem: &schema.Resource{
- Schema: map[string]*schema.Schema{
- "compute_ids": {
- Type: schema.TypeList,
- Computed: true,
- Elem: &schema.Schema{
- Type: schema.TypeInt,
- },
- },
- "route_id": {
- Type: schema.TypeInt,
- Computed: true,
- },
- "guid": {
- Type: schema.TypeString,
- Computed: true,
- },
- "destination": {
- Type: schema.TypeString,
- Computed: true,
- },
- "netmask": {
- Type: schema.TypeString,
- Computed: true,
- },
- "gateway": {
- Type: schema.TypeString,
- Computed: true,
- },
- },
- },
- },
"status": {
Type: schema.TypeString,
Computed: true,
diff --git a/internal/service/cloudbroker/zone/data_source_zone.go b/internal/service/cloudbroker/zone/data_source_zone.go
new file mode 100644
index 00000000..80126f4b
--- /dev/null
+++ b/internal/service/cloudbroker/zone/data_source_zone.go
@@ -0,0 +1,116 @@
+/*
+Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
+Authors:
+Petr Krutov,
+Stanislav Solovev,
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
+Orchestration Technology) with Terraform by Hashicorp.
+
+Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
+
+Please see README.md to learn where to place source code so that it
+builds seamlessly.
+
+Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
+*/
+
+package zone
+
+import (
+ "context"
+ "strconv"
+
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+)
+
+func dataSourceZoneRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ zone, err := utilityZoneCheckPresence(ctx, d, m)
+ if err != nil {
+ d.SetId("") // ensure ID is empty in this case
+ return diag.FromErr(err)
+ }
+ d.SetId(strconv.Itoa(d.Get("zone_id").(int)))
+ flattenZone(d, zone)
+ return nil
+}
+
+func dataSourceZoneSchemaMake() map[string]*schema.Schema {
+ return map[string]*schema.Schema{
+ "zone_id": {
+ Type: schema.TypeInt,
+ Required: true,
+ },
+ "guid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "gid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "name": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "description": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "deletable": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
+ "status": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "created_time": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "updated_time": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "node_ids": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ },
+ }
+}
+
+func DataSourceZone() *schema.Resource {
+ return &schema.Resource{
+ SchemaVersion: 1,
+
+ ReadContext: dataSourceZoneRead,
+
+ Timeouts: &schema.ResourceTimeout{
+ Read: &constants.Timeout30s,
+ Default: &constants.Timeout60s,
+ },
+
+ Schema: dataSourceZoneSchemaMake(),
+ }
+}
diff --git a/internal/service/cloudbroker/zone/data_source_zone_list.go b/internal/service/cloudbroker/zone/data_source_zone_list.go
new file mode 100644
index 00000000..0ef22887
--- /dev/null
+++ b/internal/service/cloudbroker/zone/data_source_zone_list.go
@@ -0,0 +1,182 @@
+/*
+Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
+Authors:
+Petr Krutov,
+Stanislav Solovev,
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
+Orchestration Technology) with Terraform by Hashicorp.
+
+Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
+
+Please see README.md to learn where to place source code so that it
+builds seamlessly.
+
+Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
+*/
+
+package zone
+
+import (
+ "context"
+
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
+
+ "github.com/google/uuid"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+)
+
+func dataSourceZoneListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ zoneList, err := utilityZoneListCheckPresence(ctx, d, m)
+ if err != nil {
+ d.SetId("") // ensure ID is empty in this case
+ return diag.FromErr(err)
+ }
+ id := uuid.New()
+ d.SetId(id.String())
+ d.Set("items", flattenZoneList(zoneList))
+ d.Set("entry_count", zoneList.EntryCount)
+ return nil
+}
+
+func dataSourceZoneListSchemaMake() map[string]*schema.Schema {
+ res := map[string]*schema.Schema{
+ "by_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Find by ID",
+ },
+ "gid": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Find by Grid ID",
+ },
+ "name": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Find by name",
+ },
+ "description": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Find by description",
+ },
+ "status": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "Find by status",
+ },
+ "deletable": {
+ Type: schema.TypeBool,
+ Optional: true,
+ Description: "Find by deletable",
+ },
+ "node_id": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Find by nodeId",
+ },
+ "sort_by": {
+ Type: schema.TypeString,
+ Optional: true,
+ Description: "sort by one of supported fields, format +|-(field)",
+ },
+ "page": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Page number",
+ },
+ "size": {
+ Type: schema.TypeInt,
+ Optional: true,
+ Description: "Page size",
+ },
+ "items": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Resource{
+ Schema: map[string]*schema.Schema{
+ "zone_id": {
+ Type: schema.TypeInt,
+ Required: true,
+ },
+ "guid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "gid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "name": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "description": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "deletable": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
+ "status": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "created_time": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "updated_time": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "node_ids": {
+ Type: schema.TypeList,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ },
+ },
+ },
+ },
+ "entry_count": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ }
+
+ return res
+}
+
+func DataSourceZoneList() *schema.Resource {
+ return &schema.Resource{
+ SchemaVersion: 1,
+
+ ReadContext: dataSourceZoneListRead,
+
+ Timeouts: &schema.ResourceTimeout{
+ Read: &constants.Timeout30s,
+ Default: &constants.Timeout60s,
+ },
+
+ Schema: dataSourceZoneListSchemaMake(),
+ }
+}
diff --git a/internal/service/cloudbroker/zone/flattens.go b/internal/service/cloudbroker/zone/flattens.go
new file mode 100644
index 00000000..8627fae1
--- /dev/null
+++ b/internal/service/cloudbroker/zone/flattens.go
@@ -0,0 +1,82 @@
+/*
+Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
+Authors:
+Petr Krutov,
+Stanislav Solovev,
+Kasim Baybikov,
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
+Orchestration Technology) with Terraform by Hashicorp.
+
+Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
+
+Please see README.md to learn where to place source code so that it
+builds seamlessly.
+
+Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
+*/
+
+package zone
+
+import (
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone"
+)
+
+func flattenZone(d *schema.ResourceData, item *zone.RecordZone) error {
+ log.Debugf("flattenZone: start decoding RecordZone name %q / ID %d",
+ item.Name, item.ID)
+
+ d.Set("zone_id", int(item.ID))
+ d.Set("guid", int(item.GUID))
+ d.Set("gid", int(item.GID))
+ d.Set("name", item.Name)
+ d.Set("description", item.Description)
+ d.Set("deletable", item.Deletable)
+ d.Set("status", item.Status)
+ d.Set("created_time", item.CreatedTime)
+ d.Set("updated_time", item.UpdatedTime)
+ d.Set("node_ids", item.NodeIDs)
+
+ log.Debugf("flattenZone: decoded RecordZone name %q / ID %d, complete",
+ item.Name, item.ID)
+ return nil
+}
+
+func flattenZoneList(zone *zone.ListZones) []map[string]interface{} {
+ log.Debugf("flattenZoneList start")
+ res := make([]map[string]interface{}, 0, len(zone.Data))
+ for _, zone := range zone.Data {
+ temp := map[string]interface{}{
+ "zone_id": int(zone.ID),
+ "guid": int(zone.GUID),
+ "gid": int(zone.GID),
+ "name": zone.Name,
+ "description": zone.Description,
+ "deletable": zone.Deletable,
+ "status": zone.Status,
+ "created_time": zone.CreatedTime,
+ "updated_time": zone.UpdatedTime,
+ "node_ids": zone.NodeIDs,
+ }
+ res = append(res, temp)
+ }
+ log.Debugf("flattenZoneList end")
+ return res
+
+}
diff --git a/internal/service/cloudbroker/zone/resource_zone.go b/internal/service/cloudbroker/zone/resource_zone.go
new file mode 100644
index 00000000..a41f9504
--- /dev/null
+++ b/internal/service/cloudbroker/zone/resource_zone.go
@@ -0,0 +1,229 @@
+/*
+Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
+Authors:
+Petr Krutov,
+Stanislav Solovev,
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
+Orchestration Technology) with Terraform by Hashicorp.
+
+Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
+
+Please see README.md to learn where to place source code so that it
+builds seamlessly.
+
+Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
+*/
+
+package zone
+
+import (
+ "context"
+ "strconv"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
+)
+
+func resourceZoneCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ zoneName := d.Get("name").(string)
+
+ log.Debugf("resourceZoneCreate: called Zone with name %s", zoneName)
+
+ c := m.(*controller.ControllerCfg)
+
+ req := zone.CreateRequest{
+ Name: zoneName,
+ }
+
+ if desc, ok := d.GetOk("description"); ok {
+ req.Description = desc.(string)
+ }
+
+ zoneID, err := c.CloudBroker().Zone().Create(ctx, req)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ d.SetId(strconv.FormatUint(zoneID, 10))
+
+ warnings := dc.Warnings{}
+
+ if nodeIDs, ok := d.GetOk("node_ids"); ok {
+ nodeIDsArr := nodeIDs.([]interface{})
+ if len(nodeIDsArr) > 0 {
+
+ addedUint := make([]uint64, len(nodeIDsArr))
+ for i, v := range nodeIDsArr {
+ addedUint[i] = uint64(v.(int))
+ }
+
+ req := zone.AddNodeRequest{
+ ID: zoneID,
+ NodeIDs: addedUint,
+ }
+ if _, err := c.CloudBroker().Zone().AddNode(ctx, req); err != nil {
+ warnings.Add(err)
+ }
+
+ }
+ }
+
+ log.Debugf("resourceZoneCreate: create Zone with ID: %d, complete", zoneID)
+ return append(resourceZoneRead(ctx, d, m), warnings.Get()...)
+}
+
+func resourceZoneRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ log.Debugf("resourceZoneRead: called Zone with id %s", d.Id())
+
+ zone, err := utilityZoneCheckPresence(ctx, d, m)
+ if err != nil {
+ d.SetId("")
+ return diag.FromErr(err)
+ }
+
+ flattenZone(d, zone)
+
+ log.Debugf("resourceZoneRead: read Zone with id %s, complete", d.Id())
+ return nil
+}
+
+func resourceZoneUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ zoneID, _ := strconv.ParseUint(d.Id(), 10, 64)
+
+ log.Debugf("resourceZoneUpdate: called Zone with id %d", zoneID)
+
+ if d.HasChanges("name,", "description", "node_ids") {
+ if err := utilityZoneUpdate(ctx, d, m, zoneID); err != nil {
+ return diag.FromErr(err)
+ }
+ }
+
+ log.Debugf("resourceZoneUpdate: update Zone with id %d, complete", zoneID)
+
+ return resourceZoneRead(ctx, d, m)
+}
+
+func resourceZoneDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
+ log.Debugf("resourceZoneDelete: called Zone with id %s", d.Id())
+
+ zoneItem, err := utilityZoneCheckPresence(ctx, d, m)
+ if err != nil {
+ d.SetId("")
+ return diag.FromErr(err)
+ }
+
+ c := m.(*controller.ControllerCfg)
+
+ req := zone.DeleteRequest{
+ ID: zoneItem.ID,
+ }
+
+ _, err = c.CloudBroker().Zone().Delete(ctx, req)
+ if err != nil {
+ return diag.FromErr(err)
+ }
+
+ d.SetId("")
+
+ return nil
+}
+
+func ResourceZone() *schema.Resource {
+ return &schema.Resource{
+ SchemaVersion: 1,
+
+ CreateContext: resourceZoneCreate,
+ ReadContext: resourceZoneRead,
+ UpdateContext: resourceZoneUpdate,
+ DeleteContext: resourceZoneDelete,
+
+ Importer: &schema.ResourceImporter{
+ StateContext: schema.ImportStatePassthroughContext,
+ },
+
+ Timeouts: &schema.ResourceTimeout{
+ Create: &constants.Timeout20m,
+ Read: &constants.Timeout20m,
+ Update: &constants.Timeout20m,
+ Delete: &constants.Timeout20m,
+ Default: &constants.Timeout20m,
+ },
+
+ Schema: resourceZoneSchemaMake(),
+ }
+}
+
+func resourceZoneSchemaMake() map[string]*schema.Schema {
+ return map[string]*schema.Schema{
+ "name": {
+ Type: schema.TypeString,
+ Required: true,
+ },
+ "description": {
+ Type: schema.TypeString,
+ Optional: true,
+ Computed: true,
+ },
+ "node_ids": {
+ Type: schema.TypeList,
+ Optional: true,
+ Computed: true,
+ Elem: &schema.Schema{
+ Type: schema.TypeInt,
+ },
+ },
+ "zone_id": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "guid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "gid": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "deletable": {
+ Type: schema.TypeBool,
+ Computed: true,
+ },
+ "status": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ "created_time": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "updated_time": {
+ Type: schema.TypeInt,
+ Computed: true,
+ },
+ "id": {
+ Type: schema.TypeString,
+ Computed: true,
+ },
+ }
+}
diff --git a/internal/service/cloudbroker/zone/utility_zone.go b/internal/service/cloudbroker/zone/utility_zone.go
new file mode 100644
index 00000000..a69895bb
--- /dev/null
+++ b/internal/service/cloudbroker/zone/utility_zone.go
@@ -0,0 +1,155 @@
+/*
+Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
+Authors:
+Petr Krutov,
+Stanislav Solovev,
+Kasim Baybikov,
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
+Orchestration Technology) with Terraform by Hashicorp.
+
+Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
+
+Please see README.md to learn where to place source code so that it
+builds seamlessly.
+
+Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
+*/
+
+package zone
+
+import (
+ "context"
+ "strconv"
+
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+ log "github.com/sirupsen/logrus"
+)
+
+func utilityZoneCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.RecordZone, error) {
+ c := m.(*controller.ControllerCfg)
+ req := zone.GetRequest{}
+
+ if d.Id() != "" {
+ zoneId, _ := strconv.ParseUint(d.Id(), 10, 64)
+ req.ID = zoneId
+ } else {
+ req.ID = uint64(d.Get("zone_id").(int))
+ }
+
+ zoneData, err := c.CloudBroker().Zone().Get(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+
+ return zoneData, nil
+}
+
+func utilityZoneUpdate(ctx context.Context, d *schema.ResourceData, m interface{}, zoneID uint64) error {
+ c := m.(*controller.ControllerCfg)
+
+ if d.HasChanges("name,", "description") {
+ req := zone.UpdateRequest{
+ ID: zoneID,
+ }
+
+ if d.HasChange("name") {
+ req.Name = d.Get("name").(string)
+ }
+ if d.HasChange("description") {
+ req.Description = d.Get("description").(string)
+ }
+
+ _, err := c.CloudBroker().Zone().Update(ctx, req)
+ if err != nil {
+ return err
+ }
+ log.Debugf("utilityZoneUpdate: update zone with ID: %d, complete with params=%v", zoneID, req)
+ }
+
+ addedNodes := make([]interface{}, 0)
+ removedNodes := make([]interface{}, 0)
+
+ old_set, new_set := d.GetChange("node_ids")
+ oldSlice := old_set.([]interface{})
+ newSlice := new_set.([]interface{})
+
+ for _, oldElem := range oldSlice {
+ if !containsNodes(newSlice, oldElem) {
+ removedNodes = append(removedNodes, oldElem)
+ }
+ }
+
+ for _, newElem := range newSlice {
+ if !containsNodes(oldSlice, newElem) {
+ addedNodes = append(addedNodes, newElem)
+ }
+ }
+
+ log.Debugf("Found node_ids change with %v deletion(s) and %v addition(s) [zoneID=%v]", len(removedNodes), len(addedNodes), zoneID)
+
+ if len(addedNodes) > 0 {
+
+ addedUint := make([]uint64, len(addedNodes))
+ for i, v := range addedNodes {
+ addedUint[i] = uint64(v.(int))
+ }
+
+ req := zone.AddNodeRequest{
+ ID: zoneID,
+ NodeIDs: addedUint,
+ }
+ if _, err := c.CloudBroker().Zone().AddNode(ctx, req); err != nil {
+ return err
+ }
+
+ }
+
+ if len(removedNodes) > 0 {
+ removedUint := make([]uint64, len(removedNodes))
+ for i, v := range removedNodes {
+ removedUint[i] = uint64(v.(int))
+ }
+
+ req := zone.DelNodeRequest{
+ ID: zoneID,
+ NodeIDs: removedUint,
+ }
+ log.Debug("del")
+ log.Debug(req.NodeIDs)
+ if _, err := c.CloudBroker().Zone().DelNode(ctx, req); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+func containsNodes(set []interface{}, check interface{}) bool {
+ for _, elem := range set {
+ elemConv := elem.(int)
+ checkConv := check.(int)
+ if elemConv == checkConv {
+ return true
+ }
+ }
+
+ return false
+}
diff --git a/internal/service/cloudbroker/zone/utility_zone_list.go b/internal/service/cloudbroker/zone/utility_zone_list.go
new file mode 100644
index 00000000..e17cbf63
--- /dev/null
+++ b/internal/service/cloudbroker/zone/utility_zone_list.go
@@ -0,0 +1,85 @@
+/*
+Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
+Authors:
+Petr Krutov,
+Stanislav Solovev,
+Kasim Baybikov,
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
+Orchestration Technology) with Terraform by Hashicorp.
+
+Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
+
+Please see README.md to learn where to place source code so that it
+builds seamlessly.
+
+Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
+*/
+
+package zone
+
+import (
+ "context"
+
+ "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone"
+ "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
+
+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
+)
+
+func utilityZoneListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.ListZones, error) {
+ c := m.(*controller.ControllerCfg)
+ req := zone.ListRequest{}
+
+ if byId, ok := d.GetOk("by_id"); ok {
+ req.ByID = uint64(byId.(int))
+ }
+ if gid, ok := d.GetOk("gid"); ok {
+ req.GID = uint64(gid.(int))
+ }
+ if name, ok := d.GetOk("name"); ok {
+ req.Name = name.(string)
+ }
+ if description, ok := d.GetOk("description"); ok {
+ req.Description = description.(string)
+ }
+ if status, ok := d.GetOk("status"); ok {
+ req.Status = status.(string)
+ }
+ if deletable, ok := d.GetOk("deletable"); ok {
+ req.Deletable = deletable.(bool)
+ }
+ if nodeID, ok := d.GetOk("nodeId"); ok {
+ req.NodeID = uint64(nodeID.(int))
+ }
+ if sortBy, ok := d.GetOk("sort_by"); ok {
+ req.SortBy = sortBy.(string)
+ }
+ if size, ok := d.GetOk("size"); ok {
+ req.Size = uint64(size.(int))
+ }
+ if page, ok := d.GetOk("page"); ok {
+ req.Page = uint64(page.(int))
+ }
+
+ zoneList, err := c.CloudBroker().Zone().List(ctx, req)
+ if err != nil {
+ return nil, err
+ }
+
+ return zoneList, nil
+}
diff --git a/samples/README.md b/samples/README.md
index 01591230..23d0bc66 100644
--- a/samples/README.md
+++ b/samples/README.md
@@ -91,6 +91,8 @@
- snapshot_list
- stack
- stack_list
+ - trunk
+ - trunk_list
- vfpool
- vfpool_list
- vins
@@ -102,6 +104,8 @@
- vins_nat_rule_list
- vins_static_route
- vins_static_route_list
+ - zone
+ - zone_list
- resources:
- account
- bservice
@@ -232,6 +236,8 @@
- cb_sep_pool
- cb_stack
- cb_stack_list
+ - cb_trunk
+ - cb_trunk_list
- cb_user
- cb_user_get_audit
- cb_user_list
@@ -246,6 +252,8 @@
- cb_vins_nat_rule_list
- cb_vins_static_route
- cb_vins_static_route_list
+ - cb_zone
+ - cb_zone_list
- resources:
- cb_account
- cb_cdrom_image
@@ -272,11 +280,13 @@
- cb_sep
- cb_sep_config
- cb_sep_template
+ - cb_trunk
- cb_user
- cb_vfpool
- cb_vins
- cb_vins_static_route
- cb_virtual_image
+ - cb_zone
## Как пользоваться примерами
diff --git a/samples/cloudapi/account/resource_account/main.tf b/samples/cloudapi/account/resource_account/main.tf
index 3a1a8156..6a69b11a 100644
--- a/samples/cloudapi/account/resource_account/main.tf
+++ b/samples/cloudapi/account/resource_account/main.tf
@@ -126,12 +126,6 @@ resource "decort_account" "a" {
#gpu_units = 2
#}
- #причина отключения аккаунта
- #опциональный параметр
- #тип - строка
- #используется при обновлении
- #reason = "something_reason"
-
#восстановление аккаунта
#опциональный параметр
#тип - булев
@@ -145,6 +139,16 @@ resource "decort_account" "a" {
#используется при удалении
#по умолчанию - false
#permanently = true
+
+ #зона по умольчанию для аккаунта
+ #опциональный параметр
+ #тип - целое число
+ #default_zone_id = 1111
+
+ #управление зонами аккаунта
+ #опциональный параметр
+ #тип - массив целых чисел
+ #zone_ids = [1,2,3]
}
output "test" {
diff --git a/samples/cloudapi/bservice/resource_bservice/main.tf b/samples/cloudapi/bservice/resource_bservice/main.tf
index 7a95033f..21355149 100644
--- a/samples/cloudapi/bservice/resource_bservice/main.tf
+++ b/samples/cloudapi/bservice/resource_bservice/main.tf
@@ -99,6 +99,12 @@ resource "decort_bservice" "b" {
#используется при создании
#service_id = 11111
+ #идентификатор экземпляра zone
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #zone_id = 1111
+
}
output "test" {
diff --git a/samples/cloudapi/flipgroup/resource_flipgroup/main.tf b/samples/cloudapi/flipgroup/resource_flipgroup/main.tf
index 627af6f8..b3490dc2 100644
--- a/samples/cloudapi/flipgroup/resource_flipgroup/main.tf
+++ b/samples/cloudapi/flipgroup/resource_flipgroup/main.tf
@@ -55,10 +55,11 @@ resource "decort_flipgroup" "fg" {
net_id = 13
#тип клиентов (в данный момент поддерживается только тип 'compute')
- #обязательный параметр
+ #опциональный параметр
#тип - строка
#используется при создании
- client_type = "compute"
+ #по умолчанию - "compute"
+ #client_type = "compute"
#ip-адрес
#опциональный параметр
diff --git a/samples/cloudapi/image/resource_image/main.tf b/samples/cloudapi/image/resource_image/main.tf
index 78d5f893..c38294a3 100644
--- a/samples/cloudapi/image/resource_image/main.tf
+++ b/samples/cloudapi/image/resource_image/main.tf
@@ -38,6 +38,7 @@ resource "decort_image" "img" {
#драйверы компьютов, подходящие для данного образа
#обязательный параметр
#тип - массив строк
+ #возможные значения: "KVM_X86"
#используется при создании
drivers = ["KVM_X86"]
@@ -107,18 +108,19 @@ resource "decort_image" "img" {
#используется при создании
#pool_name = "pool"
- #архитектура образа (X86_64)
- #опциональный параметр
- #тип - строка
- #используется при создании
- #architecture = "X86_64"
-
#наименование сетевого интерфейса для вашего компьютера с Linux
#eth - встроенный, ens - pci слот
#опциональный параметр
#тип - строка
#используется при создании
#network_interface_naming = "ens"
+
+ #позволяет создавать образ в синхронном режиме
+ #опциональный параметр
+ #тип - булев
+ #используется при создании
+ #по умолчанию - false
+ #sync_mode = true
}
output "img_out" {
diff --git a/samples/cloudapi/image/resource_image_from_platform_disk/main.tf b/samples/cloudapi/image/resource_image_from_platform_disk/main.tf
index fab98eb2..96435e63 100644
--- a/samples/cloudapi/image/resource_image_from_platform_disk/main.tf
+++ b/samples/cloudapi/image/resource_image_from_platform_disk/main.tf
@@ -54,13 +54,6 @@ resource "decort_image_from_platform_disk" "img" {
#используется при создании
type = "linux"
- #архитектура образа
- #обязательный параметр
- #возможные значения - X86_64
- #тип - строка
- #используется при создании
- architecture = "X86_64"
-
#драйверы компьютов, подходящие для данного образа
#обязательный параметр
#тип - массив строк
diff --git a/samples/cloudapi/k8s/resource_k8s/main.tf b/samples/cloudapi/k8s/resource_k8s/main.tf
index af2f829e..a46464b3 100644
--- a/samples/cloudapi/k8s/resource_k8s/main.tf
+++ b/samples/cloudapi/k8s/resource_k8s/main.tf
@@ -338,6 +338,12 @@ resource "decort_k8s" "cluster" {
#используется при удалении
#permanently = true
+ #идентификатор экземпляра zone
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #zone_id = 1111
+
}
output "test_cluster" {
diff --git a/samples/cloudapi/k8s/resource_k8s_cp/main.tf b/samples/cloudapi/k8s/resource_k8s_cp/main.tf
index a291a110..21334581 100644
--- a/samples/cloudapi/k8s/resource_k8s_cp/main.tf
+++ b/samples/cloudapi/k8s/resource_k8s_cp/main.tf
@@ -195,6 +195,11 @@ resource "decort_k8s_cp" "cp" {
#используется при удалении
#permanently = true
+ #идентификатор экземпляра zone
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #zone_id = 1111
}
output "cp_out" {
diff --git a/samples/cloudapi/kvmvm/resource_kvmvm/main.tf b/samples/cloudapi/kvmvm/resource_kvmvm/main.tf
index cc652cca..b48210ef 100644
--- a/samples/cloudapi/kvmvm/resource_kvmvm/main.tf
+++ b/samples/cloudapi/kvmvm/resource_kvmvm/main.tf
@@ -46,7 +46,7 @@ resource "decort_kvmvm" "comp" {
#тип драйвера для compute
#обязательный параметр
#тип - строка
- #возможные значения: "SVA_KVM_X86", "KVM_X86"
+ #возможные значения: "KVM_X86"
#используется при создании
driver = "KVM_X86"
@@ -292,11 +292,12 @@ resource "decort_kvmvm" "comp" {
#тип сети
#обязательный параметр
#тип - строка
- #возможные значения - "VINS", "EXTNET", "VFNIC", "DPDK" (при выборе типа DPDK, необходимо указать hp_backed = true)
+ #возможные значения - "VINS", "EXTNET", "VFNIC", "DPDK", "SDN", "TRUNK" (при выборе типа DPDK, необходимо указать hp_backed = true)
#net_type = "VINS"
#id сети
#обязательный параметр
+ #при использовании SDN необходимо указать любое значение отличное от 0
#тип - целое число
#net_id = 1234
@@ -318,11 +319,17 @@ resource "decort_kvmvm" "comp" {
#weight = 15
#максимальный объём данных, который может быть передан за одну итерацию
- #используется только с сетями типа "DPDK"
+ #используется только с сетями типа "DPDK" и "EXTNET"
#возможные значения - 1-9216
#опциональный параметр
#тип - целое число
#mtu = 1500
+
+ #id sdn сети
+ #используется только с сетями типа "SDN"
+ #опциональный параметр
+ #тип - строка число
+ #sdn_interface_id = "f2d87a70-ea35-468d-8aef-bb1ecbe2e476"
#}
#добавление и удаление тэгов
@@ -526,6 +533,12 @@ resource "decort_kvmvm" "comp" {
#используется при создании и обновлении
#network_interface_naming = "ens"
+ #идентификатор экземпляра zone
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #zone_id = 1111
+
}
output "test" {
diff --git a/samples/cloudapi/lb/resource_lb/main.tf b/samples/cloudapi/lb/resource_lb/main.tf
index 56dd6ce2..c88f03d8 100644
--- a/samples/cloudapi/lb/resource_lb/main.tf
+++ b/samples/cloudapi/lb/resource_lb/main.tf
@@ -125,6 +125,12 @@ resource "decort_lb" "lb" {
#тип - список мап
#используется при создании и обновлении
#sysctl_params = [{ key1 = "value1", key2 = "value2" }]
+
+ #идентификатор экземпляра zone
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #zone_id = 1111
}
output "test" {
diff --git a/samples/cloudapi/rg/resource_rg/main.tf b/samples/cloudapi/rg/resource_rg/main.tf
index f34969aa..f804accc 100644
--- a/samples/cloudapi/rg/resource_rg/main.tf
+++ b/samples/cloudapi/rg/resource_rg/main.tf
@@ -188,11 +188,16 @@ resource "decort_resgroup" "rg" {
#восстановление группы после удаления
#опциональный параметр
- #используется при редактировании ресурса
#по умолчанию - false
#тип - булев
#используется при обновлении
#restore = true
+
+ #идентификатор группы доступа SDN
+ #опциональный параметр
+ #тип - строка
+ #используется при создании
+ #sdn_access_group_id = "64e039f4-3705-4feb-84ff-a59fbdb1ebfe"
}
diff --git a/samples/cloudapi/trunk/data_trunk/main.tf b/samples/cloudapi/trunk/data_trunk/main.tf
new file mode 100644
index 00000000..74d4fea2
--- /dev/null
+++ b/samples/cloudapi/trunk/data_trunk/main.tf
@@ -0,0 +1,38 @@
+/*
+Пример использования
+Получение данных транка
+*/
+
+#Раскомментируйте этот код,
+#и внесите необходимые правки в версию и путь,
+#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
+/*
+terraform {
+ required_providers {
+ decort = {
+ source = "basis/decort/decort"
+ version = ""
+ }
+ }
+}
+*/
+
+provider "decort" {
+ authenticator = "decs3o"
+ #controller_url =
+ controller_url = "https://ds1.digitalenergy.online"
+ #oauth2_url =
+ oauth2_url = "https://sso.digitalenergy.online"
+ allow_unverified_ssl = true
+}
+
+data "decort_trunk" "name" {
+ #идентификатор транка
+ #обязательный параметр
+ #тип - целое число
+ trunk_id = 1111
+}
+
+output "test" {
+ value = data.decort_trunk.name
+}
\ No newline at end of file
diff --git a/samples/cloudapi/trunk/data_trunk_list/main.tf b/samples/cloudapi/trunk/data_trunk_list/main.tf
new file mode 100644
index 00000000..a26ed75e
--- /dev/null
+++ b/samples/cloudapi/trunk/data_trunk_list/main.tf
@@ -0,0 +1,67 @@
+/*
+Пример использования
+Получение списка транковых портов.
+*/
+
+#Раскомментируйте этот код,
+#и внесите необходимые правки в версию и путь,
+#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
+/*
+
+terraform {
+ required_providers {
+ decort = {
+ source = "basis/decort/decort"
+ version = ""
+ }
+ }
+}
+*/
+
+provider "decort" {
+ authenticator = "decs3o"
+ #controller_url =
+ controller_url = "https://ds1.digitalenergy.online"
+ #oauth2_url =
+ oauth2_url = "https://sso.digitalenergy.online"
+ allow_unverified_ssl = true
+}
+
+data "decort_trunk_list" "name" {
+ #фильтр по id транка
+ #опциональный параметр
+ #тип - массив целых чисел
+ #trunk_ids = [10,11]
+
+ #фильтр по id учетных записей с доступом к транку
+ #опциональный параметр
+ #тип - массив целых чисел
+ #account_ids = [10,11]
+
+ #фильтр по тегам транка (значение от 1 до 4095)
+ #опциональный параметр
+ #тип - строка
+ #trunk_tags = "4095"
+
+ #сортировка по одному из поддерживаемых полей
+ #опциональный параметр
+ #формат - "+поле" по возрастанию / "-поле" по убыванию
+ #тип - строка
+ #sort_by = "+name"
+
+ #номер страницы для отображения
+ #опциональный параметр
+ #если не задан - выводятся все доступные данные
+ #тип - целое число
+ #page = 1
+
+ #размер страницы
+ #опциональный параметр
+ #если не задан - выводятся все доступные данные
+ #тип - целое число
+ #size = 1
+}
+
+output "test" {
+ value = data.decort_trunk_list.name
+}
\ No newline at end of file
diff --git a/samples/cloudapi/vins/resource_vins/main.tf b/samples/cloudapi/vins/resource_vins/main.tf
index 881e8feb..75cf99e5 100644
--- a/samples/cloudapi/vins/resource_vins/main.tf
+++ b/samples/cloudapi/vins/resource_vins/main.tf
@@ -188,6 +188,12 @@ resource "decort_vins" "vins" {
#используется при создании и обновлении
#dns = ["1.1.1.1", "2.2.2.2"]
+ #идентификатор экземпляра zone
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #zone_id = 1111
+
}
output "test" {
diff --git a/samples/cloudapi/zone/data_zone/main.tf b/samples/cloudapi/zone/data_zone/main.tf
new file mode 100644
index 00000000..4b556a01
--- /dev/null
+++ b/samples/cloudapi/zone/data_zone/main.tf
@@ -0,0 +1,38 @@
+/*
+Пример использования
+Получение информации о zone по ее id
+*/
+
+#Расскомментируйте этот код,
+#и внесите необходимые правки в версию и путь,
+#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
+/*
+terraform {
+ required_providers {
+ decort = {
+ source = "basis/decort/decort"
+ version = ""
+ }
+ }
+}
+*/
+provider "decort" {
+ authenticator = "decs3o"
+ #controller_url =
+ controller_url = "https://ds1.digitalenergy.online"
+ #oauth2_url =
+ oauth2_url = "https://sso.digitalenergy.online"
+ allow_unverified_ssl = true
+}
+
+data "decort_zone" "zone" {
+ #идентификатор zone
+ #обязательный параметр
+ #тип - целое число
+ zone_id = 2
+}
+
+output "test" {
+ value = data.decort_zone.zone
+}
+
diff --git a/samples/cloudapi/zone/data_zone_list/main.tf b/samples/cloudapi/zone/data_zone_list/main.tf
new file mode 100644
index 00000000..de468740
--- /dev/null
+++ b/samples/cloudapi/zone/data_zone_list/main.tf
@@ -0,0 +1,87 @@
+/*
+Пример использования
+Получение списка zone
+*/
+
+#Расскомментируйте этот код,
+#и внесите необходимые правки в версию и путь,
+#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
+/*
+terraform {
+ required_providers {
+ decort = {
+ source = "basis/decort/decort"
+ version = ""
+ }
+ }
+}
+*/
+
+provider "decort" {
+ authenticator = "decs3o"
+ #controller_url =
+ controller_url = "https://ds1.digitalenergy.online"
+ #oauth2_url =
+ oauth2_url = "https://sso.digitalenergy.online"
+ allow_unverified_ssl = true
+}
+
+data "decort_zone_list" "zone_list" {
+ #фильтрация списка для получения информации о конкретном zone по его id
+ #опциональный параметр
+ #тип - целое число
+ #by_id = 1
+
+ #фильтрация списка для получения информации о zone, которые принадлежат к определенному GRID
+ #опциональный параметр
+ #тип - целое число
+ #gid = 1
+
+ #фильтрация списка для получения информации о конкретном zone по его имени
+ #опциональный параметр
+ #тип - строка
+ #name = "alpha-cpu-04"
+
+ #фильтрация списка для получения информации о конкретном zone по его описанию
+ #опциональный параметр
+ #тип - строка
+ #description = "some"
+
+ #фильтрация списка для получения информации о zone, которые имеют соответствующий статус
+ #опциональный параметр
+ #тип - строка
+ #status = "ENABLED"
+
+ #фильтрация списка для получения информации о zone, которые удалены
+ #опциональный параметр
+ #тип - булев
+ #deletable = false
+
+ #фильтрация списка для получения информации о zone с конкретными nodeId
+ #опциональный параметр
+ #тип - целое число
+ #node_id = 1
+
+ #сортировка по одному из поддерживаемых полей
+ #опциональный параметр
+ #тип - строка
+ #формат - "+поле" по возрастанию / "-поле" по убыванию
+ #sort_by = "+name"
+
+ #номер страницы для отображения
+ #опциональный параметр
+ #тип - целое число
+ #если не задан - выводятся все доступные данные
+ #page = 2
+
+ #размер страницы
+ #опциональный параметр
+ #тип - целое число
+ #если не задан - выводятся все доступные данные
+ #size = 3
+}
+
+output "test" {
+ value = data.decort_zone_list.zone_list
+}
+
diff --git a/samples/cloudbroker/account/resource_account/main.tf b/samples/cloudbroker/account/resource_account/main.tf
index e5924ff7..855a61b8 100644
--- a/samples/cloudbroker/account/resource_account/main.tf
+++ b/samples/cloudbroker/account/resource_account/main.tf
@@ -160,12 +160,6 @@ resource "decort_cb_account" "acc" {
#используется при удалении
#permanently = true
- #причина восстановления после удаления или отключения
- #опциональный параметр
- #тип - строка
- #используется при обновлении и удалении
- #reason = "something_reason"
-
#флаг для восстановление аккаунта из корзины
#опциональный параметр
#тип - булев
@@ -180,10 +174,22 @@ resource "decort_cb_account" "acc" {
#доступ к дополнительным функциям управления ВМ
#опциональный параметр
- #возможные значенния - "hugepages", "numa", "cpupin", "vfnic", "dpdk, "changemac"
+ #возможные значенния - "hugepages", "numa", "cpupin", "vfnic", "dpdk, "changemac", "trunk"
#тип - массив строк
#используется при создании и обновлении
#compute_features = ["hugepages", "numa", "cpupin", "vfnic"]
+
+ #зона по умолчанию для аккаунта
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #default_zone_id = 1111
+
+ #управление зонами аккаунта
+ #опциональный параметр
+ #тип - массив целых чисел
+ #используется при создании и обновлении
+ #zone_ids = [1,2,3]
}
output "test" {
diff --git a/samples/cloudbroker/extnet/resource_extnet/main.tf b/samples/cloudbroker/extnet/resource_extnet/main.tf
index 00de9235..b621c869 100644
--- a/samples/cloudbroker/extnet/resource_extnet/main.tf
+++ b/samples/cloudbroker/extnet/resource_extnet/main.tf
@@ -106,11 +106,11 @@ resource "decort_cb_extnet" "new_extnet" {
#используется при создании
#end_ip = "191.255.0.40"
- #ip с которым будет создан vnfdev
+ #IP для создания первичного vnfdev
#опциональный параметр
#тип - строка
#используется при создании
- #vnfdev_ip = "191.255.0.20"
+ #vnfdev_ip = "191.255.0.20"
#количество предварительно созданных бронирований
#опциональный параметр
@@ -221,6 +221,30 @@ resource "decort_cb_extnet" "new_extnet" {
#тип - булев
#используется при обновлении
#restart = true
+
+ #идентификатор экземпляра zone
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #zone_id = 1111
+
+ #режим высокой доступности
+ #опциональный параметр
+ #тип - булев
+ #используется при создании и обновлении
+ #highly_available = true
+
+ #IP для создания вторичного vnfdev
+ #опциональный параметр
+ #тип - строка
+ #используется при создании
+ #sec_vnfdev_ip = "191.255.0.20"
+
+ #mtu
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #mtu = 1500
}
output "extnet" {
diff --git a/samples/cloudbroker/flipgroup/resource_flipgroup/main.tf b/samples/cloudbroker/flipgroup/resource_flipgroup/main.tf
index ecc18519..63456dbf 100644
--- a/samples/cloudbroker/flipgroup/resource_flipgroup/main.tf
+++ b/samples/cloudbroker/flipgroup/resource_flipgroup/main.tf
@@ -55,12 +55,12 @@ resource "decort_cb_flipgroup" "fg" {
#используется при создании
net_id = 13
- #тип клиентов
- #обязательный параметр
+ #тип клиентов (в данный момент поддерживается только тип 'compute')
+ #опциональный параметр
#тип - строка
- #в данный момент поддерживается только тип 'compute'
#используется при создании
- client_type = "compute"
+ #по умолчанию - "compute"
+ #client_type = "compute"
#ip-адрес
#опциональный параметр
diff --git a/samples/cloudbroker/image/resource_image/main.tf b/samples/cloudbroker/image/resource_image/main.tf
index 898b7c71..73b3d1a0 100644
--- a/samples/cloudbroker/image/resource_image/main.tf
+++ b/samples/cloudbroker/image/resource_image/main.tf
@@ -60,9 +60,9 @@ resource "decort_cb_image" "my_image" {
#драйвера
#обязательный параметр
#тип - массив строк
- #возможные варианты - ["KVM_X86", "SVA_KVM_X86"], ["KVM_X86"], ["SVA_KVM_X86"]
+ #возможные варианты - ["KVM_X86"]
#используется при создании
- drivers = ["KVM_X86", "SVA_KVM_X86"]
+ drivers = ["KVM_X86"]
#поддержка hot resize
#опциональный параметр
@@ -102,13 +102,6 @@ resource "decort_cb_image" "my_image" {
#используется при создании
#pool_name = "vmstor"
- #архитектура системы образа
- #опциональный параметр
- #тип - строка
- #доступные значения: "X86_64"
- #используется при создании
- #architecture = "X86_64"
-
#доступность образа
#опциональный параметр
#тип - булев
@@ -125,6 +118,7 @@ resource "decort_cb_image" "my_image" {
#опциональный параметр
#тип - булев
#используется при создании
+ #по умолчанию - false
#sync_mode = true
#настройка доступа образа аккаунтам
diff --git a/samples/cloudbroker/image/resource_image_from_platform_disk/main.tf b/samples/cloudbroker/image/resource_image_from_platform_disk/main.tf
index f5d1637e..4dc3e591 100644
--- a/samples/cloudbroker/image/resource_image_from_platform_disk/main.tf
+++ b/samples/cloudbroker/image/resource_image_from_platform_disk/main.tf
@@ -56,13 +56,6 @@ resource "decort_cb_image_from_platform_disk" "my_image" {
#используется при создании
image_type = "linux"
- #архитектура образа
- #обязательный параметр
- #возможные значения - X86_64
- #тип - строка
- #используется при создании
- architecture = "X86_64"
-
#драйверы компьютов, подходящие для данного образа
#обязательный параметр
#тип - массив строк
diff --git a/samples/cloudbroker/k8s/resource_k8s_cp/main.tf b/samples/cloudbroker/k8s/resource_k8s_cp/main.tf
index 61f9df08..36e55dda 100644
--- a/samples/cloudbroker/k8s/resource_k8s_cp/main.tf
+++ b/samples/cloudbroker/k8s/resource_k8s_cp/main.tf
@@ -213,6 +213,12 @@ resource "decort_cb_k8s_cp" "cp" {
#тип - массив мап
#используется при создании и обновлении
#lb_sysctl_params = [{ key1 = "value1", key2 = "value2" }]
+
+ #идентификатор экземпляра zone
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #zone_id = 1111
}
output "cp_out" {
diff --git a/samples/cloudbroker/kvmvm/resource_kvmvm/main.tf b/samples/cloudbroker/kvmvm/resource_kvmvm/main.tf
index 9de69474..ebdd2be4 100644
--- a/samples/cloudbroker/kvmvm/resource_kvmvm/main.tf
+++ b/samples/cloudbroker/kvmvm/resource_kvmvm/main.tf
@@ -46,7 +46,7 @@ resource "decort_cb_kvmvm" "comp" {
#тип драйвера для compute
#обязательный параметр
#тип - строка
- #возможные значения: "SVA_KVM_X86", "KVM_X86"
+ #возможные значения: "KVM_X86"
#используется при создании
driver = "KVM_X86"
@@ -305,12 +305,13 @@ resource "decort_cb_kvmvm" "comp" {
#network {
#тип сети
#обязательный параметр
- #возможные значения - "VINS", "EXTNET", "VFNIC", "DPDK" (при выборе типа DPDK, необходимо указать hp_backed = true)
+ #возможные значения - "VINS", "EXTNET", "VFNIC", "DPDK", "SDN", "TRUNK" (при выборе типа DPDK, необходимо указать hp_backed = true)
#тип - строка
#net_type = "VINS"
#id сети
#обязательный параметр
+ #при использовании SDN необходимо указать любое значение отличное от 0
#тип - целое число
#net_id = 1234
@@ -332,11 +333,17 @@ resource "decort_cb_kvmvm" "comp" {
#weight = 15
#максимальный объём данных, который может быть передан за одну итерацию
- #используется только с сетями типа "DPDK"
+ #используется только с сетями типа "DPDK" и "EXTNET"
#возможные значения - 1-9216
#опциональный параметр
#тип - целое число
#mtu = 1500
+
+ #id sdn сети
+ #используется только с сетями типа "SDN"
+ #опциональный параметр
+ #тип - строка число
+ #sdn_interface_id = "f2d87a70-ea35-468d-8aef-bb1ecbe2e476"
#}
#добавление и удаление тэгов
@@ -603,6 +610,12 @@ resource "decort_cb_kvmvm" "comp" {
#тип - строка
#используется при создании и обновлении
#network_interface_naming = "ens"
+
+ #идентификатор экземпляра zone
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #zone_id = 1111
}
output "test" {
diff --git a/samples/cloudbroker/lb/resource_lb/main.tf b/samples/cloudbroker/lb/resource_lb/main.tf
index 62f8d96a..741acd50 100644
--- a/samples/cloudbroker/lb/resource_lb/main.tf
+++ b/samples/cloudbroker/lb/resource_lb/main.tf
@@ -126,6 +126,12 @@ resource "decort_cb_lb" "lb" {
#используется при создании и обновлении
#sysctl_params = [{ key1 = "value1", key2 = "value2" }]
+ #идентификатор экземпляра zone
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #zone_id = 1111
+
}
output "test" {
diff --git a/samples/cloudbroker/rg/resource_rg/main.tf b/samples/cloudbroker/rg/resource_rg/main.tf
index f68c4319..ef41dfb0 100644
--- a/samples/cloudbroker/rg/resource_rg/main.tf
+++ b/samples/cloudbroker/rg/resource_rg/main.tf
@@ -198,13 +198,18 @@ resource "decort_cb_rg" "rg" {
#доступ к дополнительным функциям управления ВМ
#опциональный параметр
- #возможные значенния - "hugepages", "numa", "cpupin", "vfnic", "dpdk, "changemac"
+ #возможные значенния - "hugepages", "numa", "cpupin", "vfnic", "dpdk, "changemac", "trunk"
#тип - массив строк
#внимание - требуется указывать итоговое желаемое состояние для ресурсной группы (рг), так как поле compute_features не будет автоматически
#наследоваться от аккаунта, в котором создается рг.
#используется при создании и обновлении
#compute_features = ["hugepages", "numa", "cpupin", "vfnic"]
+ #идентификатор группы доступа SDN
+ #опциональный параметр
+ #тип - строка
+ #используется при создании
+ #sdn_access_group_id = "64e039f4-3705-4feb-84ff-a59fbdb1ebfe"
}
output "output" {
diff --git a/samples/cloudbroker/trunk/data_trunk/main.tf b/samples/cloudbroker/trunk/data_trunk/main.tf
new file mode 100644
index 00000000..d14a7065
--- /dev/null
+++ b/samples/cloudbroker/trunk/data_trunk/main.tf
@@ -0,0 +1,38 @@
+/*
+Пример использования
+Получение данных транка
+*/
+
+#Раскомментируйте этот код,
+#и внесите необходимые правки в версию и путь,
+#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
+/*
+terraform {
+ required_providers {
+ decort = {
+ source = "basis/decort/decort"
+ version = ""
+ }
+ }
+}
+*/
+
+provider "decort" {
+ authenticator = "decs3o"
+ #controller_url =
+ controller_url = "https://ds1.digitalenergy.online"
+ #oauth2_url =
+ oauth2_url = "https://sso.digitalenergy.online"
+ allow_unverified_ssl = true
+}
+
+data "decort_cb_trunk" "name" {
+ #идентификатор транка
+ #обязательный параметр
+ #тип - целое число
+ trunk_id = 1111
+}
+
+output "test" {
+ value = data.decort_cb_trunk.name
+}
\ No newline at end of file
diff --git a/samples/cloudbroker/trunk/data_trunk_list/main.tf b/samples/cloudbroker/trunk/data_trunk_list/main.tf
new file mode 100644
index 00000000..b98d98e1
--- /dev/null
+++ b/samples/cloudbroker/trunk/data_trunk_list/main.tf
@@ -0,0 +1,57 @@
+/*
+Пример использования
+Получение списка транковых портов.
+*/
+
+#Раскомментируйте этот код,
+#и внесите необходимые правки в версию и путь,
+#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
+/*
+terraform {
+ required_providers {
+ decort = {
+ source = "basis/decort/decort"
+ version = ""
+ }
+ }
+}
+*/
+
+data "decort_cb_trunk_list" "name" {
+ #фильтр по id транка
+ #опциональный параметр
+ #тип - массив целых чисел
+ #trunk_ids = [10,11]
+
+ #фильтр по id учетных записей с доступом к транку
+ #опциональный параметр
+ #тип - массив целых чисел
+ #account_ids = [10,11]
+
+ #фильтр по тегам транка (значение от 1 до 4095)
+ #опциональный параметр
+ #тип - строка
+ #trunk_tags = "4095"
+
+ #сортировка по одному из поддерживаемых полей
+ #опциональный параметр
+ #формат - "+поле" по возрастанию / "-поле" по убыванию
+ #тип - строка
+ #sort_by = "+name"
+
+ #номер страницы для отображения
+ #опциональный параметр
+ #если не задан - выводятся все доступные данные
+ #тип - целое число
+ #page = 1
+
+ #размер страницы
+ #опциональный параметр
+ #если не задан - выводятся все доступные данные
+ #тип - целое число
+ #size = 1
+}
+
+output "test" {
+ value = data.decort_cb_trunk_list.name
+}
\ No newline at end of file
diff --git a/samples/cloudbroker/trunk/resource_trunk/main.tf b/samples/cloudbroker/trunk/resource_trunk/main.tf
new file mode 100644
index 00000000..8516f752
--- /dev/null
+++ b/samples/cloudbroker/trunk/resource_trunk/main.tf
@@ -0,0 +1,80 @@
+/*
+Пример использования
+Ресурса транкового порта:
+1. Создание ресурса
+2. Изменение ресурса
+3. Удаление ресурса
+*/
+
+#Раскомментируйте этот код,
+#и внесите необходимые правки в версию и путь,
+#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
+
+/*
+terraform {
+ required_providers {
+ decort = {
+ source = "basis/decort/decort"
+ version = ""
+ }
+ }
+}
+*/
+
+provider "decort" {
+ authenticator = "decs3o"
+ #controller_url =
+ controller_url = "https://ds1.digitalenergy.online"
+ #oauth2_url =
+ oauth2_url = "https://sso.digitalenergy.online"
+ allow_unverified_ssl = true
+}
+
+resource "decort_cb_trunk" "name" {
+ #имя транка
+ #обязательный параметр
+ #тип - строка
+ #используется при создании и обновлении
+ name = "trunk_name"
+
+ #список тегов транка (значения от 1 до 4095)
+ #обязательный параметр
+ #тип - строка
+ #используется при создании и обновлении
+ trunk_tags = "4095"
+
+ #имя моста ovs
+ #обязательный параметр
+ #тип - строка
+ #используется при создании
+ ovs_bridge = "ovs_bridge_name"
+
+ #описание
+ #опциональный параметр
+ #тип - строка
+ #используется при создании и обновлении
+ #description = "desc"
+
+ #список идентификаторов учетных записей с доступом к этому транку
+ #опциональный параметр
+ #тип - массив целых чисел
+ #используется при создании и обновлении
+ #account_ids = [10,11]
+
+ #идентификатор vlan
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #native_vlan_id = 123
+
+ #сделать доступным или отключить
+ #опциональный параметр
+ #тип - булев
+ #используется при создании и обновлении
+ #по умолчанию - true
+ #enable = true
+}
+
+output "test" {
+ value = decort_cb_trunk.name
+}
\ No newline at end of file
diff --git a/samples/cloudbroker/user/data_user_list/main.tf b/samples/cloudbroker/user/data_user_list/main.tf
index 03acf473..fb50414c 100644
--- a/samples/cloudbroker/user/data_user_list/main.tf
+++ b/samples/cloudbroker/user/data_user_list/main.tf
@@ -37,6 +37,11 @@ data "decort_cb_user_list" "users" {
#тип - булев
#active = true
+ #фильтр по электронной почте
+ #опциональный параметр
+ #тип - строка
+ #email = "user@site.domen"
+
#фильтр по сервисным аккаунтам
#опциональный параметр
#тип - булев
diff --git a/samples/cloudbroker/user/resource_user/main.tf b/samples/cloudbroker/user/resource_user/main.tf
index 8c15aaed..82baf397 100644
--- a/samples/cloudbroker/user/resource_user/main.tf
+++ b/samples/cloudbroker/user/resource_user/main.tf
@@ -44,22 +44,31 @@ resource "decort_cb_user" "user" {
emailaddress = ["user1@example.com"]
#пароль пользователя
+ #значение по умолчанию – strongpassword
#опциональный параметр
#тип - строка
#используется при создании
#password = "user1Password"
- #список групп, к которым принадлежит этот пользователь
- #опциональный параметр
- #тип - массив строк
- #используется при создании
- #groups = ["user"]
-
#список групп доступа к api, к которым принадлежит этот пользователь
#опциональный параметр
#тип - массив целых чисел
#используется при создании и обновлении
#apiaccess = [1,2]
+
+ #заблокировать пользователя
+ #значение по умолчанию - false
+ #опциональный параметр
+ #тип - булев
+ #используется при обновлении
+ #blocked = false
+
+ #провайдер
+ #опциональный параметр
+ #возможные значения - bvs, decs3o
+ #тип - строка
+ #используется при создании
+ #provider_name = "bvs"
}
diff --git a/samples/cloudbroker/vins/resource_vins/main.tf b/samples/cloudbroker/vins/resource_vins/main.tf
index 7778e366..14284f23 100644
--- a/samples/cloudbroker/vins/resource_vins/main.tf
+++ b/samples/cloudbroker/vins/resource_vins/main.tf
@@ -242,6 +242,12 @@ resource "decort_cb_vins" "vins" {
#используется при создании и обновлении
#dns = ["1.1.1.1", "2.2.2.2"]
+ #идентификатор экземпляра zone
+ #опциональный параметр
+ #тип - целое число
+ #используется при создании и обновлении
+ #zone_id = 1111
+
}
output "test" {
diff --git a/samples/cloudbroker/zone/data_zone/main.tf b/samples/cloudbroker/zone/data_zone/main.tf
new file mode 100644
index 00000000..d5f1fa10
--- /dev/null
+++ b/samples/cloudbroker/zone/data_zone/main.tf
@@ -0,0 +1,38 @@
+/*
+Пример использования
+Получение информации о zone по ее id
+*/
+
+#Расскомментируйте этот код,
+#и внесите необходимые правки в версию и путь,
+#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
+/*
+terraform {
+ required_providers {
+ decort = {
+ source = "basis/decort/decort"
+ version = ""
+ }
+ }
+}
+*/
+provider "decort" {
+ authenticator = "decs3o"
+ #controller_url =
+ controller_url = "https://ds1.digitalenergy.online"
+ #oauth2_url =
+ oauth2_url = "https://sso.digitalenergy.online"
+ allow_unverified_ssl = true
+}
+
+data "decort_cb_zone" "zone" {
+ #идентификатор zone
+ #обязательный параметр
+ #тип - целое число
+ zone_id = 2
+}
+
+output "test" {
+ value = data.decort_cb_zone.zone
+}
+
diff --git a/samples/cloudbroker/zone/data_zone_list/main.tf b/samples/cloudbroker/zone/data_zone_list/main.tf
new file mode 100644
index 00000000..cacbaf57
--- /dev/null
+++ b/samples/cloudbroker/zone/data_zone_list/main.tf
@@ -0,0 +1,87 @@
+/*
+Пример использования
+Получение списка zone
+*/
+
+#Расскомментируйте этот код,
+#и внесите необходимые правки в версию и путь,
+#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
+/*
+terraform {
+ required_providers {
+ decort = {
+ source = "basis/decort/decort"
+ version = ""
+ }
+ }
+}
+*/
+
+provider "decort" {
+ authenticator = "decs3o"
+ #controller_url =
+ controller_url = "https://ds1.digitalenergy.online"
+ #oauth2_url =
+ oauth2_url = "https://sso.digitalenergy.online"
+ allow_unverified_ssl = true
+}
+
+data "decort_cb_zone_list" "zone_list" {
+ #фильтрация списка для получения информации о конкретном zone по его id
+ #опциональный параметр
+ #тип - целое число
+ #by_id = 1
+
+ #фильтрация списка для получения информации о zone, которые принадлежат к определенному GRID
+ #опциональный параметр
+ #тип - целое число
+ #gid = 1
+
+ #фильтрация списка для получения информации о конкретном zone по его имени
+ #опциональный параметр
+ #тип - строка
+ #name = "alpha-cpu-04"
+
+ #фильтрация списка для получения информации о конкретном zone по его описанию
+ #опциональный параметр
+ #тип - строка
+ #description = "some"
+
+ #фильтрация списка для получения информации о zone, которые имеют соответствующий статус
+ #опциональный параметр
+ #тип - строка
+ #status = "ENABLED"
+
+ #фильтрация списка для получения информации о zone, которые удалены
+ #опциональный параметр
+ #тип - булев
+ #deletable = false
+
+ #фильтрация списка для получения информации о zone с конкретными nodeId
+ #опциональный параметр
+ #тип - целое число
+ #node_id = 1
+
+ #сортировка по одному из поддерживаемых полей
+ #опциональный параметр
+ #тип - строка
+ #формат - "+поле" по возрастанию / "-поле" по убыванию
+ #sort_by = "+name"
+
+ #номер страницы для отображения
+ #опциональный параметр
+ #тип - целое число
+ #если не задан - выводятся все доступные данные
+ #page = 2
+
+ #размер страницы
+ #опциональный параметр
+ #тип - целое число
+ #если не задан - выводятся все доступные данные
+ #size = 3
+}
+
+output "test" {
+ value = data.decort_cb_zone_list.zone_list
+}
+
diff --git a/samples/cloudbroker/zone/resource_zone/main.tf b/samples/cloudbroker/zone/resource_zone/main.tf
new file mode 100644
index 00000000..5fb78b6b
--- /dev/null
+++ b/samples/cloudbroker/zone/resource_zone/main.tf
@@ -0,0 +1,59 @@
+/*
+Пример использования
+Ресурс позволяет:
+1. Создавать зону
+2. Изменять зону
+3. Добавлять новые узлы в зону
+4. Удалять узлы из зоны
+5. Удалять зону
+*/
+
+#Расскомментируйте этот код,
+#и внесите необходимые правки в версию и путь,
+#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
+/*
+terraform {
+ required_providers {
+ decort = {
+ source = "basis/decort/decort"
+ version = ""
+ }
+ }
+}
+*/
+
+provider "decort" {
+ authenticator = "decs3o"
+ #controller_url =
+ controller_url = "https://ds1.digitalenergy.online"
+ #oauth2_url =
+ oauth2_url = "https://sso.digitalenergy.online"
+ allow_unverified_ssl = true
+}
+
+resource "decort_cb_zone" "zone" {
+ #наименование зоны
+ #обязательный параметр
+ #тип - строка
+ #используется при создании и обновлении
+ name = "test"
+
+ #описание зоны
+ #опциональный параметр
+ #тип - строка
+ #используется при создании и обновлении
+ #description = "desc"
+
+ #прикрепленные узлы
+ #опциональный параметр
+ #тип - массив целых чисел
+ #используется при создании и обновлении
+ #node_ids = [1,2,3]
+}
+
+output "test" {
+ value = decort_cb_zone.comp
+}
+
+
+