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 +} + + +