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
|
||||
| Компонент | Тип | Подробности |
|
||||
@@ -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
|
||||
| Идентификатор<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-1311 | Вычисляемое поле `zero_access_enabled` в datasource `decort_cb_grid` в cloudbroker/grid |
|
||||
| BATF-1311 | Вычисляемое поле `policies` в datasource `decort_cb_grid_get_consumption` в cloudbroker/grid |
|
||||
| BATF-1333 | Вычисляемые поля `reserved_cpu` и `reserved_ram` в datasources `decort_cb_grid` и `decort_cb_grid_list` в cloudbroker/grid |
|
||||
| BATF-1333 | Вычисляемое поле `policies` в блоках `current` и `reserved` в datasource `decort_cb_grid_list` в cloudbroker/grid |
|
||||
| BATF-1333 | Вычисляемое поле `bro_enabled` в блоке `items` в datasource `decort_cb_grid_list` в cloudbroker/grid |
|
||||
| BATF-1424 | Возможность задать поле `vnfdev_start` при создании resource `decort_cb_vins` в cloudbroker/vins |
|
||||
| BATF-1439 | Вычисляемое поле `vm_folders_enabled` в datasources `decort_cb_grid` и `decort_cb_grid_list` в cloudbroker/grid |
|
||||
|
||||
#### kvmvm
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BATF-1323 | Вычисляемое поле `memory_dump_image` в блоке `snap_sets` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
|
||||
| BATF-1323 | Вычисляемое поле `memory_dump_image` в блоке `snap_sets` в resource `decort_kvmvm` в cloudapi/kvmvm |
|
||||
| BATF-1323 | Вычисляемое поле `memory_dump_image` в блоке `snap_sets` в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm |
|
||||
| BATF-1323 | Вычисляемое поле `memory_dump_image` в блоке `snap_sets` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm |
|
||||
| BATF-1313 | Опциональное поле `read_only` в блоке `disks` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
|
||||
| BATF-1313 | Опциональное поле `read_only` в блоке `disks` в resource `decort_kvmvm` в cloudapi/kvmvm |
|
||||
| BATF-1313 | Вычисляемое поле `read_only` в блоке `disks` в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm |
|
||||
| BATF-1313 | Вычисляемое поле `read_only` в блоке `disks` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm |
|
||||
| BATF-1303 | Опциональное поле `clock` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
|
||||
| BATF-1303 | Опциональное поле `clock` в resource `decort_kvmvm` в cloudapi/kvmvm |
|
||||
| BATF-1303 | Вычисляемое поле `clock` в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm |
|
||||
| BATF-1303 | Вычисляемое поле `clock` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm |
|
||||
| BATF-1297 | Datasource `decort_cb_kvmvm_cpu_alignment_profile` в cloudbroker/kvmvm |
|
||||
| BATF-1297 | Datasource `decort_kvmvm_cpu_alignment_profile` в cloudapi/kvmvm |
|
||||
| BATF-1297 | Опциональное поле `cpu_alignment_profile` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
|
||||
| BATF-1297 | Опциональное поле `cpu_alignment_profile` в resource `decort_kvmvm` в cloudapi/kvmvm |
|
||||
| BATF-1297 | Вычисляемое поле `cpu_alignment_profiles` в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm |
|
||||
| BATF-1297 | Вычисляемое поле `cpu_alignment_profiles` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm |
|
||||
| BATF-1335 | Вычисляемое поле `pool_name` в блоке `snapshots` в datasource `decort_kvmvm` в cloudapi/kvmvm и в datasource `decort_cb_kvmvm` в cloudbroker/kvmvm |
|
||||
| BATF-1332 | Вычисляемое поле `node_id` в datasources `decort_kvmvm` и `decort_kvmvm_list` в cloudapi/kvmvm |
|
||||
| BATF-1326 | Опциональное поле `enable_default_gateway` в блоке `network` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
|
||||
| BATF-1326 | Опциональное поле `enable_default_gateway` в блоке `network` в resource `decort_kvmvm` в cloudapi/kvmvm |
|
||||
| BATF-1326 | Вычисляемое поле `enable_default_gateway` в блоке `interfaces` в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` и resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
|
||||
| BATF-1326 | Вычисляемое поле `enable_default_gateway` в блоке `interfaces` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` и resource `decort_kvmvm` в cloudapi/kvmvm |
|
||||
| BATF-1342 | Вычисляемое поле `resized_online` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
|
||||
| BATF-1342 | Вычисляемое поле `resized_online` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm и в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm |
|
||||
| BATF-1343 | Вычисляемые поля `completed`, `cpu_set`, `daemon_addr`, `domain_name`, `domain_uuid`, `elapsed_time`, `gid`, `guid`, `migration_id`, `interfaces`, `log`, `new_disk_xmls`, `new_disks`, `old_disks`, `pid`, `source_node_id`, `source_numa_node_id`, `source_reserved_node_cpus`, `source_url`, `status`, `target_shadow_compute`, `target_node_id`, `target_url` и `vmlog_dir` в datasource `decort_cb_kvmvm_migrate_storage_info` в cloudbroker/kvmvm |
|
||||
| BATF-1421 | Опциональные поля `folder_id` и `include_descendants` в datasource `decort_kvmvm_list` в cloudapi/kvmvm и в datasource `decort_cb_kvmvm_list` в cloudbroker/kvmvm |
|
||||
| BATF-1421 | Вычисляемое поле `folder_id` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
|
||||
| BATF-1421 | Вычисляемое поле `folder_id` в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm и в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm |
|
||||
|
||||
#### node
|
||||
#### locations
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BATF-1306 | Вычисляемое поле `pci_devices` в datasource `decort_cb_node_list` в cloudbroker/node |
|
||||
| BATF-1294 | Вычисляемые поля `one_g_free`, `one_g_reserved`, `one_g_available`, `one_g_used`, `one_g_dpdk_reserved`, `two_m_free`, `two_m_reserved`, `two_m_available` и `two_m_used` в блоке `memory` в datasources `decort_cb_node` и `decort_cb_node_list` в cloudbroker/node |
|
||||
| BATF-1305 | Datasources `decort_cb_node_network_info` и `decort_cb_node_pci_devices` в cloudbroker/node |
|
||||
| BATF-1330 | Вычисляемые поля `reserved_cpu` и `reserved_ram` в datasources `decort_cb_node` и `decort_cb_node_list` в cloudbroker/node |
|
||||
| BATF-1336 | Вычисляемое поле `machine_id` в datasource `decort_cb_node_list` в cloudbroker/node |
|
||||
| BATF-1364 | Вычисляемое поле `ovs_dpdk_cores` в datasources `decort_cb_node` и `decort_cb_node_list` в cloudbroker/node |
|
||||
| BATF-1420 | Вычисляемое поле `vm_folders_enabled` в datasource `decort_locations_list` в cloudapi/locations |
|
||||
|
||||
#### rg
|
||||
#### vmfolder
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BATF-1337 | Опциональное поле `enable_default_gateway` в resource `decort_resgroup` в cloudapi/resgroup и в resource `decort_cb_rg` в cloudbroker/resgroup |
|
||||
| BATF-1309 | Вычисляемое поле `email` в блоке `acl` в datasources `decort_cb_rg_list` и `decort_cb_rg_list_deleted` в cloudbroker/rg |
|
||||
|
||||
#### sep
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| 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 |
|
||||
|
||||
| BATF-1430 | Resource `decort_vm_folder` в cloudapi/vmfolder |
|
||||
| BATF-1430 | Resource `decort_cb_vm_folder` в cloudbroker/vmfolder |
|
||||
| BATF-1430 | Datasource `decort_vm_folder` в cloudapi/vmfolder |
|
||||
| BATF-1430 | Datasource `decort_vm_folder_list` в cloudapi/vmfolder |
|
||||
| BATF-1430 | Datasource `decort_cb_vm_folder` в cloudbroker/vmfolder |
|
||||
| BATF-1430 | Datasource `decort_cb_vm_folder_list` в cloudbroker/vmfolder |
|
||||
|
||||
### Удалено
|
||||
|
||||
#### grid
|
||||
#### SDN default security policy
|
||||
| Идентификатор<br>задачи | Описание |
|
||||
| --- | --- |
|
||||
| BATF-1311 | Вычисляемые поля `ckey` и `meta` в datasource `decort_cb_grid` в cloudbroker/grid |
|
||||
| BATF-1333 | Вычисляемые поля `networks`, `cpu_allocation_ratio_vm`, `cpu_allocation_ratio` и `custom_backup_path` в datasource `decort_cb_grid_get_settings` в cloudbroker/grid |
|
||||
|
||||
#### kvmvm
|
||||
| Идентификатор<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 |
|
||||
| BATF-1458 | Datasource `decort_sdn_default_security_policy_list` из sdn/default_security_policy |
|
||||
|
||||
2
Makefile
2
Makefile
@@ -7,7 +7,7 @@ ZIPDIR = ./zip
|
||||
BINARY=${NAME}
|
||||
WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH}
|
||||
MAINPATH = ./cmd/decort/
|
||||
VERSION=4.13.0
|
||||
VERSION=4.13.1
|
||||
OS_ARCH=$(shell go env GOHOSTOS)_$(shell go env GOHOSTARCH)
|
||||
|
||||
FILES = ${BINARY}_${VERSION}_darwin_amd64\
|
||||
|
||||
@@ -56,6 +56,7 @@ Terraform provider для платформы Digital Energy Cloud Orchestration
|
||||
- Работа с snapshots,
|
||||
- Работа с trunk,
|
||||
- Работа с VINS,
|
||||
- Работа с VM folders,
|
||||
- Работа с SEPs,
|
||||
- Работа с Zone.
|
||||
|
||||
@@ -79,6 +80,7 @@ Terraform provider для платформы Digital Energy Cloud Orchestration
|
||||
- Работа с security groups,
|
||||
- Работа с trunk,
|
||||
- Работа с VINS,
|
||||
- Работа с VM folders,
|
||||
- Работа с Zone.
|
||||
|
||||
- Режим SDN:
|
||||
|
||||
@@ -36,6 +36,7 @@ description: |-
|
||||
- `reserved_cpu` (Number)
|
||||
- `reserved_ram` (Number)
|
||||
- `sdn_support` (Boolean)
|
||||
- `vm_folders_enabled` (Boolean)
|
||||
- `zero_access_enabled` (Boolean)
|
||||
|
||||
<a id="nestedblock--timeouts"></a>
|
||||
|
||||
@@ -57,6 +57,7 @@ Read-Only:
|
||||
- `reserved_ram` (Number)
|
||||
- `resources` (List of Object) (see [below for nested schema](#nestedobjatt--items--resources))
|
||||
- `sdn_support` (Boolean)
|
||||
- `vm_folders_enabled` (Boolean)
|
||||
- `zero_access_enabled` (Boolean)
|
||||
|
||||
<a id="nestedobjatt--items--resources"></a>
|
||||
|
||||
@@ -57,6 +57,7 @@ description: |-
|
||||
- `devices` (String)
|
||||
- `disks` (List of Object) (see [below for nested schema](#nestedatt--disks))
|
||||
- `driver` (String)
|
||||
- `folder_id` (Number)
|
||||
- `gid` (Number)
|
||||
- `guid` (Number)
|
||||
- `hot_resize` (Boolean)
|
||||
|
||||
@@ -22,7 +22,9 @@ description: |-
|
||||
- `cd_image_id` (Number) Find by CD image ID
|
||||
- `extnet_id` (Number) Find by Extnet ID
|
||||
- `extnet_name` (String) Find by Extnet name
|
||||
- `folder_id` (Number) Find by VM folder ID
|
||||
- `ignore_k8s` (Boolean) If set to true, ignores any VMs associated with any k8s cluster
|
||||
- `include_descendants` (Boolean) Include computes from descendant folders
|
||||
- `includedeleted` (Boolean)
|
||||
- `ip_address` (String) Find by IP address
|
||||
- `name` (String) Find by name
|
||||
@@ -90,6 +92,7 @@ Read-Only:
|
||||
- `devices` (String)
|
||||
- `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks))
|
||||
- `driver` (String)
|
||||
- `folder_id` (Number)
|
||||
- `gid` (Number)
|
||||
- `guid` (Number)
|
||||
- `hot_resize` (Boolean)
|
||||
|
||||
@@ -84,6 +84,7 @@ Read-Only:
|
||||
- `devices` (String)
|
||||
- `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks))
|
||||
- `driver` (String)
|
||||
- `folder_id` (Number)
|
||||
- `gid` (Number)
|
||||
- `guid` (Number)
|
||||
- `hot_resize` (Boolean)
|
||||
|
||||
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)
|
||||
- `disks` (List of Object) (see [below for nested schema](#nestedatt--disks))
|
||||
- `driver` (String)
|
||||
- `folder_id` (Number)
|
||||
- `gid` (Number)
|
||||
- `guid` (Number)
|
||||
- `hot_resize` (Boolean)
|
||||
|
||||
@@ -21,7 +21,9 @@ description: |-
|
||||
- `by_id` (Number) Find by ID
|
||||
- `extnet_id` (Number) Find by Extnet ID
|
||||
- `extnet_name` (String) Find by Extnet name
|
||||
- `folder_id` (Number) Find by VM folder ID
|
||||
- `ignore_k8s` (Boolean) If set to true, ignores any VMs associated with any k8s cluster
|
||||
- `include_descendants` (Boolean) Include computes from descendant folders
|
||||
- `includedeleted` (Boolean)
|
||||
- `ip_address` (String) Find by IP address
|
||||
- `name` (String) Find by name
|
||||
@@ -87,6 +89,7 @@ Read-Only:
|
||||
- `devices` (String)
|
||||
- `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks))
|
||||
- `driver` (String)
|
||||
- `folder_id` (Number)
|
||||
- `gid` (Number)
|
||||
- `guid` (Number)
|
||||
- `hot_resize` (Boolean)
|
||||
|
||||
@@ -84,6 +84,7 @@ Read-Only:
|
||||
- `devices` (String)
|
||||
- `disks` (List of Object) (see [below for nested schema](#nestedobjatt--items--disks))
|
||||
- `driver` (String)
|
||||
- `folder_id` (Number)
|
||||
- `gid` (Number)
|
||||
- `guid` (Number)
|
||||
- `hot_resize` (Boolean)
|
||||
|
||||
@@ -58,4 +58,5 @@ Read-Only:
|
||||
- `name` (String)
|
||||
- `network_modes` (List of String)
|
||||
- `sdn_support` (Boolean)
|
||||
- `vm_folders_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)
|
||||
- `devices` (String)
|
||||
- `driver` (String)
|
||||
- `folder_id` (Number)
|
||||
- `gid` (Number)
|
||||
- `guid` (Number)
|
||||
- `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)
|
||||
- `devices` (String)
|
||||
- `driver` (String)
|
||||
- `folder_id` (Number)
|
||||
- `gid` (Number)
|
||||
- `guid` (Number)
|
||||
- `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/sirupsen/logrus v1.9.0
|
||||
golang.org/x/net v0.44.0
|
||||
repository.basistech.ru/BASIS/decort-golang-sdk v1.15.7
|
||||
repository.basistech.ru/BASIS/decort-golang-sdk v1.15.10
|
||||
)
|
||||
|
||||
require (
|
||||
|
||||
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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
repository.basistech.ru/BASIS/decort-golang-sdk v1.15.7 h1:/BCkmR2Dvyz9Cc08I2sPHdLuaCaQbBJWFximQMNpmHE=
|
||||
repository.basistech.ru/BASIS/decort-golang-sdk v1.15.7/go.mod h1:S/f7GxwWcE88eFpORV+I9xqEf8zDW5srQHpG2XQCLZM=
|
||||
repository.basistech.ru/BASIS/decort-golang-sdk v1.15.10 h1:ejQjPFN7Z4UaKvzO0kMPbMUlabIW6qImtPgWnDgQJhg=
|
||||
repository.basistech.ru/BASIS/decort-golang-sdk v1.15.10/go.mod h1:S/f7GxwWcE88eFpORV+I9xqEf8zDW5srQHpG2XQCLZM=
|
||||
|
||||
@@ -42,9 +42,9 @@ import (
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/trunk"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vfpool"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vins"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vmfolder"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/zone"
|
||||
accessgroup "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/access_group"
|
||||
defaultsecuritypolicy "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/default_security_policy"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/hypervisors"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/logicalports"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/netobjgroups"
|
||||
@@ -72,6 +72,7 @@ import (
|
||||
cb_user "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/user"
|
||||
cb_vfpool "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vfpool"
|
||||
cb_vins "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vins"
|
||||
cb_vmfolder "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vmfolder"
|
||||
cb_zone "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/zone"
|
||||
)
|
||||
|
||||
@@ -176,6 +177,8 @@ func newDataSourcesMap() map[string]*schema.Resource {
|
||||
"decort_security_group_list": secgroup.DataSourceSecurityGroupList(),
|
||||
"decort_trunk": trunk.DataSourceTrunk(),
|
||||
"decort_trunk_list": trunk.DataSourceTrunkList(),
|
||||
"decort_vm_folder": vmfolder.DataSourceVMFolder(),
|
||||
"decort_vm_folder_list": vmfolder.DataSourceVMFolderList(),
|
||||
"decort_zone": zone.DataSourceZone(),
|
||||
"decort_zone_list": zone.DataSourceZoneList(),
|
||||
|
||||
@@ -291,6 +294,8 @@ func newDataSourcesMap() map[string]*schema.Resource {
|
||||
"decort_cb_vins_nat_rule_list": cb_vins.DataSourceVinsNatRuleList(),
|
||||
"decort_cb_vins_static_route": cb_vins.DataSourceStaticRoute(),
|
||||
"decort_cb_vins_static_route_list": cb_vins.DataSourceStaticRouteList(),
|
||||
"decort_cb_vm_folder": cb_vmfolder.DataSourceVMFolder(),
|
||||
"decort_cb_vm_folder_list": cb_vmfolder.DataSourceVMFolderList(),
|
||||
"decort_cb_k8ci": cb_k8ci.DataSourceK8CI(),
|
||||
"decort_cb_k8ci_list": cb_k8ci.DataSourceK8CIList(),
|
||||
"decort_cb_k8ci_list_deleted": cb_k8ci.DataSourceK8CIListDeleted(),
|
||||
@@ -310,7 +315,6 @@ func newDataSourcesMap() map[string]*schema.Resource {
|
||||
"decort_sdn_access_group": accessgroup.DataSourceAccessGroup(),
|
||||
"decort_sdn_access_group_list": accessgroup.DataSourceAccessGroupList(),
|
||||
"decort_sdn_access_group_user_list": accessgroup.DataSourceAccessGroupUserList(),
|
||||
"decort_sdn_default_security_policy_list": defaultsecuritypolicy.DataSourceDefaultSecurityPolicyList(),
|
||||
"decort_sdn_segment": segments.DataSourceSegment(),
|
||||
"decort_sdn_segment_list": segments.DataSourceSegmentList(),
|
||||
|
||||
|
||||
@@ -35,6 +35,7 @@ import (
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/secgroup"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/snapshot"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vins"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vmfolder"
|
||||
accessgroup "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/access_group"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/hypervisors"
|
||||
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/logicalports"
|
||||
@@ -60,6 +61,7 @@ import (
|
||||
cb_user "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/user"
|
||||
cb_vfpool "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vfpool"
|
||||
cb_vins "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vins"
|
||||
cb_vmfolder "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vmfolder"
|
||||
cb_zone "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/zone"
|
||||
)
|
||||
|
||||
@@ -91,6 +93,7 @@ func newResourcesMap() map[string]*schema.Resource {
|
||||
"decort_flipgroup": flipgroup.ResourceFlipgroup(),
|
||||
"decort_vins_static_route": vins.ResourceStaticRoute(),
|
||||
"decort_security_group": secgroup.ResourceSecurityGroup(),
|
||||
"decort_vm_folder": vmfolder.ResourceVMFolder(),
|
||||
|
||||
"decort_cb_account": cb_account.ResourceAccount(),
|
||||
"decort_cb_dpdknet": cb_dpdknet.ResourceDPDKNet(),
|
||||
@@ -126,6 +129,7 @@ func newResourcesMap() map[string]*schema.Resource {
|
||||
"decort_cb_trunk": cb_trunk.ResourceTrunk(),
|
||||
"decort_cb_user": cb_user.ResourceUser(),
|
||||
"decort_cb_vfpool": cb_vfpool.ResourceVFPool(),
|
||||
"decort_cb_vm_folder": cb_vmfolder.ResourceVMFolder(),
|
||||
"decort_cb_zone": cb_zone.ResourceZone(),
|
||||
|
||||
"decort_sdn_segment": segments.ResourceSegment(),
|
||||
|
||||
@@ -1251,6 +1251,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"folder_id": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"weight": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
|
||||
@@ -477,6 +477,10 @@ func itemComputeSchemaMake() map[string]*schema.Schema {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"folder_id": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"weight": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
@@ -564,6 +568,16 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
|
||||
Optional: true,
|
||||
Description: "Zone ID",
|
||||
},
|
||||
"folder_id": {
|
||||
Type: schema.TypeInt,
|
||||
Optional: true,
|
||||
Description: "Find by VM folder ID",
|
||||
},
|
||||
"include_descendants": {
|
||||
Type: schema.TypeBool,
|
||||
Optional: true,
|
||||
Description: "Include computes from descendant folders",
|
||||
},
|
||||
"items": {
|
||||
Type: schema.TypeList,
|
||||
Computed: true,
|
||||
|
||||
@@ -258,6 +258,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
|
||||
"hot_resize": compute.HotResize,
|
||||
"network_interface_naming": compute.NetworkInterfaceNaming,
|
||||
"zone_id": compute.ZoneID,
|
||||
"folder_id": compute.FolderID,
|
||||
"weight": compute.Weight,
|
||||
}
|
||||
res = append(res, temp)
|
||||
@@ -514,6 +515,7 @@ func flattenCompute(d *schema.ResourceData, computeRec compute.RecordCompute, pc
|
||||
d.Set("hot_resize", computeRec.HotResize)
|
||||
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
|
||||
d.Set("zone_id", computeRec.ZoneID)
|
||||
d.Set("folder_id", computeRec.FolderID)
|
||||
d.Set("loader_meta_iso", flattenLoaderMetaIso(computeRec.LoaderMetaIso))
|
||||
d.Set("cpu_pin", computeRec.CPUPin)
|
||||
d.Set("cpu_alignment_profile", computeRec.CPUAlignmentProfile.Name)
|
||||
@@ -817,6 +819,7 @@ func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute
|
||||
d.Set("hot_resize", computeRec.HotResize)
|
||||
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
|
||||
d.Set("zone_id", computeRec.ZoneID)
|
||||
d.Set("folder_id", computeRec.FolderID)
|
||||
d.Set("loader_meta_iso", flattenLoaderMetaIso(computeRec.LoaderMetaIso))
|
||||
d.Set("os_version", computeRec.OSVersion)
|
||||
d.Set("cpu_alignment_profiles", flattenCPUAlignmentProfile(computeRec.CPUAlignmentProfile))
|
||||
|
||||
@@ -3029,6 +3029,10 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
"folder_id": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"vgpus": {
|
||||
Type: schema.TypeList,
|
||||
Computed: true,
|
||||
|
||||
@@ -89,6 +89,12 @@ func utilityDataComputeListCheckPresence(ctx context.Context, d *schema.Resource
|
||||
if zoneID, ok := d.GetOk("zone_id"); ok {
|
||||
req.ZoneID = uint64(zoneID.(int))
|
||||
}
|
||||
if folderID, ok := d.GetOk("folder_id"); ok {
|
||||
req.FolderID = uint64(folderID.(int))
|
||||
}
|
||||
if includeDescendants, ok := d.GetOkExists("include_descendants"); ok {
|
||||
req.IncludeDescendants = includeDescendants.(bool)
|
||||
}
|
||||
|
||||
listComputes, err := c.CloudAPI().Compute().List(ctx, req)
|
||||
if err != nil {
|
||||
|
||||
@@ -60,6 +60,7 @@ func flattenLocationsList(ll *locations.ListLocations) []map[string]interface{}
|
||||
"sdn_support": l.SDNSupport,
|
||||
"zero_access_enabled": l.ZeroAccessEnabled,
|
||||
"bro_enabled": l.BROEnabled,
|
||||
"vm_folders_enabled": l.VMFoldersEnabled,
|
||||
}
|
||||
res = append(res, temp)
|
||||
}
|
||||
@@ -193,6 +194,10 @@ func dataSourceLocationsListSchemaMake() map[string]*schema.Schema {
|
||||
Type: schema.TypeBool,
|
||||
Computed: true,
|
||||
},
|
||||
"vm_folders_enabled": {
|
||||
Type: schema.TypeBool,
|
||||
Computed: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
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("sdn_support", grid.SDNSupport)
|
||||
d.Set("zero_access_enabled", grid.ZeroAccessEnabled)
|
||||
d.Set("vm_folders_enabled", grid.VMFoldersEnabled)
|
||||
}
|
||||
|
||||
func flattenGridList(gl *grid.ListGrids) []map[string]interface{} {
|
||||
@@ -41,6 +42,7 @@ func flattenGridList(gl *grid.ListGrids) []map[string]interface{} {
|
||||
"sdn_support": item.SDNSupport,
|
||||
"zero_access_enabled": item.ZeroAccessEnabled,
|
||||
"bro_enabled": item.BROEnabled,
|
||||
"vm_folders_enabled": item.VMFoldersEnabled,
|
||||
}
|
||||
res = append(res, temp)
|
||||
}
|
||||
|
||||
@@ -62,6 +62,10 @@ func dataSourceGetGridSchemaMake() map[string]*schema.Schema {
|
||||
Type: schema.TypeBool,
|
||||
Computed: true,
|
||||
},
|
||||
"vm_folders_enabled": {
|
||||
Type: schema.TypeBool,
|
||||
Computed: true,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -278,6 +282,10 @@ func dataSourceGridListSchemaMake() map[string]*schema.Schema {
|
||||
Type: schema.TypeBool,
|
||||
Computed: true,
|
||||
},
|
||||
"vm_folders_enabled": {
|
||||
Type: schema.TypeBool,
|
||||
Computed: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -112,6 +112,7 @@ func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute, p
|
||||
d.Set("hot_resize", computeRec.HotResize)
|
||||
d.Set("network_interface_naming", computeRec.NetworkInterfaceNaming)
|
||||
d.Set("zone_id", computeRec.ZoneID)
|
||||
d.Set("folder_id", computeRec.FolderID)
|
||||
d.Set("os_version", computeRec.OSVersion)
|
||||
d.Set("cpu_pin", computeRec.CPUPin)
|
||||
d.Set("cpu_alignment_profile", computeRec.CPUAlignmentProfile.Name)
|
||||
@@ -436,6 +437,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
|
||||
"hot_resize": computeItem.HotResize,
|
||||
"network_interface_naming": computeItem.NetworkInterfaceNaming,
|
||||
"zone_id": computeItem.ZoneID,
|
||||
"folder_id": computeItem.FolderID,
|
||||
"weight": computeItem.Weight,
|
||||
}
|
||||
res = append(res, temp)
|
||||
@@ -527,6 +529,7 @@ func flattenDeletedComputeList(computes *compute.ListDeletedComputes) []map[stri
|
||||
"hot_resize": computeItem.HotResize,
|
||||
"network_interface_naming": computeItem.NetworkInterfaceNaming,
|
||||
"zone_id": computeItem.ZoneID,
|
||||
"folder_id": computeItem.FolderID,
|
||||
"weight": computeItem.Weight,
|
||||
}
|
||||
res = append(res, temp)
|
||||
@@ -877,6 +880,7 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
|
||||
d.Set("hot_resize", compFacts.HotResize)
|
||||
d.Set("network_interface_naming", compFacts.NetworkInterfaceNaming)
|
||||
d.Set("zone_id", compFacts.ZoneID)
|
||||
d.Set("folder_id", compFacts.FolderID)
|
||||
d.Set("loader_meta_iso", flattenLoaderMetaIso(compFacts.LoaderMetaIso))
|
||||
d.Set("os_version", compFacts.OSVersion)
|
||||
d.Set("weight", compFacts.Weight)
|
||||
|
||||
@@ -1233,6 +1233,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"folder_id": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"weight": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
@@ -1330,6 +1334,16 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
|
||||
Optional: true,
|
||||
Description: "Zone ID",
|
||||
},
|
||||
"folder_id": {
|
||||
Type: schema.TypeInt,
|
||||
Optional: true,
|
||||
Description: "Find by VM folder ID",
|
||||
},
|
||||
"include_descendants": {
|
||||
Type: schema.TypeBool,
|
||||
Optional: true,
|
||||
Description: "Include computes from descendant folders",
|
||||
},
|
||||
"ignore_k8s": {
|
||||
Type: schema.TypeBool,
|
||||
Optional: true,
|
||||
@@ -1837,6 +1851,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"folder_id": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"weight": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
@@ -2396,6 +2414,10 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"folder_id": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"weight": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
@@ -4929,6 +4951,10 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
|
||||
Type: schema.TypeString,
|
||||
Computed: true,
|
||||
},
|
||||
"folder_id": {
|
||||
Type: schema.TypeInt,
|
||||
Computed: true,
|
||||
},
|
||||
"vgpus": {
|
||||
Type: schema.TypeList,
|
||||
Computed: true,
|
||||
|
||||
@@ -99,6 +99,12 @@ func utilityDataComputeListCheckPresence(ctx context.Context, d *schema.Resource
|
||||
if zoneID, ok := d.GetOk("zone_id"); ok {
|
||||
req.ZoneID = uint64(zoneID.(int))
|
||||
}
|
||||
if folderID, ok := d.GetOk("folder_id"); ok {
|
||||
req.FolderID = uint64(folderID.(int))
|
||||
}
|
||||
if includeDescendants, ok := d.GetOkExists("include_descendants"); ok {
|
||||
req.IncludeDescendants = includeDescendants.(bool)
|
||||
}
|
||||
|
||||
listComputes, err := c.CloudBroker().Compute().List(ctx, req)
|
||||
if err != nil {
|
||||
|
||||
@@ -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_static_route
|
||||
- vins_static_route_list
|
||||
- vm_folder
|
||||
- vm_folder_list
|
||||
- zone
|
||||
- zone_list
|
||||
- resources:
|
||||
@@ -136,6 +138,7 @@
|
||||
- snapshot
|
||||
- vins
|
||||
- vins_static_route
|
||||
- vm_folder
|
||||
- cloudbroker:
|
||||
- data:
|
||||
- cb_account
|
||||
@@ -261,6 +264,8 @@
|
||||
- cb_vins_nat_rule_list
|
||||
- cb_vins_static_route
|
||||
- cb_vins_static_route_list
|
||||
- cb_vm_folder
|
||||
- cb_vm_folder_list
|
||||
- cb_zone
|
||||
- cb_zone_list
|
||||
- cb_zone_cpu_alignment_profile
|
||||
@@ -300,6 +305,7 @@
|
||||
- cb_vins
|
||||
- cb_vins_static_route
|
||||
- cb_virtual_image
|
||||
- cb_vm_folder
|
||||
- decort_cb_multi_image
|
||||
- cb_zone
|
||||
- sdn
|
||||
@@ -307,7 +313,6 @@
|
||||
- sdn_access_group
|
||||
- sdn_access_group_list
|
||||
- sdn_access_group_user_list
|
||||
- sdn_default_security_policy_list
|
||||
- sdn_segment
|
||||
- sdn_segment_list
|
||||
- sdn_logical_port
|
||||
|
||||
@@ -108,6 +108,16 @@ data "decort_kvmvm_list" "compute_list" {
|
||||
#значение по умолчанию - 0
|
||||
#zone_id = 11
|
||||
|
||||
#фильтр по id папки ВМ
|
||||
#опциональный параметр
|
||||
#тип - целое число
|
||||
#folder_id = 100
|
||||
|
||||
#флаг включения в результат ВМ из дочерних папок
|
||||
#опциональный параметр
|
||||
#тип - булев
|
||||
#include_descendants = true
|
||||
|
||||
}
|
||||
|
||||
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
|
||||
#zone_id = 11
|
||||
|
||||
#фильтр по id папки ВМ
|
||||
#опциональный параметр
|
||||
#тип - целое число
|
||||
#folder_id = 100
|
||||
|
||||
#флаг включения в результат ВМ из дочерних папок
|
||||
#опциональный параметр
|
||||
#тип - булев
|
||||
#include_descendants = true
|
||||
|
||||
}
|
||||
|
||||
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