Compare commits

...

2 Commits

Author SHA1 Message Date
89c77ddcbe git test 2026-06-19 17:45:18 +03:00
c00c608ce9 git test 2026-06-19 17:43:58 +03:00
78 changed files with 2785 additions and 396 deletions

View File

@@ -1,241 +1,93 @@
## Version 4.12.0 ## Version 4.13.0
### Добавлено ### Добавлено
#### account
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1244 | Вычисляемое поле `updated_by` в datasources `decort_account_list` и `decort_account_deleted_list` в cloudapi/account |
| BATF-1232 | Вычисляемое поле `deleted_by` в datasources `decort_account_list` и `decort_account_deleted_list` в cloudapi/account |
| BATF-1226 | Вычисляемое поле `updated_by` в resource `decort_cb_account` и datasources `decort_cb_account`, `decort_cb_account_list`, `decort_cb_account_list_deleted` и `decort_cb_account_computes_list` в cloudbroker/account |
| BATF-1226 | Вычисляемое поле `updated_by` в resource `decort_account` и datasource `decort_account` в cloudapi/account |
#### disks
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1231 | Опциональные поля `rg_id` и `compute_id` в datasource `decort_cb_disk_list` в cloudbroker/disks |
| BATF-1231 | Опциональные поля `rg_id` и `compute_id` в datasource `decort_disk_list` в cloudapi/disks |
| BATF-1224 | Опциональное поле `block_size` в resource `decort_cb_disk` в cloudbroker/disks |
| BATF-1224 | Вычисляемое поле `block_size` в datasources `decort_cb_disk`, `decort_cb_disk_list`, `decort_cb_disk_list_deleted` и `decort_cb_disk_list_unattached` в cloudbroker/disks |
| BATF-1224 | Вычисляемое поле `block_size` в datasources `decort_disk`, `decort_disk_list`, `decort_disk_list_deleted` и `decort_disk_list_unattached` и в resource `decort_disk` в cloudapi/disks |
| BATF-1247 | Вычисляемое поле `to_clean` в datasource `decort_disk_list_unattached` в cloudapi/disks и в datasource `decort_cb_disk_list_unattached` в cloudbroker/disks |
| BATF-1245 | Вычисляемое поле `independent` в datasources `decort_disk`, `decort_disk_list` и `decort_disk_list_deleted` в cloudapi/disks и в datasources `decort_cb_disk`, `decort_cb_disk_list` и `decort_cb_disk_list_deleted` в cloudbroker/disks |
| BATF-1245 | Вычисляемое поле `independent` в resource `decort_disk` в cloudapi/disks и в resource `decort_cb_disk` в cloudbroker/disks |
| BATF-1252 | Вычисляемое поле `present_to` в datasource `decort_disk_list_unattached` в cloudapi/disks |
| BATF-1252 | Вычисляемое поле `provision` в datasources `decort_disk`, `decort_disk_list`, `decort_disk_list_deleted` и `decort_disk_list_unattached` и в resource `decort_disk` в cloudapi/disks |
| BATF-1252 | Вычисляемое поле `provision` в datasources `decort_cb_disk`, `decort_cb_disk_list`, `decort_cb_disk_list_deleted` и `decort_cb_disk_list_unattached` и в resource `decort_cb_disk` в cloudbroker/disks |
#### grid #### grid
| Идентификатор<br>задачи | Описание | | Идентификатор<br>задачи | Описание |
| --- | --- | | --- | --- |
| BATF-1265 | Вычисляемое поле `zero_access_enabled` в datasource `decort_cb_grid_list` в cloudbroker/grid | | BATF-1311 | Вычисляемые поля `cpu_allocation_ratio_vm`, `cpu_allocation_ratio`, `custom_backup_path`, `interface_generation_scheme`, `mac_address_prefix`, `node_self_stop_timer_uptime_monitor` и `node_self_stop_uptime_monitor` в datasource `decort_cb_grid_get_settings` в cloudbroker/grid |
| BATF-1311 | Вычисляемое поле `zero_access_enabled` в datasource `decort_cb_grid` в cloudbroker/grid |
| BATF-1311 | Вычисляемое поле `policies` в datasource `decort_cb_grid_get_consumption` в cloudbroker/grid |
#### extnet
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1302 | Вычисляемое поле `free_ips` в datasource `decort_extnet_list` в cloudapi/extnet |
#### node
| Идентификатор<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 |
#### kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| 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 |
#### zone
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1295 | Опциональное поле `hypervisor_similarity_in_percentage` и вычисляемое поле `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 |
### Изменено
#### image #### image
| Идентификатор<br>задачи | Описание | | Идентификатор<br>задачи | Описание |
| --- | --- | | --- | --- |
| BATF-1245 | Вычисляемое поле `independent` в datasource `decort_image` в cloudapi/image и в datasources `decort_cb_image` и `decort_cb_image_list` в cloudbroker/image | | BATF-1304 | Тип опционального поля `type_image` с `string` на `[]string` в datasource `decort_image_list` в cloudapi/image |
| BATF-1245 | Вычисляемое поле `independent` в resources `decort_image` и `decort_image_virtual` в cloudapi/image и в resources `decort_cb_image` и `decort_cb_virtual_image` в cloudbroker/image | | BATF-1304 | Тип опционального поля `type_image` с `string` на `[]string` в datasource `decort_cb_image_list` в cloudbroker/image |
| BATF-1256 | Вычисляемое поле `links_to` в datasources `decort_image` и `decort_image_list` и в resources `decort_image`, `decort_image_from_blank_compute` и `decort_image_from_platform_disk` в cloudapi/image |
| BATF-1256 | Вычисляемое поле `links_to` в datasources `decort_cb_image` и `decort_cb_image_list` и в resources `decort_cb_image`, `decort_cb_image_from_blank_compute` и `decort_cb_image_from_platform_disk` в cloudbroker/image |
| BATF-1255 | Resource `decort_cb_multi_image` в cloudbroker/image |
| BATF-1262 | Обязательное поле `storage_policy_id` в resources `decort_image_from_blank_compute` в cloudapi/image и в `decort_cb_image_from_blank_compute` в cloudbroker/image |
#### kvmvm #### kvmvm
| Идентификатор<br>задачи | Описание | | Идентификатор<br>задачи | Описание |
| --- | --- | | --- | --- |
| BATF-1251 | Вычисляемое поле `provision` в блоке `disks` в resource `decort_cb_kvmvm` и datasource `decort_cb_kvmvm` в cloudbroker/kvmvm | | BATF-1300 | Тип вычисляемого поля `blk_discard` с `bool` на `string` и переименование в `discard` в блоке `disks` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1251 | Вычисляемое поле `provision` в блоке `disks` в resource `decort_kvmvm` и datasource `decort_kvmvm` в cloudapi/kvmvm | | BATF-1300 | Тип опционального поля `blk_discard` с `bool` на `string` и переименование в `discard` в блоке `disks` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1251 | Вычисляемое поле `provision` в блоке `boot_disk` в resource `decort_kvmvm` в cloudapi/kvmvm | | BATF-1300 | Тип опционального поля `boot_disk_blk_discard` с `bool` на `string` и переименование в `boot_disk_discard` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1225 | Опциональное поле `block_size` в блоке `disks` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | | BATF-1300 | Тип вычисляемого поля `blk_discard` с `bool` на `string` и переименование в `discard` в блоке `disks` в datasource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1225 | Вычисляемое поле `block_size` в блоке `disks` в datasource `decort_cb_kvmvm` в cloudbroker/kvmvm | | BATF-1300 | Тип вычисляемого поля `blk_discard` с `bool` на `string` и переименование в `discard` в блоке `disks` в resource `decort_kvmvm` и datasource `decort_kvmvm` в cloudapi/kvmvm |
| BATF-1225 | Вычисляемое поле `block_size` в блоке `disks` в resource `decort_kvmvm` и datasource `decort_kvmvm` в cloudapi/kvmvm |
| BATF-1229 | Вычисляемое поле `weight` в datasources `decort_cb_kvmvm`, `decort_cb_kvmvm_list` и `decort_cb_kvmvm_list_deleted` в cloudbroker/kvmvm и в datasources `decort_kvmvm`, `decort_kvmvm_list` и `decort_kvmvm_list_deleted` в cloudapi/kvmvm |
| BATF-1229 | Опциональное поле `weight` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1229 | Вычисляемое поле `weight` в resource `decort_kvmvm` в cloudapi/kvmvm |
| BATF-1245 | Вычисляемое поле `independent` в блоке `disks` в datasource `decort_kvmvm` в cloudapi/kvmvm и в datasource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1245 | Вычисляемое поле `independent` в блоке `disks` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1264 | Ограничения на типы сетей при использования поля `security_groups` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1267 | Проверка типа сети ВМ на TRUNK для добавления опционального поля `mtu` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1001 | Проверка типа сети ВМ на SDN в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1270 | Опциональное поле `iotune` в блоке `disks` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1270 | Опциональное поле `iotune` в блоке `disks` в resource `decort_kvmvm` в cloudapi/kvmvm |
| BATF-1276 | Добавлено опциональное поле `create_blank` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1276 | Опциональное поле `alt_boot_id` в resource `decort_kvmvm` в cloudapi/kvmvm |
#### locations
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1261 | Вычисляемое поле `ZeroAccessEnabled` в datasource `decort_locations_list` в cloudapi/locations |
| BATF-1275 | Вычисляемое поле `BROEnabled` в datasource `decort_locations_list` в cloudapi/locations |
#### node
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1223 | Опциональное поле `zone_id` в datasource `decort_cb_node_list` в cloudbroker/node |
| BATF-1254 | Вычисляемое поле `thread_count` в блок `cpu_info` в datasources `decort_cb_node` и `decort_cb_node_list` в cloudbroker/node |
#### rg
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1228 | Вычисляемое поле `email` в блоке `acl` в resource и datasource `decort_resgroup` в cloudapi/rg |
| BATF-1228 | Вычисляемое поле `email` в блоке `acl` в resource и datasource `decort_cb_rg` в cloudbroker/rg |
#### storage policy
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1235 | Вычисляемое поле `sep_tech_status` в блок `access_seps_pools` в resource `decort_cb_storage_policy` и в datasource `decort_cb_storage_policy` в cloudbroker/stpolicy |
| BATF-1235 | Вычисляемое поле `sep_tech_status` в блок `access_seps_pools` datasource `decort_storage_policy` в cloudapi/stpolicy |
#### vins
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1266 | Опциональное поле `enable_secgroups` в resource `decort_vins` в cloudapi/vins |
#### SDN logical ports
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1271 | Опциональное поле `labels` в resource `decort_sdn_logical_port` в sdn/logicalports |
| BATF-1271 | Вычисляемое поле `labels` в datasources `decort_sdn_logical_port`, `decort_sdn_logical_port_list` и `decort_sdn_logical_port_get_by_unique_identifier` в sdn/logicalports |
| BATF-1271 | Опциональное поле `migrate` в resource `decort_sdn_logical_port` в sdn/logicalports |
| BATF-1271 | Вычисляемое поле `hypervisor_status` в блоке `status` в datasources `decort_sdn_logical_port`, `decort_sdn_logical_port_list` и `decort_sdn_logical_port_get_by_unique_identifier` и в resource `decort_sdn_logical_port` в sdn/logicalports |
| BATF-1271 | Вычисляемое поле `logical_port_addresses` в блоке `bindings` в datasources `decort_sdn_logical_port`, `decort_sdn_logical_port_list` и `decort_sdn_logical_port_get_by_unique_identifier` и в resource `decort_sdn_logical_port` в sdn/logicalports |
| BATF-1271 | Вычисляемое поле `external_network_id` в datasources `decort_sdn_logical_port`, `decort_sdn_logical_port_list` и `decort_sdn_logical_port_get_by_unique_identifier` в sdn/logicalports |
| BATF-1271 | Опциональное поле `operation_status` в datasource `decort_sdn_logical_port_list` в sdn/logicalports |
| BATF-1271 | Опциональное поле `hypervisor_status` в datasource `decort_sdn_logical_port_list` в sdn/logicalports |
| BATF-1271 | Вычисляемое поле `operation_status` в блоке `status` в datasources `decort_sdn_logical_port`, `decort_sdn_logical_port_list` и `decort_sdn_logical_port_get_by_unique_identifier` и в resource `decort_sdn_logical_port` в sdn/logicalports |
| BATF-1271 | Вычисляемое поле `operation_status` в блоке `hypervisors` в datasources `decort_sdn_logical_port`, `decort_sdn_logical_port_list` и `decort_sdn_logical_port_get_by_unique_identifier` и в resource `decort_sdn_logical_port` в sdn/logicalports |
#### SDN segments
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1157 | Опциональное поле `operation_status` в datasource `decort_sdn_segment_list` в sdn/segments |
| BATF-1157 | Опциональное поле `type` в resource `decort_sdn_segment` в sdn/segments |
| BATF-1157 | Вычисляемое поле `type` в datasources `decort_sdn_segment` и `decort_sdn_segment_list` в sdn/segments |
| BATF-1157 | Вычисляемое поле `operation_status` в блоке `status` в datasources `decort_sdn_segment` и `decort_sdn_segment_list` и в resource `decort_sdn_segment` в sdn/segments |
| BATF-1157 | Вычисляемое поле `operation_status` в блоке `hypervisors` в datasources `decort_sdn_segment` и `decort_sdn_segment_list` и в resource `decort_sdn_segment` в sdn/segments |
| BATF-1157 | Вычисляемое поле `l2_connection_port` в datasources `decort_sdn_segment` и `decort_sdn_segment_list` и в resource `decort_sdn_segment` в sdn/segments |
#### SDN hypervisors
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1113 | Resource `decort_sdn_hypervisor` и datasources `decort_sdn_hypervisor` и `decort_sdn_hypervisor_list` в sdn/hypervisors |
#### SDN access group
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1155 | Опциональное поле `owner_display_name` в datasource `decort_sdn_access_group_list` в sdn/access_group |
#### SDN network object group
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1115| Resource `decort_sdn_network_object_group`, datasources `decort_sdn_network_object_group` и `decort_sdn_network_object_group_list` в sdn/netobjgroups |
#### zone
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1259 | Вычисляемые поля `drs`, `drs_uid`, `drs_name`, `sso_url`, `app_id` и `decort_url` в datasources `decort_zone` и `decort_zone_list` в cloudapi/zone и в datasources `decort_cb_zone` и `decort_cb_zone_list` в cloudbroker/zone |
| BATF-1259 | Опциональное поле `drs` и вычисляемые поля `drs`, `drs_uid`, `drs_name`, `sso_url`, `app_id` и `decort_url` в resource `decort_cb_zone` в cloudbroker/zone |
| BATF-1273 | Вычисляемые поля `ping_addr`, `broadcast_addr`, `ssl_skip_verify`, `domain` и `sso_type` в datasources `decort_zone` и `decort_zone_list` в cloudapi/zone и в datasources `decort_cb_zone` и `decort_cb_zone_list` в cloudbroker/zone |
| BATF-1273 | Вычисляемые поля `ping_addr`, `broadcast_addr`, `ssl_skip_verify`, `domain` и `sso_type` в resource `decort_cb_zone` в cloudbroker/zone |
### Изменено
#### kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1249 | Минимальное значение опционального поля `mtu` в блоке `network` с 1 на 1500 в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
#### node
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1258 | Тип вычисляемого поля `VCPU` с `uint64` на `float64` в блоке `FreeResourcesInfo` в datasource `decort_cb_node` в cloudbroker/node |
#### zone
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1253 | Поле `lb_ids` было переименовано в `lbs_ids` в datasource `decort_zone` в cloudapi/zone |
### Исправлено
#### flipgroup
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1283 | Установка поля `desc` с платформы в ресурсе `decort_cb_flipgroup` в cloudbroker/flipgroup |
#### dpdknet
| Идентификатор<br>задачи | Описание |
| --- | ---
| BATF-1266 | Оптимизировано количество запросов при создании `decort_cb_dpdknet` в cloudbroker/dpdknet |
#### extnet
| Идентификатор<br>задачи | Описание |
| --- | ---
| BATF-1266 | Оптимизировано количество запросов при создании `decort_cb_extnet` в cloudbroker/extnet |
#### kvmvm
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1276 | Ошибка при старте ВМ с указанием поля `alt_boot_id` в resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
#### rg
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1214 | Поведение ресурса при использовании параметра `net_type` в блоке `def_net` со значением `PRIVATE` в resource `decort_resgroup` в cloudapi/rg и в resource `decort_cb_rg` в cloudbroker/rg |
#### vins
| Идентификатор<br>задачи | Описание |
| --- | ---
| BATF-1266 | Оптимизировано количество запросов при создании `decort_cb_vins` в cloudbroker/vins |
#### SDN logical ports
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1271 | Формирование списка `remove_addresses` при обновлении `logical_port_addresses` в resource `decort_sdn_logical_port` в sdn/logicalports |
#### trunk
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1285 | Установка полей `account_ids`, `ovs_bridge`, `native_vlan_id`, `trunk_tags` с платформы в ресурсе `decort_cb_trunk ` в cloudbroker/trunk |
#### vfpool
| Идентификатор<br>задачи | Описание |
| --- | --- |
| BATF-1289 | Разрешено создавать пул виртуальных функций с блоком `config` при значении поля `enable` равным `false` в resource `decort_cb_vfpool` в cloudbroker/vfpool |
| BATF-1289 | Разрешено обновлять поля `name`, `description`, `account_access` и `rg_access` без блока `config` в resource `decort_cb_vfpool` в cloudbroker/vfpool |
### Удалено
#### disks #### disks
| Идентификатор<br>задачи | Описание | | Идентификатор<br>задачи | Описание |
| --- | --- | | --- | --- |
| BATF-1233 | datasources `decort_disk_list_types`, `decort_disk_list_types_detailed` в cloudapi/disks и `decort_cb_disk_list_types`, `decort_cb_disk_list_types_detailed` в cloudbroker/disks | | BATF-1300 | Тип опционального поля `blk_discard` с `bool` на `string` и переименование в `discard` в resource `decort_cb_disk` в cloudbroker/disks |
| BATF-1233 | Опциональное поле `type` из resource `decort_disk` в cloudapi/disks и из 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-1233 | Вычисляемое поле `type` из datasources `decort_disk`, `decort_disk_list`, `decort_disk_list_deleted`, `decort_disk_list_unattached` и в cloudapi/disks и `decort_cb_disk`, `decort_cb_disk_list`, `decort_cb_disk_list_deleted`, `decort_cb_disk_list_unattached` и в 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 |
#### kvmvm #### user
| Идентификатор<br>задачи | Описание | | Идентификатор<br>задачи | Описание |
| --- | --- | | --- | --- |
| BATF-1233 | Опциональное поле `disk_type` из блока `disks` в resource `decort_kvmvm` в cloudapi/kvmvm и в resource `decort_cb_kvmvm` в cloudbroker/kvmvm | | BATF-1293 | Тип поля `password` с опционального на обязательный в resource `decort_cb_user` в cloudbroker/user |
| BATF-1227 | Опциональные поля `is` и `ipa_type` из resource `decort_cb_kvmvm` в cloudbroker/kvmvm |
| BATF-1227 | Опциональные поля `is` и `ipa_type` из resource `decort_kvmvm` в cloudapi/kvmvm |
#### storage policy #### image
| Идентификатор<br>задачи | Описание | | Идентификатор<br>задачи | Описание |
| --- | --- | | --- | --- |
| BATF-1235 | Вычисляемое поле `storage_policy_id` из resource `decort_cb_storage_policy` в cloudbroker/stpolicy | | BATF-1299 | Тип поля `account_id` c опционального на обязательное в resource `decort_image_virtual` в cloudapi/image |
#### SDN logical ports
### Исправлено
### Удалено
#### grid
| Идентификатор<br>задачи | Описание | | Идентификатор<br>задачи | Описание |
| --- | --- | | --- | --- |
| BATF-1271 | Вычисляемое поле `is_excluded_from_firewall` в блоке `bindings` из datasources `decort_sdn_logical_port`, `decort_sdn_logical_port_list` и `decort_sdn_logical_port_get_by_unique_identifier` и из resource `decort_sdn_logical_port` в sdn/logicalports | | BATF-1311 | Вычисляемые поля `ckey` и `meta` в datasource `decort_cb_grid` в cloudbroker/grid |
| BATF-1271 | Вычисляемое поле `common` в блоке `status` в datasources `decort_sdn_logical_port`, `decort_sdn_logical_port_list` и `decort_sdn_logical_port_get_by_unique_identifier` и в resource `decort_sdn_logical_port` в sdn/logicalports |
| BATF-1271 | Вычисляемое поле `status` в блоке `hypervisors` в datasources `decort_sdn_logical_port`, `decort_sdn_logical_port_list` и `decort_sdn_logical_port_get_by_unique_identifier` и в resource `decort_sdn_logical_port` в sdn/logicalports |
#### SDN segments #### user
| Идентификатор<br>задачи | Описание | | Идентификатор<br>задачи | Описание |
| --- | --- | | --- | --- |
| BATF-1157 | Datasource `decort_sdn_segment_get_status` в sdn/segments | | BATF-1293 | Вычисляемое поле `password` в datasources `decort_cb_user` и `decort_cb_user_list` в cloudbroker/user |
| BATF-1157 | Вычисляемое поле `common` в блоке `status` в datasources `decort_sdn_segment` и `decort_sdn_segment_list` и в resource `decort_sdn_segment` в sdn/segments |
| BATF-1157 | Вычисляемое поле `status` в блоке `hypervisors` в datasources `decort_sdn_segment` и `decort_sdn_segment_list` и в resource `decort_sdn_segment` в sdn/segments |

View File

@@ -7,7 +7,7 @@ ZIPDIR = ./zip
BINARY=${NAME} BINARY=${NAME}
WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH} WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH}
MAINPATH = ./cmd/decort/ MAINPATH = ./cmd/decort/
VERSION=4.12.0 VERSION=4.13.0
OS_ARCH=$(shell go env GOHOSTOS)_$(shell go env GOHOSTARCH) OS_ARCH=$(shell go env GOHOSTOS)_$(shell go env GOHOSTARCH)
FILES = ${BINARY}_${VERSION}_darwin_amd64\ FILES = ${BINARY}_${VERSION}_darwin_amd64\

4
go.mod
View File

@@ -9,9 +9,11 @@ require (
github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1 github.com/hashicorp/terraform-plugin-sdk/v2 v2.38.1
github.com/sirupsen/logrus v1.9.0 github.com/sirupsen/logrus v1.9.0
golang.org/x/net v0.44.0 golang.org/x/net v0.44.0
repository.basistech.ru/BASIS/decort-golang-sdk v1.14.11 repository.basistech.ru/BASIS/decort-golang-sdk v1.15.1
) )
replace repository.basistech.ru/BASIS/decort-golang-sdk => ../decort-sdk-local
require ( require (
github.com/BurntSushi/toml v1.2.1 // indirect github.com/BurntSushi/toml v1.2.1 // indirect
github.com/Kunde21/markdownfmt/v3 v3.1.0 // indirect github.com/Kunde21/markdownfmt/v3 v3.1.0 // indirect

2
go.sum
View File

@@ -318,5 +318,3 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
repository.basistech.ru/BASIS/decort-golang-sdk v1.14.11 h1:lG35W5nKyEgaLMQp6B0Ur1n7bjXDCmB2FHQI/mM59U0=
repository.basistech.ru/BASIS/decort-golang-sdk v1.14.11/go.mod h1:S/f7GxwWcE88eFpORV+I9xqEf8zDW5srQHpG2XQCLZM=

View File

@@ -165,6 +165,7 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_kvmvm_list_deleted": kvmvm.DataSourceComputeListDeleted(), "decort_kvmvm_list_deleted": kvmvm.DataSourceComputeListDeleted(),
"decort_kvmvm_vgpu_list": kvmvm.DataSourceComputeVGPUList(), "decort_kvmvm_vgpu_list": kvmvm.DataSourceComputeVGPUList(),
"decort_kvmvm_pci_device_list": kvmvm.DataSourceComputePCIDeviceList(), "decort_kvmvm_pci_device_list": kvmvm.DataSourceComputePCIDeviceList(),
"decort_kvmvm_cpu_alignment_profile": kvmvm.DataSourceComputeCPUAlignmentProfile(),
"decort_k8s_wg_cloud_init": k8s.DataSourceK8sWgCloudInit(), "decort_k8s_wg_cloud_init": k8s.DataSourceK8sWgCloudInit(),
"decort_rg_resource_consumption_list": rg.DataSourceRGResourceConsumptionList(), "decort_rg_resource_consumption_list": rg.DataSourceRGResourceConsumptionList(),
"decort_rg_resource_consumption_get": rg.DataSourceRGResourceConsumptionGet(), "decort_rg_resource_consumption_get": rg.DataSourceRGResourceConsumptionGet(),
@@ -229,8 +230,11 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_cb_kvmvm_snapshot_usage": cb_kvmvm.DataSourceComputeSnapshotUsage(), "decort_cb_kvmvm_snapshot_usage": cb_kvmvm.DataSourceComputeSnapshotUsage(),
"decort_cb_kvmvm_user_list": cb_kvmvm.DataSourceComputeUserList(), "decort_cb_kvmvm_user_list": cb_kvmvm.DataSourceComputeUserList(),
"decort_cb_kvmvm_vgpu_list": cb_kvmvm.DataSourceComputeVGPUList(), "decort_cb_kvmvm_vgpu_list": cb_kvmvm.DataSourceComputeVGPUList(),
"decort_cb_kvmvm_cpu_alignment_profile": cb_kvmvm.DataSourceComputeCPUAlignmentProfile(),
"decort_cb_node": cb_node.DataSourceNode(), "decort_cb_node": cb_node.DataSourceNode(),
"decort_cb_node_list": cb_node.DataSourceNodeList(), "decort_cb_node_list": cb_node.DataSourceNodeList(),
"decort_cb_node_network_info": cb_node.DataSourceNodeNetworkInfo(),
"decort_cb_node_pci_devices": cb_node.DataSourceNodePCIDevices(),
"decort_cb_disk": cb_disks.DataSourceDisk(), "decort_cb_disk": cb_disks.DataSourceDisk(),
"decort_cb_disk_list": cb_disks.DataSourceDiskList(), "decort_cb_disk_list": cb_disks.DataSourceDiskList(),
"decort_cb_disk_list_deleted": cb_disks.DataSourceDiskListDeleted(), "decort_cb_disk_list_deleted": cb_disks.DataSourceDiskListDeleted(),
@@ -299,6 +303,9 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_cb_k8s_computes": cb_k8s.DataSourceK8sComputes(), "decort_cb_k8s_computes": cb_k8s.DataSourceK8sComputes(),
"decort_cb_zone": cb_zone.DataSourceZone(), "decort_cb_zone": cb_zone.DataSourceZone(),
"decort_cb_zone_list": cb_zone.DataSourceZoneList(), "decort_cb_zone_list": cb_zone.DataSourceZoneList(),
"decort_cb_zone_cpu_alignment_profile": cb_zone.DataSourceZoneCPUAlignmentProfile(),
"decort_cb_zone_cpu_alignment_profile_list": cb_zone.DataSourceZoneCPUAlignmentProfileList(),
"decort_cb_zone_cpu_alignment_profile_test": cb_zone.DataSourceZoneCPUAlignmentProfileTest(),
"decort_sdn_access_group": accessgroup.DataSourceAccessGroup(), "decort_sdn_access_group": accessgroup.DataSourceAccessGroup(),
"decort_sdn_access_group_list": accessgroup.DataSourceAccessGroupList(), "decort_sdn_access_group_list": accessgroup.DataSourceAccessGroupList(),

View File

@@ -80,8 +80,8 @@ func dataSourceDiskSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"block_size": { "block_size": {

View File

@@ -152,8 +152,8 @@ func dataSourceDiskListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"block_size": { "block_size": {

View File

@@ -155,8 +155,8 @@ func dataSourceDiskListUnattachedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"block_size": { "block_size": {

View File

@@ -123,8 +123,8 @@ func dataSourceDiskDeletedListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"block_size": { "block_size": {

View File

@@ -25,7 +25,7 @@ func flattenDiskListUnattached(ul *disks.ListDisksUnattached) []map[string]inter
"account_id": unattachedDisk.AccountID, "account_id": unattachedDisk.AccountID,
"account_name": unattachedDisk.AccountName, "account_name": unattachedDisk.AccountName,
"acl": string(unattachedDiskAcl), "acl": string(unattachedDiskAcl),
"blk_discard": unattachedDisk.BLKDiscard, "discard": unattachedDisk.Discard,
"block_size": unattachedDisk.BlockSize, "block_size": unattachedDisk.BlockSize,
"boot_partition": unattachedDisk.BootPartition, "boot_partition": unattachedDisk.BootPartition,
"created_time": unattachedDisk.CreatedTime, "created_time": unattachedDisk.CreatedTime,
@@ -79,7 +79,7 @@ func flattenDisk(d *schema.ResourceData, disk *disks.RecordDisk) {
d.Set("account_id", disk.AccountID) d.Set("account_id", disk.AccountID)
d.Set("account_name", disk.AccountName) d.Set("account_name", disk.AccountName)
d.Set("acl", string(diskAcl)) d.Set("acl", string(diskAcl))
d.Set("blk_discard", disk.BLKDiscard) d.Set("discard", disk.Discard)
d.Set("block_size", disk.BlockSize) d.Set("block_size", disk.BlockSize)
// d.Set("boot_partition", disk.BootPartition) // d.Set("boot_partition", disk.BootPartition)
d.Set("computes", flattenDiskComputes(disk.Computes)) d.Set("computes", flattenDiskComputes(disk.Computes))
@@ -225,7 +225,7 @@ func flattenDiskList(dl *disks.ListDisks) []map[string]interface{} {
"account_id": disk.AccountID, "account_id": disk.AccountID,
"account_name": disk.AccountName, "account_name": disk.AccountName,
"acl": string(diskAcl), "acl": string(diskAcl),
"blk_discard": disk.BLKDiscard, "discard": disk.Discard,
"block_size": disk.BlockSize, "block_size": disk.BlockSize,
"computes": flattenDiskComputes(disk.Computes), "computes": flattenDiskComputes(disk.Computes),
"created_by": disk.CreatedBy, "created_by": disk.CreatedBy,

View File

@@ -419,3 +419,12 @@ func resourceDiskV1() *schema.Resource {
}, },
} }
} }
func resourceDiskV2() *schema.Resource {
s := resourceDiskSchemaMake()
s["blk_discard"] = &schema.Schema{
Type: schema.TypeBool,
Computed: true,
}
return &schema.Resource{Schema: s}
}

View File

@@ -805,10 +805,10 @@ func resourceDiskSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Computed: true, Computed: true,
Description: "Flag indicating whether blk-discard is enabled for the disk", Description: "Discard mode of the disk",
}, },
"block_size": { "block_size": {
Type: schema.TypeString, Type: schema.TypeString,
@@ -821,7 +821,7 @@ func resourceDiskSchemaMake() map[string]*schema.Schema {
func ResourceDisk() *schema.Resource { func ResourceDisk() *schema.Resource {
return &schema.Resource{ return &schema.Resource{
SchemaVersion: 2, SchemaVersion: 3,
CreateContext: resourceDiskCreate, CreateContext: resourceDiskCreate,
ReadContext: resourceDiskRead, ReadContext: resourceDiskRead,
@@ -847,6 +847,11 @@ func ResourceDisk() *schema.Resource {
Upgrade: resourceDiskUpgradeV1, Upgrade: resourceDiskUpgradeV1,
Version: 1, Version: 1,
}, },
{
Type: resourceDiskV2().CoreConfigSchema().ImpliedType(),
Upgrade: resourceDiskUpgradeV2,
Version: 2,
},
}, },
} }
} }

View File

@@ -12,3 +12,17 @@ func resourceDiskUpgradeV1(ctx context.Context, rawState map[string]interface{},
return rawState, nil return rawState, nil
} }
func resourceDiskUpgradeV2(ctx context.Context, rawState map[string]interface{}, meta any) (map[string]interface{}, error) {
log.Debug("resourceDiskUpgradeV2: upgrading state")
if v, ok := rawState["blk_discard"].(bool); ok {
if v {
rawState["discard"] = "unmap"
} else {
rawState["discard"] = "ignore"
}
}
delete(rawState, "blk_discard")
return rawState, nil
}

View File

@@ -138,6 +138,10 @@ func dataSourceExtnetListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"free_ips": {
Type: schema.TypeInt,
Computed: true,
},
}, },
}, },
}, },

View File

@@ -137,6 +137,7 @@ func flattenExtnetList(el *extnet.ListExtNets) []map[string]interface{} {
"ipcidr": e.IPCIDR, "ipcidr": e.IPCIDR,
"name": e.Name, "name": e.Name,
"status": e.Status, "status": e.Status,
"free_ips": e.FreeIPs,
} }
res = append(res, temp) res = append(res, temp)
} }

View File

@@ -83,9 +83,10 @@ func dataSourceImageListSchemaMake() map[string]*schema.Schema {
Description: "Filter by architecture", Description: "Filter by architecture",
}, },
"type_image": { "type_image": {
Type: schema.TypeString, Type: schema.TypeList,
Optional: true, Optional: true,
Description: "Filter by image type", Description: "Filter by image type",
Elem: &schema.Schema{Type: schema.TypeString},
}, },
"image_size": { "image_size": {
Type: schema.TypeInt, Type: schema.TypeInt,

View File

@@ -64,7 +64,7 @@ func flattenImage(d *schema.ResourceData, img *image.RecordImage) {
d.Set("storage_policy_id", img.StoragePolicyID) d.Set("storage_policy_id", img.StoragePolicyID)
d.Set("tech_status", img.TechStatus) d.Set("tech_status", img.TechStatus)
d.Set("to_clean", img.ToClean) d.Set("to_clean", img.ToClean)
d.Set("type", img.Type) d.Set("image_type", img.Type)
d.Set("username", img.Username) d.Set("username", img.Username)
d.Set("version", img.Version) d.Set("version", img.Version)
} }
@@ -90,7 +90,7 @@ func flattenImageList(il *image.ListImages) []map[string]interface{} {
"size": img.Size, "size": img.Size,
"status": img.Status, "status": img.Status,
"storage_policy_id": img.StoragePolicyID, "storage_policy_id": img.StoragePolicyID,
"type": img.Type, "image_type": img.Type,
"username": img.Username, "username": img.Username,
"virtual": img.Virtual, "virtual": img.Virtual,
} }

View File

@@ -38,6 +38,7 @@ import (
func resourceImageVirtualSchemaMake(sch map[string]*schema.Schema) map[string]*schema.Schema { func resourceImageVirtualSchemaMake(sch map[string]*schema.Schema) map[string]*schema.Schema {
delete(sch, "show_all") delete(sch, "show_all")
sch["name"] = &schema.Schema{ sch["name"] = &schema.Schema{
Type: schema.TypeString, Type: schema.TypeString,
Required: true, Required: true,
@@ -52,9 +53,8 @@ func resourceImageVirtualSchemaMake(sch map[string]*schema.Schema) map[string]*s
sch["account_id"] = &schema.Schema{ sch["account_id"] = &schema.Schema{
Type: schema.TypeInt, Type: schema.TypeInt,
Optional: true, Required: true,
Computed: true, Description: "Account ID",
Description: "account_id",
} }
sch["image_id"] = &schema.Schema{ sch["image_id"] = &schema.Schema{

View File

@@ -63,7 +63,9 @@ func utilityImageListCheckPresence(ctx context.Context, d *schema.ResourceData,
} }
if typeImage, ok := d.GetOk("type_image"); ok { if typeImage, ok := d.GetOk("type_image"); ok {
req.TypeImage = typeImage.(string) for _, v := range typeImage.([]interface{}) {
req.TypeImage = append(req.TypeImage, v.(string))
}
} }
if imageSize, ok := d.GetOk("image_size"); ok { if imageSize, ok := d.GetOk("image_size"); ok {

View File

@@ -256,8 +256,8 @@ func computeListDisksSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"block_size": { "block_size": {
@@ -766,6 +766,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"clock": {
Type: schema.TypeString,
Computed: true,
},
"boot_order": { "boot_order": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
@@ -807,6 +811,26 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"cpu_alignment_profiles": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
},
"model": {
Type: schema.TypeString,
Computed: true,
},
"vendor": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"cpu_pin": { "cpu_pin": {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,

View File

@@ -0,0 +1,98 @@
/*
Copyright (c) 2019-2023 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package kvmvm
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 dataSourceComputeCPUAlignmentProfileRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
profile, err := utilityComputeGetCPUAlignmentProfile(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
id := uuid.New()
d.SetId(id.String())
d.Set("model", profile.Model)
d.Set("name", profile.Name)
d.Set("vendor", profile.Vendor)
return nil
}
func dataSourceComputeCPUAlignmentProfileSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{
"compute_id": {
Type: schema.TypeInt,
Required: true,
Description: "ID of the compute instance",
},
"model": {
Type: schema.TypeString,
Computed: true,
Description: "CPU model of the alignment profile",
},
"name": {
Type: schema.TypeString,
Computed: true,
Description: "Name of the CPU alignment profile",
},
"vendor": {
Type: schema.TypeString,
Computed: true,
Description: "CPU vendor of the alignment profile",
},
}
}
func DataSourceComputeCPUAlignmentProfile() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceComputeCPUAlignmentProfileRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceComputeCPUAlignmentProfileSchemaMake(),
}
}

View File

@@ -156,6 +156,10 @@ func itemComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"clock": {
Type: schema.TypeString,
Computed: true,
},
"clones": { "clones": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
@@ -167,6 +171,26 @@ func itemComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"cpu_alignment_profiles": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
},
"model": {
Type: schema.TypeString,
Computed: true,
},
"vendor": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"cpu_pin": { "cpu_pin": {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,

View File

@@ -193,10 +193,12 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"bootdisk_size": compute.BootDiskSize, "bootdisk_size": compute.BootDiskSize,
"boot_image_id": compute.BootImageID, "boot_image_id": compute.BootImageID,
"chipset": compute.Chipset, "chipset": compute.Chipset,
"clock": compute.Clock,
"cd_image_id": compute.CdImageId, "cd_image_id": compute.CdImageId,
"clone_reference": compute.CloneReference, "clone_reference": compute.CloneReference,
"clones": compute.Clones, "clones": compute.Clones,
"computeci_id": compute.ComputeCIID, "computeci_id": compute.ComputeCIID,
"cpu_alignment_profiles": flattenCPUAlignmentProfile(compute.CPUAlignmentProfile),
"cpu_pin": compute.CPUPin, "cpu_pin": compute.CPUPin,
"cpus": compute.CPU, "cpus": compute.CPU,
"created_by": compute.CreatedBy, "created_by": compute.CreatedBy,
@@ -278,7 +280,7 @@ func flattenBootDisk(bootDisk *compute.ItemComputeDisk) []map[string]interface{}
"storage_policy_id": bootDisk.StoragePolicyID, "storage_policy_id": bootDisk.StoragePolicyID,
"to_clean": bootDisk.ToClean, "to_clean": bootDisk.ToClean,
"cache": bootDisk.Cache, "cache": bootDisk.Cache,
"blk_discard": bootDisk.BLKDiscard, "discard": bootDisk.Discard,
"block_size": bootDisk.BlockSize, "block_size": bootDisk.BlockSize,
"bus_number": bootDisk.BusNumber, "bus_number": bootDisk.BusNumber,
"provision": bootDisk.Provision, "provision": bootDisk.Provision,
@@ -346,7 +348,7 @@ func flattenComputeDisksDemo(disksList compute.ListComputeDisks, disksBlocks, ex
"updated_time": disk.UpdatedTime, "updated_time": disk.UpdatedTime,
"permanently": pernamentlyValue, "permanently": pernamentlyValue,
"cache": disk.Cache, "cache": disk.Cache,
"blk_discard": disk.BLKDiscard, "discard": disk.Discard,
"block_size": disk.BlockSize, "block_size": disk.BlockSize,
"provision": disk.Provision, "provision": disk.Provision,
"iotune": flattenIotune(disk.IOTune), "iotune": flattenIotune(disk.IOTune),
@@ -440,6 +442,7 @@ func flattenCompute(d *schema.ResourceData, computeRec compute.RecordCompute, pc
d.Set("sep_id", bootDisk.SepID) d.Set("sep_id", bootDisk.SepID)
d.Set("pool", bootDisk.Pool) d.Set("pool", bootDisk.Pool)
d.Set("chipset", computeRec.Chipset) d.Set("chipset", computeRec.Chipset)
d.Set("clock", computeRec.Clock)
d.Set("clone_reference", computeRec.CloneReference) d.Set("clone_reference", computeRec.CloneReference)
d.Set("clones", computeRec.Clones) d.Set("clones", computeRec.Clones)
d.Set("computeci_id", computeRec.ComputeCIID) d.Set("computeci_id", computeRec.ComputeCIID)
@@ -505,6 +508,7 @@ func flattenCompute(d *schema.ResourceData, computeRec compute.RecordCompute, pc
d.Set("zone_id", computeRec.ZoneID) d.Set("zone_id", computeRec.ZoneID)
d.Set("loader_meta_iso", flattenLoaderMetaIso(computeRec.LoaderMetaIso)) d.Set("loader_meta_iso", flattenLoaderMetaIso(computeRec.LoaderMetaIso))
d.Set("cpu_pin", computeRec.CPUPin) d.Set("cpu_pin", computeRec.CPUPin)
d.Set("cpu_alignment_profile", computeRec.CPUAlignmentProfile.Name)
d.Set("numa_affinity", computeRec.NumaAffinity) d.Set("numa_affinity", computeRec.NumaAffinity)
d.Set("hp_backed", computeRec.HPBacked) d.Set("hp_backed", computeRec.HPBacked)
d.Set("weight", computeRec.Weight) d.Set("weight", computeRec.Weight)
@@ -613,7 +617,7 @@ func flattenListComputeDisks(disks compute.ListComputeDisks) []map[string]interf
"_ckey": disk.CKey, "_ckey": disk.CKey,
"acl": string(acl), "acl": string(acl),
"account_id": disk.AccountID, "account_id": disk.AccountID,
"blk_discard": disk.BLKDiscard, "discard": disk.Discard,
"block_size": disk.BlockSize, "block_size": disk.BlockSize,
"boot_partition": disk.BootPartition, "boot_partition": disk.BootPartition,
"bus_number": disk.BusNumber, "bus_number": disk.BusNumber,
@@ -713,6 +717,7 @@ func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute
d.Set("auto_start_w_node", computeRec.AutoStart) d.Set("auto_start_w_node", computeRec.AutoStart)
d.Set("arch", computeRec.Architecture) d.Set("arch", computeRec.Architecture)
d.Set("chipset", computeRec.Chipset) d.Set("chipset", computeRec.Chipset)
d.Set("clock", computeRec.Clock)
d.Set("boot_order", computeRec.BootOrder) d.Set("boot_order", computeRec.BootOrder)
d.Set("bootdisk_size", computeRec.BootDiskSize) d.Set("bootdisk_size", computeRec.BootDiskSize)
d.Set("boot_image_id", computeRec.BootImageID) d.Set("boot_image_id", computeRec.BootImageID)
@@ -785,9 +790,23 @@ func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute
d.Set("zone_id", computeRec.ZoneID) d.Set("zone_id", computeRec.ZoneID)
d.Set("loader_meta_iso", flattenLoaderMetaIso(computeRec.LoaderMetaIso)) d.Set("loader_meta_iso", flattenLoaderMetaIso(computeRec.LoaderMetaIso))
d.Set("os_version", computeRec.OSVersion) d.Set("os_version", computeRec.OSVersion)
d.Set("cpu_alignment_profiles", flattenCPUAlignmentProfile(computeRec.CPUAlignmentProfile))
d.Set("weight", computeRec.Weight) d.Set("weight", computeRec.Weight)
} }
func flattenCPUAlignmentProfile(profile compute.CPUAlignmentProfile) []map[string]interface{} {
if profile.Name == "" && profile.Model == "" && profile.Vendor == "" {
return nil
}
return []map[string]interface{}{
{
"name": profile.Name,
"model": profile.Model,
"vendor": profile.Vendor,
},
}
}
func flattenPCI(pciList compute.ListPCIDevices) []uint64 { func flattenPCI(pciList compute.ListPCIDevices) []uint64 {
res := make([]uint64, 0, len(pciList.Data)) res := make([]uint64, 0, len(pciList.Data))

View File

@@ -1427,3 +1427,19 @@ func resourceComputeResourceV2() *schema.Resource {
}, },
} }
} }
func resourceComputeResourceV3() *schema.Resource {
s := ResourceComputeSchemaMake()
for _, blockKey := range []string{"disks", "boot_disk"} {
if block, ok := s[blockKey]; ok {
if res, ok := block.Elem.(*schema.Resource); ok {
res.Schema["blk_discard"] = &schema.Schema{
Type: schema.TypeBool,
Computed: true,
}
}
}
}
return &schema.Resource{Schema: s}
}

View File

@@ -135,8 +135,6 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
createReqX86.BootDisk = uint64(bootSize.(int)) createReqX86.BootDisk = uint64(bootSize.(int))
} }
createReqX86.Interfaces = make([]kvmx86.Interface, 0)
if networks, ok := d.GetOk("network"); ok { if networks, ok := d.GetOk("network"); ok {
if networks.(*schema.Set).Len() > 0 { if networks.(*schema.Set).Len() > 0 {
ns := networks.(*schema.Set).List() ns := networks.(*schema.Set).List()
@@ -264,6 +262,9 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
createReqX86.CPUPin = d.Get("cpu_pin").(bool) createReqX86.CPUPin = d.Get("cpu_pin").(bool)
createReqX86.HPBacked = d.Get("hp_backed").(bool) createReqX86.HPBacked = d.Get("hp_backed").(bool)
createReqX86.Chipset = d.Get("chipset").(string) createReqX86.Chipset = d.Get("chipset").(string)
if clock, ok := d.GetOk("clock"); ok {
createReqX86.Clock = clock.(string)
}
if preferredCPU, ok := d.GetOk("preferred_cpu"); ok { if preferredCPU, ok := d.GetOk("preferred_cpu"); ok {
preferredList := preferredCPU.([]interface{}) preferredList := preferredCPU.([]interface{})
@@ -513,6 +514,17 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if profileName, ok := d.GetOk("cpu_alignment_profile"); ok {
req := compute.SetCPUAlignmentProfileRequest{
ComputeIDs: []int64{int64(computeId)},
CPUAlignmentProfile: profileName.(string),
}
_, err := c.CloudAPI().Compute().SetCPUAlignmentProfile(ctx, req)
if err != nil {
warnings.Add(err)
}
}
if ars, ok := d.GetOk("affinity_rules"); ok { if ars, ok := d.GetOk("affinity_rules"); ok {
log.Debugf("resourceComputeCreate: Create affinity rules on ComputeID: %d", computeId) log.Debugf("resourceComputeCreate: Create affinity rules on ComputeID: %d", computeId)
addedAR := ars.([]interface{}) addedAR := ars.([]interface{})
@@ -1042,6 +1054,7 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
if d.HasChanges("description", if d.HasChanges("description",
"name", "name",
"clock",
"numa_affinity", "numa_affinity",
"cpu_pin", "cpu_pin",
"hp_backed", "hp_backed",
@@ -1069,6 +1082,9 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
if d.HasChange("chipset") { if d.HasChange("chipset") {
req.Chipset = d.Get("chipset").(string) req.Chipset = d.Get("chipset").(string)
} }
if d.HasChange("clock") {
req.Clock = d.Get("clock").(string)
}
if d.HasChange("preferred_cpu") { if d.HasChange("preferred_cpu") {
if preferredCPU, ok := d.GetOk("preferred_cpu"); ok { if preferredCPU, ok := d.GetOk("preferred_cpu"); ok {
preferredList := preferredCPU.([]interface{}) preferredList := preferredCPU.([]interface{})
@@ -1911,6 +1927,12 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChange("cpu_alignment_profile") {
if err := utilityComputeUpdateCPUAlignmentProfile(ctx, d, m); err != nil {
return diag.FromErr(err)
}
}
// we may reuse dataSourceComputeRead here as we maintain similarity // we may reuse dataSourceComputeRead here as we maintain similarity
// between Compute resource and Compute data source schemas // between Compute resource and Compute data source schemas
@@ -2230,8 +2252,8 @@ func disksSubresourceSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"block_size": { "block_size": {
@@ -2382,6 +2404,13 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false), // observe case while validating ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false), // observe case while validating
Description: "Type of the emulated system.", Description: "Type of the emulated system.",
}, },
"clock": {
Type: schema.TypeString,
Optional: true,
Default: "default",
ValidateFunc: validation.StringInSlice([]string{"default", "linux", "windows", "none"}, false),
Description: "Clock synchronization mode.",
},
"without_boot_disk": { "without_boot_disk": {
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
@@ -2405,6 +2434,11 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
Optional: true, Optional: true,
Description: "Set affinity label for compute", Description: "Set affinity label for compute",
}, },
"cpu_alignment_profile": {
Type: schema.TypeString,
Optional: true,
Description: "CPU alignment profile name",
},
"affinity_rules": { "affinity_rules": {
Type: schema.TypeList, Type: schema.TypeList,
Optional: true, Optional: true,
@@ -3095,7 +3129,7 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
func ResourceCompute() *schema.Resource { func ResourceCompute() *schema.Resource {
return &schema.Resource{ return &schema.Resource{
SchemaVersion: 3, SchemaVersion: 4,
CreateContext: resourceComputeCreate, CreateContext: resourceComputeCreate,
ReadContext: resourceComputeRead, ReadContext: resourceComputeRead,
@@ -3142,6 +3176,11 @@ func ResourceCompute() *schema.Resource {
Upgrade: resourceComputeStateUpgradeV2, Upgrade: resourceComputeStateUpgradeV2,
Version: 2, Version: 2,
}, },
{
Type: resourceComputeResourceV3().CoreConfigSchema().ImpliedType(),
Upgrade: resourceComputeStateUpgradeV3,
Version: 3,
},
}, },
} }
} }

View File

@@ -39,3 +39,26 @@ func resourceComputeStateUpgradeV2(ctx context.Context, rawState map[string]inte
return rawState, nil return rawState, nil
} }
func resourceComputeStateUpgradeV3(ctx context.Context, rawState map[string]interface{}, meta any) (map[string]interface{}, error) {
log.Debug("resourceComputeStateUpgradeV3: upgrading state")
for _, blockKey := range []string{"disks", "boot_disk"} {
if items, ok := rawState[blockKey].([]interface{}); ok {
for _, item := range items {
if disk, ok := item.(map[string]interface{}); ok {
if v, ok := disk["blk_discard"].(bool); ok {
if v {
disk["discard"] = "unmap"
} else {
disk["discard"] = "ignore"
}
}
delete(disk, "blk_discard")
}
}
}
}
return rawState, nil
}

View File

@@ -0,0 +1,71 @@
/*
Copyright (c) 2019-2023 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package kvmvm
import (
"context"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/compute"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityComputeUpdateCPUAlignmentProfile(ctx context.Context, d *schema.ResourceData, m interface{}) error {
c := m.(*controller.ControllerCfg)
computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
profileName := d.Get("cpu_alignment_profile").(string)
if profileName == "" {
req := compute.DeleteCPUAlignmentProfileRequest{
ComputeIDs: []uint64{computeId},
}
_, err := c.CloudAPI().Compute().DeleteCPUAlignmentProfile(ctx, req)
return err
}
req := compute.SetCPUAlignmentProfileRequest{
ComputeIDs: []int64{int64(computeId)},
CPUAlignmentProfile: profileName,
}
_, err := c.CloudAPI().Compute().SetCPUAlignmentProfile(ctx, req)
return err
}
func utilityComputeGetCPUAlignmentProfile(ctx context.Context, d *schema.ResourceData, m interface{}) (*compute.CPUAlignmentProfile, error) {
c := m.(*controller.ControllerCfg)
req := compute.GetCPUAlignmentProfileRequest{
ComputeID: uint64(d.Get("compute_id").(int)),
}
return c.CloudAPI().Compute().GetCPUAlignmentProfile(ctx, req)
}

View File

@@ -208,20 +208,20 @@ func resourceAccountCreate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if cpuAllocationRatio, ok := d.GetOk("cpu_allocation_ratio"); ok { // if cpuAllocationRatio, ok := d.GetOk("cpu_allocation_ratio"); ok {
cpuAllocationRatio := cpuAllocationRatio.(float64) // cpuAllocationRatio := cpuAllocationRatio.(float64)
req := account.SetCPUAllocationRatioRequest{ // req := account.SetCPUAllocationRatioRequest{
AccountID: accountId, // AccountID: accountId,
Ratio: cpuAllocationRatio, // // Ratio: cpuAllocationRatio,
} // }
log.Debugf("setting account cpu allocation ratio") // log.Debugf("setting account cpu allocation ratio")
_, err := c.CloudBroker().Account().SetCPUAllocationRatio(ctx, req) // _, err := c.CloudBroker().Account().SetCPUAllocationRatio(ctx, req)
if err != nil { // if err != nil {
w.Add(err) // w.Add(err)
} // }
} // }
if !d.Get("enable").(bool) { if !d.Get("enable").(bool) {
_, err := c.CloudBroker().Account().Disable(ctx, account.DisableRequest{ _, err := c.CloudBroker().Account().Disable(ctx, account.DisableRequest{

View File

@@ -117,11 +117,11 @@ func utilityAccountCPURatioUpdate(ctx context.Context, d *schema.ResourceData, m
accountId, _ := strconv.ParseUint(d.Id(), 10, 64) accountId, _ := strconv.ParseUint(d.Id(), 10, 64)
cpuAllocacationRatio := d.Get("cpu_allocation_ratio").(float64) // cpuAllocacationRatio := d.Get("cpu_allocation_ratio").(float64)
_, err := c.CloudBroker().Account().SetCPUAllocationRatio(ctx, account.SetCPUAllocationRatioRequest{ _, err := c.CloudBroker().Account().SetCPUAllocationRatio(ctx, account.SetCPUAllocationRatioRequest{
AccountID: accountId, AccountID: accountId,
Ratio: cpuAllocacationRatio, // Ratio: cpuAllocacationRatio,
}) })
if err != nil { if err != nil {
return err return err

View File

@@ -13,7 +13,7 @@ func flattenDisk(d *schema.ResourceData, disk *disks.RecordDisk) {
d.Set("account_id", disk.AccountID) d.Set("account_id", disk.AccountID)
d.Set("account_name", disk.AccountName) d.Set("account_name", disk.AccountName)
d.Set("acl", string(diskAcl)) d.Set("acl", string(diskAcl))
d.Set("blk_discard", disk.BLKDiscard) d.Set("discard", disk.Discard)
d.Set("block_size", disk.BlockSize) d.Set("block_size", disk.BlockSize)
d.Set("boot_partition", disk.BootPartition) d.Set("boot_partition", disk.BootPartition)
d.Set("computes", flattenDiskComputes(disk.Computes)) d.Set("computes", flattenDiskComputes(disk.Computes))
@@ -187,7 +187,7 @@ func flattenDiskList(dl *disks.ListDisks) []map[string]interface{} {
"account_id": disk.AccountID, "account_id": disk.AccountID,
"account_name": disk.AccountName, "account_name": disk.AccountName,
"acl": string(diskAcl), "acl": string(diskAcl),
"blk_discard": disk.BLKDiscard, "discard": disk.Discard,
"block_size": disk.BlockSize, "block_size": disk.BlockSize,
"boot_partition": disk.BootPartition, "boot_partition": disk.BootPartition,
"computes": flattenDiskComputes(disk.Computes), "computes": flattenDiskComputes(disk.Computes),
@@ -276,7 +276,7 @@ func flattenDiskListUnattached(ul *disks.ListUnattachedDisks) []map[string]inter
"account_id": unattachedDisk.AccountID, "account_id": unattachedDisk.AccountID,
"account_name": unattachedDisk.AccountName, "account_name": unattachedDisk.AccountName,
"acl": string(unattachedDiskAcl), "acl": string(unattachedDiskAcl),
"blk_discard": unattachedDisk.BLKDiscard, "discard": unattachedDisk.Discard,
"block_size": unattachedDisk.BlockSize, "block_size": unattachedDisk.BlockSize,
"boot_partition": unattachedDisk.BootPartition, "boot_partition": unattachedDisk.BootPartition,
"created_time": unattachedDisk.CreatedTime, "created_time": unattachedDisk.CreatedTime,

View File

@@ -5,6 +5,16 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
) )
func resourceDiskV2() *schema.Resource {
s := resourceDiskSchemaMake()
s["blk_discard"] = &schema.Schema{
Type: schema.TypeBool,
Optional: true,
Default: false,
}
return &schema.Resource{Schema: s}
}
func resourceDiskV1() *schema.Resource { func resourceDiskV1() *schema.Resource {
return &schema.Resource{ return &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{

View File

@@ -79,8 +79,8 @@ func resourceDiskCreate(ctx context.Context, d *schema.ResourceData, m interface
req.Cache = cache.(string) req.Cache = cache.(string)
} }
if blkDiscard, ok := d.GetOk("blk_discard"); ok { if discard, ok := d.GetOk("discard"); ok {
req.BLKDiscard = blkDiscard.(bool) req.Discard = discard.(string)
} }
diskID, err := c.CloudBroker().Disks().Create(ctx, req) diskID, err := c.CloudBroker().Disks().Create(ctx, req)
@@ -250,15 +250,15 @@ func resourceDiskUpdate(ctx context.Context, d *schema.ResourceData, m interface
} }
} }
if d.HasChanges("cache", "blk_discard", "block_size") { if d.HasChanges("cache", "discard", "block_size") {
updateReq := disks.UpdateRequest{ updateReq := disks.UpdateRequest{
DiskID: uint64(d.Get("disk_id").(int)), DiskID: uint64(d.Get("disk_id").(int)),
} }
if d.HasChange("cache") { if d.HasChange("cache") {
updateReq.Cache = d.Get("cache").(string) updateReq.Cache = d.Get("cache").(string)
} }
if d.HasChange("blk_discard") { if d.HasChange("discard") {
updateReq.BLKDiscard = d.Get("blk_discard").(bool) updateReq.Discard = d.Get("discard").(string)
} }
if d.HasChange("block_size") { if d.HasChange("block_size") {
updateReq.BlockSize = d.Get("block_size").(string) updateReq.BlockSize = d.Get("block_size").(string)
@@ -460,7 +460,7 @@ func resourceDiskChangeNodes(ctx context.Context, d *schema.ResourceData, m inte
func ResourceDisk() *schema.Resource { func ResourceDisk() *schema.Resource {
return &schema.Resource{ return &schema.Resource{
SchemaVersion: 2, SchemaVersion: 3,
CreateContext: resourceDiskCreate, CreateContext: resourceDiskCreate,
ReadContext: resourceDiskRead, ReadContext: resourceDiskRead,
@@ -486,6 +486,11 @@ func ResourceDisk() *schema.Resource {
Upgrade: resourceDiskUpgradeV1, Upgrade: resourceDiskUpgradeV1,
Version: 1, Version: 1,
}, },
{
Type: resourceDiskV2().CoreConfigSchema().ImpliedType(),
Upgrade: resourceDiskUpgradeV2,
Version: 2,
},
}, },
} }
} }

View File

@@ -23,8 +23,8 @@ func dataSourceDiskSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"block_size": { "block_size": {
@@ -478,8 +478,8 @@ func dataSourceDiskListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"block_size": { "block_size": {
@@ -913,8 +913,8 @@ func dataSourceDiskListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"block_size": { "block_size": {
@@ -1367,8 +1367,8 @@ func dataSourceDiskListUnattachedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"block_size": { "block_size": {
@@ -1926,10 +1926,11 @@ func resourceDiskSchemaMake() map[string]*schema.Schema {
Default: false, Default: false,
Description: "restore deleting disk", Description: "restore deleting disk",
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Optional: true, Optional: true,
Default: false, Default: "ignore",
ValidateFunc: validation.StringInSlice([]string{"unmap", "ignore"}, false),
}, },
"block_size": { "block_size": {
Type: schema.TypeString, Type: schema.TypeString,

View File

@@ -12,3 +12,17 @@ func resourceDiskUpgradeV1(ctx context.Context, rawState map[string]interface{},
return rawState, nil return rawState, nil
} }
func resourceDiskUpgradeV2(ctx context.Context, rawState map[string]interface{}, meta any) (map[string]interface{}, error) {
log.Debug("resourceDiskUpgradeV2: upgrading state")
if v, ok := rawState["blk_discard"].(bool); ok {
if v {
rawState["discard"] = "unmap"
} else {
rawState["discard"] = "ignore"
}
}
delete(rawState, "blk_discard")
return rawState, nil
}

View File

@@ -9,8 +9,6 @@ import (
) )
func flattenGrid(d *schema.ResourceData, grid *grid.RecordGrid) { func flattenGrid(d *schema.ResourceData, grid *grid.RecordGrid) {
d.Set("ckey", grid.CKey)
d.Set("meta", flattens.FlattenMeta(grid.Meta))
d.Set("auth_broker", flattens.FlattenMeta(grid.AuthBroker)) d.Set("auth_broker", flattens.FlattenMeta(grid.AuthBroker))
d.Set("name", grid.Name) d.Set("name", grid.Name)
d.Set("flag", grid.Flag) d.Set("flag", grid.Flag)
@@ -20,7 +18,7 @@ func flattenGrid(d *schema.ResourceData, grid *grid.RecordGrid) {
d.Set("id", grid.ID) d.Set("id", grid.ID)
d.Set("network_modes", grid.NetworkModes) d.Set("network_modes", grid.NetworkModes)
d.Set("sdn_support", grid.SDNSupport) d.Set("sdn_support", grid.SDNSupport)
d.Set("zero_access_enabled", grid.ZeroAccessEnabled)
} }
func flattenGridList(gl *grid.ListGrids) []map[string]interface{} { func flattenGridList(gl *grid.ListGrids) []map[string]interface{} {
@@ -77,11 +75,26 @@ func flattenGridRecordResource(rr grid.RecordResource) []map[string]interface{}
"gpu": rr.GPU, "gpu": rr.GPU,
"ram": rr.RAM, "ram": rr.RAM,
"seps": flattenGridSeps(rr.SEPs), "seps": flattenGridSeps(rr.SEPs),
"policies": flattenGridPolicies(rr.Policies),
} }
res = append(res, temp) res = append(res, temp)
return res return res
} }
func flattenGridPolicies(policies map[string]grid.PolicyUsage) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(policies))
for policyID, policy := range policies {
temp := map[string]interface{}{
"policy_id": policyID,
"disk_size": policy.DiskSize,
"disk_size_max": policy.DiskSizeMax,
"seps": flattenGridSeps(policy.SEPs),
}
res = append(res, temp)
}
return res
}
func flattenGridSeps(seps map[string]map[string]grid.DiskUsage) []map[string]interface{} { func flattenGridSeps(seps map[string]map[string]grid.DiskUsage) []map[string]interface{} {
res := make([]map[string]interface{}, 0) res := make([]map[string]interface{}, 0)
for sepKey, sepVal := range seps { for sepKey, sepVal := range seps {
@@ -102,15 +115,22 @@ func flattenGridSettings(d *schema.ResourceData, gridSettings *grid.RecordSettin
limits, _ := json.Marshal(gridSettings.Limits) limits, _ := json.Marshal(gridSettings.Limits)
d.Set("allowed_ports", gridSettings.Allowedports) d.Set("allowed_ports", gridSettings.Allowedports)
d.Set("cleanup_retention_period", gridSettings.CleanupRetentionPeriod) d.Set("cleanup_retention_period", gridSettings.CleanupRetentionPeriod)
d.Set("cpu_allocation_ratio_vm", gridSettings.CPUAllocationRatioVM)
d.Set("cpu_allocation_ratio", gridSettings.CPUAllocationRatio)
d.Set("custom_backup_path", gridSettings.CustomBackupPath)
d.Set("docker_registry", flattenDockerRegistry(gridSettings.DockerRegistry)) d.Set("docker_registry", flattenDockerRegistry(gridSettings.DockerRegistry))
d.Set("enable_uptime_monitor", gridSettings.EnableUptimeMonitor) d.Set("enable_uptime_monitor", gridSettings.EnableUptimeMonitor)
d.Set("extnet_max_pre_reservations_num", gridSettings.ExtnetMaxPreReservationsNum) d.Set("extnet_max_pre_reservations_num", gridSettings.ExtnetMaxPreReservationsNum)
d.Set("healthcheck_notifications", flattenHealthcheckNotifications(gridSettings.HealthcheckNotifications)) d.Set("healthcheck_notifications", flattenHealthcheckNotifications(gridSettings.HealthcheckNotifications))
d.Set("interface_generation_scheme", gridSettings.InterfaceGenerationScheme)
d.Set("k8s_cleanup_enabled", gridSettings.K8sCleanupEnabled) d.Set("k8s_cleanup_enabled", gridSettings.K8sCleanupEnabled)
d.Set("limits", string(limits)) d.Set("limits", string(limits))
d.Set("location_url", gridSettings.LocationURL) d.Set("location_url", gridSettings.LocationURL)
d.Set("mac_address_prefix", gridSettings.MACAddressPrefix)
d.Set("net_qos", flattenNetQOS(gridSettings.NetQOS)) d.Set("net_qos", flattenNetQOS(gridSettings.NetQOS))
d.Set("networks", gridSettings.Networks) d.Set("networks", gridSettings.Networks)
d.Set("node_self_stop_timer_uptime_monitor", gridSettings.NodeSelfStopTimerUptimeMonitor)
d.Set("node_self_stop_uptime_monitor", gridSettings.NodeSelfStopUptimeMonitor)
d.Set("prometheus", flattenPrometheus(gridSettings.Prometheus)) d.Set("prometheus", flattenPrometheus(gridSettings.Prometheus))
d.Set("vins_max_pre_reservations_num", gridSettings.VinsMaxPreReservationsNum) d.Set("vins_max_pre_reservations_num", gridSettings.VinsMaxPreReservationsNum)
d.Set("vnfdev_mgmt_net_range", gridSettings.VnfdevMgmtNetRange) d.Set("vnfdev_mgmt_net_range", gridSettings.VnfdevMgmtNetRange)

View File

@@ -8,18 +8,6 @@ func dataSourceGetGridSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Required: true, Required: true,
}, },
"ckey": {
Type: schema.TypeString,
Computed: true,
},
"meta": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
Description: "meta",
},
"auth_broker": { "auth_broker": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
@@ -62,6 +50,10 @@ func dataSourceGetGridSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"zero_access_enabled": {
Type: schema.TypeBool,
Computed: true,
},
} }
} }
@@ -307,6 +299,53 @@ func dataSourceGridListEmailsSchemaMake() map[string]*schema.Schema {
return rets return rets
} }
func gridPoliciesSchemaMake() *schema.Schema {
return &schema.Schema{
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"policy_id": {
Type: schema.TypeString,
Computed: true,
},
"disk_size": {
Type: schema.TypeFloat,
Computed: true,
},
"disk_size_max": {
Type: schema.TypeFloat,
Computed: true,
},
"seps": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"sep_id": {
Type: schema.TypeString,
Computed: true,
},
"data_name": {
Type: schema.TypeString,
Computed: true,
},
"disk_size": {
Type: schema.TypeFloat,
Computed: true,
},
"disk_size_max": {
Type: schema.TypeFloat,
Computed: true,
},
},
},
},
},
},
}
}
func dataSourceGridGetConsumptionSchemaMake() map[string]*schema.Schema { func dataSourceGridGetConsumptionSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{ return map[string]*schema.Schema{
"grid_id": { "grid_id": {
@@ -366,6 +405,7 @@ func dataSourceGridGetConsumptionSchemaMake() map[string]*schema.Schema {
}, },
}, },
}, },
"policies": gridPoliciesSchemaMake(),
}, },
}, },
}, },
@@ -422,6 +462,7 @@ func dataSourceGridGetConsumptionSchemaMake() map[string]*schema.Schema {
}, },
}, },
}, },
"policies": gridPoliciesSchemaMake(),
}, },
}, },
}, },
@@ -489,6 +530,7 @@ func dataSourceGridListConsumptionSchemaMake() map[string]*schema.Schema {
}, },
}, },
}, },
"policies": gridPoliciesSchemaMake(),
}, },
}, },
}, },
@@ -545,6 +587,7 @@ func dataSourceGridListConsumptionSchemaMake() map[string]*schema.Schema {
}, },
}, },
}, },
"policies": gridPoliciesSchemaMake(),
}, },
}, },
}, },
@@ -749,5 +792,36 @@ func dataSourceGridGetSettingsSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"cpu_allocation_ratio_vm": {
Type: schema.TypeInt,
Computed: true,
},
"cpu_allocation_ratio": {
Type: schema.TypeInt,
Computed: true,
},
"custom_backup_path": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"interface_generation_scheme": {
Type: schema.TypeString,
Computed: true,
},
"mac_address_prefix": {
Type: schema.TypeString,
Computed: true,
},
"node_self_stop_timer_uptime_monitor": {
Type: schema.TypeInt,
Computed: true,
},
"node_self_stop_uptime_monitor": {
Type: schema.TypeBool,
Computed: true,
},
} }
} }

View File

@@ -64,9 +64,10 @@ func dataSourceImageListSchemaMake() map[string]*schema.Schema {
Description: "find by architecture", Description: "find by architecture",
}, },
"type_image": { "type_image": {
Type: schema.TypeString, Type: schema.TypeList,
Optional: true, Optional: true,
Description: "find by type", Description: "find by type",
Elem: &schema.Schema{Type: schema.TypeString},
}, },
"image_size": { "image_size": {
Type: schema.TypeInt, Type: schema.TypeInt,

View File

@@ -58,7 +58,9 @@ func utilityImageListCheckPresence(ctx context.Context, d *schema.ResourceData,
req.Status = status.(string) req.Status = status.(string)
} }
if typeImage, ok := d.GetOk("type_image"); ok { if typeImage, ok := d.GetOk("type_image"); ok {
req.TypeImage = typeImage.(string) for _, v := range typeImage.([]interface{}) {
req.TypeImage = append(req.TypeImage, v.(string))
}
} }
if imageSize, ok := d.GetOk("image_size"); ok { if imageSize, ok := d.GetOk("image_size"); ok {
req.ImageSize = uint64(imageSize.(int)) req.ImageSize = uint64(imageSize.(int))

View File

@@ -0,0 +1,98 @@
/*
Copyright (c) 2019-2023 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package kvmvm
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 dataSourceComputeCPUAlignmentProfileRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
profile, err := utilityComputeGetCPUAlignmentProfile(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
id := uuid.New()
d.SetId(id.String())
d.Set("model", profile.Model)
d.Set("name", profile.Name)
d.Set("vendor", profile.Vendor)
return nil
}
func dataSourceComputeCPUAlignmentProfileSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{
"compute_id": {
Type: schema.TypeInt,
Required: true,
Description: "ID of the compute instance",
},
"model": {
Type: schema.TypeString,
Computed: true,
Description: "CPU model of the alignment profile",
},
"name": {
Type: schema.TypeString,
Computed: true,
Description: "Name of the CPU alignment profile",
},
"vendor": {
Type: schema.TypeString,
Computed: true,
Description: "CPU vendor of the alignment profile",
},
}
}
func DataSourceComputeCPUAlignmentProfile() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceComputeCPUAlignmentProfileRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceComputeCPUAlignmentProfileSchemaMake(),
}
}

View File

@@ -39,8 +39,10 @@ func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute, p
d.Set("boot_disk_id", bootDisk.ID) d.Set("boot_disk_id", bootDisk.ID)
// we intentionally use the SizeMax field, do not change it until the BootDiskSize field is fixed on the platform // we intentionally use the SizeMax field, do not change it until the BootDiskSize field is fixed on the platform
d.Set("boot_disk_size", bootDisk.SizeMax) d.Set("boot_disk_size", bootDisk.SizeMax)
d.Set("boot_disk_discard", bootDisk.Discard)
d.Set("boot_image_id", bootDisk.ImageID) d.Set("boot_image_id", bootDisk.ImageID)
d.Set("chipset", computeRec.Chipset) d.Set("chipset", computeRec.Chipset)
d.Set("clock", computeRec.Clock)
d.Set("cd_image_id", computeRec.CdImageId) d.Set("cd_image_id", computeRec.CdImageId)
d.Set("clone_reference", computeRec.CloneReference) d.Set("clone_reference", computeRec.CloneReference)
d.Set("clones", computeRec.Clones) d.Set("clones", computeRec.Clones)
@@ -111,12 +113,26 @@ func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute, p
d.Set("zone_id", computeRec.ZoneID) d.Set("zone_id", computeRec.ZoneID)
d.Set("os_version", computeRec.OSVersion) d.Set("os_version", computeRec.OSVersion)
d.Set("cpu_pin", computeRec.CPUPin) d.Set("cpu_pin", computeRec.CPUPin)
d.Set("cpu_alignment_profile", computeRec.CPUAlignmentProfile.Name)
d.Set("numa_affinity", computeRec.NumaAffinity) d.Set("numa_affinity", computeRec.NumaAffinity)
d.Set("hp_backed", computeRec.HPBacked) d.Set("hp_backed", computeRec.HPBacked)
d.Set("weight", computeRec.Weight) d.Set("weight", computeRec.Weight)
return nil return nil
} }
func flattenCPUAlignmentProfile(profile compute.CPUAlignmentProfile) []map[string]interface{} {
if profile.Name == "" && profile.Model == "" && profile.Vendor == "" {
return nil
}
return []map[string]interface{}{
{
"name": profile.Name,
"model": profile.Model,
"vendor": profile.Vendor,
},
}
}
func flattenPCI(pciList compute.ListPCIDevices) []uint64 { func flattenPCI(pciList compute.ListPCIDevices) []uint64 {
res := make([]uint64, 0, len(pciList.Data)) res := make([]uint64, 0, len(pciList.Data))
@@ -291,7 +307,7 @@ func flattenComputeDisks(disksList compute.ListDisks, disksBlocks, extraDisks []
"delete_time": disk.DeletedTime, "delete_time": disk.DeletedTime,
"update_time": disk.UpdatedTime, "update_time": disk.UpdatedTime,
"cache": disk.Cache, "cache": disk.Cache,
"blk_discard": disk.BLKDiscard, "discard": disk.Discard,
"block_size": disk.BlockSize, "block_size": disk.BlockSize,
"provision": disk.Provision, "provision": disk.Provision,
"iotune": flattenIOTune(disk.IOTune), "iotune": flattenIOTune(disk.IOTune),
@@ -346,6 +362,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"arch": computeItem.Arch, "arch": computeItem.Arch,
"auto_start_w_node": computeItem.AutoStart, "auto_start_w_node": computeItem.AutoStart,
"chipset": computeItem.Chipset, "chipset": computeItem.Chipset,
"clock": computeItem.Clock,
"cd_image_id": computeItem.CdImageId, "cd_image_id": computeItem.CdImageId,
"boot_order": computeItem.BootOrder, "boot_order": computeItem.BootOrder,
"boot_image_id": computeItem.BootImageID, "boot_image_id": computeItem.BootImageID,
@@ -367,6 +384,7 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"guid": computeItem.GUID, "guid": computeItem.GUID,
"hp_backed": computeItem.HPBacked, "hp_backed": computeItem.HPBacked,
"compute_id": computeItem.ID, "compute_id": computeItem.ID,
"cpu_alignment_profiles": flattenCPUAlignmentProfile(computeItem.CPUAlignmentProfile),
"cpu_pin": computeItem.CPUPin, "cpu_pin": computeItem.CPUPin,
"interfaces": flattenInterfaces(computeItem.Interfaces), "interfaces": flattenInterfaces(computeItem.Interfaces),
"live_migration_job_id": computeItem.LiveMigrationJobID, "live_migration_job_id": computeItem.LiveMigrationJobID,
@@ -438,6 +456,7 @@ func flattenDeletedComputeList(computes *compute.ListDeletedComputes) []map[stri
"arch": computeItem.Arch, "arch": computeItem.Arch,
"auto_start_w_node": computeItem.AutoStart, "auto_start_w_node": computeItem.AutoStart,
"chipset": computeItem.Chipset, "chipset": computeItem.Chipset,
"clock": computeItem.Clock,
"cd_image_id": computeItem.CdImageId, "cd_image_id": computeItem.CdImageId,
"boot_order": computeItem.BootOrder, "boot_order": computeItem.BootOrder,
"bootdisk_size": computeItem.BootDiskSize, "bootdisk_size": computeItem.BootDiskSize,
@@ -459,6 +478,7 @@ func flattenDeletedComputeList(computes *compute.ListDeletedComputes) []map[stri
"guid": computeItem.GUID, "guid": computeItem.GUID,
"hp_backed": computeItem.HPBacked, "hp_backed": computeItem.HPBacked,
"compute_id": computeItem.ID, "compute_id": computeItem.ID,
"cpu_alignment_profiles": flattenCPUAlignmentProfile(computeItem.CPUAlignmentProfile),
"cpu_pin": computeItem.CPUPin, "cpu_pin": computeItem.CPUPin,
"interfaces": flattenInterfaces(computeItem.Interfaces), "interfaces": flattenInterfaces(computeItem.Interfaces),
"lock_status": computeItem.LockStatus, "lock_status": computeItem.LockStatus,
@@ -779,10 +799,12 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
d.Set("boot_order", compFacts.BootOrder) d.Set("boot_order", compFacts.BootOrder)
d.Set("boot_image_id", compFacts.ImageID) d.Set("boot_image_id", compFacts.ImageID)
d.Set("chipset", compFacts.Chipset) d.Set("chipset", compFacts.Chipset)
d.Set("clock", compFacts.Clock)
d.Set("cd_image_id", compFacts.CdImageId) d.Set("cd_image_id", compFacts.CdImageId)
d.Set("clone_reference", compFacts.CloneReference) d.Set("clone_reference", compFacts.CloneReference)
d.Set("clones", compFacts.Clones) d.Set("clones", compFacts.Clones)
d.Set("computeci_id", compFacts.ComputeCIID) d.Set("computeci_id", compFacts.ComputeCIID)
d.Set("cpu_alignment_profiles", flattenCPUAlignmentProfile(compFacts.CPUAlignmentProfile))
d.Set("cpu_pin", compFacts.CPUPin) d.Set("cpu_pin", compFacts.CPUPin)
d.Set("cpus", compFacts.CPUs) d.Set("cpus", compFacts.CPUs)
d.Set("created_by", compFacts.CreatedBy) d.Set("created_by", compFacts.CreatedBy)
@@ -907,7 +929,7 @@ func flattenDisk(diskList compute.ListDisks) []map[string]interface{} {
"ckey": disk.CKey, "ckey": disk.CKey,
"meta": flattens.FlattenMeta(disk.Meta), "meta": flattens.FlattenMeta(disk.Meta),
"account_id": disk.AccountID, "account_id": disk.AccountID,
"blk_discard": disk.BLKDiscard, "discard": disk.Discard,
"block_size": disk.BlockSize, "block_size": disk.BlockSize,
"boot_partition": disk.BootPartition, "boot_partition": disk.BootPartition,
"bus_number": disk.BusNumber, "bus_number": disk.BusNumber,

View File

@@ -1058,3 +1058,20 @@ func resourceComputeResourceV1() *schema.Resource {
}, },
} }
} }
func resourceComputeResourceV2() *schema.Resource {
s := resourceComputeSchemaMake()
// Add blk_discard
s["disks"].Elem.(*schema.Resource).Schema["blk_discard"] = &schema.Schema{
Type: schema.TypeBool,
Optional: true,
Default: false,
}
// Add boot_disk_blk_discard
s["boot_disk_blk_discard"] = &schema.Schema{
Type: schema.TypeBool,
Optional: true,
Default: false,
}
return &schema.Resource{Schema: s}
}

View File

@@ -89,12 +89,10 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
createReqX86.ZoneID = uint64(zoneID.(int)) createReqX86.ZoneID = uint64(zoneID.(int))
} }
if bootDiskBLKDiscard, ok := d.GetOk("boot_disk_blk_discard"); ok { if bootDiskDiscard, ok := d.GetOk("boot_disk_discard"); ok {
createReqX86.BootDiskBLKDiscard = bootDiskBLKDiscard.(bool) createReqX86.BootDiskDiscard = bootDiskDiscard.(string)
} }
createReqX86.Interfaces = make([]kvmx86.Interface, 0)
if networks, ok := d.GetOk("network"); ok { if networks, ok := d.GetOk("network"); ok {
if networks.(*schema.Set).Len() > 0 { if networks.(*schema.Set).Len() > 0 {
ns := networks.(*schema.Set).List() ns := networks.(*schema.Set).List()
@@ -179,8 +177,8 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
if cache, ok := diskVal["cache"]; ok { if cache, ok := diskVal["cache"]; ok {
reqDataDisk.Cache = cache.(string) reqDataDisk.Cache = cache.(string)
} }
if blkDiscard, ok := diskVal["blk_discard"]; ok { if discard, ok := diskVal["discard"]; ok {
reqDataDisk.BLKDiscard = blkDiscard.(bool) reqDataDisk.Discard = discard.(string)
} }
disksX86 = append(disksX86, reqDataDisk) disksX86 = append(disksX86, reqDataDisk)
} }
@@ -227,6 +225,9 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
createReqX86.CPUPin = d.Get("cpu_pin").(bool) createReqX86.CPUPin = d.Get("cpu_pin").(bool)
createReqX86.HPBacked = d.Get("hp_backed").(bool) createReqX86.HPBacked = d.Get("hp_backed").(bool)
createReqX86.Chipset = d.Get("chipset").(string) createReqX86.Chipset = d.Get("chipset").(string)
if clock, ok := d.GetOk("clock"); ok {
createReqX86.Clock = clock.(string)
}
if preferredCPU, ok := d.GetOk("preferred_cpu"); ok { if preferredCPU, ok := d.GetOk("preferred_cpu"); ok {
preferredList := preferredCPU.([]interface{}) preferredList := preferredCPU.([]interface{})
@@ -527,6 +528,17 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if profileName, ok := d.GetOk("cpu_alignment_profile"); ok {
req := compute.SetCPUAlignmentProfileRequest{
ComputeIDs: []int64{int64(computeId)},
CPUAlignmentProfile: profileName.(string),
}
_, err := c.CloudBroker().Compute().SetCPUAlignmentProfile(ctx, req)
if err != nil {
warnings.Add(err)
}
}
if ars, ok := d.GetOk("affinity_rules"); ok { if ars, ok := d.GetOk("affinity_rules"); ok {
log.Debugf("resourceComputeCreate: Create affinity rules on ComputeID: %d", computeId) log.Debugf("resourceComputeCreate: Create affinity rules on ComputeID: %d", computeId)
addedAR := ars.([]interface{}) addedAR := ars.([]interface{})
@@ -872,8 +884,8 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChange("boot_disk_blk_discard") { if d.HasChange("boot_disk_discard") {
if err := utilityComputeUpdateBootDiskBLKDiscard(ctx, d, m); err != nil { if err := utilityComputeUpdateBootDiskDiscard(ctx, d, m); err != nil {
return diag.FromErr(err) return diag.FromErr(err)
} }
} }
@@ -893,6 +905,7 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
if d.HasChanges("description", if d.HasChanges("description",
"name", "name",
"clock",
"numa_affinity", "numa_affinity",
"cpu_pin", "cpu_pin",
"hp_backed", "hp_backed",
@@ -1026,6 +1039,12 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChange("cpu_alignment_profile") {
if err := utilityComputeUpdateCPUAlignmentProfile(ctx, d, m); err != nil {
return diag.FromErr(err)
}
}
return append(resourceComputeRead(ctx, d, m), warnings.Get()...) return append(resourceComputeRead(ctx, d, m), warnings.Get()...)
} }
@@ -1057,7 +1076,7 @@ func resourceComputeDelete(ctx context.Context, d *schema.ResourceData, m interf
func ResourceCompute() *schema.Resource { func ResourceCompute() *schema.Resource {
return &schema.Resource{ return &schema.Resource{
SchemaVersion: 2, SchemaVersion: 3,
CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, i interface{}) error { CustomizeDiff: func(ctx context.Context, diff *schema.ResourceDiff, i interface{}) error {
if diff.HasChanges() || diff.HasChanges("chipset", "pin_to_node", "auto_start_w_node", "libvirt_settings", "network", "affinity_rules", "anti_affinity_rules", if diff.HasChanges() || diff.HasChanges("chipset", "pin_to_node", "auto_start_w_node", "libvirt_settings", "network", "affinity_rules", "anti_affinity_rules",
@@ -1100,6 +1119,11 @@ func ResourceCompute() *schema.Resource {
Upgrade: resourceCompueteStateUpgradeV1, Upgrade: resourceCompueteStateUpgradeV1,
Version: 1, Version: 1,
}, },
{
Type: resourceComputeResourceV2().CoreConfigSchema().ImpliedType(),
Upgrade: resourceComputeStateUpgradeV2,
Version: 2,
},
}, },
} }
} }

View File

@@ -153,6 +153,10 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"clock": {
Type: schema.TypeString,
Computed: true,
},
"cd_image_id": { "cd_image_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
@@ -172,6 +176,26 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"cpu_alignment_profiles": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
},
"model": {
Type: schema.TypeString,
Computed: true,
},
"vendor": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"cpu_pin": { "cpu_pin": {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
@@ -228,8 +252,8 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"block_size": { "block_size": {
@@ -1413,6 +1437,10 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"clock": {
Type: schema.TypeString,
Computed: true,
},
"cd_image_id": { "cd_image_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
@@ -1432,6 +1460,26 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"cpu_alignment_profiles": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
},
"model": {
Type: schema.TypeString,
Computed: true,
},
"vendor": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"cpu_pin": { "cpu_pin": {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
@@ -2177,6 +2225,10 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"clock": {
Type: schema.TypeString,
Computed: true,
},
"cd_image_id": { "cd_image_id": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
@@ -2196,6 +2248,26 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"cpu_alignment_profiles": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
},
"model": {
Type: schema.TypeString,
Computed: true,
},
"vendor": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"cpu_pin": { "cpu_pin": {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
@@ -3430,16 +3502,24 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false), // observe case while validating ValidateFunc: validation.StringInSlice([]string{"Q35", "i440fx"}, false), // observe case while validating
Description: "Type of the emulated system.", Description: "Type of the emulated system.",
}, },
"clock": {
Type: schema.TypeString,
Optional: true,
Default: "default",
ValidateFunc: validation.StringInSlice([]string{"default", "linux", "windows", "none"}, false),
Description: "Clock synchronization mode.",
},
"without_boot_disk": { "without_boot_disk": {
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
Default: false, Default: false,
Description: "If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state.", Description: "If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state.",
}, },
"boot_disk_blk_discard": { "boot_disk_discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Optional: true, Optional: true,
Default: false, Default: "ignore",
ValidateFunc: validation.StringInSlice([]string{"unmap", "ignore"}, false),
}, },
"create_blank": { "create_blank": {
Type: schema.TypeBool, Type: schema.TypeBool,
@@ -3668,6 +3748,11 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Computed: true, Computed: true,
Description: "Set affinity label for compute", Description: "Set affinity label for compute",
}, },
"cpu_alignment_profile": {
Type: schema.TypeString,
Optional: true,
Description: "CPU alignment profile name",
},
"affinity_rules": { "affinity_rules": {
Type: schema.TypeList, Type: schema.TypeList,
Optional: true, Optional: true,
@@ -3773,10 +3858,11 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Required: true, Required: true,
Description: "Storage policy id of disk. The rules of the specified storage policy will be used.", Description: "Storage policy id of disk. The rules of the specified storage policy will be used.",
}, },
"blk_discard": { "discard": {
Type: schema.TypeBool, Type: schema.TypeString,
Optional: true, Optional: true,
Default: false, Default: "ignore",
ValidateFunc: validation.StringInSlice([]string{"unmap", "ignore"}, false),
}, },
"block_size": { "block_size": {
Type: schema.TypeString, Type: schema.TypeString,

View File

@@ -18,3 +18,33 @@ func resourceCompueteStateUpgradeV1(ctx context.Context, rawState map[string]int
return rawState, nil return rawState, nil
} }
func resourceComputeStateUpgradeV2(ctx context.Context, rawState map[string]interface{}, meta any) (map[string]interface{}, error) {
log.Debug("resourceComputeStateUpgradeV2: upgrading state")
if v, ok := rawState["boot_disk_blk_discard"].(bool); ok {
if v {
rawState["boot_disk_discard"] = "unmap"
} else {
rawState["boot_disk_discard"] = "ignore"
}
}
delete(rawState, "boot_disk_blk_discard")
if disks, ok := rawState["disks"].([]interface{}); ok {
for _, d := range disks {
if disk, ok := d.(map[string]interface{}); ok {
if v, ok := disk["blk_discard"].(bool); ok {
if v {
disk["discard"] = "unmap"
} else {
disk["discard"] = "ignore"
}
}
delete(disk, "blk_discard")
}
}
}
return rawState, nil
}

View File

@@ -265,7 +265,7 @@ func utilityComputeUpdateDisks(ctx context.Context, d *schema.ResourceData, m in
renamedDisks := make([]interface{}, 0) renamedDisks := make([]interface{}, 0)
changeStoragePolicyDisks := make([]interface{}, 0) changeStoragePolicyDisks := make([]interface{}, 0)
cacheUpdatedDisks := make([]interface{}, 0) cacheUpdatedDisks := make([]interface{}, 0)
blkDiscardUpdatedDisks := make([]interface{}, 0) discardUpdatedDisks := make([]interface{}, 0)
blockSizeUpdatedDisks := make([]interface{}, 0) blockSizeUpdatedDisks := make([]interface{}, 0)
iotuneUpdatedDisks := make([]interface{}, 0) iotuneUpdatedDisks := make([]interface{}, 0)
migratedDisks := make([]interface{}, 0) migratedDisks := make([]interface{}, 0)
@@ -325,8 +325,8 @@ func utilityComputeUpdateDisks(ctx context.Context, d *schema.ResourceData, m in
cacheUpdatedDisks = append(cacheUpdatedDisks, el) cacheUpdatedDisks = append(cacheUpdatedDisks, el)
} }
if isChangeBLKDiscardDisk(oldConv, el) { if isChangeDiscardDisk(oldConv, el) {
blkDiscardUpdatedDisks = append(blkDiscardUpdatedDisks, el) discardUpdatedDisks = append(discardUpdatedDisks, el)
} }
if isChangeBlockSizeDisk(oldConv, el) { if isChangeBlockSizeDisk(oldConv, el) {
@@ -515,8 +515,8 @@ func utilityComputeUpdateDisks(ctx context.Context, d *schema.ResourceData, m in
} }
} }
if len(blkDiscardUpdatedDisks) > 0 { if len(discardUpdatedDisks) > 0 {
for _, disk := range blkDiscardUpdatedDisks { for _, disk := range discardUpdatedDisks {
diskConv := disk.(map[string]interface{}) diskConv := disk.(map[string]interface{})
if isBootDisk(diskConv, chipset) { if isBootDisk(diskConv, chipset) {
continue continue
@@ -529,7 +529,7 @@ func utilityComputeUpdateDisks(ctx context.Context, d *schema.ResourceData, m in
req := disks.UpdateRequest{ req := disks.UpdateRequest{
DiskID: diskID, DiskID: diskID,
BLKDiscard: diskConv["blk_discard"].(bool), Discard: diskConv["discard"].(string),
} }
_, err := c.CloudBroker().Disks().Update(ctx, req) _, err := c.CloudBroker().Disks().Update(ctx, req)
if err != nil { if err != nil {
@@ -672,10 +672,10 @@ func utilityComputeUpdateBootDiskCache(ctx context.Context, d *schema.ResourceDa
return err return err
} }
func utilityComputeUpdateBootDiskBLKDiscard(ctx context.Context, d *schema.ResourceData, m interface{}) error { func utilityComputeUpdateBootDiskDiscard(ctx context.Context, d *schema.ResourceData, m interface{}) error {
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
newBLKDiscard := d.Get("boot_disk_blk_discard").(bool) newDiscard := d.Get("boot_disk_discard").(string)
var bootDiskID uint64 var bootDiskID uint64
if v, ok := d.GetOk("boot_disk_id"); ok { if v, ok := d.GetOk("boot_disk_id"); ok {
@@ -685,12 +685,12 @@ func utilityComputeUpdateBootDiskBLKDiscard(ctx context.Context, d *schema.Resou
} }
if bootDiskID == 0 { if bootDiskID == 0 {
return fmt.Errorf("cannot update boot_disk_cache: boot disk ID is unknown for compute %s", d.Id()) return fmt.Errorf("cannot update boot_disk_discard: boot disk ID is unknown for compute %s", d.Id())
} }
req := disks.UpdateRequest{ req := disks.UpdateRequest{
DiskID: bootDiskID, DiskID: bootDiskID,
BLKDiscard: newBLKDiscard, Discard: newDiscard,
} }
_, err := c.CloudBroker().Disks().Update(ctx, req) _, err := c.CloudBroker().Disks().Update(ctx, req)
@@ -1304,6 +1304,9 @@ func utilityComputeUpdate(ctx context.Context, d *schema.ResourceData, m interfa
if d.HasChange("chipset") { if d.HasChange("chipset") {
req.Chipset = d.Get("chipset").(string) req.Chipset = d.Get("chipset").(string)
} }
if d.HasChange("clock") {
req.Clock = d.Get("clock").(string)
}
if d.HasChange("loader_type") { if d.HasChange("loader_type") {
req.LoaderType = d.Get("loader_type").(string) req.LoaderType = d.Get("loader_type").(string)
@@ -2308,12 +2311,12 @@ func isChangeCacheDisk(els []interface{}, el interface{}) bool {
return false return false
} }
func isChangeBLKDiscardDisk(els []interface{}, el interface{}) bool { func isChangeDiscardDisk(els []interface{}, el interface{}) bool {
for _, elOld := range els { for _, elOld := range els {
elOldConv := elOld.(map[string]interface{}) elOldConv := elOld.(map[string]interface{})
elConv := el.(map[string]interface{}) elConv := el.(map[string]interface{})
if elOldConv["disk_id"].(int) == elConv["disk_id"].(int) && if elOldConv["disk_id"].(int) == elConv["disk_id"].(int) &&
elOldConv["blk_discard"].(bool) != elConv["blk_discard"].(bool) { elOldConv["discard"].(string) != elConv["discard"].(string) {
return true return true
} }
} }

View File

@@ -0,0 +1,71 @@
/*
Copyright (c) 2019-2023 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package kvmvm
import (
"context"
"strconv"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/compute"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityComputeUpdateCPUAlignmentProfile(ctx context.Context, d *schema.ResourceData, m interface{}) error {
c := m.(*controller.ControllerCfg)
computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
profileName := d.Get("cpu_alignment_profile").(string)
if profileName == "" {
req := compute.DeleteCPUAlignmentProfileRequest{
ComputeIDs: []uint64{computeId},
}
_, err := c.CloudBroker().Compute().DeleteCPUAlignmentProfile(ctx, req)
return err
}
req := compute.SetCPUAlignmentProfileRequest{
ComputeIDs: []int64{int64(computeId)},
CPUAlignmentProfile: profileName,
}
_, err := c.CloudBroker().Compute().SetCPUAlignmentProfile(ctx, req)
return err
}
func utilityComputeGetCPUAlignmentProfile(ctx context.Context, d *schema.ResourceData, m interface{}) (*compute.CPUAlignmentProfile, error) {
c := m.(*controller.ControllerCfg)
req := compute.GetCPUAlignmentProfileRequest{
ComputeID: uint64(d.Get("compute_id").(int)),
}
return c.CloudBroker().Compute().GetCPUAlignmentProfile(ctx, req)
}

View File

@@ -0,0 +1,355 @@
/*
Copyright (c) 2019-2023 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Sergey Kisil, <svkisil@digitalenergy.online>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package node
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/decort-golang-sdk/pkg/cloudbroker/node"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func dataSourceNodeNetworkInfoRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
c := m.(*controller.ControllerCfg)
req := node.GetNetworkInfoRequest{
NodeID: uint64(d.Get("node_id").(int)),
}
info, err := c.CloudBroker().Node().GetNetworkInfo(ctx, req)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
id := uuid.New()
d.SetId(id.String())
d.Set("system_networks_info", flattenSystemNetworksInfo(info.SystemNetworksInfo))
d.Set("ovs_networks_info", flattenOVSNetworksInfo(info.OVSNetworksInfo))
d.Set("libvirt_networks_info", flattenLibvirtNetworksInfo(info.LibvirtNetworksInfo))
d.Set("topology", flattenNetworkTopology(info.Topology))
return nil
}
func dataSourceNodeNetworkInfoSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{
"node_id": {
Type: schema.TypeInt,
Required: true,
Description: "Node ID",
},
"system_networks_info": {
Type: schema.TypeList,
Computed: true,
Description: "System-level information about all network interfaces on the node",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
Description: "Interface name",
},
"mtu": {
Type: schema.TypeInt,
Computed: true,
Description: "MTU value",
},
"speed": {
Type: schema.TypeInt,
Computed: true,
Description: "Interface link speed",
},
"bridge_id": {
Type: schema.TypeString,
Computed: true,
Description: "Linux bridge ID",
},
"bport_id": {
Type: schema.TypeString,
Computed: true,
Description: "Bridge port ID",
},
"mac": {
Type: schema.TypeString,
Computed: true,
Description: "MAC address",
},
},
},
},
"ovs_networks_info": {
Type: schema.TypeList,
Computed: true,
Description: "Raw OVS ports data",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"bridge_name": {
Type: schema.TypeString,
Computed: true,
Description: "Bridge name",
},
"bridge_tag": {
Type: schema.TypeString,
Computed: true,
Description: "Bridge tag",
},
"interface_uuid": {
Type: schema.TypeString,
Computed: true,
Description: "Interface UUID",
},
"interface_type": {
Type: schema.TypeString,
Computed: true,
Description: "Interface type",
},
"interface_name": {
Type: schema.TypeString,
Computed: true,
Description: "Interface name",
},
"interface_mtu": {
Type: schema.TypeInt,
Computed: true,
Description: "Interface MTU value",
},
"interface_ip": {
Type: schema.TypeString,
Computed: true,
Description: "Interface IP address",
},
"interface_mac": {
Type: schema.TypeString,
Computed: true,
Description: "Interface MAC address",
},
"interface_peer": {
Type: schema.TypeString,
Computed: true,
Description: "Interface peer name",
},
},
},
},
"libvirt_networks_info": {
Type: schema.TypeList,
Computed: true,
Description: "VM network interface connections",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"vm_name": {
Type: schema.TypeString,
Computed: true,
Description: "VM name",
},
"interface": {
Type: schema.TypeString,
Computed: true,
Description: "Host-side interface name used by the VM",
},
"interface_type": {
Type: schema.TypeString,
Computed: true,
Description: "Interface type",
},
"interface_source": {
Type: schema.TypeString,
Computed: true,
Description: "Name of the bridge the VM interface is attached to",
},
},
},
},
"topology": {
Type: schema.TypeList,
Computed: true,
Description: "Assembled network topology of the node",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"interfaces": {
Type: schema.TypeList,
Computed: true,
Description: "Network interfaces and their topology details",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
Description: "Interface name",
},
"type": {
Type: schema.TypeString,
Computed: true,
Description: "Interface type",
},
"mtu": {
Type: schema.TypeInt,
Computed: true,
Description: "Interface MTU value",
},
"speed": {
Type: schema.TypeInt,
Computed: true,
Description: "Interface link speed",
},
"vlans": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
Description: "VLANs associated with the interface",
},
"bridge_id": {
Type: schema.TypeString,
Computed: true,
Description: "Linux bridge ID",
},
"peer": {
Type: schema.TypeString,
Computed: true,
Description: "Peer interface name",
},
"uuid": {
Type: schema.TypeString,
Computed: true,
Description: "OVS UUID",
},
"connected_interfaces": {
Type: schema.TypeList,
Computed: true, Elem: &schema.Schema{Type: schema.TypeString},
Description: "Names of interfaces attached to this bridge as ports",
},
"connections": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"vms": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {Type: schema.TypeString, Computed: true},
"vm_interface": {Type: schema.TypeString, Computed: true},
"vm_interface_type": {Type: schema.TypeString, Computed: true},
"connection_type": {Type: schema.TypeString, Computed: true},
"via_bridge": {Type: schema.TypeString, Computed: true},
},
},
},
"bridges": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {Type: schema.TypeString, Computed: true},
"type": {Type: schema.TypeString, Computed: true},
"via": {Type: schema.TypeString, Computed: true},
"bport_id": {Type: schema.TypeString, Computed: true},
"port_info": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {Type: schema.TypeString, Computed: true},
"type": {Type: schema.TypeString, Computed: true},
"mtu": {Type: schema.TypeInt, Computed: true},
"vlan": {Type: schema.TypeString, Computed: true},
"uuid": {Type: schema.TypeString, Computed: true},
},
},
},
},
},
},
},
},
},
"bridge_info": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"type": {Type: schema.TypeString, Computed: true},
"ports": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {Type: schema.TypeString, Computed: true},
"type": {Type: schema.TypeString, Computed: true},
"mtu": {Type: schema.TypeInt, Computed: true},
"vlan": {Type: schema.TypeString, Computed: true},
"uuid": {Type: schema.TypeString, Computed: true},
"ip": {Type: schema.TypeString, Computed: true},
"mac": {Type: schema.TypeString, Computed: true},
},
},
},
},
},
},
"bridge_connections": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {Type: schema.TypeString, Computed: true},
"via": {Type: schema.TypeString, Computed: true},
"vlan": {Type: schema.TypeString, Computed: true},
},
},
},
},
},
},
},
},
},
}
}
func DataSourceNodeNetworkInfo() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceNodeNetworkInfoRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceNodeNetworkInfoSchemaMake(),
}
}

View File

@@ -0,0 +1,172 @@
/*
Copyright (c) 2019-2023 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Sergey Kisil, <svkisil@digitalenergy.online>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package node
import (
"context"
"github.com/google/uuid"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
sdknode "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/node"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func dataSourceNodePCIDevicesRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
c := m.(*controller.ControllerCfg)
req := sdknode.GetPCIDevicesRequest{
NodeID: uint64(d.Get("node_id").(int)),
}
if v, ok := d.GetOk("search"); ok {
req.Search = v.(string)
}
if v, ok := d.GetOk("sort_by"); ok {
req.SortBy = v.(string)
}
if v, ok := d.GetOk("page"); ok {
req.Page = uint64(v.(int))
}
if v, ok := d.GetOk("size"); ok {
req.Size = uint64(v.(int))
}
list, err := c.CloudBroker().Node().GetPCIDevices(ctx, req)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
id := uuid.New()
d.SetId(id.String())
d.Set("items", flattenNodePCIDevices(list.Data))
d.Set("entry_count", list.EntryCount)
return nil
}
func dataSourceNodePCIDevicesSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{
"node_id": {
Type: schema.TypeInt,
Required: true,
Description: "Node ID",
},
"search": {
Type: schema.TypeString,
Optional: true,
Description: "Search string",
},
"sort_by": {
Type: schema.TypeString,
Optional: true,
Description: "Sort by one of supported fields, format +|-(field)",
},
"page": {
Type: schema.TypeInt,
Optional: true,
Description: "Page number",
},
"size": {
Type: schema.TypeInt,
Optional: true,
Description: "Page size",
},
"entry_count": {
Type: schema.TypeInt,
Computed: true,
Description: "Total number of PCI devices",
},
"items": {
Type: schema.TypeList,
Computed: true,
Description: "List of PCI devices",
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"hw_path": {
Type: schema.TypeString,
Computed: true,
Description: "Hardware path",
},
"current_driver": {
Type: schema.TypeString,
Computed: true,
Description: "Current driver",
},
"numa_node": {
Type: schema.TypeInt,
Computed: true,
Description: "NUMA node",
},
"product_id": {
Type: schema.TypeString,
Computed: true,
Description: "Product ID",
},
"product_name": {
Type: schema.TypeString,
Computed: true,
Description: "Product name",
},
"vendor_id": {
Type: schema.TypeString,
Computed: true,
Description: "Vendor ID",
},
"vendor_name": {
Type: schema.TypeString,
Computed: true,
Description: "Vendor name",
},
"iommu_group": {
Type: schema.TypeInt,
Computed: true,
Description: "IOMMU group",
},
},
},
},
}
}
func DataSourceNodePCIDevices() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceNodePCIDevicesRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceNodePCIDevicesSchemaMake(),
}
}

View File

@@ -173,6 +173,7 @@ func flattenNodeList(nodes *node.ListNodes) []map[string]interface{} {
"cpu_allocation_ratio": item.CPUAllocationRatio, "cpu_allocation_ratio": item.CPUAllocationRatio,
"mem_allocation_ratio": item.MemAllocationRatio, "mem_allocation_ratio": item.MemAllocationRatio,
"packages": flattenPackages(item.Packages), "packages": flattenPackages(item.Packages),
"pci_devices": flattenNodePCIDevices(item.PCIDevices),
} }
res = append(res, temp) res = append(res, temp)
} }
@@ -189,7 +190,16 @@ func flattenNumaTopology(info node.NumaTopologyInfo) []map[string]interface{} {
memoryTemp := []map[string]interface{}{ memoryTemp := []map[string]interface{}{
{ {
"one_g": item.Memory.OneG, "one_g": item.Memory.OneG,
"one_g_free": item.Memory.OneGFree,
"one_g_reserved": item.Memory.OneGReserved,
"one_g_available": item.Memory.OneGAvailable,
"one_g_used": item.Memory.OneGUsed,
"one_g_dpdk_reserved": item.Memory.OneGDPDKReserved,
"two_m": item.Memory.TwoM, "two_m": item.Memory.TwoM,
"two_m_free": item.Memory.TwoMFree,
"two_m_reserved": item.Memory.TwoMReserved,
"two_m_available": item.Memory.TwoMAvailable,
"two_m_used": item.Memory.TwoMUsed,
"total": item.Memory.Total, "total": item.Memory.Total,
}, },
} }
@@ -339,3 +349,178 @@ func flattenRole(role node.Role) []map[string]interface{} {
res[0] = temp res[0] = temp
return res return res
} }
func flattenSystemNetworksInfo(m map[string]node.SystemNetworkInfo) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(m))
for name, info := range m {
res = append(res, map[string]interface{}{
"name": name,
"mtu": info.MTU,
"speed": info.Speed,
"bridge_id": info.BridgeID,
"bport_id": info.BPortID,
"mac": info.MAC,
})
}
return res
}
func flattenOVSNetworksInfo(items []node.OVSNetworkInfo) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(items))
for _, item := range items {
res = append(res, map[string]interface{}{
"bridge_name": item.BridgeName,
"bridge_tag": item.BridgeTag,
"interface_uuid": item.InterfaceUUID,
"interface_type": item.InterfaceType,
"interface_name": item.InterfaceName,
"interface_mtu": item.InterfaceMTU,
"interface_ip": item.InterfaceIP,
"interface_mac": item.InterfaceMAC,
"interface_peer": item.InterfacePeer,
})
}
return res
}
func flattenLibvirtNetworksInfo(items []node.LibvirtNetworkInfo) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(items))
for _, item := range items {
res = append(res, map[string]interface{}{
"vm_name": item.VMName,
"interface": item.Interface,
"interface_type": item.InterfaceType,
"interface_source": item.InterfaceSource,
})
}
return res
}
func flattenNetworkTopology(t node.NetworkTopology) []map[string]interface{} {
return []map[string]interface{}{
{
"interfaces": flattenTopologyInterfaces(t.Interfaces),
},
}
}
func flattenTopologyInterfaces(m map[string]node.TopologyInterface) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(m))
for name, iface := range m {
res = append(res, map[string]interface{}{
"name": name,
"type": iface.Type,
"mtu": iface.MTU,
"speed": iface.Speed,
"vlans": iface.VLANs,
"bridge_id": iface.BridgeID,
"peer": iface.Peer,
"uuid": iface.UUID,
"connected_interfaces": iface.ConnectedInterfaces,
"connections": flattenTopologyConnections(iface.Connections),
"bridge_info": flattenTopologyBridgeInfo(iface.BridgeInfo),
"bridge_connections": flattenTopologyBridgeRefs(iface.BridgeConnections),
})
}
return res
}
func flattenTopologyConnections(c node.TopologyInterfaceConnections) []map[string]interface{} {
vms := make([]map[string]interface{}, 0, len(c.VMs))
for _, vm := range c.VMs {
vms = append(vms, map[string]interface{}{
"name": vm.Name,
"vm_interface": vm.VMInterface,
"vm_interface_type": vm.VMInterfaceType,
"connection_type": vm.ConnectionType,
"via_bridge": vm.ViaBridge,
})
}
bridges := make([]map[string]interface{}, 0, len(c.Bridges))
for _, b := range c.Bridges {
portInfo := flattenTopologyPortInfo(b.PortInfo)
bridges = append(bridges, map[string]interface{}{
"name": b.Name,
"type": b.Type,
"via": b.Via,
"bport_id": b.BPortID,
"port_info": portInfo,
})
}
return []map[string]interface{}{
{
"vms": vms,
"bridges": bridges,
},
}
}
func flattenTopologyPortInfo(p *node.TopologyPortInfo) []map[string]interface{} {
if p == nil {
return nil
}
return []map[string]interface{}{
{
"name": p.Name,
"type": p.Type,
"mtu": p.MTU,
"vlan": p.VLAN,
"uuid": p.UUID,
},
}
}
func flattenTopologyBridgeInfo(b *node.TopologyBridgeInfo) []map[string]interface{} {
if b == nil {
return nil
}
ports := make([]map[string]interface{}, 0, len(b.Ports))
for _, p := range b.Ports {
ports = append(ports, map[string]interface{}{
"name": p.Name,
"type": p.Type,
"mtu": p.MTU,
"vlan": p.VLAN,
"uuid": p.UUID,
"ip": p.IP,
"mac": p.MAC,
})
}
return []map[string]interface{}{
{
"type": b.Type,
"ports": ports,
},
}
}
func flattenTopologyBridgeRefs(refs []node.TopologyBridgeRef) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(refs))
for _, r := range refs {
res = append(res, map[string]interface{}{
"name": r.Name,
"via": r.Via,
"vlan": r.VLAN,
})
}
return res
}
func flattenNodePCIDevices(items []node.ItemPCIDevice) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(items))
for _, item := range items {
res = append(res, map[string]interface{}{
"hw_path": item.HWPath,
"current_driver": item.CurrentDriver,
"numa_node": item.NUMANode,
"product_id": item.ProductID,
"product_name": item.ProductName,
"vendor_id": item.VendorID,
"vendor_name": item.VendorName,
"iommu_group": item.IOMMUGroup,
})
}
return res
}

View File

@@ -331,10 +331,46 @@ func dataSourceNodeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"one_g_free": {
Type: schema.TypeInt,
Computed: true,
},
"one_g_reserved": {
Type: schema.TypeInt,
Computed: true,
},
"one_g_available": {
Type: schema.TypeInt,
Computed: true,
},
"one_g_used": {
Type: schema.TypeInt,
Computed: true,
},
"one_g_dpdk_reserved": {
Type: schema.TypeInt,
Computed: true,
},
"two_m": { "two_m": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"two_m_free": {
Type: schema.TypeInt,
Computed: true,
},
"two_m_reserved": {
Type: schema.TypeInt,
Computed: true,
},
"two_m_available": {
Type: schema.TypeInt,
Computed: true,
},
"two_m_used": {
Type: schema.TypeInt,
Computed: true,
},
"total": { "total": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
@@ -848,10 +884,46 @@ func dataSourceNodeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"one_g_free": {
Type: schema.TypeInt,
Computed: true,
},
"one_g_reserved": {
Type: schema.TypeInt,
Computed: true,
},
"one_g_available": {
Type: schema.TypeInt,
Computed: true,
},
"one_g_used": {
Type: schema.TypeInt,
Computed: true,
},
"one_g_dpdk_reserved": {
Type: schema.TypeInt,
Computed: true,
},
"two_m": { "two_m": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"two_m_free": {
Type: schema.TypeInt,
Computed: true,
},
"two_m_reserved": {
Type: schema.TypeInt,
Computed: true,
},
"two_m_available": {
Type: schema.TypeInt,
Computed: true,
},
"two_m_used": {
Type: schema.TypeInt,
Computed: true,
},
"total": { "total": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
@@ -978,6 +1050,46 @@ func dataSourceNodeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"pci_devices": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"hw_path": {
Type: schema.TypeString,
Computed: true,
},
"current_driver": {
Type: schema.TypeString,
Computed: true,
},
"numa_node": {
Type: schema.TypeInt,
Computed: true,
},
"product_id": {
Type: schema.TypeString,
Computed: true,
},
"product_name": {
Type: schema.TypeString,
Computed: true,
},
"vendor_id": {
Type: schema.TypeString,
Computed: true,
},
"vendor_name": {
Type: schema.TypeString,
Computed: true,
},
"iommu_group": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
}, },
}, },
}, },

View File

@@ -667,14 +667,13 @@ func resourceRGSetCPUAllocationParameter(ctx context.Context, d *schema.Resource
} }
func resourceRGSetCPUAllocationRatio(ctx context.Context, d *schema.ResourceData, m interface{}) error { func resourceRGSetCPUAllocationRatio(ctx context.Context, d *schema.ResourceData, m interface{}) error {
cpuAllocationRatio := d.Get("cpu_allocation_ratio").(float64) // log.Debugf("resourceRGSetCPUAllocationRatio: cpuAllocationRatio %s for rg id %d", cpuAllocationRatio, uint64(d.Get("rg_id").(int)))
log.Debugf("resourceRGSetCPUAllocationRatio: cpuAllocationRatio %s for rg id %d", cpuAllocationRatio, uint64(d.Get("rg_id").(int)))
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
req := rg.SetCPUAllocationRatioRequest{ req := rg.SetCPUAllocationRatioRequest{
RGID: uint64(d.Get("rg_id").(int)), RGID: uint64(d.Get("rg_id").(int)),
Ratio: cpuAllocationRatio, Ratio: uint64(d.Get("cpu_allocation_ratio").(int)),
} }
_, err := c.CloudBroker().RG().SetCPUAllocationRatio(ctx, req) _, err := c.CloudBroker().RG().SetCPUAllocationRatio(ctx, req)

View File

@@ -36,19 +36,18 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/sep" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/sep"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
) )
func utilitySepConsumptionCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*sep.RecordConsumption, error) { func utilitySepConsumptionCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*sep.RecordConsumption, error) {
c := m.(*controller.ControllerCfg) // c := m.(*controller.ControllerCfg)
req := sep.ConsumptionRequest{ // req := sep.ConsumptionRequest{
SEPID: uint64(d.Get("sep_id").(int)), // SEPID: uint64(d.Get("sep_id").(int)),
} // }
sepCons, err := c.CloudBroker().SEP().Consumption(ctx, req) // nil, err := c.CloudBroker().SEP().Consumption(ctx, req)
if err != nil { // if err != nil {
return nil, err // return nil, err
} // }
return sepCons, nil return nil, nil
} }

View File

@@ -63,7 +63,6 @@ func flattenUserDataSource(d *schema.ResourceData, details *user.ItemUser) {
d.Set("guid", details.GUID) d.Set("guid", details.GUID)
d.Set("last_check", details.LastCheck) d.Set("last_check", details.LastCheck)
d.Set("mobile", flattenItemUser(details.Mobile)) d.Set("mobile", flattenItemUser(details.Mobile))
d.Set("password", details.Password)
d.Set("protected", details.Protected) d.Set("protected", details.Protected)
d.Set("roles", flattenItemUser(details.Roles)) d.Set("roles", flattenItemUser(details.Roles))
d.Set("service_account", details.ServiceAccount) d.Set("service_account", details.ServiceAccount)
@@ -157,7 +156,6 @@ func flattenUserList(users *user.ListUsers) []map[string]interface{} {
"user_id": item.ID, "user_id": item.ID,
"last_check": item.LastCheck, "last_check": item.LastCheck,
"mobile": flattenItemUser(item.Mobile), "mobile": flattenItemUser(item.Mobile),
"password": item.Password,
"protected": item.Protected, "protected": item.Protected,
"roles": flattenItemUser(item.Roles), "roles": flattenItemUser(item.Roles),
"service_account": item.ServiceAccount, "service_account": item.ServiceAccount,

View File

@@ -26,10 +26,7 @@ func resourceUserCreate(ctx context.Context, d *schema.ResourceData, m interface
EmailAddress: email, EmailAddress: email,
} }
if passwd, ok := d.GetOk("password"); ok { createReq.Password = d.Get("password").(string)
createReq.Password = passwd.(string)
}
if provider, ok := d.GetOk("provider_name"); ok { if provider, ok := d.GetOk("provider_name"); ok {
createReq.Provider = provider.(string) createReq.Provider = provider.(string)

View File

@@ -111,11 +111,6 @@ func dataSourceUserSchemaMake() map[string]*schema.Schema {
}, },
Description: "mobile", Description: "mobile",
}, },
"password": {
Type: schema.TypeString,
Computed: true,
Description: "password",
},
"protected": { "protected": {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
@@ -370,11 +365,6 @@ func dataSourceUserListSchemaMake() map[string]*schema.Schema {
}, },
Description: "mobile", Description: "mobile",
}, },
"password": {
Type: schema.TypeString,
Computed: true,
Description: "password",
},
"protected": { "protected": {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
@@ -427,8 +417,8 @@ func resourceUserSchemaMake() map[string]*schema.Schema {
}, },
"password": { "password": {
Type: schema.TypeString, Type: schema.TypeString,
Default: "strongpassword", Required: true,
Optional: true, Sensitive: true,
Description: "password of user", Description: "password of user",
}, },
"provider_name": { "provider_name": {

View File

@@ -0,0 +1,97 @@
/*
Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package zone
import (
"context"
"strconv"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func dataSourceZoneCPUAlignmentProfileRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
profiles, err := utilityZoneCPUAlignmentProfileCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
d.SetId(strconv.Itoa(d.Get("zone_id").(int)))
d.Set("profiles", flattenCPUAlignmentProfiles(profiles))
return nil
}
func dataSourceZoneCPUAlignmentProfileSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{
"zone_id": {
Type: schema.TypeInt,
Required: true,
},
"profiles": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
},
"vendor": {
Type: schema.TypeString,
Computed: true,
},
"model": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
}
}
func DataSourceZoneCPUAlignmentProfile() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceZoneCPUAlignmentProfileRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceZoneCPUAlignmentProfileSchemaMake(),
}
}

View File

@@ -0,0 +1,115 @@
/*
Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package zone
import (
"context"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"github.com/google/uuid"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func dataSourceZoneCPUAlignmentProfileListRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
list, err := utilityZoneCPUAlignmentProfileListCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
id := uuid.New()
d.SetId(id.String())
d.Set("items", flattenZoneCPUAlignmentProfileList(list))
d.Set("entry_count", list.EntryCount)
return nil
}
func dataSourceZoneCPUAlignmentProfileListSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{
"zone_id": {
Type: schema.TypeInt,
Optional: true,
},
"items": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"zone_id": {
Type: schema.TypeInt,
Computed: true,
},
"cpu_alignment_profiles": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
},
"vendor": {
Type: schema.TypeString,
Computed: true,
},
"model": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
},
},
},
"entry_count": {
Type: schema.TypeInt,
Computed: true,
},
}
}
func DataSourceZoneCPUAlignmentProfileList() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceZoneCPUAlignmentProfileListRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceZoneCPUAlignmentProfileListSchemaMake(),
}
}

View File

@@ -0,0 +1,159 @@
/*
Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package zone
import (
"context"
"strconv"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func dataSourceZoneCPUAlignmentProfileTestRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
result, err := utilityZoneCPUAlignmentProfileTestCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
d.SetId(strconv.Itoa(d.Get("zone_id").(int)))
d.Set("profiles", flattenCPUAlignmentProfiles(result.Profiles))
d.Set("candidates", flattenCPUAlignmentProfileCandidates(result.Candidates))
d.Set("supported_cpu_models", flattenSupportedCpuModels(result.SupportedCpuModels))
return nil
}
func dataSourceZoneCPUAlignmentProfileTestSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{
"zone_id": {
Type: schema.TypeInt,
Required: true,
},
"hypervisor_similarity_in_percentage": {
Type: schema.TypeInt,
Optional: true,
},
"profiles": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
},
"vendor": {
Type: schema.TypeString,
Computed: true,
},
"model": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"candidates": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
},
"vendor": {
Type: schema.TypeString,
Computed: true,
},
"model": {
Type: schema.TypeString,
Computed: true,
},
"count": {
Type: schema.TypeInt,
Computed: true,
},
"percentage": {
Type: schema.TypeFloat,
Computed: true,
},
"required_count": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
"supported_cpu_models": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"vendor": {
Type: schema.TypeString,
Computed: true,
},
"model": {
Type: schema.TypeString,
Computed: true,
},
"count": {
Type: schema.TypeInt,
Computed: true,
},
"percentage": {
Type: schema.TypeFloat,
Computed: true,
},
},
},
},
}
}
func DataSourceZoneCPUAlignmentProfileTest() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceZoneCPUAlignmentProfileTestRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceZoneCPUAlignmentProfileTestSchemaMake(),
}
}

View File

@@ -71,12 +71,64 @@ func flattenZone(d *schema.ResourceData, item *zone.RecordZone) error {
d.Set("ssl_skip_verify", item.SSLSkipVerify) d.Set("ssl_skip_verify", item.SSLSkipVerify)
d.Set("domain", item.Domain) d.Set("domain", item.Domain)
d.Set("sso_type", item.SSOType) d.Set("sso_type", item.SSOType)
d.Set("cpu_alignment_profiles", flattenCPUAlignmentProfiles(item.CpuAlignmentProfiles))
log.Debugf("flattenZone: decoded RecordZone name %q / ID %d, complete", log.Debugf("flattenZone: decoded RecordZone name %q / ID %d, complete",
item.Name, item.ID) item.Name, item.ID)
return nil return nil
} }
func flattenCPUAlignmentProfiles(profiles []zone.CpuAlignmentProfile) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(profiles))
for _, p := range profiles {
res = append(res, map[string]interface{}{
"name": p.Name,
"vendor": p.Vendor,
"model": p.Model,
})
}
return res
}
func flattenCPUAlignmentProfileCandidates(candidates []zone.CpuAlignmentProfileCandidate) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(candidates))
for _, c := range candidates {
res = append(res, map[string]interface{}{
"name": c.Name,
"vendor": c.Vendor,
"model": c.Model,
"count": int(c.Count),
"percentage": c.Percentage,
"required_count": int(c.RequiredCount),
})
}
return res
}
func flattenSupportedCpuModels(models []zone.SupportedCpuModel) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(models))
for _, m := range models {
res = append(res, map[string]interface{}{
"vendor": m.Vendor,
"model": m.Model,
"count": int(m.Count),
"percentage": m.Percentage,
})
}
return res
}
func flattenZoneCPUAlignmentProfileList(list *zone.ListCPUAlignmentProfiles) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(list.Data))
for _, item := range list.Data {
res = append(res, map[string]interface{}{
"zone_id": int(item.ZoneID),
"cpu_alignment_profiles": flattenCPUAlignmentProfiles(item.CpuAlignmentProfiles),
})
}
return res
}
func flattenZoneList(zone *zone.ListZones) []map[string]interface{} { func flattenZoneList(zone *zone.ListZones) []map[string]interface{} {
log.Debugf("flattenZoneList start") log.Debugf("flattenZoneList start")
res := make([]map[string]interface{}, 0, len(zone.Data)) res := make([]map[string]interface{}, 0, len(zone.Data))

View File

@@ -97,6 +97,14 @@ func resourceZoneCreate(ctx context.Context, d *schema.ResourceData, m interface
} }
} }
if similarity, ok := d.GetOk("hypervisor_similarity_in_percentage"); ok {
if s := similarity.(int); s > 0 {
if err := utilityZoneCPUAlignmentProfileUpdate(ctx, d, m, zoneID); err != nil {
warnings.Add(err)
}
}
}
log.Debugf("resourceZoneCreate: create Zone with ID: %d, complete", zoneID) log.Debugf("resourceZoneCreate: create Zone with ID: %d, complete", zoneID)
return append(resourceZoneRead(ctx, d, m), warnings.Get()...) return append(resourceZoneRead(ctx, d, m), warnings.Get()...)
} }
@@ -127,6 +135,12 @@ func resourceZoneUpdate(ctx context.Context, d *schema.ResourceData, m interface
} }
} }
if d.HasChange("hypervisor_similarity_in_percentage") {
if err := utilityZoneCPUAlignmentProfileUpdate(ctx, d, m, zoneID); err != nil {
return diag.FromErr(err)
}
}
log.Debugf("resourceZoneUpdate: update Zone with id %d, complete", zoneID) log.Debugf("resourceZoneUpdate: update Zone with id %d, complete", zoneID)
return resourceZoneRead(ctx, d, m) return resourceZoneRead(ctx, d, m)
@@ -279,6 +293,30 @@ func resourceZoneSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"hypervisor_similarity_in_percentage": {
Type: schema.TypeInt,
Optional: true,
},
"cpu_alignment_profiles": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"name": {
Type: schema.TypeString,
Computed: true,
},
"vendor": {
Type: schema.TypeString,
Computed: true,
},
"model": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"id": { "id": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,

View File

@@ -146,6 +146,33 @@ func utilityZoneUpdate(ctx context.Context, d *schema.ResourceData, m interface{
return nil return nil
} }
func utilityZoneCPUAlignmentProfileUpdate(ctx context.Context, d *schema.ResourceData, m interface{}, zoneID uint64) error {
c := m.(*controller.ControllerCfg)
newVal := d.Get("hypervisor_similarity_in_percentage").(int)
if newVal > 0 {
req := zone.AddCPUAlignmentProfileRequest{
ZoneID: zoneID,
HypervisorSimilarityInPercentage: uint64(newVal),
}
if _, err := c.CloudBroker().Zone().AddCPUAlignmentProfile(ctx, req); err != nil {
return err
}
log.Debugf("utilityZoneCPUAlignmentProfileUpdate: added CPU alignment profile for zone %d with similarity %d%%", zoneID, newVal)
} else {
req := zone.DeleteCPUAlignmentProfileRequest{
ZoneID: zoneID,
}
if _, err := c.CloudBroker().Zone().DeleteCPUAlignmentProfile(ctx, req); err != nil {
return err
}
log.Debugf("utilityZoneCPUAlignmentProfileUpdate: deleted CPU alignment profile for zone %d", zoneID)
}
return nil
}
func containsNodes(set []interface{}, check interface{}) bool { func containsNodes(set []interface{}, check interface{}) bool {
for _, elem := range set { for _, elem := range set {
elemConv := elem.(int) elemConv := elem.(int)

View File

@@ -0,0 +1,77 @@
/*
Copyright (c) 2019-2024 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors:
Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
/*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it
builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/
package zone
import (
"context"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/zone"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func utilityZoneCPUAlignmentProfileCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) ([]zone.CpuAlignmentProfile, error) {
c := m.(*controller.ControllerCfg)
req := zone.GetCPUAlignmentProfileRequest{
ZoneID: uint64(d.Get("zone_id").(int)),
}
return c.CloudBroker().Zone().GetCPUAlignmentProfile(ctx, req)
}
func utilityZoneCPUAlignmentProfileListCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.ListCPUAlignmentProfiles, error) {
c := m.(*controller.ControllerCfg)
req := zone.ListCPUAlignmentProfileRequest{}
if zoneID, ok := d.GetOk("zone_id"); ok {
req.ZoneID = uint64(zoneID.(int))
}
return c.CloudBroker().Zone().ListCPUAlignmentProfile(ctx, req)
}
func utilityZoneCPUAlignmentProfileTestCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (*zone.TestCPUAlignmentProfileResult, error) {
c := m.(*controller.ControllerCfg)
req := zone.TestCPUAlignmentProfileRequest{
ZoneID: uint64(d.Get("zone_id").(int)),
}
if similarity, ok := d.GetOk("hypervisor_similarity_in_percentage"); ok {
req.HypervisorSimilarityInPercentage = uint64(similarity.(int))
}
return c.CloudBroker().Zone().TestCPUAlignmentProfile(ctx, req)
}

View File

@@ -68,6 +68,7 @@
- kvmvm_snapshot_usage - kvmvm_snapshot_usage
- kvmvm_user_list - kvmvm_user_list
- kvmvm_vgpu_list - kvmvm_vgpu_list
- kvmvm_cpu_alignment_profile
- lb - lb
- lb_list - lb_list
- lb_list_deleted - lb_list_deleted
@@ -209,11 +210,14 @@
- cb_kvmvm_snapshot_usage - cb_kvmvm_snapshot_usage
- cb_kvmvm_user_list - cb_kvmvm_user_list
- cb_kvmvm_vgpu_list - cb_kvmvm_vgpu_list
- cb_kvmvm_cpu_alignment_profile
- cb_lb - cb_lb
- cb_lb_list - cb_lb_list
- cb_lb_list_deleted - cb_lb_list_deleted
- cb_node - cb_node
- cb_node_list - cb_node_list
- cb_node_network_info
- cb_node_pci_devices
- cb_pcidevice - cb_pcidevice
- cb_pcidevice_list - cb_pcidevice_list
- cb_rg - cb_rg
@@ -259,6 +263,9 @@
- cb_vins_static_route_list - cb_vins_static_route_list
- cb_zone - cb_zone
- cb_zone_list - cb_zone_list
- cb_zone_cpu_alignment_profile
- cb_zone_cpu_alignment_profile_list
- cb_zone_cpu_alignment_profile_test
- resources: - resources:
- cb_account - cb_account
- cb_cdrom_image - cb_cdrom_image

View File

@@ -55,8 +55,8 @@ data "decort_image_list" "il" {
#фильтр по типу образа #фильтр по типу образа
#опциональный параметр #опциональный параметр
#тип - строка #тип - массив строк
#type_image = "cdrom" #type_image = ["linux", "windows"]
#фильтр по размеру образа #фильтр по размеру образа
#опциональный параметр #опциональный параметр

View File

@@ -44,11 +44,10 @@ resource "decort_image_virtual" "iv" {
link_to = 123 link_to = 123
#id аккаунта #id аккаунта
#опциональный параметр #обязательный параметр
#значение по умолчанию - 0
#тип - целое число #тип - целое число
#используется при создании #используется при создании
#account_id = 123 account_id = 123
} }

View File

@@ -0,0 +1,38 @@
/*
Пример использования
Получение данных о профиле CPU alignment виртуальной машины
*/
#Раскомментируйте этот код,
#и внесите необходимые правки в версию и путь,
#чтобы работать с установленным вручную (не через 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_kvmvm_cpu_alignment_profile" "cpu_alignment_profile" {
#id виртуальной машины
#обязательный параметр
#тип - целое число
compute_id = 100
}
output "output" {
value = data.decort_kvmvm_cpu_alignment_profile.cpu_alignment_profile
}

View File

@@ -69,6 +69,13 @@ resource "decort_kvmvm" "comp" {
#используется при создании и обновлении #используется при создании и обновлении
#chipset = "i440fx" #chipset = "i440fx"
#тип часов для ВМ
#опциональный параметр
#возможные значения: "default", "linux", "windows", "none"
#по умолчанию - "default"
#используется при создании и обновлении
#clock = "linux"
#размер загрузочного диска #размер загрузочного диска
#опциональный параметр #опциональный параметр
#тип - целое число #тип - целое число
@@ -293,6 +300,11 @@ resource "decort_kvmvm" "comp" {
#используется при создании и обновлении #используется при создании и обновлении
#affinity_label = "test4" #affinity_label = "test4"
#имя профиля CPU alignment
#опциональный параметр
#тип - строка
#используется при создании и обновлении
#cpu_alignment_profile = "balanced"
#id экстра дисков #id экстра дисков
#опциональный параметр #опциональный параметр

View File

@@ -134,10 +134,11 @@ resource "decort_cb_disk" "my_disk01" {
#включение режима unmap для диска #включение режима unmap для диска
#опциональный параметр #опциональный параметр
#тип - булев #тип - строка
#по умолчанию - false #по умолчанию - "ignore"
#возможные варианты: "ignore" или "unmap"
#используется при создании и обновлении #используется при создании и обновлении
#blk_discard = false #discard = "unmap"
#размер блока диска #размер блока диска
#опциональный параметр #опциональный параметр

View File

@@ -54,8 +54,8 @@ data "decort_cb_image_list" "il" {
#фильтр по типу образа #фильтр по типу образа
#опциональный параметр #опциональный параметр
#тип - строка #тип - массив строк
#type_image = "cdrom" #type_image = ["linux", "windows"]
#фильтр по размеру образа #фильтр по размеру образа
#опциональный параметр #опциональный параметр

View File

@@ -0,0 +1,38 @@
/*
Пример использования
Получение данных о профиле CPU alignment виртуальной машины
*/
#Раскомментируйте этот код,
#и внесите необходимые правки в версию и путь,
#чтобы работать с установленным вручную (не через 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_kvmvm_cpu_alignment_profile" "cpu_alignment_profile" {
#id виртуальной машины
#обязательный параметр
#тип - целое число
compute_id = 100
}
output "output" {
value = data.decort_cb_kvmvm_cpu_alignment_profile.cpu_alignment_profile
}

View File

@@ -69,6 +69,13 @@ resource "decort_cb_kvmvm" "comp" {
#используется при создании и обновлении #используется при создании и обновлении
#chipset = "Q35" #chipset = "Q35"
#тип часов для ВМ
#опциональный параметр
#возможные значения: "default", "linux", "windows", "none"
#по умолчанию - "default"
#используется при создании и обновлении
#clock = "linux"
#id образа диска для создания compute #id образа диска для создания compute
#опциональный параметр #опциональный параметр
#тип - целое число #тип - целое число
@@ -197,7 +204,6 @@ resource "decort_cb_kvmvm" "comp" {
#возможные варианты: "none" или "writethrough" #возможные варианты: "none" или "writethrough"
#cache = "none" #cache = "none"
#опциональный параметр #опциональный параметр
#тип - целое число #тип - целое число
#sep_id = 1 #sep_id = 1
@@ -228,9 +234,11 @@ resource "decort_cb_kvmvm" "comp" {
#включение режима unmap для диска #включение режима unmap для диска
#опциональный параметр #опциональный параметр
#тип - булев #тип - строка
#по умолчанию - false #по умолчанию - "ignore"
#blk_discard = false #возможные варианты: "ignore" или "unmap"
#используется при создании и обновлении
#discard = "unmap"
#размер блока диска #размер блока диска
#опциональный параметр #опциональный параметр
@@ -336,6 +344,12 @@ resource "decort_cb_kvmvm" "comp" {
#используется при создании и обновлении #используется при создании и обновлении
#affinity_label = "test4" #affinity_label = "test4"
#имя профиля CPU alignment
#опциональный параметр
#тип - строка
#используется при создании и обновлении
#cpu_alignment_profile = "balanced"
#id экстра дисков #id экстра дисков
#опциональный параметр #опциональный параметр
#тип - список чисел #тип - список чисел
@@ -724,10 +738,11 @@ resource "decort_cb_kvmvm" "comp" {
#включение режима unmap для boot диска #включение режима unmap для boot диска
#опциональный параметр #опциональный параметр
#тип - булев #тип - строка
#по умолчанию - false #по умолчанию - "ignore"
#используется при создании и обновлении #используется при создании и обновлении
#boot_disk_blk_discard = false #возможные варианты: "ignore" или "unmap"
#boot_disk_discard = "unmap"
} }
output "test" { output "test" {

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_node_network_info" "network_info" {
#id ноды
#обязательный параметр
#тип - целое число
node_id = 100
}
output "output" {
value = data.decort_cb_node_network_info.network_info
}

View File

@@ -0,0 +1,58 @@
/*
Пример использования
Получение списка PCI-устройств ноды
*/
#Раскомментируйте этот код,
#и внесите необходимые правки в версию и путь,
#чтобы работать с установленным вручную (не через 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_node_pci_devices" "pci_devices" {
#id ноды
#обязательный параметр
#тип - целое число
node_id = 100
#строка поиска
#опциональный параметр
#тип - строка
#search = "nvidia"
#сортировка по полю, формат +|-(поле)
#опциональный параметр
#тип - строка
#sort_by = "+product_name"
#номер страницы
#опциональный параметр
#тип - целое число
#page = 1
#размер страницы
#опциональный параметр
#тип - целое число
#size = 10
}
output "output" {
value = data.decort_cb_node_pci_devices.pci_devices
}

View File

@@ -44,11 +44,10 @@ resource "decort_cb_user" "user" {
emailaddress = "user1@example.com" emailaddress = "user1@example.com"
#пароль пользователя #пароль пользователя
#значение по умолчанию strongpassword #обязательный параметр
#опциональный параметр
#тип - строка #тип - строка
#используется при создании #используется при создании
#password = "user1Password" password = "user1Password"
#список групп доступа к api, к которым принадлежит этот пользователь #список групп доступа к api, к которым принадлежит этот пользователь
#опциональный параметр #опциональный параметр

View File

@@ -0,0 +1,38 @@
/*
Пример использования
Получение профиля выравнивания CPU зоны по её id
*/
#Расскомментируйте этот код,
#и внесите необходимые правки в версию и путь,
#чтобы работать с установленным вручную (не через 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_zone_cpu_alignment_profile" "cap" {
#идентификатор зоны
#обязательный параметр
#тип - целое число
zone_id = 1
}
output "test" {
value = data.decort_cb_zone_cpu_alignment_profile.cap
}

View File

@@ -0,0 +1,38 @@
/*
Пример использования
Получение списка профилей выравнивания CPU зон
*/
#Расскомментируйте этот код,
#и внесите необходимые правки в версию и путь,
#чтобы работать с установленным вручную (не через 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_zone_cpu_alignment_profile_list" "cap_list" {
#фильтрация по идентификатору зоны
#опциональный параметр
#тип - целое число
#zone_id = 1
}
output "test" {
value = data.decort_cb_zone_cpu_alignment_profile_list.cap_list
}

View File

@@ -0,0 +1,43 @@
/*
Пример использования
Тестирование профиля выравнивания CPU зоны
*/
#Расскомментируйте этот код,
#и внесите необходимые правки в версию и путь,
#чтобы работать с установленным вручную (не через 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_zone_cpu_alignment_profile_test" "cap_test" {
#идентификатор зоны
#обязательный параметр
#тип - целое число
zone_id = 1
#схожесть гипервизоров в процентах
#опциональный параметр
#тип - целое число
#hypervisor_similarity_in_percentage = 70
}
output "test" {
value = data.decort_cb_zone_cpu_alignment_profile_test.cap_test
}

View File

@@ -63,6 +63,12 @@ resource "decort_cb_zone" "zone" {
#значение по умолчанию - false #значение по умолчанию - false
#используется при создании #используется при создании
#drs = false #drs = false
#профиль выравнивания CPU
#опциональный параметр
#тип - целое число
#используется при создании и обновлении
#hypervisor_similarity_in_percentage = 70
} }
output "test" { output "test" {