4.13.1
This commit is contained in:
2026-10-30 16:23:20 +03:00
parent 2b229a84fb
commit cd3310836b
63 changed files with 2375 additions and 1029 deletions

View File

@@ -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 |

View File

@@ -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\

View File

@@ -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:

View File

@@ -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>

View File

@@ -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>

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View 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)

View 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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -58,4 +58,5 @@ Read-Only:
- `name` (String)
- `network_modes` (List of String)
- `sdn_support` (Boolean)
- `vm_folders_enabled` (Boolean)
- `zero_access_enabled` (Boolean)

View File

@@ -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)

View 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)

View 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)

View File

@@ -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.

View 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)

View File

@@ -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.

View 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
View File

@@ -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
View File

@@ -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=

View File

@@ -42,9 +42,9 @@ import (
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/trunk"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vfpool"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vins"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/vmfolder"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudapi/zone"
accessgroup "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/access_group"
defaultsecuritypolicy "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/default_security_policy"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/hypervisors"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/logicalports"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/sdn/netobjgroups"
@@ -72,6 +72,7 @@ import (
cb_user "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/user"
cb_vfpool "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vfpool"
cb_vins "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vins"
cb_vmfolder "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/vmfolder"
cb_zone "repository.basistech.ru/BASIS/terraform-provider-decort/internal/service/cloudbroker/zone"
)
@@ -176,6 +177,8 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_security_group_list": secgroup.DataSourceSecurityGroupList(),
"decort_trunk": trunk.DataSourceTrunk(),
"decort_trunk_list": trunk.DataSourceTrunkList(),
"decort_vm_folder": vmfolder.DataSourceVMFolder(),
"decort_vm_folder_list": vmfolder.DataSourceVMFolderList(),
"decort_zone": zone.DataSourceZone(),
"decort_zone_list": zone.DataSourceZoneList(),
@@ -230,7 +233,7 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_cb_kvmvm_snapshot_usage": cb_kvmvm.DataSourceComputeSnapshotUsage(),
"decort_cb_kvmvm_user_list": cb_kvmvm.DataSourceComputeUserList(),
"decort_cb_kvmvm_vgpu_list": cb_kvmvm.DataSourceComputeVGPUList(),
"decort_cb_kvmvm_cpu_alignment_profile": cb_kvmvm.DataSourceComputeCPUAlignmentProfile(),
"decort_cb_kvmvm_cpu_alignment_profile": cb_kvmvm.DataSourceComputeCPUAlignmentProfile(),
"decort_cb_node": cb_node.DataSourceNode(),
"decort_cb_node_list": cb_node.DataSourceNodeList(),
"decort_cb_node_network_info": cb_node.DataSourceNodeNetworkInfo(),
@@ -291,6 +294,8 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_cb_vins_nat_rule_list": cb_vins.DataSourceVinsNatRuleList(),
"decort_cb_vins_static_route": cb_vins.DataSourceStaticRoute(),
"decort_cb_vins_static_route_list": cb_vins.DataSourceStaticRouteList(),
"decort_cb_vm_folder": cb_vmfolder.DataSourceVMFolder(),
"decort_cb_vm_folder_list": cb_vmfolder.DataSourceVMFolderList(),
"decort_cb_k8ci": cb_k8ci.DataSourceK8CI(),
"decort_cb_k8ci_list": cb_k8ci.DataSourceK8CIList(),
"decort_cb_k8ci_list_deleted": cb_k8ci.DataSourceK8CIListDeleted(),
@@ -301,18 +306,17 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_cb_k8s_wg_cloud_init": cb_k8s.DataSourceK8sWgCloudInit(),
"decort_cb_k8s_wg_list": cb_k8s.DataSourceK8sWgList(),
"decort_cb_k8s_computes": cb_k8s.DataSourceK8sComputes(),
"decort_cb_zone": cb_zone.DataSourceZone(),
"decort_cb_zone_list": cb_zone.DataSourceZoneList(),
"decort_cb_zone_cpu_alignment_profile": cb_zone.DataSourceZoneCPUAlignmentProfile(),
"decort_cb_zone_cpu_alignment_profile_list": cb_zone.DataSourceZoneCPUAlignmentProfileList(),
"decort_cb_zone_cpu_alignment_profile_test": cb_zone.DataSourceZoneCPUAlignmentProfileTest(),
"decort_cb_zone": cb_zone.DataSourceZone(),
"decort_cb_zone_list": cb_zone.DataSourceZoneList(),
"decort_cb_zone_cpu_alignment_profile": cb_zone.DataSourceZoneCPUAlignmentProfile(),
"decort_cb_zone_cpu_alignment_profile_list": cb_zone.DataSourceZoneCPUAlignmentProfileList(),
"decort_cb_zone_cpu_alignment_profile_test": cb_zone.DataSourceZoneCPUAlignmentProfileTest(),
"decort_sdn_access_group": accessgroup.DataSourceAccessGroup(),
"decort_sdn_access_group_list": accessgroup.DataSourceAccessGroupList(),
"decort_sdn_access_group_user_list": accessgroup.DataSourceAccessGroupUserList(),
"decort_sdn_default_security_policy_list": defaultsecuritypolicy.DataSourceDefaultSecurityPolicyList(),
"decort_sdn_segment": segments.DataSourceSegment(),
"decort_sdn_segment_list": segments.DataSourceSegmentList(),
"decort_sdn_access_group": accessgroup.DataSourceAccessGroup(),
"decort_sdn_access_group_list": accessgroup.DataSourceAccessGroupList(),
"decort_sdn_access_group_user_list": accessgroup.DataSourceAccessGroupUserList(),
"decort_sdn_segment": segments.DataSourceSegment(),
"decort_sdn_segment_list": segments.DataSourceSegmentList(),
"decort_sdn_hypervisor": hypervisors.DataSourceHypervisor(),
"decort_sdn_hypervisor_list": hypervisors.DataSourceHypervisorList(),

View File

@@ -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(),

View File

@@ -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,

View File

@@ -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,

View File

@@ -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))

View File

@@ -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,

View File

@@ -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 {

View File

@@ -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,
},
},
},
},

View 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(),
}
}

View 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(),
}
}

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

View 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(),
}
}

View 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)
}

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

View File

@@ -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)
}

View File

@@ -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,
},
},
},
},

View File

@@ -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)

View File

@@ -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,

View File

@@ -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 {

View File

@@ -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(),
}
}

View File

@@ -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(),
}
}

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

View 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(),
}
}

View 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",
},
}
}

View 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)
}

View 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/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
}

View File

@@ -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(),
}
}

View File

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

View File

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

View File

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

View File

@@ -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

View File

@@ -107,6 +107,16 @@ data "decort_kvmvm_list" "compute_list" {
#тип - целое число
#значение по умолчанию - 0
#zone_id = 11
#фильтр по id папки ВМ
#опциональный параметр
#тип - целое число
#folder_id = 100
#флаг включения в результат ВМ из дочерних папок
#опциональный параметр
#тип - булев
#include_descendants = true
}

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

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

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

View File

@@ -122,6 +122,16 @@ data "decort_cb_kvmvm_list" "compute_list" {
#значение по умолчанию - 0
#zone_id = 11
#фильтр по id папки ВМ
#опциональный параметр
#тип - целое число
#folder_id = 100
#флаг включения в результат ВМ из дочерних папок
#опциональный параметр
#тип - булев
#include_descendants = true
}
output "output" {

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

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

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

View File

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