4.13.1
4.13.1
This commit is contained in:
238
CHANGELOG.md
238
CHANGELOG.md
@@ -1,4 +1,4 @@
|
|||||||
## Version 4.13.0
|
## Version 4.13.1
|
||||||
|
|
||||||
### Deprecated
|
### Deprecated
|
||||||
| Компонент | Тип | Подробности |
|
| Компонент | Тип | Подробности |
|
||||||
@@ -10,242 +10,36 @@
|
|||||||
|
|
||||||
### Добавлено
|
### Добавлено
|
||||||
|
|
||||||
#### disks
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
#### grid
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор<br>задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| 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-1439 | Вычисляемое поле `vm_folders_enabled` в datasources `decort_cb_grid` и `decort_cb_grid_list` в 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 |
|
|
||||||
|
|
||||||
#### kvmvm
|
#### kvmvm
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор<br>задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BATF-1323 | Вычисляемое поле `memory_dump_image` в блоке `snap_sets` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
|
| BATF-1421 | Опциональные поля `folder_id` и `include_descendants` в datasource `decort_kvmvm_list` в cloudapi/kvmvm и в datasource `decort_cb_kvmvm_list` в cloudbroker/kvmvm |
|
||||||
| BATF-1323 | Вычисляемое поле `memory_dump_image` в блоке `snap_sets` в resource `decort_kvmvm` в cloudapi/kvmvm |
|
| BATF-1421 | Вычисляемое поле `folder_id` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
|
||||||
| BATF-1323 | Вычисляемое поле `memory_dump_image` в блоке `snap_sets` в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в 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 |
|
||||||
| 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 |
|
|
||||||
|
|
||||||
#### node
|
#### locations
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор<br>задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BATF-1306 | Вычисляемое поле `pci_devices` в datasource `decort_cb_node_list` в cloudbroker/node |
|
| BATF-1420 | Вычисляемое поле `vm_folders_enabled` в datasource `decort_locations_list` в cloudapi/locations |
|
||||||
| 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 |
|
|
||||||
|
|
||||||
#### rg
|
#### vmfolder
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор<br>задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BATF-1337 | Опциональное поле `enable_default_gateway` в resource `decort_resgroup` в cloudapi/resgroup и в resource `decort_cb_rg` в cloudbroker/resgroup |
|
| BATF-1430 | Resource `decort_vm_folder` в cloudapi/vmfolder |
|
||||||
| BATF-1309 | Вычисляемое поле `email` в блоке `acl` в datasources `decort_cb_rg_list` и `decort_cb_rg_list_deleted` в cloudbroker/rg |
|
| BATF-1430 | Resource `decort_cb_vm_folder` в cloudbroker/vmfolder |
|
||||||
|
| BATF-1430 | Datasource `decort_vm_folder` в cloudapi/vmfolder |
|
||||||
#### sep
|
| BATF-1430 | Datasource `decort_vm_folder_list` в cloudapi/vmfolder |
|
||||||
| Идентификатор<br>задачи | Описание |
|
| BATF-1430 | Datasource `decort_cb_vm_folder` в cloudbroker/vmfolder |
|
||||||
| --- | --- |
|
| BATF-1430 | Datasource `decort_cb_vm_folder_list` в cloudbroker/vmfolder |
|
||||||
| BATF-1318 | Вычисляемые поля `entry_count` и `items` в datasource `decort_cb_sep_consumption` в cloudbroker/sep |
|
|
||||||
|
|
||||||
#### vins
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-1376 | Опциональное поле `enabled` получило значение по умолчанию `true` в resource `decort_cb_k8ci` в cloudbroker/k8ci |
|
|
||||||
|
|
||||||
#### node
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-1318 | Тип поля `sep_id` c обязательного на опциональный в datasource `decort_cb_sep_consumption` в cloudbroker/sep |
|
|
||||||
|
|
||||||
#### storage policy
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-1373 | Тип поля `limit_iops` с опционального на опционально-вычисляемое в resource `decort_cb_storage_policy` в cloudbroker/stpolicy |
|
|
||||||
|
|
||||||
#### user
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-1293 | Тип поля `password` с опционального на обязательный в resource `decort_cb_user` в cloudbroker/user |
|
|
||||||
|
|
||||||
#### SDN logicalports
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-1375 | Баг с полем `user_data` при чтении resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
|
|
||||||
|
|
||||||
#### SDN logicalports
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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 |
|
|
||||||
|
|
||||||
|
|
||||||
### Удалено
|
### Удалено
|
||||||
|
|
||||||
#### grid
|
#### SDN default security policy
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор<br>задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BATF-1311 | Вычисляемые поля `ckey` и `meta` в datasource `decort_cb_grid` в cloudbroker/grid |
|
| BATF-1458 | Datasource `decort_sdn_default_security_policy_list` из sdn/default_security_policy |
|
||||||
| BATF-1333 | Вычисляемые поля `networks`, `cpu_allocation_ratio_vm`, `cpu_allocation_ratio` и `custom_backup_path` в datasource `decort_cb_grid_get_settings` в cloudbroker/grid |
|
|
||||||
|
|
||||||
#### kvmvm
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-1343 | Вычисляемое поле `migrate_storage_info` в datasource `decort_cb_kvmvm_migrate_storage_info` в cloudbroker/kvmvm |
|
|
||||||
|
|
||||||
#### node
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-1364 | Вычисляемое поле `pmd_cpu` в datasources `decort_cb_node` и `decort_cb_node_list` в cloudbroker/node |
|
|
||||||
|
|
||||||
#### user
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-1293 | Вычисляемое поле `password` в datasources `decort_cb_user` и `decort_cb_user_list` в cloudbroker/user |
|
|
||||||
|
|
||||||
#### SDN netobjgroups
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| 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 |
|
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -7,7 +7,7 @@ ZIPDIR = ./zip
|
|||||||
BINARY=${NAME}
|
BINARY=${NAME}
|
||||||
WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH}
|
WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH}
|
||||||
MAINPATH = ./cmd/decort/
|
MAINPATH = ./cmd/decort/
|
||||||
VERSION=4.13.0
|
VERSION=4.13.1
|
||||||
OS_ARCH=$(shell go env GOHOSTOS)_$(shell go env GOHOSTARCH)
|
OS_ARCH=$(shell go env GOHOSTOS)_$(shell go env GOHOSTARCH)
|
||||||
|
|
||||||
FILES = ${BINARY}_${VERSION}_darwin_amd64\
|
FILES = ${BINARY}_${VERSION}_darwin_amd64\
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ Terraform provider для платформы Digital Energy Cloud Orchestration
|
|||||||
- Работа с snapshots,
|
- Работа с snapshots,
|
||||||
- Работа с trunk,
|
- Работа с trunk,
|
||||||
- Работа с VINS,
|
- Работа с VINS,
|
||||||
|
- Работа с VM folders,
|
||||||
- Работа с SEPs,
|
- Работа с SEPs,
|
||||||
- Работа с Zone.
|
- Работа с Zone.
|
||||||
|
|
||||||
@@ -79,6 +80,7 @@ Terraform provider для платформы Digital Energy Cloud Orchestration
|
|||||||
- Работа с security groups,
|
- Работа с security groups,
|
||||||
- Работа с trunk,
|
- Работа с trunk,
|
||||||
- Работа с VINS,
|
- Работа с VINS,
|
||||||
|
- Работа с VM folders,
|
||||||
- Работа с Zone.
|
- Работа с Zone.
|
||||||
|
|
||||||
- Режим SDN:
|
- Режим SDN:
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ description: |-
|
|||||||
- `reserved_cpu` (Number)
|
- `reserved_cpu` (Number)
|
||||||
- `reserved_ram` (Number)
|
- `reserved_ram` (Number)
|
||||||
- `sdn_support` (Boolean)
|
- `sdn_support` (Boolean)
|
||||||
|
- `vm_folders_enabled` (Boolean)
|
||||||
- `zero_access_enabled` (Boolean)
|
- `zero_access_enabled` (Boolean)
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
<a id="nestedblock--timeouts"></a>
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ Read-Only:
|
|||||||
- `reserved_ram` (Number)
|
- `reserved_ram` (Number)
|
||||||
- `resources` (List of Object) (see [below for nested schema](#nestedobjatt--items--resources))
|
- `resources` (List of Object) (see [below for nested schema](#nestedobjatt--items--resources))
|
||||||
- `sdn_support` (Boolean)
|
- `sdn_support` (Boolean)
|
||||||
|
- `vm_folders_enabled` (Boolean)
|
||||||
- `zero_access_enabled` (Boolean)
|
- `zero_access_enabled` (Boolean)
|
||||||
|
|
||||||
<a id="nestedobjatt--items--resources"></a>
|
<a id="nestedobjatt--items--resources"></a>
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ description: |-
|
|||||||
- `devices` (String)
|
- `devices` (String)
|
||||||
- `disks` (List of Object) (see [below for nested schema](#nestedatt--disks))
|
- `disks` (List of Object) (see [below for nested schema](#nestedatt--disks))
|
||||||
- `driver` (String)
|
- `driver` (String)
|
||||||
|
- `folder_id` (Number)
|
||||||
- `gid` (Number)
|
- `gid` (Number)
|
||||||
- `guid` (Number)
|
- `guid` (Number)
|
||||||
- `hot_resize` (Boolean)
|
- `hot_resize` (Boolean)
|
||||||
|
|||||||
@@ -22,7 +22,9 @@ description: |-
|
|||||||
- `cd_image_id` (Number) Find by CD image ID
|
- `cd_image_id` (Number) Find by CD image ID
|
||||||
- `extnet_id` (Number) Find by Extnet ID
|
- `extnet_id` (Number) Find by Extnet ID
|
||||||
- `extnet_name` (String) Find by Extnet name
|
- `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
|
- `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)
|
- `includedeleted` (Boolean)
|
||||||
- `ip_address` (String) Find by IP address
|
- `ip_address` (String) Find by IP address
|
||||||
- `name` (String) Find by name
|
- `name` (String) Find by name
|
||||||
@@ -90,6 +92,7 @@ Read-Only:
|
|||||||
- `devices` (String)
|
- `devices` (String)
|
||||||
- `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks))
|
- `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks))
|
||||||
- `driver` (String)
|
- `driver` (String)
|
||||||
|
- `folder_id` (Number)
|
||||||
- `gid` (Number)
|
- `gid` (Number)
|
||||||
- `guid` (Number)
|
- `guid` (Number)
|
||||||
- `hot_resize` (Boolean)
|
- `hot_resize` (Boolean)
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ Read-Only:
|
|||||||
- `devices` (String)
|
- `devices` (String)
|
||||||
- `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks))
|
- `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks))
|
||||||
- `driver` (String)
|
- `driver` (String)
|
||||||
|
- `folder_id` (Number)
|
||||||
- `gid` (Number)
|
- `gid` (Number)
|
||||||
- `guid` (Number)
|
- `guid` (Number)
|
||||||
- `hot_resize` (Boolean)
|
- `hot_resize` (Boolean)
|
||||||
|
|||||||
57
docs/data-sources/cb_vm_folder.md
Normal file
57
docs/data-sources/cb_vm_folder.md
Normal file
@@ -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 generated by tfplugindocs -->
|
||||||
|
## 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
|
||||||
|
|
||||||
|
<a id="nestedblock--timeouts"></a>
|
||||||
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
|
Optional:
|
||||||
|
|
||||||
|
- `default` (String)
|
||||||
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
|
<a id="nestedatt--acl"></a>
|
||||||
|
### Nested Schema for `acl`
|
||||||
|
|
||||||
|
Read-Only:
|
||||||
|
|
||||||
|
- `explicit` (Boolean)
|
||||||
|
- `right` (String)
|
||||||
|
- `status` (String)
|
||||||
|
- `type` (String)
|
||||||
|
- `user_group_id` (String)
|
||||||
64
docs/data-sources/cb_vm_folder_list.md
Normal file
64
docs/data-sources/cb_vm_folder_list.md
Normal file
@@ -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 generated by tfplugindocs -->
|
||||||
|
## 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))
|
||||||
|
|
||||||
|
<a id="nestedblock--timeouts"></a>
|
||||||
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
|
Optional:
|
||||||
|
|
||||||
|
- `default` (String)
|
||||||
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
|
<a id="nestedatt--items"></a>
|
||||||
|
### 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)
|
||||||
|
|
||||||
|
<a id="nestedobjatt--items--acl"></a>
|
||||||
|
### Nested Schema for `items.acl`
|
||||||
|
|
||||||
|
Read-Only:
|
||||||
|
|
||||||
|
- `explicit` (Boolean)
|
||||||
|
- `right` (String)
|
||||||
|
- `status` (String)
|
||||||
|
- `type` (String)
|
||||||
|
- `user_group_id` (String)
|
||||||
@@ -56,6 +56,7 @@ description: |-
|
|||||||
- `devices` (String)
|
- `devices` (String)
|
||||||
- `disks` (List of Object) (see [below for nested schema](#nestedatt--disks))
|
- `disks` (List of Object) (see [below for nested schema](#nestedatt--disks))
|
||||||
- `driver` (String)
|
- `driver` (String)
|
||||||
|
- `folder_id` (Number)
|
||||||
- `gid` (Number)
|
- `gid` (Number)
|
||||||
- `guid` (Number)
|
- `guid` (Number)
|
||||||
- `hot_resize` (Boolean)
|
- `hot_resize` (Boolean)
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ description: |-
|
|||||||
- `by_id` (Number) Find by ID
|
- `by_id` (Number) Find by ID
|
||||||
- `extnet_id` (Number) Find by Extnet ID
|
- `extnet_id` (Number) Find by Extnet ID
|
||||||
- `extnet_name` (String) Find by Extnet name
|
- `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
|
- `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)
|
- `includedeleted` (Boolean)
|
||||||
- `ip_address` (String) Find by IP address
|
- `ip_address` (String) Find by IP address
|
||||||
- `name` (String) Find by name
|
- `name` (String) Find by name
|
||||||
@@ -87,6 +89,7 @@ Read-Only:
|
|||||||
- `devices` (String)
|
- `devices` (String)
|
||||||
- `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks))
|
- `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks))
|
||||||
- `driver` (String)
|
- `driver` (String)
|
||||||
|
- `folder_id` (Number)
|
||||||
- `gid` (Number)
|
- `gid` (Number)
|
||||||
- `guid` (Number)
|
- `guid` (Number)
|
||||||
- `hot_resize` (Boolean)
|
- `hot_resize` (Boolean)
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ Read-Only:
|
|||||||
- `devices` (String)
|
- `devices` (String)
|
||||||
- `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks))
|
- `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks))
|
||||||
- `driver` (String)
|
- `driver` (String)
|
||||||
|
- `folder_id` (Number)
|
||||||
- `gid` (Number)
|
- `gid` (Number)
|
||||||
- `guid` (Number)
|
- `guid` (Number)
|
||||||
- `hot_resize` (Boolean)
|
- `hot_resize` (Boolean)
|
||||||
|
|||||||
@@ -58,4 +58,5 @@ Read-Only:
|
|||||||
- `name` (String)
|
- `name` (String)
|
||||||
- `network_modes` (List of String)
|
- `network_modes` (List of String)
|
||||||
- `sdn_support` (Boolean)
|
- `sdn_support` (Boolean)
|
||||||
|
- `vm_folders_enabled` (Boolean)
|
||||||
- `zero_access_enabled` (Boolean)
|
- `zero_access_enabled` (Boolean)
|
||||||
|
|||||||
@@ -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 generated by tfplugindocs -->
|
|
||||||
## 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))
|
|
||||||
|
|
||||||
<a id="nestedblock--timeouts"></a>
|
|
||||||
### Nested Schema for `timeouts`
|
|
||||||
|
|
||||||
Optional:
|
|
||||||
|
|
||||||
- `default` (String)
|
|
||||||
- `read` (String)
|
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedatt--items"></a>
|
|
||||||
### 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)
|
|
||||||
|
|
||||||
<a id="nestedobjatt--items--security_rules"></a>
|
|
||||||
### 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)
|
|
||||||
|
|
||||||
<a id="nestedobjatt--items--security_rules--destination_net_object"></a>
|
|
||||||
### Nested Schema for `items.security_rules.destination_net_object`
|
|
||||||
|
|
||||||
Read-Only:
|
|
||||||
|
|
||||||
- `display_name` (String)
|
|
||||||
- `net_address_pool_id` (String)
|
|
||||||
- `net_object_group_id` (String)
|
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedobjatt--items--security_rules--filter"></a>
|
|
||||||
### 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)
|
|
||||||
|
|
||||||
<a id="nestedobjatt--items--security_rules--filter--filters"></a>
|
|
||||||
### 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)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedobjatt--items--security_rules--source_net_object"></a>
|
|
||||||
### Nested Schema for `items.security_rules.source_net_object`
|
|
||||||
|
|
||||||
Read-Only:
|
|
||||||
|
|
||||||
- `display_name` (String)
|
|
||||||
- `net_address_pool_id` (String)
|
|
||||||
- `net_object_group_id` (String)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a id="nestedobjatt--items--status"></a>
|
|
||||||
### Nested Schema for `items.status`
|
|
||||||
|
|
||||||
Read-Only:
|
|
||||||
|
|
||||||
- `common` (String)
|
|
||||||
- `hypervisors` (List of Object) (see [below for nested schema](#nestedobjatt--items--status--hypervisors))
|
|
||||||
|
|
||||||
<a id="nestedobjatt--items--status--hypervisors"></a>
|
|
||||||
### Nested Schema for `items.status.hypervisors`
|
|
||||||
|
|
||||||
Read-Only:
|
|
||||||
|
|
||||||
- `display_name` (String)
|
|
||||||
- `hypervisor_status` (String)
|
|
||||||
- `name` (String)
|
|
||||||
- `status` (String)
|
|
||||||
- `synced_at` (String)
|
|
||||||
56
docs/data-sources/vm_folder.md
Normal file
56
docs/data-sources/vm_folder.md
Normal file
@@ -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 generated by tfplugindocs -->
|
||||||
|
## 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
|
||||||
|
|
||||||
|
<a id="nestedblock--timeouts"></a>
|
||||||
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
|
Optional:
|
||||||
|
|
||||||
|
- `default` (String)
|
||||||
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
|
<a id="nestedatt--acl"></a>
|
||||||
|
### Nested Schema for `acl`
|
||||||
|
|
||||||
|
Read-Only:
|
||||||
|
|
||||||
|
- `explicit` (Boolean)
|
||||||
|
- `right` (String)
|
||||||
|
- `status` (String)
|
||||||
|
- `type` (String)
|
||||||
|
- `user_group_id` (String)
|
||||||
64
docs/data-sources/vm_folder_list.md
Normal file
64
docs/data-sources/vm_folder_list.md
Normal file
@@ -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 generated by tfplugindocs -->
|
||||||
|
## 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))
|
||||||
|
|
||||||
|
<a id="nestedblock--timeouts"></a>
|
||||||
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
|
Optional:
|
||||||
|
|
||||||
|
- `default` (String)
|
||||||
|
- `read` (String)
|
||||||
|
|
||||||
|
|
||||||
|
<a id="nestedatt--items"></a>
|
||||||
|
### 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)
|
||||||
|
|
||||||
|
<a id="nestedobjatt--items--acl"></a>
|
||||||
|
### Nested Schema for `items.acl`
|
||||||
|
|
||||||
|
Read-Only:
|
||||||
|
|
||||||
|
- `explicit` (Boolean)
|
||||||
|
- `right` (String)
|
||||||
|
- `status` (String)
|
||||||
|
- `type` (String)
|
||||||
|
- `user_group_id` (String)
|
||||||
@@ -104,6 +104,7 @@ description: |-
|
|||||||
- `deleted_time` (Number)
|
- `deleted_time` (Number)
|
||||||
- `devices` (String)
|
- `devices` (String)
|
||||||
- `driver` (String)
|
- `driver` (String)
|
||||||
|
- `folder_id` (Number)
|
||||||
- `gid` (Number)
|
- `gid` (Number)
|
||||||
- `guid` (Number)
|
- `guid` (Number)
|
||||||
- `id` (String) The ID of this resource.
|
- `id` (String) The ID of this resource.
|
||||||
|
|||||||
80
docs/resources/cb_vm_folder.md
Normal file
80
docs/resources/cb_vm_folder.md
Normal file
@@ -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 generated by tfplugindocs -->
|
||||||
|
## 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
|
||||||
|
|
||||||
|
<a id="nestedblock--acl_access"></a>
|
||||||
|
### 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
|
||||||
|
|
||||||
|
|
||||||
|
<a id="nestedblock--computes_move"></a>
|
||||||
|
### 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
|
||||||
|
|
||||||
|
|
||||||
|
<a id="nestedblock--timeouts"></a>
|
||||||
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
|
Optional:
|
||||||
|
|
||||||
|
- `create` (String)
|
||||||
|
- `default` (String)
|
||||||
|
- `delete` (String)
|
||||||
|
- `read` (String)
|
||||||
|
- `update` (String)
|
||||||
|
|
||||||
|
|
||||||
|
<a id="nestedatt--acl"></a>
|
||||||
|
### Nested Schema for `acl`
|
||||||
|
|
||||||
|
Read-Only:
|
||||||
|
|
||||||
|
- `explicit` (Boolean)
|
||||||
|
- `right` (String)
|
||||||
|
- `status` (String)
|
||||||
|
- `type` (String)
|
||||||
|
- `user_group_id` (String)
|
||||||
@@ -97,6 +97,7 @@ description: |-
|
|||||||
- `deleted_time` (Number)
|
- `deleted_time` (Number)
|
||||||
- `devices` (String)
|
- `devices` (String)
|
||||||
- `driver` (String)
|
- `driver` (String)
|
||||||
|
- `folder_id` (Number)
|
||||||
- `gid` (Number)
|
- `gid` (Number)
|
||||||
- `guid` (Number)
|
- `guid` (Number)
|
||||||
- `id` (String) The ID of this resource.
|
- `id` (String) The ID of this resource.
|
||||||
|
|||||||
79
docs/resources/vm_folder.md
Normal file
79
docs/resources/vm_folder.md
Normal file
@@ -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 generated by tfplugindocs -->
|
||||||
|
## 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
|
||||||
|
|
||||||
|
<a id="nestedblock--acl_access"></a>
|
||||||
|
### 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
|
||||||
|
|
||||||
|
|
||||||
|
<a id="nestedblock--computes_move"></a>
|
||||||
|
### 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
|
||||||
|
|
||||||
|
|
||||||
|
<a id="nestedblock--timeouts"></a>
|
||||||
|
### Nested Schema for `timeouts`
|
||||||
|
|
||||||
|
Optional:
|
||||||
|
|
||||||
|
- `create` (String)
|
||||||
|
- `default` (String)
|
||||||
|
- `delete` (String)
|
||||||
|
- `read` (String)
|
||||||
|
- `update` (String)
|
||||||
|
|
||||||
|
|
||||||
|
<a id="nestedatt--acl"></a>
|
||||||
|
### Nested Schema for `acl`
|
||||||
|
|
||||||
|
Read-Only:
|
||||||
|
|
||||||
|
- `explicit` (Boolean)
|
||||||
|
- `right` (String)
|
||||||
|
- `status` (String)
|
||||||
|
- `type` (String)
|
||||||
|
- `user_group_id` (String)
|
||||||
2
go.mod
2
go.mod
@@ -9,7 +9,7 @@ require (
|
|||||||
github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1
|
github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1
|
||||||
github.com/sirupsen/logrus v1.9.0
|
github.com/sirupsen/logrus v1.9.0
|
||||||
golang.org/x/net v0.44.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 (
|
require (
|
||||||
|
|||||||
4
go.sum
4
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.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 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
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.10 h1:ejQjPFN7Z4UaKvzO0kMPbMUlabIW6qImtPgWnDgQJhg=
|
||||||
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/go.mod h1:S/f7GxwWcE88eFpORV+I9xqEf8zDW5srQHpG2XQCLZM=
|
||||||
|
|||||||
@@ -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/trunk"
|
||||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vfpool"
|
"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/vins"
|
||||||
|
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vmfolder"
|
||||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/zone"
|
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/zone"
|
||||||
accessgroup "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/access_group"
|
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/hypervisors"
|
||||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/logicalports"
|
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/logicalports"
|
||||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/netobjgroups"
|
"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_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_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_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"
|
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_security_group_list": secgroup.DataSourceSecurityGroupList(),
|
||||||
"decort_trunk": trunk.DataSourceTrunk(),
|
"decort_trunk": trunk.DataSourceTrunk(),
|
||||||
"decort_trunk_list": trunk.DataSourceTrunkList(),
|
"decort_trunk_list": trunk.DataSourceTrunkList(),
|
||||||
|
"decort_vm_folder": vmfolder.DataSourceVMFolder(),
|
||||||
|
"decort_vm_folder_list": vmfolder.DataSourceVMFolderList(),
|
||||||
"decort_zone": zone.DataSourceZone(),
|
"decort_zone": zone.DataSourceZone(),
|
||||||
"decort_zone_list": zone.DataSourceZoneList(),
|
"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_snapshot_usage": cb_kvmvm.DataSourceComputeSnapshotUsage(),
|
||||||
"decort_cb_kvmvm_user_list": cb_kvmvm.DataSourceComputeUserList(),
|
"decort_cb_kvmvm_user_list": cb_kvmvm.DataSourceComputeUserList(),
|
||||||
"decort_cb_kvmvm_vgpu_list": cb_kvmvm.DataSourceComputeVGPUList(),
|
"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": cb_node.DataSourceNode(),
|
||||||
"decort_cb_node_list": cb_node.DataSourceNodeList(),
|
"decort_cb_node_list": cb_node.DataSourceNodeList(),
|
||||||
"decort_cb_node_network_info": cb_node.DataSourceNodeNetworkInfo(),
|
"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_nat_rule_list": cb_vins.DataSourceVinsNatRuleList(),
|
||||||
"decort_cb_vins_static_route": cb_vins.DataSourceStaticRoute(),
|
"decort_cb_vins_static_route": cb_vins.DataSourceStaticRoute(),
|
||||||
"decort_cb_vins_static_route_list": cb_vins.DataSourceStaticRouteList(),
|
"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": cb_k8ci.DataSourceK8CI(),
|
||||||
"decort_cb_k8ci_list": cb_k8ci.DataSourceK8CIList(),
|
"decort_cb_k8ci_list": cb_k8ci.DataSourceK8CIList(),
|
||||||
"decort_cb_k8ci_list_deleted": cb_k8ci.DataSourceK8CIListDeleted(),
|
"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_cloud_init": cb_k8s.DataSourceK8sWgCloudInit(),
|
||||||
"decort_cb_k8s_wg_list": cb_k8s.DataSourceK8sWgList(),
|
"decort_cb_k8s_wg_list": cb_k8s.DataSourceK8sWgList(),
|
||||||
"decort_cb_k8s_computes": cb_k8s.DataSourceK8sComputes(),
|
"decort_cb_k8s_computes": cb_k8s.DataSourceK8sComputes(),
|
||||||
"decort_cb_zone": cb_zone.DataSourceZone(),
|
"decort_cb_zone": cb_zone.DataSourceZone(),
|
||||||
"decort_cb_zone_list": cb_zone.DataSourceZoneList(),
|
"decort_cb_zone_list": cb_zone.DataSourceZoneList(),
|
||||||
"decort_cb_zone_cpu_alignment_profile": cb_zone.DataSourceZoneCPUAlignmentProfile(),
|
"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_list": cb_zone.DataSourceZoneCPUAlignmentProfileList(),
|
||||||
"decort_cb_zone_cpu_alignment_profile_test": cb_zone.DataSourceZoneCPUAlignmentProfileTest(),
|
"decort_cb_zone_cpu_alignment_profile_test": cb_zone.DataSourceZoneCPUAlignmentProfileTest(),
|
||||||
|
|
||||||
"decort_sdn_access_group": accessgroup.DataSourceAccessGroup(),
|
"decort_sdn_access_group": accessgroup.DataSourceAccessGroup(),
|
||||||
"decort_sdn_access_group_list": accessgroup.DataSourceAccessGroupList(),
|
"decort_sdn_access_group_list": accessgroup.DataSourceAccessGroupList(),
|
||||||
"decort_sdn_access_group_user_list": accessgroup.DataSourceAccessGroupUserList(),
|
"decort_sdn_access_group_user_list": accessgroup.DataSourceAccessGroupUserList(),
|
||||||
"decort_sdn_default_security_policy_list": defaultsecuritypolicy.DataSourceDefaultSecurityPolicyList(),
|
"decort_sdn_segment": segments.DataSourceSegment(),
|
||||||
"decort_sdn_segment": segments.DataSourceSegment(),
|
"decort_sdn_segment_list": segments.DataSourceSegmentList(),
|
||||||
"decort_sdn_segment_list": segments.DataSourceSegmentList(),
|
|
||||||
|
|
||||||
"decort_sdn_hypervisor": hypervisors.DataSourceHypervisor(),
|
"decort_sdn_hypervisor": hypervisors.DataSourceHypervisor(),
|
||||||
"decort_sdn_hypervisor_list": hypervisors.DataSourceHypervisorList(),
|
"decort_sdn_hypervisor_list": hypervisors.DataSourceHypervisorList(),
|
||||||
|
|||||||
@@ -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/secgroup"
|
||||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/snapshot"
|
"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/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"
|
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/hypervisors"
|
||||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/logicalports"
|
"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_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_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_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"
|
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_flipgroup": flipgroup.ResourceFlipgroup(),
|
||||||
"decort_vins_static_route": vins.ResourceStaticRoute(),
|
"decort_vins_static_route": vins.ResourceStaticRoute(),
|
||||||
"decort_security_group": secgroup.ResourceSecurityGroup(),
|
"decort_security_group": secgroup.ResourceSecurityGroup(),
|
||||||
|
"decort_vm_folder": vmfolder.ResourceVMFolder(),
|
||||||
|
|
||||||
"decort_cb_account": cb_account.ResourceAccount(),
|
"decort_cb_account": cb_account.ResourceAccount(),
|
||||||
"decort_cb_dpdknet": cb_dpdknet.ResourceDPDKNet(),
|
"decort_cb_dpdknet": cb_dpdknet.ResourceDPDKNet(),
|
||||||
@@ -126,6 +129,7 @@ func newResourcesMap() map[string]*schema.Resource {
|
|||||||
"decort_cb_trunk": cb_trunk.ResourceTrunk(),
|
"decort_cb_trunk": cb_trunk.ResourceTrunk(),
|
||||||
"decort_cb_user": cb_user.ResourceUser(),
|
"decort_cb_user": cb_user.ResourceUser(),
|
||||||
"decort_cb_vfpool": cb_vfpool.ResourceVFPool(),
|
"decort_cb_vfpool": cb_vfpool.ResourceVFPool(),
|
||||||
|
"decort_cb_vm_folder": cb_vmfolder.ResourceVMFolder(),
|
||||||
"decort_cb_zone": cb_zone.ResourceZone(),
|
"decort_cb_zone": cb_zone.ResourceZone(),
|
||||||
|
|
||||||
"decort_sdn_segment": segments.ResourceSegment(),
|
"decort_sdn_segment": segments.ResourceSegment(),
|
||||||
|
|||||||
@@ -1251,6 +1251,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
|
|||||||
Type: schema.TypeInt,
|
Type: schema.TypeInt,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
|
"folder_id": {
|
||||||
|
Type: schema.TypeInt,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
"weight": {
|
"weight": {
|
||||||
Type: schema.TypeInt,
|
Type: schema.TypeInt,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
|
|||||||
@@ -477,6 +477,10 @@ func itemComputeSchemaMake() map[string]*schema.Schema {
|
|||||||
Type: schema.TypeInt,
|
Type: schema.TypeInt,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
|
"folder_id": {
|
||||||
|
Type: schema.TypeInt,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
"weight": {
|
"weight": {
|
||||||
Type: schema.TypeInt,
|
Type: schema.TypeInt,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
@@ -564,6 +568,16 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
|
|||||||
Optional: true,
|
Optional: true,
|
||||||
Description: "Zone ID",
|
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": {
|
"items": {
|
||||||
Type: schema.TypeList,
|
Type: schema.TypeList,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
|
|||||||
@@ -258,6 +258,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
|
|||||||
"hot_resize": compute.HotResize,
|
"hot_resize": compute.HotResize,
|
||||||
"network_interface_naming": compute.NetworkInterfaceNaming,
|
"network_interface_naming": compute.NetworkInterfaceNaming,
|
||||||
"zone_id": compute.ZoneID,
|
"zone_id": compute.ZoneID,
|
||||||
|
"folder_id": compute.FolderID,
|
||||||
"weight": compute.Weight,
|
"weight": compute.Weight,
|
||||||
}
|
}
|
||||||
res = append(res, temp)
|
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("hot_resize", computeRec.HotResize)
|
||||||
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
|
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
|
||||||
d.Set("zone_id", computeRec.ZoneID)
|
d.Set("zone_id", computeRec.ZoneID)
|
||||||
|
d.Set("folder_id", computeRec.FolderID)
|
||||||
d.Set("loader_meta_iso", flattenLoaderMetaIso(computeRec.LoaderMetaIso))
|
d.Set("loader_meta_iso", flattenLoaderMetaIso(computeRec.LoaderMetaIso))
|
||||||
d.Set("cpu_pin", computeRec.CPUPin)
|
d.Set("cpu_pin", computeRec.CPUPin)
|
||||||
d.Set("cpu_alignment_profile", computeRec.CPUAlignmentProfile.Name)
|
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("hot_resize", computeRec.HotResize)
|
||||||
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
|
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
|
||||||
d.Set("zone_id", computeRec.ZoneID)
|
d.Set("zone_id", computeRec.ZoneID)
|
||||||
|
d.Set("folder_id", computeRec.FolderID)
|
||||||
d.Set("loader_meta_iso", flattenLoaderMetaIso(computeRec.LoaderMetaIso))
|
d.Set("loader_meta_iso", flattenLoaderMetaIso(computeRec.LoaderMetaIso))
|
||||||
d.Set("os_version", computeRec.OSVersion)
|
d.Set("os_version", computeRec.OSVersion)
|
||||||
d.Set("cpu_alignment_profiles", flattenCPUAlignmentProfile(computeRec.CPUAlignmentProfile))
|
d.Set("cpu_alignment_profiles", flattenCPUAlignmentProfile(computeRec.CPUAlignmentProfile))
|
||||||
|
|||||||
@@ -3029,6 +3029,10 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
|
|||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
|
"folder_id": {
|
||||||
|
Type: schema.TypeInt,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
"vgpus": {
|
"vgpus": {
|
||||||
Type: schema.TypeList,
|
Type: schema.TypeList,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
|
|||||||
@@ -89,6 +89,12 @@ func utilityDataComputeListCheckPresence(ctx context.Context, d *schema.Resource
|
|||||||
if zoneID, ok := d.GetOk("zone_id"); ok {
|
if zoneID, ok := d.GetOk("zone_id"); ok {
|
||||||
req.ZoneID = uint64(zoneID.(int))
|
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)
|
listComputes, err := c.CloudAPI().Compute().List(ctx, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -60,6 +60,7 @@ func flattenLocationsList(ll *locations.ListLocations) []map[string]interface{}
|
|||||||
"sdn_support": l.SDNSupport,
|
"sdn_support": l.SDNSupport,
|
||||||
"zero_access_enabled": l.ZeroAccessEnabled,
|
"zero_access_enabled": l.ZeroAccessEnabled,
|
||||||
"bro_enabled": l.BROEnabled,
|
"bro_enabled": l.BROEnabled,
|
||||||
|
"vm_folders_enabled": l.VMFoldersEnabled,
|
||||||
}
|
}
|
||||||
res = append(res, temp)
|
res = append(res, temp)
|
||||||
}
|
}
|
||||||
@@ -193,6 +194,10 @@ func dataSourceLocationsListSchemaMake() map[string]*schema.Schema {
|
|||||||
Type: schema.TypeBool,
|
Type: schema.TypeBool,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
|
"vm_folders_enabled": {
|
||||||
|
Type: schema.TypeBool,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
130
internal/service/cloudapi/vmfolder/data_source_vm_folder.go
Normal file
130
internal/service/cloudapi/vmfolder/data_source_vm_folder.go
Normal file
@@ -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(),
|
||||||
|
}
|
||||||
|
}
|
||||||
108
internal/service/cloudapi/vmfolder/data_source_vm_folder_list.go
Normal file
108
internal/service/cloudapi/vmfolder/data_source_vm_folder_list.go
Normal file
@@ -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(),
|
||||||
|
}
|
||||||
|
}
|
||||||
54
internal/service/cloudapi/vmfolder/flattens.go
Normal file
54
internal/service/cloudapi/vmfolder/flattens.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
279
internal/service/cloudapi/vmfolder/resource_vm_folder.go
Normal file
279
internal/service/cloudapi/vmfolder/resource_vm_folder.go
Normal file
@@ -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(),
|
||||||
|
}
|
||||||
|
}
|
||||||
117
internal/service/cloudapi/vmfolder/utility_vm_folder.go
Normal file
117
internal/service/cloudapi/vmfolder/utility_vm_folder.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
33
internal/service/cloudapi/vmfolder/utility_vm_folder_list.go
Normal file
33
internal/service/cloudapi/vmfolder/utility_vm_folder_list.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
@@ -21,6 +21,7 @@ func flattenGrid(d *schema.ResourceData, grid *grid.RecordGrid) {
|
|||||||
d.Set("reserved_ram", grid.ReservedRAM)
|
d.Set("reserved_ram", grid.ReservedRAM)
|
||||||
d.Set("sdn_support", grid.SDNSupport)
|
d.Set("sdn_support", grid.SDNSupport)
|
||||||
d.Set("zero_access_enabled", grid.ZeroAccessEnabled)
|
d.Set("zero_access_enabled", grid.ZeroAccessEnabled)
|
||||||
|
d.Set("vm_folders_enabled", grid.VMFoldersEnabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
func flattenGridList(gl *grid.ListGrids) []map[string]interface{} {
|
func flattenGridList(gl *grid.ListGrids) []map[string]interface{} {
|
||||||
@@ -41,6 +42,7 @@ func flattenGridList(gl *grid.ListGrids) []map[string]interface{} {
|
|||||||
"sdn_support": item.SDNSupport,
|
"sdn_support": item.SDNSupport,
|
||||||
"zero_access_enabled": item.ZeroAccessEnabled,
|
"zero_access_enabled": item.ZeroAccessEnabled,
|
||||||
"bro_enabled": item.BROEnabled,
|
"bro_enabled": item.BROEnabled,
|
||||||
|
"vm_folders_enabled": item.VMFoldersEnabled,
|
||||||
}
|
}
|
||||||
res = append(res, temp)
|
res = append(res, temp)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -62,6 +62,10 @@ func dataSourceGetGridSchemaMake() map[string]*schema.Schema {
|
|||||||
Type: schema.TypeBool,
|
Type: schema.TypeBool,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
|
"vm_folders_enabled": {
|
||||||
|
Type: schema.TypeBool,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,6 +282,10 @@ func dataSourceGridListSchemaMake() map[string]*schema.Schema {
|
|||||||
Type: schema.TypeBool,
|
Type: schema.TypeBool,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
|
"vm_folders_enabled": {
|
||||||
|
Type: schema.TypeBool,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute, p
|
|||||||
d.Set("hot_resize", computeRec.HotResize)
|
d.Set("hot_resize", computeRec.HotResize)
|
||||||
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
|
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
|
||||||
d.Set("zone_id", computeRec.ZoneID)
|
d.Set("zone_id", computeRec.ZoneID)
|
||||||
|
d.Set("folder_id", computeRec.FolderID)
|
||||||
d.Set("os_version", computeRec.OSVersion)
|
d.Set("os_version", computeRec.OSVersion)
|
||||||
d.Set("cpu_pin", computeRec.CPUPin)
|
d.Set("cpu_pin", computeRec.CPUPin)
|
||||||
d.Set("cpu_alignment_profile", computeRec.CPUAlignmentProfile.Name)
|
d.Set("cpu_alignment_profile", computeRec.CPUAlignmentProfile.Name)
|
||||||
@@ -436,6 +437,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
|
|||||||
"hot_resize": computeItem.HotResize,
|
"hot_resize": computeItem.HotResize,
|
||||||
"network_interface_naming": computeItem.NetworkInterfaceNaming,
|
"network_interface_naming": computeItem.NetworkInterfaceNaming,
|
||||||
"zone_id": computeItem.ZoneID,
|
"zone_id": computeItem.ZoneID,
|
||||||
|
"folder_id": computeItem.FolderID,
|
||||||
"weight": computeItem.Weight,
|
"weight": computeItem.Weight,
|
||||||
}
|
}
|
||||||
res = append(res, temp)
|
res = append(res, temp)
|
||||||
@@ -527,6 +529,7 @@ func flattenDeletedComputeList(computes *compute.ListDeletedComputes) []map[stri
|
|||||||
"hot_resize": computeItem.HotResize,
|
"hot_resize": computeItem.HotResize,
|
||||||
"network_interface_naming": computeItem.NetworkInterfaceNaming,
|
"network_interface_naming": computeItem.NetworkInterfaceNaming,
|
||||||
"zone_id": computeItem.ZoneID,
|
"zone_id": computeItem.ZoneID,
|
||||||
|
"folder_id": computeItem.FolderID,
|
||||||
"weight": computeItem.Weight,
|
"weight": computeItem.Weight,
|
||||||
}
|
}
|
||||||
res = append(res, temp)
|
res = append(res, temp)
|
||||||
@@ -877,6 +880,7 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
|
|||||||
d.Set("hot_resize", compFacts.HotResize)
|
d.Set("hot_resize", compFacts.HotResize)
|
||||||
d.Set("network_interface_naming", compFacts.NetworkInterfaceNaming)
|
d.Set("network_interface_naming", compFacts.NetworkInterfaceNaming)
|
||||||
d.Set("zone_id", compFacts.ZoneID)
|
d.Set("zone_id", compFacts.ZoneID)
|
||||||
|
d.Set("folder_id", compFacts.FolderID)
|
||||||
d.Set("loader_meta_iso", flattenLoaderMetaIso(compFacts.LoaderMetaIso))
|
d.Set("loader_meta_iso", flattenLoaderMetaIso(compFacts.LoaderMetaIso))
|
||||||
d.Set("os_version", compFacts.OSVersion)
|
d.Set("os_version", compFacts.OSVersion)
|
||||||
d.Set("weight", compFacts.Weight)
|
d.Set("weight", compFacts.Weight)
|
||||||
|
|||||||
@@ -1233,6 +1233,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
|
|||||||
Type: schema.TypeInt,
|
Type: schema.TypeInt,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
|
"folder_id": {
|
||||||
|
Type: schema.TypeInt,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
"weight": {
|
"weight": {
|
||||||
Type: schema.TypeInt,
|
Type: schema.TypeInt,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
@@ -1330,6 +1334,16 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
|
|||||||
Optional: true,
|
Optional: true,
|
||||||
Description: "Zone ID",
|
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": {
|
"ignore_k8s": {
|
||||||
Type: schema.TypeBool,
|
Type: schema.TypeBool,
|
||||||
Optional: true,
|
Optional: true,
|
||||||
@@ -1837,6 +1851,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
|
|||||||
Type: schema.TypeInt,
|
Type: schema.TypeInt,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
|
"folder_id": {
|
||||||
|
Type: schema.TypeInt,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
"weight": {
|
"weight": {
|
||||||
Type: schema.TypeInt,
|
Type: schema.TypeInt,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
@@ -2396,6 +2414,10 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
|
|||||||
Type: schema.TypeInt,
|
Type: schema.TypeInt,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
|
"folder_id": {
|
||||||
|
Type: schema.TypeInt,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
"weight": {
|
"weight": {
|
||||||
Type: schema.TypeInt,
|
Type: schema.TypeInt,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
@@ -4929,6 +4951,10 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
|
|||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
},
|
},
|
||||||
|
"folder_id": {
|
||||||
|
Type: schema.TypeInt,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
"vgpus": {
|
"vgpus": {
|
||||||
Type: schema.TypeList,
|
Type: schema.TypeList,
|
||||||
Computed: true,
|
Computed: true,
|
||||||
|
|||||||
@@ -99,6 +99,12 @@ func utilityDataComputeListCheckPresence(ctx context.Context, d *schema.Resource
|
|||||||
if zoneID, ok := d.GetOk("zone_id"); ok {
|
if zoneID, ok := d.GetOk("zone_id"); ok {
|
||||||
req.ZoneID = uint64(zoneID.(int))
|
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)
|
listComputes, err := c.CloudBroker().Compute().List(ctx, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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(),
|
||||||
|
}
|
||||||
|
}
|
||||||
55
internal/service/cloudbroker/vmfolder/flattens.go
Normal file
55
internal/service/cloudbroker/vmfolder/flattens.go
Normal file
@@ -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
|
||||||
|
}
|
||||||
182
internal/service/cloudbroker/vmfolder/resource_vm_folder.go
Normal file
182
internal/service/cloudbroker/vmfolder/resource_vm_folder.go
Normal file
@@ -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(),
|
||||||
|
}
|
||||||
|
}
|
||||||
266
internal/service/cloudbroker/vmfolder/schema.go
Normal file
266
internal/service/cloudbroker/vmfolder/schema.go
Normal file
@@ -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",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
117
internal/service/cloudbroker/vmfolder/utility_vm_folder.go
Normal file
117
internal/service/cloudbroker/vmfolder/utility_vm_folder.go
Normal file
@@ -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)
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -108,6 +108,8 @@
|
|||||||
- vins_nat_rule_list
|
- vins_nat_rule_list
|
||||||
- vins_static_route
|
- vins_static_route
|
||||||
- vins_static_route_list
|
- vins_static_route_list
|
||||||
|
- vm_folder
|
||||||
|
- vm_folder_list
|
||||||
- zone
|
- zone
|
||||||
- zone_list
|
- zone_list
|
||||||
- resources:
|
- resources:
|
||||||
@@ -136,6 +138,7 @@
|
|||||||
- snapshot
|
- snapshot
|
||||||
- vins
|
- vins
|
||||||
- vins_static_route
|
- vins_static_route
|
||||||
|
- vm_folder
|
||||||
- cloudbroker:
|
- cloudbroker:
|
||||||
- data:
|
- data:
|
||||||
- cb_account
|
- cb_account
|
||||||
@@ -261,6 +264,8 @@
|
|||||||
- cb_vins_nat_rule_list
|
- cb_vins_nat_rule_list
|
||||||
- cb_vins_static_route
|
- cb_vins_static_route
|
||||||
- cb_vins_static_route_list
|
- cb_vins_static_route_list
|
||||||
|
- cb_vm_folder
|
||||||
|
- cb_vm_folder_list
|
||||||
- cb_zone
|
- cb_zone
|
||||||
- cb_zone_list
|
- cb_zone_list
|
||||||
- cb_zone_cpu_alignment_profile
|
- cb_zone_cpu_alignment_profile
|
||||||
@@ -300,6 +305,7 @@
|
|||||||
- cb_vins
|
- cb_vins
|
||||||
- cb_vins_static_route
|
- cb_vins_static_route
|
||||||
- cb_virtual_image
|
- cb_virtual_image
|
||||||
|
- cb_vm_folder
|
||||||
- decort_cb_multi_image
|
- decort_cb_multi_image
|
||||||
- cb_zone
|
- cb_zone
|
||||||
- sdn
|
- sdn
|
||||||
@@ -307,7 +313,6 @@
|
|||||||
- sdn_access_group
|
- sdn_access_group
|
||||||
- sdn_access_group_list
|
- sdn_access_group_list
|
||||||
- sdn_access_group_user_list
|
- sdn_access_group_user_list
|
||||||
- sdn_default_security_policy_list
|
|
||||||
- sdn_segment
|
- sdn_segment
|
||||||
- sdn_segment_list
|
- sdn_segment_list
|
||||||
- sdn_logical_port
|
- sdn_logical_port
|
||||||
|
|||||||
@@ -108,6 +108,16 @@ data "decort_kvmvm_list" "compute_list" {
|
|||||||
#значение по умолчанию - 0
|
#значение по умолчанию - 0
|
||||||
#zone_id = 11
|
#zone_id = 11
|
||||||
|
|
||||||
|
#фильтр по id папки ВМ
|
||||||
|
#опциональный параметр
|
||||||
|
#тип - целое число
|
||||||
|
#folder_id = 100
|
||||||
|
|
||||||
|
#флаг включения в результат ВМ из дочерних папок
|
||||||
|
#опциональный параметр
|
||||||
|
#тип - булев
|
||||||
|
#include_descendants = true
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
output "output" {
|
output "output" {
|
||||||
|
|||||||
38
samples/cloudapi/vmfolder/data_vm_folder/main.tf
Normal file
38
samples/cloudapi/vmfolder/data_vm_folder/main.tf
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
Пример использования
|
||||||
|
Получение информации о папке ВМ
|
||||||
|
*/
|
||||||
|
|
||||||
|
#Раскомментируйте этот код,
|
||||||
|
#и внесите необходимые правки в версию и путь,
|
||||||
|
#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
|
||||||
|
/*
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
decort = {
|
||||||
|
source = "basis/decort/decort"
|
||||||
|
version = "<VERSION>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
provider "decort" {
|
||||||
|
authenticator = "decs3o"
|
||||||
|
#controller_url = <DECORT_CONTROLLER_URL>
|
||||||
|
controller_url = "https://ds1.digitalenergy.online"
|
||||||
|
#oauth2_url = <DECORT_SSO_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
|
||||||
|
}
|
||||||
48
samples/cloudapi/vmfolder/data_vm_folder_list/main.tf
Normal file
48
samples/cloudapi/vmfolder/data_vm_folder_list/main.tf
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
Пример использования
|
||||||
|
Получение списка папок ВМ
|
||||||
|
*/
|
||||||
|
|
||||||
|
#Раскомментируйте этот код,
|
||||||
|
#и внесите необходимые правки в версию и путь,
|
||||||
|
#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
|
||||||
|
/*
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
decort = {
|
||||||
|
source = "basis/decort/decort"
|
||||||
|
version = "<VERSION>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
provider "decort" {
|
||||||
|
authenticator = "decs3o"
|
||||||
|
#controller_url = <DECORT_CONTROLLER_URL>
|
||||||
|
controller_url = "https://ds1.digitalenergy.online"
|
||||||
|
#oauth2_url = <DECORT_SSO_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
|
||||||
|
}
|
||||||
88
samples/cloudapi/vmfolder/resource_vm_folder/main.tf
Normal file
88
samples/cloudapi/vmfolder/resource_vm_folder/main.tf
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
Пример использования
|
||||||
|
Ресурса папки ВМ:
|
||||||
|
1. Создание ресурса
|
||||||
|
2. Изменение ресурса
|
||||||
|
3. Удаление ресурса
|
||||||
|
*/
|
||||||
|
|
||||||
|
#Раскомментируйте этот код,
|
||||||
|
#и внесите необходимые правки в версию и путь,
|
||||||
|
#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
|
||||||
|
/*
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
decort = {
|
||||||
|
source = "basis/decort/decort"
|
||||||
|
version = "<VERSION>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
provider "decort" {
|
||||||
|
authenticator = "decs3o"
|
||||||
|
#controller_url = <DECORT_CONTROLLER_URL>
|
||||||
|
controller_url = "https://ds1.digitalenergy.online"
|
||||||
|
#oauth2_url = <DECORT_SSO_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
|
||||||
|
}
|
||||||
@@ -122,6 +122,16 @@ data "decort_cb_kvmvm_list" "compute_list" {
|
|||||||
#значение по умолчанию - 0
|
#значение по умолчанию - 0
|
||||||
#zone_id = 11
|
#zone_id = 11
|
||||||
|
|
||||||
|
#фильтр по id папки ВМ
|
||||||
|
#опциональный параметр
|
||||||
|
#тип - целое число
|
||||||
|
#folder_id = 100
|
||||||
|
|
||||||
|
#флаг включения в результат ВМ из дочерних папок
|
||||||
|
#опциональный параметр
|
||||||
|
#тип - булев
|
||||||
|
#include_descendants = true
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
output "output" {
|
output "output" {
|
||||||
|
|||||||
38
samples/cloudbroker/vmfolder/data_vm_folder/main.tf
Normal file
38
samples/cloudbroker/vmfolder/data_vm_folder/main.tf
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
Пример использования
|
||||||
|
Получение информации о папке ВМ
|
||||||
|
*/
|
||||||
|
|
||||||
|
#Раскомментируйте этот код,
|
||||||
|
#и внесите необходимые правки в версию и путь,
|
||||||
|
#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
|
||||||
|
/*
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
decort = {
|
||||||
|
source = "basis/decort/decort"
|
||||||
|
version = "<VERSION>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
provider "decort" {
|
||||||
|
authenticator = "decs3o"
|
||||||
|
#controller_url = <DECORT_CONTROLLER_URL>
|
||||||
|
controller_url = "https://ds1.digitalenergy.online"
|
||||||
|
#oauth2_url = <DECORT_SSO_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
|
||||||
|
}
|
||||||
48
samples/cloudbroker/vmfolder/data_vm_folder_list/main.tf
Normal file
48
samples/cloudbroker/vmfolder/data_vm_folder_list/main.tf
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
Пример использования
|
||||||
|
Получение списка папок ВМ
|
||||||
|
*/
|
||||||
|
|
||||||
|
#Раскомментируйте этот код,
|
||||||
|
#и внесите необходимые правки в версию и путь,
|
||||||
|
#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
|
||||||
|
/*
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
decort = {
|
||||||
|
source = "basis/decort/decort"
|
||||||
|
version = "<VERSION>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
provider "decort" {
|
||||||
|
authenticator = "decs3o"
|
||||||
|
#controller_url = <DECORT_CONTROLLER_URL>
|
||||||
|
controller_url = "https://ds1.digitalenergy.online"
|
||||||
|
#oauth2_url = <DECORT_SSO_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
|
||||||
|
}
|
||||||
88
samples/cloudbroker/vmfolder/resource_vm_folder/main.tf
Normal file
88
samples/cloudbroker/vmfolder/resource_vm_folder/main.tf
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
Пример использования
|
||||||
|
Ресурса папки ВМ:
|
||||||
|
1. Создание ресурса
|
||||||
|
2. Изменение ресурса
|
||||||
|
3. Удаление ресурса
|
||||||
|
*/
|
||||||
|
|
||||||
|
#Раскомментируйте этот код,
|
||||||
|
#и внесите необходимые правки в версию и путь,
|
||||||
|
#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
|
||||||
|
/*
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
decort = {
|
||||||
|
source = "basis/decort/decort"
|
||||||
|
version = "<VERSION>"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
provider "decort" {
|
||||||
|
authenticator = "decs3o"
|
||||||
|
#controller_url = <DECORT_CONTROLLER_URL>
|
||||||
|
controller_url = "https://ds1.digitalenergy.online"
|
||||||
|
#oauth2_url = <DECORT_SSO_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
|
||||||
|
}
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
Пример использования
|
|
||||||
Получение списка политик безопасности по умолчанию
|
|
||||||
*/
|
|
||||||
|
|
||||||
#Раскомментируйте этот код,
|
|
||||||
#и внесите необходимые правки в версию и путь,
|
|
||||||
#чтобы работать с установленным вручную (не через hashicorp provider registry) провайдером
|
|
||||||
/*
|
|
||||||
terraform {
|
|
||||||
required_providers {
|
|
||||||
decort = {
|
|
||||||
source = "basis/decort/decort"
|
|
||||||
version = "<VERSION>"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
provider "decort" {
|
|
||||||
authenticator = "decs3o"
|
|
||||||
#controller_url = <DECORT_CONTROLLER_URL>
|
|
||||||
controller_url = "https://ds1.digitalenergy.online"
|
|
||||||
#oauth2_url = <DECORT_SSO_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
|
|
||||||
}
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user