From cd3310836b2605a3f625aa3c04a0134f9224ef2c Mon Sep 17 00:00:00 2001 From: Alexey Fetisov Date: Fri, 30 Oct 2026 16:23:20 +0300 Subject: [PATCH] 4.13.1 4.13.1 --- CHANGELOG.md | 238 +---------- Makefile | 2 +- README.md | 2 + docs/data-sources/cb_grid.md | 1 + docs/data-sources/cb_grid_list.md | 1 + docs/data-sources/cb_kvmvm.md | 1 + docs/data-sources/cb_kvmvm_list.md | 3 + docs/data-sources/cb_kvmvm_list_deleted.md | 1 + docs/data-sources/cb_vm_folder.md | 57 +++ docs/data-sources/cb_vm_folder_list.md | 64 +++ docs/data-sources/kvmvm.md | 1 + docs/data-sources/kvmvm_list.md | 3 + docs/data-sources/kvmvm_list_deleted.md | 1 + docs/data-sources/locations_list.md | 1 + .../sdn_default_security_policy_list.md | 149 ------- docs/data-sources/vm_folder.md | 56 +++ docs/data-sources/vm_folder_list.md | 64 +++ docs/resources/cb_kvmvm.md | 1 + docs/resources/cb_vm_folder.md | 80 ++++ docs/resources/kvmvm.md | 1 + docs/resources/vm_folder.md | 79 ++++ go.mod | 2 +- go.sum | 4 +- internal/provider/data_sources_map.go | 30 +- internal/provider/resource_map.go | 4 + .../cloudapi/kvmvm/data_source_compute.go | 4 + .../kvmvm/data_source_compute_list.go | 14 + internal/service/cloudapi/kvmvm/flattens.go | 3 + .../cloudapi/kvmvm/resource_compute.go | 4 + .../cloudapi/kvmvm/utility_compute_list.go | 6 + .../locations/data_source_locations_list.go | 5 + .../vmfolder/data_source_vm_folder.go | 130 ++++++ .../vmfolder/data_source_vm_folder_list.go | 108 +++++ .../service/cloudapi/vmfolder/flattens.go | 54 +++ .../cloudapi/vmfolder/resource_vm_folder.go | 279 +++++++++++++ .../cloudapi/vmfolder/utility_vm_folder.go | 117 ++++++ .../vmfolder/utility_vm_folder_list.go | 33 ++ internal/service/cloudbroker/grid/flattens.go | 2 + internal/service/cloudbroker/grid/schema.go | 8 + .../service/cloudbroker/kvmvm/flattens.go | 4 + internal/service/cloudbroker/kvmvm/schema.go | 26 ++ .../cloudbroker/kvmvm/utility_compute_list.go | 6 + .../vmfolder/data_source_vm_folder.go | 44 +++ .../vmfolder/data_source_vm_folder_list.go | 43 ++ .../service/cloudbroker/vmfolder/flattens.go | 55 +++ .../vmfolder/resource_vm_folder.go | 182 +++++++++ .../service/cloudbroker/vmfolder/schema.go | 266 +++++++++++++ .../cloudbroker/vmfolder/utility_vm_folder.go | 117 ++++++ .../vmfolder/utility_vm_folder_list.go | 33 ++ ...decort_sdn_default_security_policy_list.go | 40 -- .../sdn/default_security_policy/flattens.go | 130 ------ .../sdn/default_security_policy/schema.go | 369 ------------------ .../utility_default_security_policy_list.go | 40 -- samples/README.md | 7 +- .../cloudapi/kvmvm/data_kvmvm_list/main.tf | 10 + .../cloudapi/vmfolder/data_vm_folder/main.tf | 38 ++ .../vmfolder/data_vm_folder_list/main.tf | 48 +++ .../vmfolder/resource_vm_folder/main.tf | 88 +++++ .../cloudbroker/kvmvm/data_kvmvm_list/main.tf | 10 + .../vmfolder/data_vm_folder/main.tf | 38 ++ .../vmfolder/data_vm_folder_list/main.tf | 48 +++ .../vmfolder/resource_vm_folder/main.tf | 88 +++++ .../main.tf | 61 --- 63 files changed, 2375 insertions(+), 1029 deletions(-) create mode 100644 docs/data-sources/cb_vm_folder.md create mode 100644 docs/data-sources/cb_vm_folder_list.md delete mode 100644 docs/data-sources/sdn_default_security_policy_list.md create mode 100644 docs/data-sources/vm_folder.md create mode 100644 docs/data-sources/vm_folder_list.md create mode 100644 docs/resources/cb_vm_folder.md create mode 100644 docs/resources/vm_folder.md create mode 100644 internal/service/cloudapi/vmfolder/data_source_vm_folder.go create mode 100644 internal/service/cloudapi/vmfolder/data_source_vm_folder_list.go create mode 100644 internal/service/cloudapi/vmfolder/flattens.go create mode 100644 internal/service/cloudapi/vmfolder/resource_vm_folder.go create mode 100644 internal/service/cloudapi/vmfolder/utility_vm_folder.go create mode 100644 internal/service/cloudapi/vmfolder/utility_vm_folder_list.go create mode 100644 internal/service/cloudbroker/vmfolder/data_source_vm_folder.go create mode 100644 internal/service/cloudbroker/vmfolder/data_source_vm_folder_list.go create mode 100644 internal/service/cloudbroker/vmfolder/flattens.go create mode 100644 internal/service/cloudbroker/vmfolder/resource_vm_folder.go create mode 100644 internal/service/cloudbroker/vmfolder/schema.go create mode 100644 internal/service/cloudbroker/vmfolder/utility_vm_folder.go create mode 100644 internal/service/cloudbroker/vmfolder/utility_vm_folder_list.go delete mode 100644 internal/service/sdn/default_security_policy/data_decort_sdn_default_security_policy_list.go delete mode 100644 internal/service/sdn/default_security_policy/flattens.go delete mode 100644 internal/service/sdn/default_security_policy/schema.go delete mode 100644 internal/service/sdn/default_security_policy/utility_default_security_policy_list.go create mode 100644 samples/cloudapi/vmfolder/data_vm_folder/main.tf create mode 100644 samples/cloudapi/vmfolder/data_vm_folder_list/main.tf create mode 100644 samples/cloudapi/vmfolder/resource_vm_folder/main.tf create mode 100644 samples/cloudbroker/vmfolder/data_vm_folder/main.tf create mode 100644 samples/cloudbroker/vmfolder/data_vm_folder_list/main.tf create mode 100644 samples/cloudbroker/vmfolder/resource_vm_folder/main.tf delete mode 100644 samples/sdn/default_security_policy/data_decort_sdn_default_security_policy_list/main.tf diff --git a/CHANGELOG.md b/CHANGELOG.md index 116fc33c..af321be4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -## Version 4.13.0 +## Version 4.13.1 ### Deprecated | Компонент | Тип | Подробности | @@ -10,242 +10,36 @@ ### Добавлено -#### disks -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1314 | Вычисляемое поле `computes_read_only` в resource `decort_disk` в cloudapi/disks | -| BATF-1314 | Вычисляемое поле `computes_read_only` в datasources `decort_disk`, `decort_disk_list` и `decort_disk_list_deleted` в cloudapi/disks | -| BATF-1314 | Вычисляемое поле `computes_read_only` в resource `decort_cb_disk` в cloudbroker/disks | -| BATF-1314 | Вычисляемое поле `computes_read_only` в datasources `decort_cb_disk`, `decort_cb_disk_list` и `decort_cb_disk_list_deleted` в cloudbroker/disks | -| BATF-1334 | Вычисляемое поле `pool_name` в блоке `snapshots` в datasource `decort_disk` в cloudapi/disks | -| BATF-1334 | Вычисляемое поле `pool_name` в блоке `snapshots` в datasource `decort_cb_disk` в cloudbroker/disks | -| BATF-1356 | Вычисляемое поле `pool_name` в блоке `snapshots` в resource `decort_disk` в cloudapi/disks | -| BATF-1356 | Вычисляемое поле `pool_name` в блоке `snapshots` в datasources `decort_disk_list`, `decort_disk_list_deleted`, `decort_disk_list_unattached` и `decort_disk_replication` в cloudapi/disks | -| BATF-1356 | Вычисляемое поле `pool_name` в блоке `snapshots` в resource `decort_cb_disk` в cloudbroker/disks | -| BATF-1356 | Вычисляемое поле `pool_name` в блоке `snapshots` в datasources `decort_cb_disk_list`, `decort_cb_disk_list_deleted` и `decort_cb_disk_replication` в cloudbroker/disks | - -#### extnet -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1302 | Вычисляемое поле `free_ips` в datasource `decort_extnet_list` в cloudapi/extnet | -| BATF-1375 | Вычисляемые поля `pre_reservations` и `sec_vnfdev_id` в resource `decort_cb_extnet` в cloudbroker/extnet | -| BATF-1375 | Вычисляемое поле `desc` в блоке `reservations` в resource `decort_cb_extnet` в cloudbroker/extnet | - #### grid | Идентификатор
задачи | Описание | | --- | --- | -| BATF-1311 | Вычисляемые поля `cpu_allocation_ratio_vm`, `cpu_allocation_ratio`, `custom_backup_path`, `interface_generation_scheme`, `mac_address_prefix`, `node_self_stop_timer_uptime_monitor` и `node_self_stop_uptime_monitor` в datasource `decort_cb_grid_get_settings` в cloudbroker/grid | -| BATF-1311 | Вычисляемое поле `zero_access_enabled` в datasource `decort_cb_grid` в cloudbroker/grid | -| BATF-1311 | Вычисляемое поле `policies` в datasource `decort_cb_grid_get_consumption` в cloudbroker/grid | -| BATF-1333 | Вычисляемые поля `reserved_cpu` и `reserved_ram` в datasources `decort_cb_grid` и `decort_cb_grid_list` в cloudbroker/grid | -| BATF-1333 | Вычисляемое поле `policies` в блоках `current` и `reserved` в datasource `decort_cb_grid_list` в cloudbroker/grid | -| BATF-1333 | Вычисляемое поле `bro_enabled` в блоке `items` в datasource `decort_cb_grid_list` в cloudbroker/grid | -| BATF-1424 | Возможность задать поле `vnfdev_start` при создании resource `decort_cb_vins` в cloudbroker/vins | +| BATF-1439 | Вычисляемое поле `vm_folders_enabled` в datasources `decort_cb_grid` и `decort_cb_grid_list` в cloudbroker/grid | #### kvmvm | Идентификатор
задачи | Описание | | --- | --- | -| BATF-1323 | Вычисляемое поле `memory_dump_image` в блоке `snap_sets` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | -| BATF-1323 | Вычисляемое поле `memory_dump_image` в блоке `snap_sets` в resource `decort_kvmvm` в cloudapi/kvmvm | -| BATF-1323 | Вычисляемое поле `memory_dump_image` в блоке `snap_sets` в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm | -| BATF-1323 | Вычисляемое поле `memory_dump_image` в блоке `snap_sets` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm | -| BATF-1313 | Опциональное поле `read_only` в блоке `disks` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | -| BATF-1313 | Опциональное поле `read_only` в блоке `disks` в resource `decort_kvmvm` в cloudapi/kvmvm | -| BATF-1313 | Вычисляемое поле `read_only` в блоке `disks` в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm | -| BATF-1313 | Вычисляемое поле `read_only` в блоке `disks` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm | -| BATF-1303 | Опциональное поле `clock` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | -| BATF-1303 | Опциональное поле `clock` в resource `decort_kvmvm` в cloudapi/kvmvm | -| BATF-1303 | Вычисляемое поле `clock` в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm | -| BATF-1303 | Вычисляемое поле `clock` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm | -| BATF-1297 | Datasource `decort_cb_kvmvm_cpu_alignment_profile` в cloudbroker/kvmvm | -| BATF-1297 | Datasource `decort_kvmvm_cpu_alignment_profile` в cloudapi/kvmvm | -| BATF-1297 | Опциональное поле `cpu_alignment_profile` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | -| BATF-1297 | Опциональное поле `cpu_alignment_profile` в resource `decort_kvmvm` в cloudapi/kvmvm | -| BATF-1297 | Вычисляемое поле `cpu_alignment_profiles` в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm | -| BATF-1297 | Вычисляемое поле `cpu_alignment_profiles` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm | -| BATF-1335 | Вычисляемое поле `pool_name` в блоке `snapshots` в datasource `decort_kvmvm` в cloudapi/kvmvm и в datasource `decort_cb_kvmvm` в cloudbroker/kvmvm | -| BATF-1332 | Вычисляемое поле `node_id` в datasources `decort_kvmvm` и `decort_kvmvm_list` в cloudapi/kvmvm | -| BATF-1326 | Опциональное поле `enable_default_gateway` в блоке `network` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | -| BATF-1326 | Опциональное поле `enable_default_gateway` в блоке `network` в resource `decort_kvmvm` в cloudapi/kvmvm | -| BATF-1326 | Вычисляемое поле `enable_default_gateway` в блоке `interfaces` в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` и resource `decort_cb_kvmvm` в cloudbroker/kvmvm | -| BATF-1326 | Вычисляемое поле `enable_default_gateway` в блоке `interfaces` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` и resource `decort_kvmvm` в cloudapi/kvmvm | -| BATF-1342 | Вычисляемое поле `resized_online` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | -| BATF-1342 | Вычисляемое поле `resized_online` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm и в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm | -| BATF-1343 | Вычисляемые поля `completed`, `cpu_set`, `daemon_addr`, `domain_name`, `domain_uuid`, `elapsed_time`, `gid`, `guid`, `migration_id`, `interfaces`, `log`, `new_disk_xmls`, `new_disks`, `old_disks`, `pid`, `source_node_id`, `source_numa_node_id`, `source_reserved_node_cpus`, `source_url`, `status`, `target_shadow_compute`, `target_node_id`, `target_url` и `vmlog_dir` в datasource `decort_cb_kvmvm_migrate_storage_info` в cloudbroker/kvmvm | +| BATF-1421 | Опциональные поля `folder_id` и `include_descendants` в datasource `decort_kvmvm_list` в cloudapi/kvmvm и в datasource `decort_cb_kvmvm_list` в cloudbroker/kvmvm | +| BATF-1421 | Вычисляемое поле `folder_id` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | +| BATF-1421 | Вычисляемое поле `folder_id` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm и в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm | -#### node +#### locations | Идентификатор
задачи | Описание | | --- | --- | -| BATF-1306 | Вычисляемое поле `pci_devices` в datasource `decort_cb_node_list` в cloudbroker/node | -| BATF-1294 | Вычисляемые поля `one_g_free`, `one_g_reserved`, `one_g_available`, `one_g_used`, `one_g_dpdk_reserved`, `two_m_free`, `two_m_reserved`, `two_m_available` и `two_m_used` в блоке `memory` в datasources `decort_cb_node` и `decort_cb_node_list` в cloudbroker/node | -| BATF-1305 | Datasources `decort_cb_node_network_info` и `decort_cb_node_pci_devices` в cloudbroker/node | -| BATF-1330 | Вычисляемые поля `reserved_cpu` и `reserved_ram` в datasources `decort_cb_node` и `decort_cb_node_list` в cloudbroker/node | -| BATF-1336 | Вычисляемое поле `machine_id` в datasource `decort_cb_node_list` в cloudbroker/node | -| BATF-1364 | Вычисляемое поле `ovs_dpdk_cores` в datasources `decort_cb_node` и `decort_cb_node_list` в cloudbroker/node | +| BATF-1420 | Вычисляемое поле `vm_folders_enabled` в datasource `decort_locations_list` в cloudapi/locations | -#### rg +#### vmfolder | Идентификатор
задачи | Описание | | --- | --- | -| BATF-1337 | Опциональное поле `enable_default_gateway` в resource `decort_resgroup` в cloudapi/resgroup и в resource `decort_cb_rg` в cloudbroker/resgroup | -| BATF-1309 | Вычисляемое поле `email` в блоке `acl` в datasources `decort_cb_rg_list` и `decort_cb_rg_list_deleted` в cloudbroker/rg | - -#### sep -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1318 | Вычисляемые поля `entry_count` и `items` в datasource `decort_cb_sep_consumption` в cloudbroker/sep | - -#### vins -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1327 | Опциональное поле `enable_default_gateway` в resource `decort_cb_vins` в cloudbroker/vins | -| BATF-1327 | Вычисляемое поле `enable_default_gateway` в datasources `decort_cb_vins`, `decort_cb_vins_list` и `decort_cb_vins_list_deleted` в cloudbroker/vins | -| BATF-1327 | Опциональное поле `enable_default_gateway` в resource `decort_vins` в cloudapi/vins | -| BATF-1327 | Вычисляемое поле `enable_default_gateway` в datasource `decort_vins` в cloudapi/vins | - -#### zone -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1295 | Опциональное поле `hypervisor_similarity_in_percentage` в resource `decort_cb_zone` в cloudbroker/zone | -| BATF-1295 | Вычисляемое поле `cpu_alignment_profiles` в resource `decort_cb_zone` в cloudbroker/zone | -| BATF-1295 | Datasources `decort_cb_zone_cpu_alignment_profile`, `decort_cb_zone_cpu_alignment_profile_list` и `decort_cb_zone_cpu_alignment_profile_test` в cloudbroker/zone | -| BATF-1296 | Вычисляемое поле `cpu_alignment_profiles` в datasources `decort_zone` и `decort_zone_list` в cloudapi/zone | -| BATF-1296 | Вычисляемое поле `cpu_alignment_profiles` в datasources `decort_cb_zone` и `decort_cb_zone_list` и в resource `decort_cb_zone` в cloudbroker/zone | -| BATF-1328 | Опциональные поля `reserved_cpu` и `reserved_ram` в resource `decort_cb_zone` в cloudbroker/zone | -| BATF-1329 | Вычисляемые поля `reserved_cpu` и `reserved_ram` в datasources `decort_cb_zone` и `decort_cb_zone_list` в cloudbroker/zone | -| BATF-1329 | Вычисляемые поля `reserved_cpu` и `reserved_ram` в datasources `decort_zone` и `decort_zone_list` в cloudapi/zone | - - -#### SDN logicalports -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1315 | Вычисляемое поле `exclude_firewall` в resource `decort_sdn_logical_port` и datasources `decort_sdn_logical_port`, `decort_sdn_logical_port_get_by_unique_identifier` и `decort_sdn_logical_port_list` в sdn/logicalports | -| BATF-1363 | Вычисляемые поля `id`, `logical_port_id` и `assigned_at` в блоке `logical_port_addresses` в resource `decort_sdn_logical_port` в sdn/logicalports | - -#### SDN netobjgroups -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1308 | Опциональное поле `type` в datasource `decort_sdn_network_object_group_list` в sdn/netobjgroups | -| BATF-1308 | Вычисляемые поля `Comment`, `DisplayName`, `Enabled`, `ExternalNetworkID`, `IPv4` и `MAC` в datasources `decort_sdn_network_object_group` и `decort_sdn_network_object_group_list` в sdn/netobjgroups | -| BATF-1308 | Вычисляемые поля `Comment`, `DisplayName`, `Enabled`, `ExternalNetworkID`, `IPv4` и `MAC` в resource `decort_sdn_network_object_group` в sdn/netobjgroups | - - -### Изменено - -#### account -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1310 | Тип поля `cpu_allocation_ratio` с `float` на `int` в datasource и resource `decort_account` в cloudapi/account | -| BATF-1310 | Тип поля `cpu_allocation_ratio` с `float` на `int` в datasources `decort_cb_account`, `decort_cb_account_list` и `decort_cb_account_list_deleted` и resource `decort_cb_account` в cloudbroker/account | - -#### disks -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1300 | Тип опционального поля `blk_discard` с `bool` на `string` и переименование в `discard` в resource `decort_cb_disk` в cloudbroker/disks | -| BATF-1300 | Тип вычисляемого поля `blk_discard` с `bool` на `string` и переименование в `discard` в datasources `decort_cb_disk`, `decort_cb_disk_list`, `decort_cb_disk_list_unattached` и `decort_cb_disk_list_deleted` в cloudbroker/disks | -| BATF-1300 | Тип вычисляемого поля `blk_discard` с `bool` на `string` и переименование в `discard` в resource `decort_disk` и datasources `decort_disk`, `decort_disk_list`, `decort_disk_list_unattached` и `decort_disk_list_deleted` в cloudapi/disks | - -#### image -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1299 | Тип поля `account_id` c опционального на обязательный в resource `decort_image_virtual` в cloudapi/image | -| BATF-1304 | Тип опционального поля `type_image` с `string` на `[]string` в datasource `decort_image_list` в cloudapi/image | -| BATF-1304 | Тип опционального поля `type_image` с `string` на `[]string` в datasource `decort_cb_image_list` в cloudbroker/image | -| BATF-1304 | Переименование вычисляемого поля `type` в `type_image` в блоке `items` в datasource `decort_image_list` в cloudapi/image | - -#### kvmvm -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1300 | Тип вычисляемого поля `blk_discard` с `bool` на `string` и переименование в `discard` в блоке `disks` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | -| BATF-1300 | Тип опционального поля `blk_discard` с `bool` на `string` и переименование в `discard` в блоке `disks` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | -| BATF-1300 | Тип опционального поля `boot_disk_blk_discard` с `bool` на `string` и переименование в `boot_disk_discard` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | -| BATF-1300 | Тип вычисляемого поля `blk_discard` с `bool` на `string` и переименование в `discard` в блоке `disks` в datasource `decort_cb_kvmvm` в cloudbroker/kvmvm | -| BATF-1300 | Тип вычисляемого поля `blk_discard` с `bool` на `string` и переименование в `discard` в блоке `disks` в resource `decort_kvmvm` и datasource `decort_kvmvm` в cloudapi/kvmvm | - -#### k8ci -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1376 | Опциональное поле `enabled` получило значение по умолчанию `true` в resource `decort_cb_k8ci` в cloudbroker/k8ci | - -#### node -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1312 | Тип вычисляемых полей `cpu_allocation_ratio` и `mem_allocation_ratio` с `float` на `int` в datasources `decort_cb_node` и `decort_cb_node_list` в cloudbroker/node | -| BATF-1312 | Тип вычисляемого поля `vcpu` с `float` на `int` в блоке `free` в datasource `decort_cb_node` в cloudbroker/node | - -#### rg -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1309 | Тип поля `cpu_allocation_ratio` с `float` на `int` в datasources `decort_resgroup`, `decort_rg_list`, `decort_rg_list_deleted` и resource `decort_resgroup` в cloudapi/rg | -| BATF-1309 | Тип поля `cpu_allocation_ratio` с `float` на `int` в datasources `decort_cb_rg`, `decort_cb_rg_list`, `decort_cb_rg_list_deleted` и resource `decort_cb_rg` в cloudbroker/rg | - -#### sep -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1318 | Тип поля `sep_id` c обязательного на опциональный в datasource `decort_cb_sep_consumption` в cloudbroker/sep | - -#### storage policy -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1373 | Тип поля `limit_iops` с опционального на опционально-вычисляемое в resource `decort_cb_storage_policy` в cloudbroker/stpolicy | - -#### user -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1293 | Тип поля `password` с опционального на обязательный в resource `decort_cb_user` в cloudbroker/user | - -#### SDN logicalports -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1363 | Тип поля `logical_port_addresses` с `list` на `set` в resource `decort_sdn_logical_port` в sdn/logicalports | -| BATF-1363 | Тип поля `unique_identifier` с опционального на опционально-вычисляемый в resource `decort_sdn_logical_port` в sdn/logicalports | -| BATF-1363 | Тип поля `is_primary` в блоке `logical_port_addresses` с обязательного на опциональный в resource `decort_sdn_logical_port` в sdn/logicalports | - - -### Исправлено - -#### extnet -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1375 | Баг с обновлением поля `enable_secgroups` в resource `decort_cb_extnet` в cloudbroker/extnet | -| BATF-1375 | Баги с опциональными полями `shared_with`, `sec_vnfdev_id`, `ntp`, `default_qos`, `enable`, `highly_available` и `vnfdev_ip` при создании resource `decort_cb_extnet` в cloudbroker/extnet | - -#### kvmvm -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1375 | Баг с полем `user_data` при чтении resource `decort_cb_kvmvm` в cloudbroker/kvmvm | - -#### SDN logicalports -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1360 | Баг с полем `adapter_mac` при обновлении resource `decort_sdn_logical_port` в sdn/logicalports | -| BATF-1360 | Баг с полем `labels` при обновлении resource `decort_sdn_logical_port` в sdn/logicalports | -| BATF-1360 | Каскадное изменение адресов `logical_port_addresses` при редактировании списка блоков адресов в resource `decort_sdn_logical_port` в sdn/logicalports | - +| BATF-1430 | Resource `decort_vm_folder` в cloudapi/vmfolder | +| BATF-1430 | Resource `decort_cb_vm_folder` в cloudbroker/vmfolder | +| BATF-1430 | Datasource `decort_vm_folder` в cloudapi/vmfolder | +| BATF-1430 | Datasource `decort_vm_folder_list` в cloudapi/vmfolder | +| BATF-1430 | Datasource `decort_cb_vm_folder` в cloudbroker/vmfolder | +| BATF-1430 | Datasource `decort_cb_vm_folder_list` в cloudbroker/vmfolder | ### Удалено -#### grid +#### SDN default security policy | Идентификатор
задачи | Описание | | --- | --- | -| BATF-1311 | Вычисляемые поля `ckey` и `meta` в datasource `decort_cb_grid` в cloudbroker/grid | -| BATF-1333 | Вычисляемые поля `networks`, `cpu_allocation_ratio_vm`, `cpu_allocation_ratio` и `custom_backup_path` в datasource `decort_cb_grid_get_settings` в cloudbroker/grid | - -#### kvmvm -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1343 | Вычисляемое поле `migrate_storage_info` в datasource `decort_cb_kvmvm_migrate_storage_info` в cloudbroker/kvmvm | - -#### node -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1364 | Вычисляемое поле `pmd_cpu` в datasources `decort_cb_node` и `decort_cb_node_list` в cloudbroker/node | - -#### user -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1293 | Вычисляемое поле `password` в datasources `decort_cb_user` и `decort_cb_user_list` в cloudbroker/user | - -#### SDN netobjgroups -| Идентификатор
задачи | Описание | -| --- | --- | -| BATF-1308 | Вычисляемые поля `BridgeNetworkName`, `DefaultGatewayIPv4` `DefaultGatewayIPv6`, `Description`, `ExternalNetworkPorts`, `Hypervisors`, `Status`, `SubnetV4`, `SubnetV6`, `CreatedAt`, `UpdatedAt` и `VLANTag` в datasources `decort_sdn_network_object_group` и `decort_sdn_network_object_group_list` и в resource `decort_sdn_network_object_group` в sdn/netobjgroups | \ No newline at end of file +| BATF-1458 | Datasource `decort_sdn_default_security_policy_list` из sdn/default_security_policy | diff --git a/Makefile b/Makefile index 15c280b8..92409644 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.13.0 +VERSION=4.13.1 OS_ARCH=$(shell go env GOHOSTOS)_$(shell go env GOHOSTARCH) FILES = ${BINARY}_${VERSION}_darwin_amd64\ diff --git a/README.md b/README.md index 0f804505..751b0bc0 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ Terraform provider для платформы Digital Energy Cloud Orchestration - Работа с snapshots, - Работа с trunk, - Работа с VINS, + - Работа с VM folders, - Работа с SEPs, - Работа с Zone. @@ -79,6 +80,7 @@ Terraform provider для платформы Digital Energy Cloud Orchestration - Работа с security groups, - Работа с trunk, - Работа с VINS, + - Работа с VM folders, - Работа с Zone. - Режим SDN: diff --git a/docs/data-sources/cb_grid.md b/docs/data-sources/cb_grid.md index c44fcc33..a498d530 100644 --- a/docs/data-sources/cb_grid.md +++ b/docs/data-sources/cb_grid.md @@ -36,6 +36,7 @@ description: |- - `reserved_cpu` (Number) - `reserved_ram` (Number) - `sdn_support` (Boolean) +- `vm_folders_enabled` (Boolean) - `zero_access_enabled` (Boolean) diff --git a/docs/data-sources/cb_grid_list.md b/docs/data-sources/cb_grid_list.md index c91debb8..fa04a17f 100644 --- a/docs/data-sources/cb_grid_list.md +++ b/docs/data-sources/cb_grid_list.md @@ -57,6 +57,7 @@ Read-Only: - `reserved_ram` (Number) - `resources` (List of Object) (see [below for nested schema](#nestedobjatt--items--resources)) - `sdn_support` (Boolean) +- `vm_folders_enabled` (Boolean) - `zero_access_enabled` (Boolean) diff --git a/docs/data-sources/cb_kvmvm.md b/docs/data-sources/cb_kvmvm.md index 08b40b92..9d20ca93 100644 --- a/docs/data-sources/cb_kvmvm.md +++ b/docs/data-sources/cb_kvmvm.md @@ -57,6 +57,7 @@ description: |- - `devices` (String) - `disks` (List of Object) (see [below for nested schema](#nestedatt--disks)) - `driver` (String) +- `folder_id` (Number) - `gid` (Number) - `guid` (Number) - `hot_resize` (Boolean) diff --git a/docs/data-sources/cb_kvmvm_list.md b/docs/data-sources/cb_kvmvm_list.md index 5b683807..de6f859c 100644 --- a/docs/data-sources/cb_kvmvm_list.md +++ b/docs/data-sources/cb_kvmvm_list.md @@ -22,7 +22,9 @@ description: |- - `cd_image_id` (Number) Find by CD image ID - `extnet_id` (Number) Find by Extnet ID - `extnet_name` (String) Find by Extnet name +- `folder_id` (Number) Find by VM folder ID - `ignore_k8s` (Boolean) If set to true, ignores any VMs associated with any k8s cluster +- `include_descendants` (Boolean) Include computes from descendant folders - `includedeleted` (Boolean) - `ip_address` (String) Find by IP address - `name` (String) Find by name @@ -90,6 +92,7 @@ Read-Only: - `devices` (String) - `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks)) - `driver` (String) +- `folder_id` (Number) - `gid` (Number) - `guid` (Number) - `hot_resize` (Boolean) diff --git a/docs/data-sources/cb_kvmvm_list_deleted.md b/docs/data-sources/cb_kvmvm_list_deleted.md index 1d7ecd21..fbbb7d3e 100644 --- a/docs/data-sources/cb_kvmvm_list_deleted.md +++ b/docs/data-sources/cb_kvmvm_list_deleted.md @@ -84,6 +84,7 @@ Read-Only: - `devices` (String) - `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks)) - `driver` (String) +- `folder_id` (Number) - `gid` (Number) - `guid` (Number) - `hot_resize` (Boolean) diff --git a/docs/data-sources/cb_vm_folder.md b/docs/data-sources/cb_vm_folder.md new file mode 100644 index 00000000..02786f9d --- /dev/null +++ b/docs/data-sources/cb_vm_folder.md @@ -0,0 +1,57 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_cb_vm_folder Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_cb_vm_folder (Data Source) + + + + + + +## Schema + +### Required + +- `folder_id` (Number) ID of the vm folder + +### Optional + +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `acl` (List of Object) Access control list of the vm folder (see [below for nested schema](#nestedatt--acl)) +- `compute_ids` (List of Number) IDs of computes in the vm folder +- `created_time` (Number) Time of creation +- `gid` (Number) Grid ID +- `id` (String) The ID of this resource. +- `name` (String) Name of the vm folder +- `parent_id` (Number) ID of the parent vm folder +- `rg_id` (Number) ID of the resource group +- `status` (String) Status of the vm folder +- `updated_time` (Number) Time of update + + +### Nested Schema for `timeouts` + +Optional: + +- `default` (String) +- `read` (String) + + + +### Nested Schema for `acl` + +Read-Only: + +- `explicit` (Boolean) +- `right` (String) +- `status` (String) +- `type` (String) +- `user_group_id` (String) diff --git a/docs/data-sources/cb_vm_folder_list.md b/docs/data-sources/cb_vm_folder_list.md new file mode 100644 index 00000000..3da62c84 --- /dev/null +++ b/docs/data-sources/cb_vm_folder_list.md @@ -0,0 +1,64 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_cb_vm_folder_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_cb_vm_folder_list (Data Source) + + + + + + +## Schema + +### Required + +- `rg_id` (Number) Find by resource group ID + +### Optional + +- `page` (Number) Page number +- `size` (Number) Page size +- `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: + +- `acl` (List of Object) (see [below for nested schema](#nestedobjatt--items--acl)) +- `id` (Number) +- `name` (String) +- `parent_id` (Number) +- `status` (String) +- `vm_count` (Number) + + +### Nested Schema for `items.acl` + +Read-Only: + +- `explicit` (Boolean) +- `right` (String) +- `status` (String) +- `type` (String) +- `user_group_id` (String) diff --git a/docs/data-sources/kvmvm.md b/docs/data-sources/kvmvm.md index aa895643..03d3fd59 100644 --- a/docs/data-sources/kvmvm.md +++ b/docs/data-sources/kvmvm.md @@ -56,6 +56,7 @@ description: |- - `devices` (String) - `disks` (List of Object) (see [below for nested schema](#nestedatt--disks)) - `driver` (String) +- `folder_id` (Number) - `gid` (Number) - `guid` (Number) - `hot_resize` (Boolean) diff --git a/docs/data-sources/kvmvm_list.md b/docs/data-sources/kvmvm_list.md index 27257c5a..e2f8a4eb 100644 --- a/docs/data-sources/kvmvm_list.md +++ b/docs/data-sources/kvmvm_list.md @@ -21,7 +21,9 @@ description: |- - `by_id` (Number) Find by ID - `extnet_id` (Number) Find by Extnet ID - `extnet_name` (String) Find by Extnet name +- `folder_id` (Number) Find by VM folder ID - `ignore_k8s` (Boolean) If set to true, ignores any VMs associated with any k8s cluster +- `include_descendants` (Boolean) Include computes from descendant folders - `includedeleted` (Boolean) - `ip_address` (String) Find by IP address - `name` (String) Find by name @@ -87,6 +89,7 @@ Read-Only: - `devices` (String) - `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks)) - `driver` (String) +- `folder_id` (Number) - `gid` (Number) - `guid` (Number) - `hot_resize` (Boolean) diff --git a/docs/data-sources/kvmvm_list_deleted.md b/docs/data-sources/kvmvm_list_deleted.md index e5b99570..4a99f1a7 100644 --- a/docs/data-sources/kvmvm_list_deleted.md +++ b/docs/data-sources/kvmvm_list_deleted.md @@ -84,6 +84,7 @@ Read-Only: - `devices` (String) - `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks)) - `driver` (String) +- `folder_id` (Number) - `gid` (Number) - `guid` (Number) - `hot_resize` (Boolean) diff --git a/docs/data-sources/locations_list.md b/docs/data-sources/locations_list.md index 531d26f3..069ac3d7 100644 --- a/docs/data-sources/locations_list.md +++ b/docs/data-sources/locations_list.md @@ -58,4 +58,5 @@ Read-Only: - `name` (String) - `network_modes` (List of String) - `sdn_support` (Boolean) +- `vm_folders_enabled` (Boolean) - `zero_access_enabled` (Boolean) diff --git a/docs/data-sources/sdn_default_security_policy_list.md b/docs/data-sources/sdn_default_security_policy_list.md deleted file mode 100644 index 35addcc1..00000000 --- a/docs/data-sources/sdn_default_security_policy_list.md +++ /dev/null @@ -1,149 +0,0 @@ ---- -# generated by https://github.com/hashicorp/terraform-plugin-docs -page_title: "decort_sdn_default_security_policy_list Data Source - terraform-provider-decort" -subcategory: "" -description: |- - ---- - -# decort_sdn_default_security_policy_list (Data Source) - - - - - - -## Schema - -### Optional - -- `access_group_id` (String) id of the access group -- `page` (Number) result page number -- `per_page` (Number) number of results per page -- `sort_by` (String) sort by one of the supported fields -- `sort_order` (String) sorting order -- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) - -### Read-Only - -- `id` (String) The ID of this resource. -- `items` (List of Object) List of default security policies (see [below for nested schema](#nestedatt--items)) - - -### Nested Schema for `timeouts` - -Optional: - -- `default` (String) -- `read` (String) - - - -### Nested Schema for `items` - -Read-Only: - -- `access_group_id` (String) -- `created_at` (String) -- `default_acl_drop` (String) -- `default_open_session_drop` (Boolean) -- `description` (String) -- `display_name` (String) -- `id` (String) -- `locked_at` (String) -- `security_rules` (List of Object) (see [below for nested schema](#nestedobjatt--items--security_rules)) -- `status` (List of Object) (see [below for nested schema](#nestedobjatt--items--status)) -- `version_id` (Number) - - -### Nested Schema for `items.security_rules` - -Read-Only: - -- `access_group_id` (String) -- `action` (String) -- `description` (String) -- `destination_net_object` (List of Object) (see [below for nested schema](#nestedobjatt--items--security_rules--destination_net_object)) -- `direction` (String) -- `display_name` (String) -- `enabled` (Boolean) -- `filter` (List of Object) (see [below for nested schema](#nestedobjatt--items--security_rules--filter)) -- `id` (String) -- `log_enabled` (Boolean) -- `log_name` (String) -- `log_severity` (String) -- `priority` (Number) -- `security_policy_id` (String) -- `source_net_object` (List of Object) (see [below for nested schema](#nestedobjatt--items--security_rules--source_net_object)) -- `statistics_enabled` (Boolean) -- `version_id` (Number) - - -### Nested Schema for `items.security_rules.destination_net_object` - -Read-Only: - -- `display_name` (String) -- `net_address_pool_id` (String) -- `net_object_group_id` (String) - - - -### Nested Schema for `items.security_rules.filter` - -Read-Only: - -- `filters` (List of Object) (see [below for nested schema](#nestedobjatt--items--security_rules--filter--filters)) -- `name` (String) - - -### Nested Schema for `items.security_rules.filter.filters` - -Read-Only: - -- `all` (Boolean) -- `arp` (Boolean) -- `dhcp` (Boolean) -- `expression` (String) -- `icmp` (Boolean) -- `ip` (Boolean) -- `ip_v4` (Boolean) -- `ip_v6` (Boolean) -- `keep_opened_sessions` (Boolean) -- `nd` (Boolean) -- `tcp` (Boolean) -- `tcp_dst_ports` (List of String) -- `udp` (Boolean) -- `udp_dst_ports` (List of String) - - - - -### Nested Schema for `items.security_rules.source_net_object` - -Read-Only: - -- `display_name` (String) -- `net_address_pool_id` (String) -- `net_object_group_id` (String) - - - - -### Nested Schema for `items.status` - -Read-Only: - -- `common` (String) -- `hypervisors` (List of Object) (see [below for nested schema](#nestedobjatt--items--status--hypervisors)) - - -### Nested Schema for `items.status.hypervisors` - -Read-Only: - -- `display_name` (String) -- `hypervisor_status` (String) -- `name` (String) -- `status` (String) -- `synced_at` (String) diff --git a/docs/data-sources/vm_folder.md b/docs/data-sources/vm_folder.md new file mode 100644 index 00000000..c740db7d --- /dev/null +++ b/docs/data-sources/vm_folder.md @@ -0,0 +1,56 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_vm_folder Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_vm_folder (Data Source) + + + + + + +## Schema + +### Required + +- `folder_id` (Number) ID of the vm folder + +### Optional + +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `acl` (List of Object) Access control list of the vm folder (see [below for nested schema](#nestedatt--acl)) +- `compute_ids` (List of Number) IDs of computes in the vm folder +- `created_time` (Number) Time of creation +- `gid` (Number) Grid ID +- `id` (String) The ID of this resource. +- `name` (String) Name of the vm folder +- `parent_id` (Number) ID of the parent vm folder +- `rg_id` (Number) ID of the resource group +- `status` (String) Status of the vm folder + + +### Nested Schema for `timeouts` + +Optional: + +- `default` (String) +- `read` (String) + + + +### Nested Schema for `acl` + +Read-Only: + +- `explicit` (Boolean) +- `right` (String) +- `status` (String) +- `type` (String) +- `user_group_id` (String) diff --git a/docs/data-sources/vm_folder_list.md b/docs/data-sources/vm_folder_list.md new file mode 100644 index 00000000..66b681a0 --- /dev/null +++ b/docs/data-sources/vm_folder_list.md @@ -0,0 +1,64 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_vm_folder_list Data Source - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_vm_folder_list (Data Source) + + + + + + +## Schema + +### Required + +- `rg_id` (Number) Find by resource group ID + +### Optional + +- `page` (Number) Page number +- `size` (Number) Page size +- `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: + +- `acl` (List of Object) (see [below for nested schema](#nestedobjatt--items--acl)) +- `id` (Number) +- `name` (String) +- `parent_id` (Number) +- `status` (String) +- `vm_count` (Number) + + +### Nested Schema for `items.acl` + +Read-Only: + +- `explicit` (Boolean) +- `right` (String) +- `status` (String) +- `type` (String) +- `user_group_id` (String) diff --git a/docs/resources/cb_kvmvm.md b/docs/resources/cb_kvmvm.md index a90d378c..3a516aa9 100644 --- a/docs/resources/cb_kvmvm.md +++ b/docs/resources/cb_kvmvm.md @@ -104,6 +104,7 @@ description: |- - `deleted_time` (Number) - `devices` (String) - `driver` (String) +- `folder_id` (Number) - `gid` (Number) - `guid` (Number) - `id` (String) The ID of this resource. diff --git a/docs/resources/cb_vm_folder.md b/docs/resources/cb_vm_folder.md new file mode 100644 index 00000000..7df389e3 --- /dev/null +++ b/docs/resources/cb_vm_folder.md @@ -0,0 +1,80 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_cb_vm_folder Resource - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_cb_vm_folder (Resource) + + + + + + +## Schema + +### Required + +- `name` (String) Name of the vm folder +- `rg_id` (Number) ID of the resource group + +### Optional + +- `acl_access` (Block Set) ACL access rules for the vm folder (see [below for nested schema](#nestedblock--acl_access)) +- `computes_move` (Block List, Max: 1) Move computes to the vm folder (see [below for nested schema](#nestedblock--computes_move)) +- `parent_id` (Number) ID of the parent vm folder +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `acl` (List of Object) Access control list of the vm folder (see [below for nested schema](#nestedatt--acl)) +- `compute_ids` (List of Number) IDs of computes in the vm folder +- `created_time` (Number) Time of creation +- `folder_id` (Number) ID of the vm folder +- `gid` (Number) Grid ID +- `id` (String) The ID of this resource. +- `status` (String) Status of the vm folder +- `updated_time` (Number) Time of update + + +### Nested Schema for `acl_access` + +Required: + +- `right` (String) Access rights to set, one of 'R', 'RCX' or 'ARCXDU' +- `user` (String) User or group name to grant access + + + +### Nested Schema for `computes_move` + +Optional: + +- `compute_ids` (Set of Number) IDs of computes to move +- `folder_id` (Number) ID of the target vm folder. If not set, computes are moved to this vm folder + + + +### Nested Schema for `timeouts` + +Optional: + +- `create` (String) +- `default` (String) +- `delete` (String) +- `read` (String) +- `update` (String) + + + +### Nested Schema for `acl` + +Read-Only: + +- `explicit` (Boolean) +- `right` (String) +- `status` (String) +- `type` (String) +- `user_group_id` (String) diff --git a/docs/resources/kvmvm.md b/docs/resources/kvmvm.md index 6afc8289..f58d67e9 100644 --- a/docs/resources/kvmvm.md +++ b/docs/resources/kvmvm.md @@ -97,6 +97,7 @@ description: |- - `deleted_time` (Number) - `devices` (String) - `driver` (String) +- `folder_id` (Number) - `gid` (Number) - `guid` (Number) - `id` (String) The ID of this resource. diff --git a/docs/resources/vm_folder.md b/docs/resources/vm_folder.md new file mode 100644 index 00000000..fe3a579a --- /dev/null +++ b/docs/resources/vm_folder.md @@ -0,0 +1,79 @@ +--- +# generated by https://github.com/hashicorp/terraform-plugin-docs +page_title: "decort_vm_folder Resource - terraform-provider-decort" +subcategory: "" +description: |- + +--- + +# decort_vm_folder (Resource) + + + + + + +## Schema + +### Required + +- `name` (String) Name of the vm folder +- `rg_id` (Number) ID of the resource group + +### Optional + +- `acl_access` (Block Set) ACL access rules for the vm folder (see [below for nested schema](#nestedblock--acl_access)) +- `computes_move` (Block List, Max: 1) Move computes to the vm folder (see [below for nested schema](#nestedblock--computes_move)) +- `parent_id` (Number) ID of the parent vm folder +- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) + +### Read-Only + +- `acl` (List of Object) Access control list of the vm folder (see [below for nested schema](#nestedatt--acl)) +- `compute_ids` (List of Number) IDs of computes in the vm folder +- `created_time` (Number) Time of creation +- `folder_id` (Number) ID of the vm folder +- `gid` (Number) Grid ID +- `id` (String) The ID of this resource. +- `status` (String) Status of the vm folder + + +### Nested Schema for `acl_access` + +Required: + +- `right` (String) Access rights to set, one of 'R', 'RCX' or 'ARCXDU' +- `user` (String) User or group name to grant access + + + +### Nested Schema for `computes_move` + +Optional: + +- `compute_ids` (Set of Number) IDs of computes to move +- `folder_id` (Number) ID of the target vm folder. If not set, computes are moved to this vm folder + + + +### Nested Schema for `timeouts` + +Optional: + +- `create` (String) +- `default` (String) +- `delete` (String) +- `read` (String) +- `update` (String) + + + +### Nested Schema for `acl` + +Read-Only: + +- `explicit` (Boolean) +- `right` (String) +- `status` (String) +- `type` (String) +- `user_group_id` (String) diff --git a/go.mod b/go.mod index 94c0d25d..ace181bf 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1 github.com/sirupsen/logrus v1.9.0 golang.org/x/net v0.44.0 - repository.basistech.ru/BASIS/decort-golang-sdk v1.15.7 + repository.basistech.ru/BASIS/decort-golang-sdk v1.15.10 ) require ( diff --git a/go.sum b/go.sum index ea1c03c4..11bb2d7a 100644 --- a/go.sum +++ b/go.sum @@ -318,5 +318,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.15.7 h1:/BCkmR2Dvyz9Cc08I2sPHdLuaCaQbBJWFximQMNpmHE= -repository.basistech.ru/BASIS/decort-golang-sdk v1.15.7/go.mod h1:S/f7GxwWcE88eFpORV+I9xqEf8zDW5srQHpG2XQCLZM= +repository.basistech.ru/BASIS/decort-golang-sdk v1.15.10 h1:ejQjPFN7Z4UaKvzO0kMPbMUlabIW6qImtPgWnDgQJhg= +repository.basistech.ru/BASIS/decort-golang-sdk v1.15.10/go.mod h1:S/f7GxwWcE88eFpORV+I9xqEf8zDW5srQHpG2XQCLZM= diff --git a/internal/provider/data_sources_map.go b/internal/provider/data_sources_map.go index 51025e8c..41460490 100644 --- a/internal/provider/data_sources_map.go +++ b/internal/provider/data_sources_map.go @@ -42,9 +42,9 @@ import ( "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/vmfolder" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/zone" accessgroup "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/access_group" - defaultsecuritypolicy "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/default_security_policy" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/hypervisors" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/logicalports" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/netobjgroups" @@ -72,6 +72,7 @@ import ( 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_vmfolder "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vmfolder" cb_zone "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/zone" ) @@ -176,6 +177,8 @@ func newDataSourcesMap() map[string]*schema.Resource { "decort_security_group_list": secgroup.DataSourceSecurityGroupList(), "decort_trunk": trunk.DataSourceTrunk(), "decort_trunk_list": trunk.DataSourceTrunkList(), + "decort_vm_folder": vmfolder.DataSourceVMFolder(), + "decort_vm_folder_list": vmfolder.DataSourceVMFolderList(), "decort_zone": zone.DataSourceZone(), "decort_zone_list": zone.DataSourceZoneList(), @@ -230,7 +233,7 @@ func newDataSourcesMap() map[string]*schema.Resource { "decort_cb_kvmvm_snapshot_usage": cb_kvmvm.DataSourceComputeSnapshotUsage(), "decort_cb_kvmvm_user_list": cb_kvmvm.DataSourceComputeUserList(), "decort_cb_kvmvm_vgpu_list": cb_kvmvm.DataSourceComputeVGPUList(), - "decort_cb_kvmvm_cpu_alignment_profile": cb_kvmvm.DataSourceComputeCPUAlignmentProfile(), + "decort_cb_kvmvm_cpu_alignment_profile": cb_kvmvm.DataSourceComputeCPUAlignmentProfile(), "decort_cb_node": cb_node.DataSourceNode(), "decort_cb_node_list": cb_node.DataSourceNodeList(), "decort_cb_node_network_info": cb_node.DataSourceNodeNetworkInfo(), @@ -291,6 +294,8 @@ func newDataSourcesMap() map[string]*schema.Resource { "decort_cb_vins_nat_rule_list": cb_vins.DataSourceVinsNatRuleList(), "decort_cb_vins_static_route": cb_vins.DataSourceStaticRoute(), "decort_cb_vins_static_route_list": cb_vins.DataSourceStaticRouteList(), + "decort_cb_vm_folder": cb_vmfolder.DataSourceVMFolder(), + "decort_cb_vm_folder_list": cb_vmfolder.DataSourceVMFolderList(), "decort_cb_k8ci": cb_k8ci.DataSourceK8CI(), "decort_cb_k8ci_list": cb_k8ci.DataSourceK8CIList(), "decort_cb_k8ci_list_deleted": cb_k8ci.DataSourceK8CIListDeleted(), @@ -301,18 +306,17 @@ 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(), - "decort_cb_zone_cpu_alignment_profile": cb_zone.DataSourceZoneCPUAlignmentProfile(), - "decort_cb_zone_cpu_alignment_profile_list": cb_zone.DataSourceZoneCPUAlignmentProfileList(), - "decort_cb_zone_cpu_alignment_profile_test": cb_zone.DataSourceZoneCPUAlignmentProfileTest(), + "decort_cb_zone": cb_zone.DataSourceZone(), + "decort_cb_zone_list": cb_zone.DataSourceZoneList(), + "decort_cb_zone_cpu_alignment_profile": cb_zone.DataSourceZoneCPUAlignmentProfile(), + "decort_cb_zone_cpu_alignment_profile_list": cb_zone.DataSourceZoneCPUAlignmentProfileList(), + "decort_cb_zone_cpu_alignment_profile_test": cb_zone.DataSourceZoneCPUAlignmentProfileTest(), - "decort_sdn_access_group": accessgroup.DataSourceAccessGroup(), - "decort_sdn_access_group_list": accessgroup.DataSourceAccessGroupList(), - "decort_sdn_access_group_user_list": accessgroup.DataSourceAccessGroupUserList(), - "decort_sdn_default_security_policy_list": defaultsecuritypolicy.DataSourceDefaultSecurityPolicyList(), - "decort_sdn_segment": segments.DataSourceSegment(), - "decort_sdn_segment_list": segments.DataSourceSegmentList(), + "decort_sdn_access_group": accessgroup.DataSourceAccessGroup(), + "decort_sdn_access_group_list": accessgroup.DataSourceAccessGroupList(), + "decort_sdn_access_group_user_list": accessgroup.DataSourceAccessGroupUserList(), + "decort_sdn_segment": segments.DataSourceSegment(), + "decort_sdn_segment_list": segments.DataSourceSegmentList(), "decort_sdn_hypervisor": hypervisors.DataSourceHypervisor(), "decort_sdn_hypervisor_list": hypervisors.DataSourceHypervisorList(), diff --git a/internal/provider/resource_map.go b/internal/provider/resource_map.go index 631dc2eb..ecd8c3e5 100644 --- a/internal/provider/resource_map.go +++ b/internal/provider/resource_map.go @@ -35,6 +35,7 @@ import ( "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/secgroup" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/snapshot" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vins" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vmfolder" accessgroup "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/access_group" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/hypervisors" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/logicalports" @@ -60,6 +61,7 @@ import ( 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_vmfolder "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vmfolder" cb_zone "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/zone" ) @@ -91,6 +93,7 @@ func newResourcesMap() map[string]*schema.Resource { "decort_flipgroup": flipgroup.ResourceFlipgroup(), "decort_vins_static_route": vins.ResourceStaticRoute(), "decort_security_group": secgroup.ResourceSecurityGroup(), + "decort_vm_folder": vmfolder.ResourceVMFolder(), "decort_cb_account": cb_account.ResourceAccount(), "decort_cb_dpdknet": cb_dpdknet.ResourceDPDKNet(), @@ -126,6 +129,7 @@ func newResourcesMap() map[string]*schema.Resource { "decort_cb_trunk": cb_trunk.ResourceTrunk(), "decort_cb_user": cb_user.ResourceUser(), "decort_cb_vfpool": cb_vfpool.ResourceVFPool(), + "decort_cb_vm_folder": cb_vmfolder.ResourceVMFolder(), "decort_cb_zone": cb_zone.ResourceZone(), "decort_sdn_segment": segments.ResourceSegment(), diff --git a/internal/service/cloudapi/kvmvm/data_source_compute.go b/internal/service/cloudapi/kvmvm/data_source_compute.go index b29ddf80..3cbaf0c5 100644 --- a/internal/service/cloudapi/kvmvm/data_source_compute.go +++ b/internal/service/cloudapi/kvmvm/data_source_compute.go @@ -1251,6 +1251,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + "folder_id": { + Type: schema.TypeInt, + Computed: true, + }, "weight": { 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 de95a147..9c0cb5b6 100644 --- a/internal/service/cloudapi/kvmvm/data_source_compute_list.go +++ b/internal/service/cloudapi/kvmvm/data_source_compute_list.go @@ -477,6 +477,10 @@ func itemComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + "folder_id": { + Type: schema.TypeInt, + Computed: true, + }, "weight": { Type: schema.TypeInt, Computed: true, @@ -564,6 +568,16 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema { Optional: true, Description: "Zone ID", }, + "folder_id": { + Type: schema.TypeInt, + Optional: true, + Description: "Find by VM folder ID", + }, + "include_descendants": { + Type: schema.TypeBool, + Optional: true, + Description: "Include computes from descendant folders", + }, "items": { Type: schema.TypeList, Computed: true, diff --git a/internal/service/cloudapi/kvmvm/flattens.go b/internal/service/cloudapi/kvmvm/flattens.go index dcb4a8e9..a7a91908 100644 --- a/internal/service/cloudapi/kvmvm/flattens.go +++ b/internal/service/cloudapi/kvmvm/flattens.go @@ -258,6 +258,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{} "hot_resize": compute.HotResize, "network_interface_naming": compute.NetworkInterfaceNaming, "zone_id": compute.ZoneID, + "folder_id": compute.FolderID, "weight": compute.Weight, } res = append(res, temp) @@ -514,6 +515,7 @@ func flattenCompute(d *schema.ResourceData, computeRec compute.RecordCompute, pc d.Set("hot_resize", computeRec.HotResize) d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming) d.Set("zone_id", computeRec.ZoneID) + d.Set("folder_id", computeRec.FolderID) d.Set("loader_meta_iso", flattenLoaderMetaIso(computeRec.LoaderMetaIso)) d.Set("cpu_pin", computeRec.CPUPin) d.Set("cpu_alignment_profile", computeRec.CPUAlignmentProfile.Name) @@ -817,6 +819,7 @@ func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute d.Set("hot_resize", computeRec.HotResize) d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming) d.Set("zone_id", computeRec.ZoneID) + d.Set("folder_id", computeRec.FolderID) d.Set("loader_meta_iso", flattenLoaderMetaIso(computeRec.LoaderMetaIso)) d.Set("os_version", computeRec.OSVersion) d.Set("cpu_alignment_profiles", flattenCPUAlignmentProfile(computeRec.CPUAlignmentProfile)) diff --git a/internal/service/cloudapi/kvmvm/resource_compute.go b/internal/service/cloudapi/kvmvm/resource_compute.go index 02521ddb..bc914bca 100644 --- a/internal/service/cloudapi/kvmvm/resource_compute.go +++ b/internal/service/cloudapi/kvmvm/resource_compute.go @@ -3029,6 +3029,10 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Computed: true, }, + "folder_id": { + Type: schema.TypeInt, + Computed: true, + }, "vgpus": { Type: schema.TypeList, Computed: true, diff --git a/internal/service/cloudapi/kvmvm/utility_compute_list.go b/internal/service/cloudapi/kvmvm/utility_compute_list.go index 2bc96b57..2534107d 100644 --- a/internal/service/cloudapi/kvmvm/utility_compute_list.go +++ b/internal/service/cloudapi/kvmvm/utility_compute_list.go @@ -89,6 +89,12 @@ func utilityDataComputeListCheckPresence(ctx context.Context, d *schema.Resource if zoneID, ok := d.GetOk("zone_id"); ok { req.ZoneID = uint64(zoneID.(int)) } + if folderID, ok := d.GetOk("folder_id"); ok { + req.FolderID = uint64(folderID.(int)) + } + if includeDescendants, ok := d.GetOkExists("include_descendants"); ok { + req.IncludeDescendants = includeDescendants.(bool) + } listComputes, err := c.CloudAPI().Compute().List(ctx, req) if err != nil { diff --git a/internal/service/cloudapi/locations/data_source_locations_list.go b/internal/service/cloudapi/locations/data_source_locations_list.go index 30f0b711..be523252 100644 --- a/internal/service/cloudapi/locations/data_source_locations_list.go +++ b/internal/service/cloudapi/locations/data_source_locations_list.go @@ -60,6 +60,7 @@ func flattenLocationsList(ll *locations.ListLocations) []map[string]interface{} "sdn_support": l.SDNSupport, "zero_access_enabled": l.ZeroAccessEnabled, "bro_enabled": l.BROEnabled, + "vm_folders_enabled": l.VMFoldersEnabled, } res = append(res, temp) } @@ -193,6 +194,10 @@ func dataSourceLocationsListSchemaMake() map[string]*schema.Schema { Type: schema.TypeBool, Computed: true, }, + "vm_folders_enabled": { + Type: schema.TypeBool, + Computed: true, + }, }, }, }, diff --git a/internal/service/cloudapi/vmfolder/data_source_vm_folder.go b/internal/service/cloudapi/vmfolder/data_source_vm_folder.go new file mode 100644 index 00000000..fb7aff11 --- /dev/null +++ b/internal/service/cloudapi/vmfolder/data_source_vm_folder.go @@ -0,0 +1,130 @@ +package vmfolder + +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 dataSourceVMFolderRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("dataSourceVMFolderRead: called with folder_id %d", d.Get("folder_id").(int)) + + w := dc.Warnings{} + folder, err := utilityVMFolderCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + id := uuid.New() + d.SetId(id.String()) + flattenVMFolder(d, folder) + + return w.Get() +} + +func aclSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "explicit": { + Type: schema.TypeBool, + Computed: true, + Description: "Whether the access is explicit", + }, + "right": { + Type: schema.TypeString, + Computed: true, + Description: "Access rights", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "Access status", + }, + "type": { + Type: schema.TypeString, + Computed: true, + Description: "Access type", + }, + "user_group_id": { + Type: schema.TypeString, + Computed: true, + Description: "User or group ID", + }, + } +} + +func dataSourceVMFolderSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "folder_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the vm folder", + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the resource group", + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + Description: "Grid ID", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "Name of the vm folder", + }, + "acl": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: aclSchemaMake(), + }, + Description: "Access control list of the vm folder", + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Time of creation", + }, + "parent_id": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the parent vm folder", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "Status of the vm folder", + }, + "compute_ids": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "IDs of computes in the vm folder", + }, + } +} + +func DataSourceVMFolder() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceVMFolderRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dataSourceVMFolderSchemaMake(), + } +} diff --git a/internal/service/cloudapi/vmfolder/data_source_vm_folder_list.go b/internal/service/cloudapi/vmfolder/data_source_vm_folder_list.go new file mode 100644 index 00000000..2d1002ba --- /dev/null +++ b/internal/service/cloudapi/vmfolder/data_source_vm_folder_list.go @@ -0,0 +1,108 @@ +package vmfolder + +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 dataSourceVMFolderListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + w := dc.Warnings{} + folderList, err := utilityVMFolderListCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + id := uuid.New() + d.SetId(id.String()) + + d.Set("items", flattenVMFolderList(folderList)) + d.Set("entry_count", folderList.EntryCount) + + return w.Get() +} + +func dataSourceVMFolderListSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "rg_id": { + Type: schema.TypeInt, + Required: true, + Description: "Find by resource group ID", + }, + "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{ + "id": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the vm folder", + }, + "parent_id": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the parent vm folder", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "Name of the vm folder", + }, + "acl": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: aclSchemaMake(), + }, + Description: "Access control list of the vm folder", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "Status of the vm folder", + }, + "vm_count": { + Type: schema.TypeInt, + Computed: true, + Description: "Number of computes in the vm folder", + }, + }, + }, + }, + "entry_count": { + Type: schema.TypeInt, + Computed: true, + }, + } +} + +func DataSourceVMFolderList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceVMFolderListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dataSourceVMFolderListSchemaMake(), + } +} diff --git a/internal/service/cloudapi/vmfolder/flattens.go b/internal/service/cloudapi/vmfolder/flattens.go new file mode 100644 index 00000000..aa46236c --- /dev/null +++ b/internal/service/cloudapi/vmfolder/flattens.go @@ -0,0 +1,54 @@ +package vmfolder + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + log "github.com/sirupsen/logrus" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vmfolder" +) + +func flattenVMFolder(d *schema.ResourceData, folder *vmfolder.RecordVMFolder) { + log.Debugf("flattenVMFolder: decoded vm folder ID %d", folder.ID) + + d.Set("folder_id", folder.ID) + d.Set("rg_id", folder.RGID) + d.Set("gid", folder.GID) + d.Set("name", folder.Name) + d.Set("acl", flattenVMFolderACL(folder.ACL)) + d.Set("created_time", folder.CreatedTime) + d.Set("parent_id", folder.ParentID) + d.Set("status", folder.Status) + d.Set("compute_ids", folder.ComputeIDs) +} + +func flattenVMFolderACL(acl []vmfolder.ACL) []map[string]interface{} { + res := make([]map[string]interface{}, 0, len(acl)) + for _, item := range acl { + temp := map[string]interface{}{ + "explicit": item.Explicit, + "right": item.Right, + "status": item.Status, + "type": item.Type, + "user_group_id": item.UserGroupID, + } + res = append(res, temp) + } + + return res +} + +func flattenVMFolderList(folderList *vmfolder.ListVMFolder) []map[string]interface{} { + res := make([]map[string]interface{}, 0, len(folderList.Data)) + for _, item := range folderList.Data { + temp := map[string]interface{}{ + "id": item.ID, + "parent_id": item.ParentID, + "name": item.Name, + "acl": flattenVMFolderACL(item.ACL), + "status": item.Status, + "vm_count": item.VMCount, + } + res = append(res, temp) + } + + return res +} diff --git a/internal/service/cloudapi/vmfolder/resource_vm_folder.go b/internal/service/cloudapi/vmfolder/resource_vm_folder.go new file mode 100644 index 00000000..883dd893 --- /dev/null +++ b/internal/service/cloudapi/vmfolder/resource_vm_folder.go @@ -0,0 +1,279 @@ +package vmfolder + +import ( + "context" + "strconv" + + "github.com/hashicorp/terraform-plugin-sdk/v2/diag" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" + log "github.com/sirupsen/logrus" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vmfolder" + "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 resourceVMFolderCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceVMFolderCreate: called with name %s, rg_id %d", d.Get("name").(string), d.Get("rg_id").(int)) + + c := m.(*controller.ControllerCfg) + + warnings := dc.Warnings{} + + req := vmfolder.CreateRequest{ + RGID: uint64(d.Get("rg_id").(int)), + Name: d.Get("name").(string), + } + + if parentID, ok := d.GetOk("parent_id"); ok { + req.ParentID = uint64(parentID.(int)) + } + + folderID, err := c.CloudAPI().VMFolder().Create(ctx, req) + if err != nil { + return diag.FromErr(err) + } + + d.SetId(strconv.FormatUint(folderID, 10)) + d.Set("folder_id", folderID) + + if aclAccess, ok := d.GetOk("acl_access"); ok { + if err := utilityVMFolderACLAccessAdd(ctx, m, folderID, aclAccess.(*schema.Set).List()); err != nil { + warnings.Add(err) + } + } + + if _, ok := d.GetOk("computes_move"); ok { + if err := utilityVMFolderComputesMove(ctx, d, m, folderID); err != nil { + warnings.Add(err) + } + } + + return append(warnings.Get(), resourceVMFolderRead(ctx, d, m)...) +} + +func resourceVMFolderRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceVMFolderRead: called with id %s", d.Id()) + + w := dc.Warnings{} + + folder, err := utilityVMFolderCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + flattenVMFolder(d, folder) + + return w.Get() +} + +func resourceVMFolderUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceVMFolderUpdate: called with id %s", d.Id()) + + if d.HasChange("rg_id") { + return diag.Errorf("resourceVMFolderUpdate: rg_id can't be changed") + } + + c := m.(*controller.ControllerCfg) + + folderID, err := strconv.ParseUint(d.Id(), 10, 64) + if err != nil { + return diag.FromErr(err) + } + + if d.HasChange("name") { + req := vmfolder.RenameRequest{ + FolderID: folderID, + Name: d.Get("name").(string), + } + + if _, err := c.CloudAPI().VMFolder().Rename(ctx, req); err != nil { + return diag.FromErr(err) + } + } + + if d.HasChange("parent_id") { + req := vmfolder.MoveRequest{ + FolderID: folderID, + NewParentID: uint64(d.Get("parent_id").(int)), + } + + if _, err := c.CloudAPI().VMFolder().Move(ctx, req); err != nil { + return diag.FromErr(err) + } + } + + if d.HasChange("acl_access") { + if err := utilityVMFolderACLAccessUpdate(ctx, d, m, folderID); err != nil { + return diag.FromErr(err) + } + } + + if d.HasChanges("computes_move.#", "computes_move.0.compute_ids", "computes_move.0.folder_id") { + if err := utilityVMFolderComputesMove(ctx, d, m, folderID); err != nil { + return diag.FromErr(err) + } + } + + return resourceVMFolderRead(ctx, d, m) +} + +func resourceVMFolderDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceVMFolderDelete: called with id %s", d.Id()) + + folder, err := utilityVMFolderCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + c := m.(*controller.ControllerCfg) + + req := vmfolder.DeleteRequest{ + FolderID: folder.ID, + } + + if _, err := c.CloudAPI().VMFolder().Delete(ctx, req); err != nil { + return diag.FromErr(err) + } + + d.SetId("") + + return nil +} + +func resourceVMFolderSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "rg_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the resource group", + }, + "name": { + Type: schema.TypeString, + Required: true, + Description: "Name of the vm folder", + }, + "parent_id": { + Type: schema.TypeInt, + Optional: true, + Description: "ID of the parent vm folder", + }, + "computes_move": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "compute_ids": { + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "IDs of computes to move", + }, + "folder_id": { + Type: schema.TypeInt, + Optional: true, + Description: "ID of the target vm folder. If not set, computes are moved to this vm folder", + }, + }, + }, + Description: "Move computes to the vm folder", + }, + "acl_access": { + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "user": { + Type: schema.TypeString, + Required: true, + Description: "User or group name to grant access", + }, + "right": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringInSlice([]string{"R", "RCX", "ARCXDU"}, false), + Description: "Access rights to set, one of 'R', 'RCX' or 'ARCXDU'", + }, + }, + }, + Description: "ACL access rules for the vm folder", + }, + "folder_id": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the vm folder", + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + Description: "Grid ID", + }, + "acl": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: aclSchemaMake(), + }, + Description: "Access control list of the vm folder", + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Time of creation", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "Status of the vm folder", + }, + "compute_ids": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "IDs of computes in the vm folder", + }, + } +} + +func ResourceVMFolder() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, i interface{}) error { + if diff.HasChange("acl_access") { + diff.SetNewComputed("acl") + } + if diff.HasChanges("computes_move.#", "computes_move.0.compute_ids", "computes_move.0.folder_id") { + diff.SetNewComputed("compute_ids") + } + return nil + }, + + CreateContext: resourceVMFolderCreate, + ReadContext: resourceVMFolderRead, + UpdateContext: resourceVMFolderUpdate, + DeleteContext: resourceVMFolderDelete, + + 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: resourceVMFolderSchemaMake(), + } +} diff --git a/internal/service/cloudapi/vmfolder/utility_vm_folder.go b/internal/service/cloudapi/vmfolder/utility_vm_folder.go new file mode 100644 index 00000000..aaaf67ac --- /dev/null +++ b/internal/service/cloudapi/vmfolder/utility_vm_folder.go @@ -0,0 +1,117 @@ +package vmfolder + +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/vmfolder" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" +) + +func utilityVMFolderCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*vmfolder.RecordVMFolder, error) { + c := m.(*controller.ControllerCfg) + req := vmfolder.GetRequest{} + + if d.Id() != "" { + id, err := strconv.ParseUint(d.Id(), 10, 64) + if err != nil { + return nil, err + } + + req.FolderID = id + } else { + req.FolderID = uint64(d.Get("folder_id").(int)) + } + + log.Debugf("utilityVMFolderCheckPresence: get vm folder with ID %d", req.FolderID) + + folder, err := c.CloudAPI().VMFolder().Get(ctx, req) + if err != nil { + return nil, err + } + + return folder, nil +} + +func utilityVMFolderComputesMove(ctx context.Context, d *schema.ResourceData, m interface{}, folderID uint64) error { + c := m.(*controller.ControllerCfg) + + computesMove := d.Get("computes_move").([]interface{}) + if len(computesMove) == 0 || computesMove[0] == nil { + return nil + } + + item := computesMove[0].(map[string]interface{}) + + computeIDs := make([]uint64, 0) + for _, id := range item["compute_ids"].(*schema.Set).List() { + computeIDs = append(computeIDs, uint64(id.(int))) + } + if len(computeIDs) == 0 { + return nil + } + + req := vmfolder.ComputesMoveRequest{ + ComputeIDs: computeIDs, + FolderID: folderID, + } + if targetFolderID := item["folder_id"].(int); targetFolderID != 0 { + req.FolderID = uint64(targetFolderID) + } + + log.Debugf("utilityVMFolderComputesMove: move computes %v to vm folder with ID %d", computeIDs, req.FolderID) + + _, err := c.CloudAPI().VMFolder().ComputesMove(ctx, req) + + return err +} + +func utilityVMFolderACLAccessAdd(ctx context.Context, m interface{}, folderID uint64, aclAccess []interface{}) error { + c := m.(*controller.ControllerCfg) + + for _, aclInterface := range aclAccess { + aclItem := aclInterface.(map[string]interface{}) + + req := vmfolder.AddACLAccessRequest{ + FolderID: folderID, + User: aclItem["user"].(string), + Right: aclItem["right"].(string), + } + + log.Debugf("utilityVMFolderACLAccessAdd: add ACL access %s for user %s to vm folder with ID %d", req.Right, req.User, folderID) + + if _, err := c.CloudAPI().VMFolder().AddACLAccess(ctx, req); err != nil { + return err + } + } + + return nil +} + +func utilityVMFolderACLAccessUpdate(ctx context.Context, d *schema.ResourceData, m interface{}, folderID uint64) error { + c := m.(*controller.ControllerCfg) + + oldSet, newSet := d.GetChange("acl_access") + + deletedAccess := (oldSet.(*schema.Set).Difference(newSet.(*schema.Set))).List() + for _, deletedInterface := range deletedAccess { + deletedItem := deletedInterface.(map[string]interface{}) + + req := vmfolder.DelACLAccessRequest{ + FolderID: folderID, + User: deletedItem["user"].(string), + } + + log.Debugf("utilityVMFolderACLAccessUpdate: delete ACL access for user %s from vm folder with ID %d", req.User, folderID) + + if _, err := c.CloudAPI().VMFolder().DeleteACLAccess(ctx, req); err != nil { + return err + } + } + + addedAccess := (newSet.(*schema.Set).Difference(oldSet.(*schema.Set))).List() + + return utilityVMFolderACLAccessAdd(ctx, m, folderID, addedAccess) +} diff --git a/internal/service/cloudapi/vmfolder/utility_vm_folder_list.go b/internal/service/cloudapi/vmfolder/utility_vm_folder_list.go new file mode 100644 index 00000000..9154e7fc --- /dev/null +++ b/internal/service/cloudapi/vmfolder/utility_vm_folder_list.go @@ -0,0 +1,33 @@ +package vmfolder + +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/vmfolder" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" +) + +func utilityVMFolderListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*vmfolder.ListVMFolder, error) { + c := m.(*controller.ControllerCfg) + req := vmfolder.ListRequest{ + RGID: uint64(d.Get("rg_id").(int)), + } + + 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("utilityVMFolderListCheckPresence: load vm folder list") + + folderList, err := c.CloudAPI().VMFolder().List(ctx, req) + if err != nil { + return nil, err + } + + return folderList, nil +} diff --git a/internal/service/cloudbroker/grid/flattens.go b/internal/service/cloudbroker/grid/flattens.go index 76ff3c3a..13278c9b 100644 --- a/internal/service/cloudbroker/grid/flattens.go +++ b/internal/service/cloudbroker/grid/flattens.go @@ -21,6 +21,7 @@ func flattenGrid(d *schema.ResourceData, grid *grid.RecordGrid) { d.Set("reserved_ram", grid.ReservedRAM) d.Set("sdn_support", grid.SDNSupport) d.Set("zero_access_enabled", grid.ZeroAccessEnabled) + d.Set("vm_folders_enabled", grid.VMFoldersEnabled) } func flattenGridList(gl *grid.ListGrids) []map[string]interface{} { @@ -41,6 +42,7 @@ func flattenGridList(gl *grid.ListGrids) []map[string]interface{} { "sdn_support": item.SDNSupport, "zero_access_enabled": item.ZeroAccessEnabled, "bro_enabled": item.BROEnabled, + "vm_folders_enabled": item.VMFoldersEnabled, } res = append(res, temp) } diff --git a/internal/service/cloudbroker/grid/schema.go b/internal/service/cloudbroker/grid/schema.go index 2bf3dac6..374e9290 100644 --- a/internal/service/cloudbroker/grid/schema.go +++ b/internal/service/cloudbroker/grid/schema.go @@ -62,6 +62,10 @@ func dataSourceGetGridSchemaMake() map[string]*schema.Schema { Type: schema.TypeBool, Computed: true, }, + "vm_folders_enabled": { + Type: schema.TypeBool, + Computed: true, + }, } } @@ -278,6 +282,10 @@ func dataSourceGridListSchemaMake() map[string]*schema.Schema { Type: schema.TypeBool, Computed: true, }, + "vm_folders_enabled": { + Type: schema.TypeBool, + Computed: true, + }, }, }, }, diff --git a/internal/service/cloudbroker/kvmvm/flattens.go b/internal/service/cloudbroker/kvmvm/flattens.go index 7d4e80f7..036b5f88 100644 --- a/internal/service/cloudbroker/kvmvm/flattens.go +++ b/internal/service/cloudbroker/kvmvm/flattens.go @@ -112,6 +112,7 @@ func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute, p d.Set("hot_resize", computeRec.HotResize) d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming) d.Set("zone_id", computeRec.ZoneID) + d.Set("folder_id", computeRec.FolderID) d.Set("os_version", computeRec.OSVersion) d.Set("cpu_pin", computeRec.CPUPin) d.Set("cpu_alignment_profile", computeRec.CPUAlignmentProfile.Name) @@ -436,6 +437,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{} "hot_resize": computeItem.HotResize, "network_interface_naming": computeItem.NetworkInterfaceNaming, "zone_id": computeItem.ZoneID, + "folder_id": computeItem.FolderID, "weight": computeItem.Weight, } res = append(res, temp) @@ -527,6 +529,7 @@ func flattenDeletedComputeList(computes *compute.ListDeletedComputes) []map[stri "hot_resize": computeItem.HotResize, "network_interface_naming": computeItem.NetworkInterfaceNaming, "zone_id": computeItem.ZoneID, + "folder_id": computeItem.FolderID, "weight": computeItem.Weight, } res = append(res, temp) @@ -877,6 +880,7 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute d.Set("hot_resize", compFacts.HotResize) d.Set("network_interface_naming", compFacts.NetworkInterfaceNaming) d.Set("zone_id", compFacts.ZoneID) + d.Set("folder_id", compFacts.FolderID) d.Set("loader_meta_iso", flattenLoaderMetaIso(compFacts.LoaderMetaIso)) d.Set("os_version", compFacts.OSVersion) d.Set("weight", compFacts.Weight) diff --git a/internal/service/cloudbroker/kvmvm/schema.go b/internal/service/cloudbroker/kvmvm/schema.go index ae1d9693..bd6de4dd 100644 --- a/internal/service/cloudbroker/kvmvm/schema.go +++ b/internal/service/cloudbroker/kvmvm/schema.go @@ -1233,6 +1233,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + "folder_id": { + Type: schema.TypeInt, + Computed: true, + }, "weight": { Type: schema.TypeInt, Computed: true, @@ -1330,6 +1334,16 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema { Optional: true, Description: "Zone ID", }, + "folder_id": { + Type: schema.TypeInt, + Optional: true, + Description: "Find by VM folder ID", + }, + "include_descendants": { + Type: schema.TypeBool, + Optional: true, + Description: "Include computes from descendant folders", + }, "ignore_k8s": { Type: schema.TypeBool, Optional: true, @@ -1837,6 +1851,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + "folder_id": { + Type: schema.TypeInt, + Computed: true, + }, "weight": { Type: schema.TypeInt, Computed: true, @@ -2396,6 +2414,10 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema { Type: schema.TypeInt, Computed: true, }, + "folder_id": { + Type: schema.TypeInt, + Computed: true, + }, "weight": { Type: schema.TypeInt, Computed: true, @@ -4929,6 +4951,10 @@ func resourceComputeSchemaMake() map[string]*schema.Schema { Type: schema.TypeString, Computed: true, }, + "folder_id": { + Type: schema.TypeInt, + Computed: true, + }, "vgpus": { Type: schema.TypeList, Computed: true, diff --git a/internal/service/cloudbroker/kvmvm/utility_compute_list.go b/internal/service/cloudbroker/kvmvm/utility_compute_list.go index 26ca50ea..bf19de6b 100644 --- a/internal/service/cloudbroker/kvmvm/utility_compute_list.go +++ b/internal/service/cloudbroker/kvmvm/utility_compute_list.go @@ -99,6 +99,12 @@ func utilityDataComputeListCheckPresence(ctx context.Context, d *schema.Resource if zoneID, ok := d.GetOk("zone_id"); ok { req.ZoneID = uint64(zoneID.(int)) } + if folderID, ok := d.GetOk("folder_id"); ok { + req.FolderID = uint64(folderID.(int)) + } + if includeDescendants, ok := d.GetOkExists("include_descendants"); ok { + req.IncludeDescendants = includeDescendants.(bool) + } listComputes, err := c.CloudBroker().Compute().List(ctx, req) if err != nil { diff --git a/internal/service/cloudbroker/vmfolder/data_source_vm_folder.go b/internal/service/cloudbroker/vmfolder/data_source_vm_folder.go new file mode 100644 index 00000000..98f6df3e --- /dev/null +++ b/internal/service/cloudbroker/vmfolder/data_source_vm_folder.go @@ -0,0 +1,44 @@ +package vmfolder + +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 dataSourceVMFolderRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("dataSourceVMFolderRead: called with folder_id %d", d.Get("folder_id").(int)) + + w := dc.Warnings{} + folder, err := utilityVMFolderCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + id := uuid.New() + d.SetId(id.String()) + flattenVMFolder(d, folder) + + return w.Get() +} + +func DataSourceVMFolder() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceVMFolderRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dataSourceVMFolderSchemaMake(), + } +} diff --git a/internal/service/cloudbroker/vmfolder/data_source_vm_folder_list.go b/internal/service/cloudbroker/vmfolder/data_source_vm_folder_list.go new file mode 100644 index 00000000..5fb72996 --- /dev/null +++ b/internal/service/cloudbroker/vmfolder/data_source_vm_folder_list.go @@ -0,0 +1,43 @@ +package vmfolder + +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 dataSourceVMFolderListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + w := dc.Warnings{} + folderList, err := utilityVMFolderListCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + id := uuid.New() + d.SetId(id.String()) + + d.Set("items", flattenVMFolderList(folderList)) + d.Set("entry_count", folderList.EntryCount) + + return w.Get() +} + +func DataSourceVMFolderList() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + ReadContext: dataSourceVMFolderListRead, + + Timeouts: &schema.ResourceTimeout{ + Read: &constants.Timeout30s, + Default: &constants.Timeout60s, + }, + + Schema: dataSourceVMFolderListSchemaMake(), + } +} diff --git a/internal/service/cloudbroker/vmfolder/flattens.go b/internal/service/cloudbroker/vmfolder/flattens.go new file mode 100644 index 00000000..787f32d6 --- /dev/null +++ b/internal/service/cloudbroker/vmfolder/flattens.go @@ -0,0 +1,55 @@ +package vmfolder + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + log "github.com/sirupsen/logrus" + "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vmfolder" +) + +func flattenVMFolder(d *schema.ResourceData, folder *vmfolder.RecordVMFolder) { + log.Debugf("flattenVMFolder: decoded vm folder ID %d", folder.ID) + + d.Set("folder_id", folder.ID) + d.Set("rg_id", folder.RGID) + d.Set("gid", folder.GID) + d.Set("name", folder.Name) + d.Set("acl", flattenVMFolderACL(folder.ACL)) + d.Set("created_time", folder.CreatedTime) + d.Set("parent_id", folder.ParentID) + d.Set("status", folder.Status) + d.Set("compute_ids", folder.ComputeIDs) + d.Set("updated_time", folder.UpdatedTime) +} + +func flattenVMFolderACL(acl []vmfolder.ACL) []map[string]interface{} { + res := make([]map[string]interface{}, 0, len(acl)) + for _, item := range acl { + temp := map[string]interface{}{ + "explicit": item.Explicit, + "right": item.Right, + "status": item.Status, + "type": item.Type, + "user_group_id": item.UserGroupID, + } + res = append(res, temp) + } + + return res +} + +func flattenVMFolderList(folderList *vmfolder.ListVMFolder) []map[string]interface{} { + res := make([]map[string]interface{}, 0, len(folderList.Data)) + for _, item := range folderList.Data { + temp := map[string]interface{}{ + "id": item.ID, + "parent_id": item.ParentID, + "name": item.Name, + "acl": flattenVMFolderACL(item.ACL), + "status": item.Status, + "vm_count": item.VMCount, + } + res = append(res, temp) + } + + return res +} diff --git a/internal/service/cloudbroker/vmfolder/resource_vm_folder.go b/internal/service/cloudbroker/vmfolder/resource_vm_folder.go new file mode 100644 index 00000000..397c46ef --- /dev/null +++ b/internal/service/cloudbroker/vmfolder/resource_vm_folder.go @@ -0,0 +1,182 @@ +package vmfolder + +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/vmfolder" + "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 resourceVMFolderCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceVMFolderCreate: called with name %s, rg_id %d", d.Get("name").(string), d.Get("rg_id").(int)) + + c := m.(*controller.ControllerCfg) + + warnings := dc.Warnings{} + + req := vmfolder.CreateRequest{ + RGID: uint64(d.Get("rg_id").(int)), + Name: d.Get("name").(string), + } + + if parentID, ok := d.GetOk("parent_id"); ok { + req.ParentID = uint64(parentID.(int)) + } + + folderID, err := c.CloudBroker().VMFolder().Create(ctx, req) + if err != nil { + return diag.FromErr(err) + } + + d.SetId(strconv.FormatUint(folderID, 10)) + d.Set("folder_id", folderID) + + if aclAccess, ok := d.GetOk("acl_access"); ok { + if err := utilityVMFolderACLAccessAdd(ctx, m, folderID, aclAccess.(*schema.Set).List()); err != nil { + warnings.Add(err) + } + } + + if _, ok := d.GetOk("computes_move"); ok { + if err := utilityVMFolderComputesMove(ctx, d, m, folderID); err != nil { + warnings.Add(err) + } + } + + return append(warnings.Get(), resourceVMFolderRead(ctx, d, m)...) +} + +func resourceVMFolderRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceVMFolderRead: called with id %s", d.Id()) + + w := dc.Warnings{} + + folder, err := utilityVMFolderCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + flattenVMFolder(d, folder) + + return w.Get() +} + +func resourceVMFolderUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceVMFolderUpdate: called with id %s", d.Id()) + + if d.HasChange("rg_id") { + return diag.Errorf("resourceVMFolderUpdate: rg_id can't be changed") + } + + c := m.(*controller.ControllerCfg) + + folderID, err := strconv.ParseUint(d.Id(), 10, 64) + if err != nil { + return diag.FromErr(err) + } + + if d.HasChange("name") { + req := vmfolder.RenameRequest{ + FolderID: folderID, + Name: d.Get("name").(string), + } + + if _, err := c.CloudBroker().VMFolder().Rename(ctx, req); err != nil { + return diag.FromErr(err) + } + } + + if d.HasChange("parent_id") { + req := vmfolder.MoveRequest{ + FolderID: folderID, + NewParentID: uint64(d.Get("parent_id").(int)), + } + + if _, err := c.CloudBroker().VMFolder().Move(ctx, req); err != nil { + return diag.FromErr(err) + } + } + + if d.HasChange("acl_access") { + if err := utilityVMFolderACLAccessUpdate(ctx, d, m, folderID); err != nil { + return diag.FromErr(err) + } + } + + if d.HasChanges("computes_move.#", "computes_move.0.compute_ids", "computes_move.0.folder_id") { + if err := utilityVMFolderComputesMove(ctx, d, m, folderID); err != nil { + return diag.FromErr(err) + } + } + + return resourceVMFolderRead(ctx, d, m) +} + +func resourceVMFolderDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { + log.Debugf("resourceVMFolderDelete: called with id %s", d.Id()) + + folder, err := utilityVMFolderCheckPresence(ctx, d, m) + if err != nil { + d.SetId("") + return diag.FromErr(err) + } + + c := m.(*controller.ControllerCfg) + + req := vmfolder.DeleteRequest{ + FolderID: folder.ID, + } + + if _, err := c.CloudBroker().VMFolder().Delete(ctx, req); err != nil { + return diag.FromErr(err) + } + + d.SetId("") + + return nil +} + +func ResourceVMFolder() *schema.Resource { + return &schema.Resource{ + SchemaVersion: 1, + + CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, i interface{}) error { + if diff.HasChanges("name", "parent_id", "acl_access", "computes_move.#", "computes_move.0.compute_ids", "computes_move.0.folder_id") { + diff.SetNewComputed("updated_time") + } + if diff.HasChange("acl_access") { + diff.SetNewComputed("acl") + } + if diff.HasChanges("computes_move.#", "computes_move.0.compute_ids", "computes_move.0.folder_id") { + diff.SetNewComputed("compute_ids") + } + return nil + }, + + CreateContext: resourceVMFolderCreate, + ReadContext: resourceVMFolderRead, + UpdateContext: resourceVMFolderUpdate, + DeleteContext: resourceVMFolderDelete, + + 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: resourceVMFolderSchemaMake(), + } +} diff --git a/internal/service/cloudbroker/vmfolder/schema.go b/internal/service/cloudbroker/vmfolder/schema.go new file mode 100644 index 00000000..8d2e7c4b --- /dev/null +++ b/internal/service/cloudbroker/vmfolder/schema.go @@ -0,0 +1,266 @@ +package vmfolder + +import ( + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" +) + +func resourceVMFolderSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "rg_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the resource group", + }, + "name": { + Type: schema.TypeString, + Required: true, + Description: "Name of the vm folder", + }, + "parent_id": { + Type: schema.TypeInt, + Optional: true, + Description: "ID of the parent vm folder", + }, + "computes_move": { + Type: schema.TypeList, + Optional: true, + MaxItems: 1, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "compute_ids": { + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "IDs of computes to move", + }, + "folder_id": { + Type: schema.TypeInt, + Optional: true, + Description: "ID of the target vm folder. If not set, computes are moved to this vm folder", + }, + }, + }, + Description: "Move computes to the vm folder", + }, + "acl_access": { + Type: schema.TypeSet, + Optional: true, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + "user": { + Type: schema.TypeString, + Required: true, + Description: "User or group name to grant access", + }, + "right": { + Type: schema.TypeString, + Required: true, + ValidateFunc: validation.StringInSlice([]string{"R", "RCX", "ARCXDU"}, false), + Description: "Access rights to set, one of 'R', 'RCX' or 'ARCXDU'", + }, + }, + }, + Description: "ACL access rules for the vm folder", + }, + "folder_id": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the vm folder", + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + Description: "Grid ID", + }, + "acl": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: aclSchemaMake(), + }, + Description: "Access control list of the vm folder", + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Time of creation", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "Status of the vm folder", + }, + "compute_ids": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "IDs of computes in the vm folder", + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Time of update", + }, + } +} + +func dataSourceVMFolderSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "folder_id": { + Type: schema.TypeInt, + Required: true, + Description: "ID of the vm folder", + }, + "rg_id": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the resource group", + }, + "gid": { + Type: schema.TypeInt, + Computed: true, + Description: "Grid ID", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "Name of the vm folder", + }, + "acl": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: aclSchemaMake(), + }, + Description: "Access control list of the vm folder", + }, + "created_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Time of creation", + }, + "parent_id": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the parent vm folder", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "Status of the vm folder", + }, + "compute_ids": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Schema{ + Type: schema.TypeInt, + }, + Description: "IDs of computes in the vm folder", + }, + "updated_time": { + Type: schema.TypeInt, + Computed: true, + Description: "Time of update", + }, + } +} + +func dataSourceVMFolderListSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "rg_id": { + Type: schema.TypeInt, + Required: true, + Description: "Find by resource group ID", + }, + "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{ + "id": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the vm folder", + }, + "parent_id": { + Type: schema.TypeInt, + Computed: true, + Description: "ID of the parent vm folder", + }, + "name": { + Type: schema.TypeString, + Computed: true, + Description: "Name of the vm folder", + }, + "acl": { + Type: schema.TypeList, + Computed: true, + Elem: &schema.Resource{ + Schema: aclSchemaMake(), + }, + Description: "Access control list of the vm folder", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "Status of the vm folder", + }, + "vm_count": { + Type: schema.TypeInt, + Computed: true, + Description: "Number of computes in the vm folder", + }, + }, + }, + }, + "entry_count": { + Type: schema.TypeInt, + Computed: true, + }, + } +} + +func aclSchemaMake() map[string]*schema.Schema { + return map[string]*schema.Schema{ + "explicit": { + Type: schema.TypeBool, + Computed: true, + Description: "Whether the access is explicit", + }, + "right": { + Type: schema.TypeString, + Computed: true, + Description: "Access rights", + }, + "status": { + Type: schema.TypeString, + Computed: true, + Description: "Access status", + }, + "type": { + Type: schema.TypeString, + Computed: true, + Description: "Access type", + }, + "user_group_id": { + Type: schema.TypeString, + Computed: true, + Description: "User or group ID", + }, + } +} diff --git a/internal/service/cloudbroker/vmfolder/utility_vm_folder.go b/internal/service/cloudbroker/vmfolder/utility_vm_folder.go new file mode 100644 index 00000000..9b2f09e1 --- /dev/null +++ b/internal/service/cloudbroker/vmfolder/utility_vm_folder.go @@ -0,0 +1,117 @@ +package vmfolder + +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/vmfolder" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" +) + +func utilityVMFolderCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*vmfolder.RecordVMFolder, error) { + c := m.(*controller.ControllerCfg) + req := vmfolder.GetRequest{} + + if d.Id() != "" { + id, err := strconv.ParseUint(d.Id(), 10, 64) + if err != nil { + return nil, err + } + + req.FolderID = id + } else { + req.FolderID = uint64(d.Get("folder_id").(int)) + } + + log.Debugf("utilityVMFolderCheckPresence: get vm folder with ID %d", req.FolderID) + + folder, err := c.CloudBroker().VMFolder().Get(ctx, req) + if err != nil { + return nil, err + } + + return folder, nil +} + +func utilityVMFolderComputesMove(ctx context.Context, d *schema.ResourceData, m interface{}, folderID uint64) error { + c := m.(*controller.ControllerCfg) + + computesMove := d.Get("computes_move").([]interface{}) + if len(computesMove) == 0 || computesMove[0] == nil { + return nil + } + + item := computesMove[0].(map[string]interface{}) + + computeIDs := make([]uint64, 0) + for _, id := range item["compute_ids"].(*schema.Set).List() { + computeIDs = append(computeIDs, uint64(id.(int))) + } + if len(computeIDs) == 0 { + return nil + } + + req := vmfolder.ComputesMoveRequest{ + ComputeIDs: computeIDs, + FolderID: folderID, + } + if targetFolderID := item["folder_id"].(int); targetFolderID != 0 { + req.FolderID = uint64(targetFolderID) + } + + log.Debugf("utilityVMFolderComputesMove: move computes %v to vm folder with ID %d", computeIDs, req.FolderID) + + _, err := c.CloudBroker().VMFolder().ComputesMove(ctx, req) + + return err +} + +func utilityVMFolderACLAccessAdd(ctx context.Context, m interface{}, folderID uint64, aclAccess []interface{}) error { + c := m.(*controller.ControllerCfg) + + for _, aclInterface := range aclAccess { + aclItem := aclInterface.(map[string]interface{}) + + req := vmfolder.AddACLAccessRequest{ + FolderID: folderID, + User: aclItem["user"].(string), + Right: aclItem["right"].(string), + } + + log.Debugf("utilityVMFolderACLAccessAdd: add ACL access %s for user %s to vm folder with ID %d", req.Right, req.User, folderID) + + if _, err := c.CloudBroker().VMFolder().AddACLAccess(ctx, req); err != nil { + return err + } + } + + return nil +} + +func utilityVMFolderACLAccessUpdate(ctx context.Context, d *schema.ResourceData, m interface{}, folderID uint64) error { + c := m.(*controller.ControllerCfg) + + oldSet, newSet := d.GetChange("acl_access") + + deletedAccess := (oldSet.(*schema.Set).Difference(newSet.(*schema.Set))).List() + for _, deletedInterface := range deletedAccess { + deletedItem := deletedInterface.(map[string]interface{}) + + req := vmfolder.DelACLAccessRequest{ + FolderID: folderID, + User: deletedItem["user"].(string), + } + + log.Debugf("utilityVMFolderACLAccessUpdate: delete ACL access for user %s from vm folder with ID %d", req.User, folderID) + + if _, err := c.CloudBroker().VMFolder().DeleteACLAccess(ctx, req); err != nil { + return err + } + } + + addedAccess := (newSet.(*schema.Set).Difference(oldSet.(*schema.Set))).List() + + return utilityVMFolderACLAccessAdd(ctx, m, folderID, addedAccess) +} diff --git a/internal/service/cloudbroker/vmfolder/utility_vm_folder_list.go b/internal/service/cloudbroker/vmfolder/utility_vm_folder_list.go new file mode 100644 index 00000000..342526a7 --- /dev/null +++ b/internal/service/cloudbroker/vmfolder/utility_vm_folder_list.go @@ -0,0 +1,33 @@ +package vmfolder + +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/vmfolder" + "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" +) + +func utilityVMFolderListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*vmfolder.ListVMFolder, error) { + c := m.(*controller.ControllerCfg) + req := vmfolder.ListRequest{ + RGID: uint64(d.Get("rg_id").(int)), + } + + 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("utilityVMFolderListCheckPresence: load vm folder list") + + folderList, err := c.CloudBroker().VMFolder().List(ctx, req) + if err != nil { + return nil, err + } + + return folderList, nil +} diff --git a/internal/service/sdn/default_security_policy/data_decort_sdn_default_security_policy_list.go b/internal/service/sdn/default_security_policy/data_decort_sdn_default_security_policy_list.go deleted file mode 100644 index 44758639..00000000 --- a/internal/service/sdn/default_security_policy/data_decort_sdn_default_security_policy_list.go +++ /dev/null @@ -1,40 +0,0 @@ -package defaultsecuritypolicy - -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" -) - -func dataSourceDefaultSecurityPolicyListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { - defaultSecurityPolicyList, err := utilityDefaultSecurityPolicyListCheckPresence(ctx, d, m) - if err != nil { - d.SetId("") - return diag.FromErr(err) - } - - id := uuid.New() - d.SetId(id.String()) - d.Set("items", flattenDefaultSecurityPolicyList(defaultSecurityPolicyList)) - - return nil -} - -func DataSourceDefaultSecurityPolicyList() *schema.Resource { - return &schema.Resource{ - SchemaVersion: 1, - - ReadContext: dataSourceDefaultSecurityPolicyListRead, - - Timeouts: &schema.ResourceTimeout{ - Read: &constants.Timeout30s, - Default: &constants.Timeout60s, - }, - - Schema: dataSourceDefaultSecurityPolicyListSchemaMake(), - } -} - diff --git a/internal/service/sdn/default_security_policy/flattens.go b/internal/service/sdn/default_security_policy/flattens.go deleted file mode 100644 index d13f91da..00000000 --- a/internal/service/sdn/default_security_policy/flattens.go +++ /dev/null @@ -1,130 +0,0 @@ -package defaultsecuritypolicy - -import ( - "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/defsecpolicies" -) - -func flattenDefaultSecurityPolicyList(policyList *defsecpolicies.SecurityPoliciesList) []map[string]interface{} { - if policyList == nil { - return []map[string]interface{}{} - } - res := make([]map[string]interface{}, 0, len(policyList.Policies)) - for _, v := range policyList.Policies { - temp := map[string]interface{}{ - "access_group_id": v.AccessGroupID, - "created_at": v.CreatedAt, - "default_acl_drop": v.DefaultACLDrop, - "default_open_session_drop": v.DefaultOpenSessionDrop, - "description": v.Description, - "display_name": v.DisplayName, - "id": v.ID, - "security_rules": flattenSecurityRules(v.SecurityRules), - "locked_at": v.LockedAt, - "status": flattenStatus(v.Status), - "version_id": int(v.VersionID), - } - res = append(res, temp) - } - return res -} - -func flattenSecurityRules(rules []defsecpolicies.SecurityRule) []map[string]interface{} { - if rules == nil { - return []map[string]interface{}{} - } - res := make([]map[string]interface{}, 0, len(rules)) - for _, v := range rules { - temp := map[string]interface{}{ - "access_group_id": v.AccessGroupID, - "action": v.Action, - "description": v.Description, - "destination_net_object": flattenNetObject(v.DestinationNetObject), - "direction": v.Direction, - "display_name": v.DisplayName, - "enabled": v.Enabled, - "filter": flattenFilter(v.Filter), - "id": v.ID, - "log_enabled": v.LogEnabled, - "log_name": v.LogName, - "log_severity": v.LogSeverity, - "priority": v.Priority, - "security_policy_id": v.SecurityPolicyID, - "source_net_object": flattenNetObject(v.SourceNetObject), - "statistics_enabled": v.StatisticsEnabled, - "version_id": int(v.VersionID), - } - res = append(res, temp) - } - return res -} - -func flattenNetObject(netObj defsecpolicies.NetObject) []map[string]interface{} { - res := make([]map[string]interface{}, 0) - temp := map[string]interface{}{ - "display_name": netObj.DisplayName, - "net_address_pool_id": netObj.NetAddressPoolID, - "net_object_group_id": netObj.NetObjectGroupID, - } - res = append(res, temp) - return res -} - -func flattenFilter(filter defsecpolicies.Filter) []map[string]interface{} { - res := make([]map[string]interface{}, 0) - temp := map[string]interface{}{ - "filters": flattenFilterParams(filter.Filters), - "name": filter.Name, - } - res = append(res, temp) - return res -} - -func flattenFilterParams(params defsecpolicies.FilterParams) []map[string]interface{} { - res := make([]map[string]interface{}, 0) - temp := map[string]interface{}{ - "all": params.All, - "arp": params.ARP, - "dhcp": params.DHCP, - "expression": params.Expression, - "icmp": params.ICMP, - "ip": params.IP, - "ip_v4": params.IPv4, - "ip_v6": params.IPv6, - "keep_opened_sessions": params.KeepOpenedSessions, - "nd": params.ND, - "tcp": params.TCP, - "tcp_dst_ports": params.TCPDstPorts, - "udp": params.UDP, - "udp_dst_ports": params.UDPDstPorts, - } - res = append(res, temp) - return res -} - -func flattenStatus(status defsecpolicies.Status) []map[string]interface{} { - res := make([]map[string]interface{}, 0) - temp := map[string]interface{}{ - "common": status.Common, - "hypervisors": flattenHypervisorStatuses(status.Hypervisors), - } - res = append(res, temp) - return res -} - -func flattenHypervisorStatuses(hypervisors []defsecpolicies.HypervisorStatus) []map[string]interface{} { - if hypervisors == nil { - return []map[string]interface{}{} - } - res := make([]map[string]interface{}, 0, len(hypervisors)) - for _, v := range hypervisors { - temp := map[string]interface{}{ - "status": v.Status, - "name": v.Name, - "display_name": v.DisplayName, - "hypervisor_status": v.HypervisorStatus, - "synced_at": v.SyncedAt, - } - res = append(res, temp) - } - return res -} diff --git a/internal/service/sdn/default_security_policy/schema.go b/internal/service/sdn/default_security_policy/schema.go deleted file mode 100644 index daabaf8a..00000000 --- a/internal/service/sdn/default_security_policy/schema.go +++ /dev/null @@ -1,369 +0,0 @@ -package defaultsecuritypolicy - -import ( - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" -) - -func dataSourceDefaultSecurityPolicyListSchemaMake() map[string]*schema.Schema { - res := map[string]*schema.Schema{ - "access_group_id": { - Type: schema.TypeString, - Optional: true, - Description: "id of the access group", - }, - "page": { - Type: schema.TypeInt, - Optional: true, - Description: "result page number", - }, - "per_page": { - Type: schema.TypeInt, - Optional: true, - Description: "number of results per page", - }, - "sort_by": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.StringInSlice([]string{"created_at", "updated_at"}, false), - Description: "sort by one of the supported fields", - }, - "sort_order": { - Type: schema.TypeString, - Optional: true, - ValidateFunc: validation.StringInSlice([]string{"asc", "desc"}, false), - Description: "sorting order", - }, - "items": { - Type: schema.TypeList, - Computed: true, - Description: "List of default security policies", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "access_group_id": { - Type: schema.TypeString, - Computed: true, - Description: "Access group ID", - }, - "created_at": { - Type: schema.TypeString, - Computed: true, - Description: "Creation timestamp", - }, - "default_acl_drop": { - Type: schema.TypeString, - Computed: true, - Description: "Default ACL drop action", - }, - "default_open_session_drop": { - Type: schema.TypeBool, - Computed: true, - Description: "Default open session drop flag", - }, - "description": { - Type: schema.TypeString, - Computed: true, - Description: "Description", - }, - "display_name": { - Type: schema.TypeString, - Computed: true, - Description: "Display name", - }, - "id": { - Type: schema.TypeString, - Computed: true, - Description: "Unique identifier", - }, - "security_rules": { - Type: schema.TypeList, - Computed: true, - Description: "Security rules", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "access_group_id": { - Type: schema.TypeString, - Computed: true, - Description: "Access group ID", - }, - "action": { - Type: schema.TypeString, - Computed: true, - Description: "Action", - }, - "description": { - Type: schema.TypeString, - Computed: true, - Description: "Description", - }, - "destination_net_object": { - Type: schema.TypeList, - Computed: true, - Description: "Destination network object", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "display_name": { - Type: schema.TypeString, - Computed: true, - Description: "Display name", - }, - "net_address_pool_id": { - Type: schema.TypeString, - Computed: true, - Description: "Network address pool ID", - }, - "net_object_group_id": { - Type: schema.TypeString, - Computed: true, - Description: "Network object group ID", - }, - }, - }, - }, - "direction": { - Type: schema.TypeString, - Computed: true, - Description: "Direction", - }, - "display_name": { - Type: schema.TypeString, - Computed: true, - Description: "Display name", - }, - "enabled": { - Type: schema.TypeBool, - Computed: true, - Description: "Enabled flag", - }, - "filter": { - Type: schema.TypeList, - Computed: true, - Description: "Filter configuration", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "filters": { - Type: schema.TypeList, - Computed: true, - Description: "Filter parameters", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "all": { - Type: schema.TypeBool, - Computed: true, - Description: "All protocols flag", - }, - "arp": { - Type: schema.TypeBool, - Computed: true, - Description: "ARP protocol flag", - }, - "dhcp": { - Type: schema.TypeBool, - Computed: true, - Description: "DHCP protocol flag", - }, - "expression": { - Type: schema.TypeString, - Computed: true, - Description: "Filter expression", - }, - "icmp": { - Type: schema.TypeBool, - Computed: true, - Description: "ICMP protocol flag", - }, - "ip": { - Type: schema.TypeBool, - Computed: true, - Description: "IP protocol flag", - }, - "ip_v4": { - Type: schema.TypeBool, - Computed: true, - Description: "IPv4 protocol flag", - }, - "ip_v6": { - Type: schema.TypeBool, - Computed: true, - Description: "IPv6 protocol flag", - }, - "keep_opened_sessions": { - Type: schema.TypeBool, - Computed: true, - Description: "Keep opened sessions flag", - }, - "nd": { - Type: schema.TypeBool, - Computed: true, - Description: "ND protocol flag", - }, - "tcp": { - Type: schema.TypeBool, - Computed: true, - Description: "TCP protocol flag", - }, - "tcp_dst_ports": { - Type: schema.TypeList, - Computed: true, - Description: "TCP destination ports", - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - "udp": { - Type: schema.TypeBool, - Computed: true, - Description: "UDP protocol flag", - }, - "udp_dst_ports": { - Type: schema.TypeList, - Computed: true, - Description: "UDP destination ports", - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - }, - }, - }, - "name": { - Type: schema.TypeString, - Computed: true, - Description: "Filter name", - }, - }, - }, - }, - "id": { - Type: schema.TypeString, - Computed: true, - Description: "Unique identifier", - }, - "log_enabled": { - Type: schema.TypeBool, - Computed: true, - Description: "Log enabled flag", - }, - "log_name": { - Type: schema.TypeString, - Computed: true, - Description: "Log name", - }, - "log_severity": { - Type: schema.TypeString, - Computed: true, - Description: "Log severity", - }, - "priority": { - Type: schema.TypeInt, - Computed: true, - Description: "Priority", - }, - "security_policy_id": { - Type: schema.TypeString, - Computed: true, - Description: "Security policy ID", - }, - "source_net_object": { - Type: schema.TypeList, - Computed: true, - Description: "Source network object", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "display_name": { - Type: schema.TypeString, - Computed: true, - Description: "Display name", - }, - "net_address_pool_id": { - Type: schema.TypeString, - Computed: true, - Description: "Network address pool ID", - }, - "net_object_group_id": { - Type: schema.TypeString, - Computed: true, - Description: "Network object group ID", - }, - }, - }, - }, - "statistics_enabled": { - Type: schema.TypeBool, - Computed: true, - Description: "Statistics enabled flag", - }, - "version_id": { - Type: schema.TypeInt, - Computed: true, - Description: "Version ID", - }, - }, - }, - }, - "locked_at": { - Type: schema.TypeString, - Computed: true, - Description: "Locked timestamp", - }, - "status": { - Type: schema.TypeList, - Computed: true, - Description: "Status information", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "common": { - Type: schema.TypeString, - Computed: true, - Description: "Common status", - }, - "hypervisors": { - Type: schema.TypeList, - Computed: true, - Description: "Hypervisor statuses", - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "status": { - Type: schema.TypeString, - Computed: true, - Description: "Status", - }, - "name": { - Type: schema.TypeString, - Computed: true, - Description: "Name", - }, - "display_name": { - Type: schema.TypeString, - Computed: true, - Description: "Display name", - }, - "hypervisor_status": { - Type: schema.TypeString, - Computed: true, - Description: "Hypervisor status", - }, - "synced_at": { - Type: schema.TypeString, - Computed: true, - Description: "Last sync timestamp", - }, - }, - }, - }, - }, - }, - }, - "version_id": { - Type: schema.TypeInt, - Computed: true, - Description: "Version ID", - }, - }, - }, - }, - } - - return res -} - diff --git a/internal/service/sdn/default_security_policy/utility_default_security_policy_list.go b/internal/service/sdn/default_security_policy/utility_default_security_policy_list.go deleted file mode 100644 index 5cf41070..00000000 --- a/internal/service/sdn/default_security_policy/utility_default_security_policy_list.go +++ /dev/null @@ -1,40 +0,0 @@ -package defaultsecuritypolicy - -import ( - "context" - - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - log "github.com/sirupsen/logrus" - "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/sdn/defsecpolicies" - "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" -) - -func utilityDefaultSecurityPolicyListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*defsecpolicies.SecurityPoliciesList, error) { - c := m.(*controller.ControllerCfg) - req := defsecpolicies.ListRequest{} - - if accessGroupID, ok := d.GetOk("access_group_id"); ok { - req.AccessGroupID = accessGroupID.(string) - } - if page, ok := d.GetOk("page"); ok { - req.Page = uint64(page.(int)) - } - if perPage, ok := d.GetOk("per_page"); ok { - req.PerPage = uint64(perPage.(int)) - } - if sortBy, ok := d.GetOk("sort_by"); ok { - req.SortBy = sortBy.(string) - } - if sortOrder, ok := d.GetOk("sort_order"); ok { - req.SortOrder = sortOrder.(string) - } - - log.Debugf("utilityDefaultSecurityPolicyListCheckPresence") - defaultSecurityPolicyList, err := c.SDN().DefaultSecurityPolicies().List(ctx, req) - if err != nil { - return nil, err - } - - return defaultSecurityPolicyList, nil -} - diff --git a/samples/README.md b/samples/README.md index 3abaaa06..a2c53cb2 100644 --- a/samples/README.md +++ b/samples/README.md @@ -108,6 +108,8 @@ - vins_nat_rule_list - vins_static_route - vins_static_route_list + - vm_folder + - vm_folder_list - zone - zone_list - resources: @@ -136,6 +138,7 @@ - snapshot - vins - vins_static_route + - vm_folder - cloudbroker: - data: - cb_account @@ -261,6 +264,8 @@ - cb_vins_nat_rule_list - cb_vins_static_route - cb_vins_static_route_list + - cb_vm_folder + - cb_vm_folder_list - cb_zone - cb_zone_list - cb_zone_cpu_alignment_profile @@ -300,6 +305,7 @@ - cb_vins - cb_vins_static_route - cb_virtual_image + - cb_vm_folder - decort_cb_multi_image - cb_zone - sdn @@ -307,7 +313,6 @@ - sdn_access_group - sdn_access_group_list - sdn_access_group_user_list - - sdn_default_security_policy_list - sdn_segment - sdn_segment_list - sdn_logical_port diff --git a/samples/cloudapi/kvmvm/data_kvmvm_list/main.tf b/samples/cloudapi/kvmvm/data_kvmvm_list/main.tf index 585f2030..13d6381f 100644 --- a/samples/cloudapi/kvmvm/data_kvmvm_list/main.tf +++ b/samples/cloudapi/kvmvm/data_kvmvm_list/main.tf @@ -107,6 +107,16 @@ data "decort_kvmvm_list" "compute_list" { #тип - целое число #значение по умолчанию - 0 #zone_id = 11 + + #фильтр по id папки ВМ + #опциональный параметр + #тип - целое число + #folder_id = 100 + + #флаг включения в результат ВМ из дочерних папок + #опциональный параметр + #тип - булев + #include_descendants = true } diff --git a/samples/cloudapi/vmfolder/data_vm_folder/main.tf b/samples/cloudapi/vmfolder/data_vm_folder/main.tf new file mode 100644 index 00000000..c8a97b3e --- /dev/null +++ b/samples/cloudapi/vmfolder/data_vm_folder/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_vm_folder" "name" { + #id папки + #обязательный параметр + #тип - целое число + folder_id = 123 +} + +output "test" { + value = data.decort_vm_folder.name +} diff --git a/samples/cloudapi/vmfolder/data_vm_folder_list/main.tf b/samples/cloudapi/vmfolder/data_vm_folder_list/main.tf new file mode 100644 index 00000000..4bf9d819 --- /dev/null +++ b/samples/cloudapi/vmfolder/data_vm_folder_list/main.tf @@ -0,0 +1,48 @@ +/* +Пример использования +Получение списка папок ВМ +*/ + +#Раскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через 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_vm_folder_list" "name" { + #id РГ + #обязательный параметр + #тип - целое число + rg_id = 1234 + + #номер страницы для отображения + #опциональный параметр + #тип - целое число + #page = 1 + + #размер страницы + #опциональный параметр + #тип - целое число + #size = 10 +} + +output "test" { + value = data.decort_vm_folder_list.name +} diff --git a/samples/cloudapi/vmfolder/resource_vm_folder/main.tf b/samples/cloudapi/vmfolder/resource_vm_folder/main.tf new file mode 100644 index 00000000..adc3e975 --- /dev/null +++ b/samples/cloudapi/vmfolder/resource_vm_folder/main.tf @@ -0,0 +1,88 @@ +/* +Пример использования +Ресурса папки ВМ: +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_vm_folder" "name" { + #id РГ + #обязательный параметр + #тип - целое число + #используется при создании + rg_id = 88366 + + #имя папки + #обязательный параметр + #тип - строка + #используется при создании и обновлении + name = "my-vm-folder-123" + + #id родительской папки + #опциональный параметр + #тип - целое число + #используется при создании и обновлении + #parent_id = 123 + + #массовое перемещение ВМ + #опциональный параметр + #тип - блок + #используется при создании и обновлении + #computes_move { + #id ВМ для перемещения + #опциональный параметр + #тип - массив целых чисел + #compute_ids = [1253, 4456] + + #id папки, в которую произойдет перемещение + #опциональный параметр + #тип - целое число + #если не задан - ВМ перемещаются в текущую папку + #folder_id = 123 + #} + + #назначение/отзыв прав доступа на папку + #опциональный параметр + #тип - блок + #используется при создании и обновлении + #acl_access { + #пользователь + #обязательный параметр + #тип - строка + #user = "username" + + #право доступа + #обязательный параметр + #тип - строка + #возможные значения - "R", "RCX", "ARCXDU" + #right = "R" + #} +} + +output "test" { + value = decort_vm_folder.name +} diff --git a/samples/cloudbroker/kvmvm/data_kvmvm_list/main.tf b/samples/cloudbroker/kvmvm/data_kvmvm_list/main.tf index 1a9f3695..9ed018bd 100644 --- a/samples/cloudbroker/kvmvm/data_kvmvm_list/main.tf +++ b/samples/cloudbroker/kvmvm/data_kvmvm_list/main.tf @@ -122,6 +122,16 @@ data "decort_cb_kvmvm_list" "compute_list" { #значение по умолчанию - 0 #zone_id = 11 + #фильтр по id папки ВМ + #опциональный параметр + #тип - целое число + #folder_id = 100 + + #флаг включения в результат ВМ из дочерних папок + #опциональный параметр + #тип - булев + #include_descendants = true + } output "output" { diff --git a/samples/cloudbroker/vmfolder/data_vm_folder/main.tf b/samples/cloudbroker/vmfolder/data_vm_folder/main.tf new file mode 100644 index 00000000..888c68f2 --- /dev/null +++ b/samples/cloudbroker/vmfolder/data_vm_folder/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_vm_folder" "name" { + #id папки + #обязательный параметр + #тип - целое число + folder_id = 123 +} + +output "test" { + value = data.decort_cb_vm_folder.name +} diff --git a/samples/cloudbroker/vmfolder/data_vm_folder_list/main.tf b/samples/cloudbroker/vmfolder/data_vm_folder_list/main.tf new file mode 100644 index 00000000..a31390ec --- /dev/null +++ b/samples/cloudbroker/vmfolder/data_vm_folder_list/main.tf @@ -0,0 +1,48 @@ +/* +Пример использования +Получение списка папок ВМ +*/ + +#Раскомментируйте этот код, +#и внесите необходимые правки в версию и путь, +#чтобы работать с установленным вручную (не через 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_vm_folder_list" "name" { + #id РГ + #обязательный параметр + #тип - целое число + rg_id = 1234 + + #номер страницы для отображения + #опциональный параметр + #тип - целое число + #page = 1 + + #размер страницы + #опциональный параметр + #тип - целое число + #size = 10 +} + +output "test" { + value = data.decort_cb_vm_folder_list.name +} diff --git a/samples/cloudbroker/vmfolder/resource_vm_folder/main.tf b/samples/cloudbroker/vmfolder/resource_vm_folder/main.tf new file mode 100644 index 00000000..3b5bc339 --- /dev/null +++ b/samples/cloudbroker/vmfolder/resource_vm_folder/main.tf @@ -0,0 +1,88 @@ +/* +Пример использования +Ресурса папки ВМ: +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_vm_folder" "name" { + #id РГ + #обязательный параметр + #тип - целое число + #используется при создании + rg_id = 88366 + + #имя папки + #обязательный параметр + #тип - строка + #используется при создании и обновлении + name = "my-vm-folder-123" + + #id родительской папки + #опциональный параметр + #тип - целое число + #используется при создании и обновлении + #parent_id = 123 + + #массовое перемещение ВМ + #опциональный параметр + #тип - блок + #используется при создании и обновлении + #computes_move { + #id ВМ для перемещения + #опциональный параметр + #тип - массив целых чисел + #compute_ids = [1253, 4456] + + #id папки, в которую произойдет перемещение + #опциональный параметр + #тип - целое число + #если не задан - ВМ перемещаются в текущую папку + #folder_id = 123 + #} + + #назначение/отзыв прав доступа на папку + #опциональный параметр + #тип - блок + #используется при создании и обновлении + #acl_access { + #пользователь + #обязательный параметр + #тип - строка + #user = "username" + + #право доступа + #обязательный параметр + #тип - строка + #возможные значения - "R", "RCX", "ARCXDU" + #right = "R" + #} +} + +output "test" { + value = decort_cb_vm_folder.name +} diff --git a/samples/sdn/default_security_policy/data_decort_sdn_default_security_policy_list/main.tf b/samples/sdn/default_security_policy/data_decort_sdn_default_security_policy_list/main.tf deleted file mode 100644 index b5477938..00000000 --- a/samples/sdn/default_security_policy/data_decort_sdn_default_security_policy_list/main.tf +++ /dev/null @@ -1,61 +0,0 @@ -/* -Пример использования -Получение списка политик безопасности по умолчанию -*/ - -#Раскомментируйте этот код, -#и внесите необходимые правки в версию и путь, -#чтобы работать с установленным вручную (не через 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_sdn_default_security_policy_list" "policy_list" { - #id группы доступа - #опциональный параметр - #тип - строка - #access_group_id = "a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8" - - #номер страницы результата - #опциональный параметр - #тип - целое число - #page = 1 - - #количество результатов на странице - #опциональный параметр - #тип - целое число - #per_page = 2 - - #сортировка по одному из поддерживаемых полей - #опциональный параметр - #тип - строка - #возможные значения - created_at, updated_at - #sort_by = "created_at" - - #порядок сортировки - #опциональный параметр - #тип - строка - #возможные значения - asc, desc - #sort_order = "asc" -} - -output "test" { - value = data.decort_sdn_default_security_policy_list.policy_list -} -