Compare commits

..

3 Commits
4.8.4 ... 4.7.6

Author SHA1 Message Date
dayterr
e0e788cacc 4.7.6 2025-08-07 14:26:43 +03:00
7546634d05 4.7.5 2025-07-23 12:15:51 +03:00
d6caa7e214 4.7.4 2025-05-21 14:20:55 +03:00
87 changed files with 1435 additions and 2340 deletions

3
.gitignore vendored
View File

@@ -4,5 +4,4 @@ url_scrapping/
terraform-provider-decort* terraform-provider-decort*
.vscode/ .vscode/
.DS_Store .DS_Store
vendor/
.idea/

View File

@@ -1,9 +1,8 @@
## Version 4.8.4 ## Version 4.7.6
### Исправлено ### Исправлено
#### kvmvm #### kvmvm
| Идентификатор<br>задачи | Описание | | Идентификатор<br>задачи | Описание |
| --- | --- | | --- | --- |
| BATF-1015 | Ошибка при изменении полей `ram` и `cpu`, приводящая к невозможности измения параметров виртуальной машины в resources `decort_kvmvm` и `decort_cb_kvmvm` в cloudapi/kvmvm и в cloudbroker/kvmvm | | BATF-1050 | Перезагрузка виртуальной машины при изменении полей `ram` и `cpu` в resources `decort_kvmvm` и `decort_cb_kvmvm` в cloudapi/kvmvm и в cloudbroker/kvmvm |
| BATF-1017 | Ошибка при изменении поля `started`, приводящая к невозможности запуска виртуальной машины в resources `decort_kvmvm` в cloudapi/kvmvm |

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.8.4 VERSION=4.7.6
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\

View File

@@ -6,7 +6,6 @@ Terraform provider для платформы Digital Energy Cloud Orchestration
| Версия DECORT API | Версия провайдера Terraform | | Версия DECORT API | Версия провайдера Terraform |
| ------ | ------ | | ------ | ------ |
| 4.2.0 | 4.8.x |
| 4.1.0 | 4.7.x | | 4.1.0 | 4.7.x |
| 4.0.0 | 4.6.x | | 4.0.0 | 4.6.x |
| 3.8.9 | 4.5.x | | 3.8.9 | 4.5.x |

View File

@@ -93,7 +93,6 @@ Read-Only:
Read-Only: Read-Only:
- `account_id` (Number)
- `client_type` (String) - `client_type` (String)
- `desc` (String) - `desc` (String)
- `domain_name` (String) - `domain_name` (String)

View File

@@ -1,61 +0,0 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "decort_cb_extnet_reserved_ip_list Data Source - terraform-provider-decort"
subcategory: ""
description: |-
---
# decort_cb_extnet_reserved_ip_list (Data Source)
<!-- schema generated by tfplugindocs -->
## Schema
### Required
- `account_id` (Number)
### Optional
- `extnet_id` (Number)
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
### Read-Only
- `id` (String) The ID of this resource.
- `items` (List of Object) (see [below for nested schema](#nestedatt--items))
<a id="nestedblock--timeouts"></a>
### Nested Schema for `timeouts`
Optional:
- `default` (String)
- `read` (String)
<a id="nestedatt--items"></a>
### Nested Schema for `items`
Read-Only:
- `extnet_id` (Number)
- `reservations` (List of Object) (see [below for nested schema](#nestedobjatt--items--reservations))
<a id="nestedobjatt--items--reservations"></a>
### Nested Schema for `items.reservations`
Read-Only:
- `account_id` (Number)
- `client_type` (String)
- `domain_name` (String)
- `hostname` (String)
- `ip` (String)
- `mac` (String)
- `type` (String)
- `vm_id` (Number)

View File

@@ -17,7 +17,6 @@ description: |-
### Required ### Required
- `file_path` (String)
- `gid` (Number) - `gid` (Number)
### Optional ### Optional
@@ -26,6 +25,7 @@ description: |-
### Read-Only ### Read-Only
- `diagnosis` (String)
- `id` (String) The ID of this resource. - `id` (String) The ID of this resource.
<a id="nestedblock--timeouts"></a> <a id="nestedblock--timeouts"></a>

View File

@@ -0,0 +1,37 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "decort_cb_grid_post_diagnosis Data Source - terraform-provider-decort"
subcategory: ""
description: |-
---
# decort_cb_grid_post_diagnosis (Data Source)
<!-- schema generated by tfplugindocs -->
## Schema
### Required
- `gid` (Number)
### Optional
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
### Read-Only
- `diagnosis` (String)
- `id` (String) The ID of this resource.
<a id="nestedblock--timeouts"></a>
### Nested Schema for `timeouts`
Optional:
- `default` (String)
- `read` (String)

View File

@@ -59,7 +59,6 @@ description: |-
- `rescuecd` (Boolean) - `rescuecd` (Boolean)
- `sep_id` (Number) storage endpoint provider ID - `sep_id` (Number) storage endpoint provider ID
- `size` (Number) image size - `size` (Number) image size
- `snapshot_id` (String) snapshot id
- `status` (String) status - `status` (String) status
- `tech_status` (String) tech atatus - `tech_status` (String) tech atatus
- `unc_path` (String) unc path - `unc_path` (String) unc path

View File

@@ -89,7 +89,6 @@ Read-Only:
- `sep_id` (Number) - `sep_id` (Number)
- `shared_with` (List of Number) - `shared_with` (List of Number)
- `size` (Number) - `size` (Number)
- `snapshot_id` (String)
- `status` (String) - `status` (String)
- `tech_status` (String) - `tech_status` (String)
- `unc_path` (String) - `unc_path` (String)

View File

@@ -33,7 +33,6 @@ description: |-
- `affinity_weight` (Number) - `affinity_weight` (Number)
- `anti_affinity_rules` (List of Object) (see [below for nested schema](#nestedatt--anti_affinity_rules)) - `anti_affinity_rules` (List of Object) (see [below for nested schema](#nestedatt--anti_affinity_rules))
- `arch` (String) - `arch` (String)
- `auto_start_w_node` (Boolean)
- `boot_disk_id` (Number) - `boot_disk_id` (Number)
- `boot_disk_size` (Number) - `boot_disk_size` (Number)
- `boot_order` (List of String) - `boot_order` (List of String)
@@ -78,7 +77,6 @@ description: |-
- `pci_devices` (List of Number) - `pci_devices` (List of Number)
- `pinned` (Boolean) - `pinned` (Boolean)
- `pool` (String) - `pool` (String)
- `preferred_cpu` (List of Number)
- `ram` (Number) - `ram` (Number)
- `reference_id` (String) - `reference_id` (String)
- `registered` (Boolean) - `registered` (Boolean)
@@ -99,10 +97,9 @@ description: |-
- `updated_time` (Number) - `updated_time` (Number)
- `user_data` (String) - `user_data` (String)
- `user_managed` (Boolean) - `user_managed` (Boolean)
- `vgpus` (List of Number) - `vgpus` (List of Object) (see [below for nested schema](#nestedatt--vgpus))
- `virtual_image_id` (Number) - `virtual_image_id` (Number)
- `virtual_image_name` (String) - `virtual_image_name` (String)
- `vnc_password` (String)
<a id="nestedblock--timeouts"></a> <a id="nestedblock--timeouts"></a>
### Nested Schema for `timeouts` ### Nested Schema for `timeouts`
@@ -332,3 +329,29 @@ Read-Only:
- `key` (String) - `key` (String)
- `val` (String) - `val` (String)
<a id="nestedatt--vgpus"></a>
### Nested Schema for `vgpus`
Read-Only:
- `account_id` (Number)
- `bus_number` (Number)
- `created_time` (Number)
- `deleted_time` (Number)
- `gid` (Number)
- `guid` (Number)
- `id` (Number)
- `last_claimed_by` (Number)
- `last_update_time` (Number)
- `mode` (String)
- `pci_slot` (Number)
- `pgpuid` (Number)
- `profile_id` (Number)
- `ram` (Number)
- `reference_id` (String)
- `rg_id` (Number)
- `status` (String)
- `type` (String)
- `vmid` (Number)

View File

@@ -19,7 +19,6 @@ description: |-
- `account_id` (Number) Find by AccountID - `account_id` (Number) Find by AccountID
- `by_id` (Number) Find by ID - `by_id` (Number) Find by ID
- `cd_image_id` (Number) Find by CD image ID
- `extnet_id` (Number) Find by Extnet ID - `extnet_id` (Number) Find by Extnet ID
- `extnet_name` (String) Find by Extnet name - `extnet_name` (String) Find by Extnet name
- `ignore_k8s` (Boolean) If set to true, ignores any VMs associated with any k8s cluster - `ignore_k8s` (Boolean) If set to true, ignores any VMs associated with any k8s cluster
@@ -65,7 +64,6 @@ Read-Only:
- `affinity_weight` (Number) - `affinity_weight` (Number)
- `anti_affinity_rules` (List of Object) (see [below for nested schema](#nestedobjatt--items--anti_affinity_rules)) - `anti_affinity_rules` (List of Object) (see [below for nested schema](#nestedobjatt--items--anti_affinity_rules))
- `arch` (String) - `arch` (String)
- `auto_start_w_node` (Boolean)
- `boot_order` (List of String) - `boot_order` (List of String)
- `bootdisk_size` (Number) - `bootdisk_size` (Number)
- `cd_image_id` (Number) - `cd_image_id` (Number)
@@ -101,7 +99,6 @@ Read-Only:
- `numa_node_id` (Number) - `numa_node_id` (Number)
- `os_users` (List of Object) (see [below for nested schema](#nestedobjatt--items--os_users)) - `os_users` (List of Object) (see [below for nested schema](#nestedobjatt--items--os_users))
- `pinned` (Boolean) - `pinned` (Boolean)
- `preferred_cpu` (List of Number)
- `ram` (Number) - `ram` (Number)
- `reference_id` (String) - `reference_id` (String)
- `registered` (Boolean) - `registered` (Boolean)
@@ -121,7 +118,7 @@ Read-Only:
- `updated_time` (Number) - `updated_time` (Number)
- `user_data` (String) - `user_data` (String)
- `user_managed` (Boolean) - `user_managed` (Boolean)
- `vgpus` (List of Number) - `vgpus` (List of Object) (see [below for nested schema](#nestedobjatt--items--vgpus))
- `vins_connected` (Number) - `vins_connected` (Number)
- `virtual_image_id` (Number) - `virtual_image_id` (Number)
@@ -257,3 +254,29 @@ Read-Only:
- `key` (String) - `key` (String)
- `val` (String) - `val` (String)
<a id="nestedobjatt--items--vgpus"></a>
### Nested Schema for `items.vgpus`
Read-Only:
- `account_id` (Number)
- `bus_number` (Number)
- `created_time` (Number)
- `deleted_time` (Number)
- `gid` (Number)
- `guid` (Number)
- `id` (Number)
- `last_claimed_by` (Number)
- `last_update_time` (Number)
- `mode` (String)
- `pci_slot` (Number)
- `pgpuid` (Number)
- `profile_id` (Number)
- `ram` (Number)
- `reference_id` (String)
- `rg_id` (Number)
- `status` (String)
- `type` (String)
- `vmid` (Number)

View File

@@ -60,7 +60,6 @@ Read-Only:
- `affinity_weight` (Number) - `affinity_weight` (Number)
- `anti_affinity_rules` (List of Object) (see [below for nested schema](#nestedobjatt--items--anti_affinity_rules)) - `anti_affinity_rules` (List of Object) (see [below for nested schema](#nestedobjatt--items--anti_affinity_rules))
- `arch` (String) - `arch` (String)
- `auto_start_w_node` (Boolean)
- `boot_order` (List of String) - `boot_order` (List of String)
- `bootdisk_size` (Number) - `bootdisk_size` (Number)
- `cd_image_id` (Number) - `cd_image_id` (Number)
@@ -95,7 +94,6 @@ Read-Only:
- `numa_node_id` (Number) - `numa_node_id` (Number)
- `os_users` (List of Object) (see [below for nested schema](#nestedobjatt--items--os_users)) - `os_users` (List of Object) (see [below for nested schema](#nestedobjatt--items--os_users))
- `pinned` (Boolean) - `pinned` (Boolean)
- `preferred_cpu` (List of Number)
- `ram` (Number) - `ram` (Number)
- `reference_id` (String) - `reference_id` (String)
- `registered` (Boolean) - `registered` (Boolean)

View File

@@ -28,15 +28,12 @@ description: |-
- `consumption` (List of Object) (see [below for nested schema](#nestedatt--consumption)) - `consumption` (List of Object) (see [below for nested schema](#nestedatt--consumption))
- `cpu_allocation_ratio` (Number) - `cpu_allocation_ratio` (Number)
- `cpu_info` (List of Object) (see [below for nested schema](#nestedatt--cpu_info)) - `cpu_info` (List of Object) (see [below for nested schema](#nestedatt--cpu_info))
- `dpdk` (List of Object) (see [below for nested schema](#nestedatt--dpdk))
- `gid` (Number) - `gid` (Number)
- `id` (String) The ID of this resource. - `id` (String) The ID of this resource.
- `ipaddr` (List of String) - `ipaddr` (List of String)
- `isolated_cpus` (List of String) - `isolated_cpus` (List of String)
- `name` (String) - `name` (String)
- `need_reboot` (Boolean) - `need_reboot` (Boolean)
- `net_addr` (List of Object) (see [below for nested schema](#nestedatt--net_addr))
- `network_mode` (String)
- `nic_info` (List of Object) (see [below for nested schema](#nestedatt--nic_info)) - `nic_info` (List of Object) (see [below for nested schema](#nestedatt--nic_info))
- `numa_topology` (List of Object) (see [below for nested schema](#nestedatt--numa_topology)) - `numa_topology` (List of Object) (see [below for nested schema](#nestedatt--numa_topology))
- `reserved_cpus` (List of String) - `reserved_cpus` (List of String)
@@ -44,10 +41,6 @@ description: |-
- `sriov_enabled` (Boolean) - `sriov_enabled` (Boolean)
- `stack_id` (Number) - `stack_id` (Number)
- `status` (String) - `status` (String)
- `to_active` (List of Object) (see [below for nested schema](#nestedatt--to_active))
- `to_installing` (List of Object) (see [below for nested schema](#nestedatt--to_installing))
- `to_maintenance` (List of Object) (see [below for nested schema](#nestedatt--to_maintenance))
- `to_restricted` (List of Object) (see [below for nested schema](#nestedatt--to_restricted))
- `version` (String) - `version` (String)
<a id="nestedblock--timeouts"></a> <a id="nestedblock--timeouts"></a>
@@ -116,42 +109,6 @@ Read-Only:
- `phys_count` (Number) - `phys_count` (Number)
<a id="nestedatt--dpdk"></a>
### Nested Schema for `dpdk`
Read-Only:
- `bridges` (List of Object) (see [below for nested schema](#nestedobjatt--dpdk--bridges))
- `hp_memory` (Map of Number)
- `pmd_cpu` (List of Number)
<a id="nestedobjatt--dpdk--bridges"></a>
### Nested Schema for `dpdk.bridges`
Read-Only:
- `backplane1` (List of Object) (see [below for nested schema](#nestedobjatt--dpdk--bridges--backplane1))
<a id="nestedobjatt--dpdk--bridges--backplane1"></a>
### Nested Schema for `dpdk.bridges.backplane1`
Read-Only:
- `interfaces` (List of String)
- `numa_node` (Number)
<a id="nestedatt--net_addr"></a>
### Nested Schema for `net_addr`
Read-Only:
- `ip` (List of String)
- `name` (String)
<a id="nestedatt--nic_info"></a> <a id="nestedatt--nic_info"></a>
### Nested Schema for `nic_info` ### Nested Schema for `nic_info`
@@ -199,45 +156,3 @@ Read-Only:
- `one_g` (Number) - `one_g` (Number)
- `total` (Number) - `total` (Number)
- `two_m` (Number) - `two_m` (Number)
<a id="nestedatt--to_active"></a>
### Nested Schema for `to_active`
Read-Only:
- `actor` (String)
- `reason` (String)
- `time` (Number)
<a id="nestedatt--to_installing"></a>
### Nested Schema for `to_installing`
Read-Only:
- `actor` (String)
- `reason` (String)
- `time` (Number)
<a id="nestedatt--to_maintenance"></a>
### Nested Schema for `to_maintenance`
Read-Only:
- `actor` (String)
- `reason` (String)
- `time` (Number)
<a id="nestedatt--to_restricted"></a>
### Nested Schema for `to_restricted`
Read-Only:
- `actor` (String)
- `reason` (String)
- `time` (Number)

View File

@@ -52,7 +52,6 @@ Read-Only:
- `additional_pkgs` (List of String) - `additional_pkgs` (List of String)
- `cpu_info` (List of Object) (see [below for nested schema](#nestedobjatt--items--cpu_info)) - `cpu_info` (List of Object) (see [below for nested schema](#nestedobjatt--items--cpu_info))
- `description` (String) - `description` (String)
- `dpdk` (List of Object) (see [below for nested schema](#nestedobjatt--items--dpdk))
- `gid` (Number) - `gid` (Number)
- `guid` (String) - `guid` (String)
- `hostkey` (String) - `hostkey` (String)
@@ -87,7 +86,6 @@ Read-Only:
- `status` (String) - `status` (String)
- `tags` (List of String) - `tags` (List of String)
- `type` (String) - `type` (String)
- `uefi_firmware_file` (String)
- `version` (String) - `version` (String)
<a id="nestedobjatt--items--cpu_info"></a> <a id="nestedobjatt--items--cpu_info"></a>
@@ -100,33 +98,6 @@ Read-Only:
- `phys_count` (Number) - `phys_count` (Number)
<a id="nestedobjatt--items--dpdk"></a>
### Nested Schema for `items.dpdk`
Read-Only:
- `bridges` (List of Object) (see [below for nested schema](#nestedobjatt--items--dpdk--bridges))
- `hp_memory` (Map of Number)
- `pmd_cpu` (List of Number)
<a id="nestedobjatt--items--dpdk--bridges"></a>
### Nested Schema for `items.dpdk.bridges`
Read-Only:
- `backplane1` (List of Object) (see [below for nested schema](#nestedobjatt--items--dpdk--bridges--backplane1))
<a id="nestedobjatt--items--dpdk--bridges--backplane1"></a>
### Nested Schema for `items.dpdk.bridges.backplane1`
Read-Only:
- `interfaces` (List of String)
- `numa_node` (Number)
<a id="nestedobjatt--items--net_addr"></a> <a id="nestedobjatt--items--net_addr"></a>
### Nested Schema for `items.net_addr` ### Nested Schema for `items.net_addr`

View File

@@ -25,14 +25,15 @@ description: |-
### Read-Only ### Read-Only
- `ckey` (String) ckey
- `config` (String) config - `config` (String) config
- `consumed_by` (Set of Number) consumed by - `consumed_by` (Set of Number) consumed by
- `desc` (String) description - `desc` (String) description
- `gid` (Number) gid - `gid` (Number) gid
- `guid` (Number) guid - `guid` (Number) guid
- `id` (String) The ID of this resource. - `id` (String) The ID of this resource.
- `meta` (List of String) meta
- `milestones` (Number) milestones - `milestones` (Number) milestones
- `multipath_num` (Number) multipath_num
- `name` (String) name - `name` (String) name
- `obj_status` (String) object status - `obj_status` (String) object status
- `provided_by` (List of Number) provided by - `provided_by` (List of Number) provided by

View File

@@ -49,13 +49,14 @@ Optional:
Read-Only: Read-Only:
- `ckey` (String)
- `config` (String) - `config` (String)
- `consumed_by` (Set of Number) - `consumed_by` (Set of Number)
- `desc` (String) - `desc` (String)
- `gid` (Number) - `gid` (Number)
- `guid` (Number) - `guid` (Number)
- `meta` (List of String)
- `milestones` (Number) - `milestones` (Number)
- `multipath_num` (Number)
- `name` (String) - `name` (String)
- `obj_status` (String) - `obj_status` (String)
- `provided_by` (List of Number) - `provided_by` (List of Number)

View File

@@ -101,7 +101,6 @@ Read-Only:
- `tech_status` (String) - `tech_status` (String)
- `type` (String) - `type` (String)
- `vins` (List of Number) - `vins` (List of Number)
- `vnc_password` (String)
<a id="nestedobjatt--vnf_dev--config"></a> <a id="nestedobjatt--vnf_dev--config"></a>
### Nested Schema for `vnf_dev.config` ### Nested Schema for `vnf_dev.config`
@@ -241,7 +240,10 @@ Read-Only:
Read-Only: Read-Only:
- `account_id` (Number) - `client_type` (String)
- `description` (String)
- `domain_name` (String)
- `host_name` (String)
- `ip` (String) - `ip` (String)
- `mac` (String) - `mac` (String)
- `type` (String) - `type` (String)

View File

@@ -90,7 +90,6 @@ Read-Only:
Read-Only: Read-Only:
- `account_id` (Number)
- `client_type` (String) - `client_type` (String)
- `desc` (String) - `desc` (String)
- `domainname` (String) - `domainname` (String)

View File

@@ -1,61 +0,0 @@
---
# generated by https://github.com/hashicorp/terraform-plugin-docs
page_title: "decort_extnet_reserved_ip_list Data Source - terraform-provider-decort"
subcategory: ""
description: |-
---
# decort_extnet_reserved_ip_list (Data Source)
<!-- schema generated by tfplugindocs -->
## Schema
### Required
- `account_id` (Number)
### Optional
- `extnet_id` (Number)
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
### Read-Only
- `id` (String) The ID of this resource.
- `items` (List of Object) (see [below for nested schema](#nestedatt--items))
<a id="nestedblock--timeouts"></a>
### Nested Schema for `timeouts`
Optional:
- `default` (String)
- `read` (String)
<a id="nestedatt--items"></a>
### Nested Schema for `items`
Read-Only:
- `extnet_id` (Number)
- `reservations` (List of Object) (see [below for nested schema](#nestedobjatt--items--reservations))
<a id="nestedobjatt--items--reservations"></a>
### Nested Schema for `items.reservations`
Read-Only:
- `account_id` (Number)
- `client_type` (String)
- `domain_name` (String)
- `hostname` (String)
- `ip` (String)
- `mac` (String)
- `type` (String)
- `vm_id` (Number)

View File

@@ -33,7 +33,6 @@ description: |-
- `affinity_weight` (Number) - `affinity_weight` (Number)
- `anti_affinity_rules` (List of Object) (see [below for nested schema](#nestedatt--anti_affinity_rules)) - `anti_affinity_rules` (List of Object) (see [below for nested schema](#nestedatt--anti_affinity_rules))
- `arch` (String) - `arch` (String)
- `auto_start_w_node` (Boolean)
- `boot_order` (List of String) - `boot_order` (List of String)
- `bootdisk_size` (Number) - `bootdisk_size` (Number)
- `cd_image_id` (Number) - `cd_image_id` (Number)
@@ -75,7 +74,6 @@ description: |-
- `os_users` (List of Object) (see [below for nested schema](#nestedatt--os_users)) - `os_users` (List of Object) (see [below for nested schema](#nestedatt--os_users))
- `pci_devices` (List of Number) - `pci_devices` (List of Number)
- `pinned` (Boolean) - `pinned` (Boolean)
- `preferred_cpu` (List of Number)
- `ram` (Number) - `ram` (Number)
- `reference_id` (String) - `reference_id` (String)
- `registered` (Boolean) - `registered` (Boolean)
@@ -93,10 +91,9 @@ description: |-
- `updated_time` (Number) - `updated_time` (Number)
- `user_managed` (Boolean) - `user_managed` (Boolean)
- `userdata` (String) - `userdata` (String)
- `vgpus` (List of Number) - `vgpus` (List of Object) (see [below for nested schema](#nestedatt--vgpus))
- `virtual_image_id` (Number) - `virtual_image_id` (Number)
- `virtual_image_name` (String) - `virtual_image_name` (String)
- `vnc_password` (String)
<a id="nestedblock--timeouts"></a> <a id="nestedblock--timeouts"></a>
### Nested Schema for `timeouts` ### Nested Schema for `timeouts`
@@ -352,3 +349,28 @@ Read-Only:
- `guid` (String) - `guid` (String)
- `label` (String) - `label` (String)
- `timestamp` (Number) - `timestamp` (Number)
<a id="nestedatt--vgpus"></a>
### Nested Schema for `vgpus`
Read-Only:
- `account_id` (Number)
- `created_time` (Number)
- `deleted_time` (Number)
- `gid` (Number)
- `guid` (Number)
- `id` (Number)
- `last_claimed_by` (Number)
- `last_update_time` (Number)
- `mode` (String)
- `pci_slot` (Number)
- `pgpuid` (Number)
- `profile_id` (Number)
- `ram` (Number)
- `reference_id` (String)
- `rg_id` (Number)
- `status` (String)
- `type` (String)
- `vmid` (Number)

View File

@@ -62,7 +62,6 @@ Read-Only:
- `affinity_weight` (Number) - `affinity_weight` (Number)
- `anti_affinity_rules` (List of Object) (see [below for nested schema](#nestedobjatt--items--anti_affinity_rules)) - `anti_affinity_rules` (List of Object) (see [below for nested schema](#nestedobjatt--items--anti_affinity_rules))
- `arch` (String) - `arch` (String)
- `auto_start_w_node` (Boolean)
- `boot_order` (List of String) - `boot_order` (List of String)
- `bootdisk_size` (Number) - `bootdisk_size` (Number)
- `cd_image_id` (Number) - `cd_image_id` (Number)
@@ -97,7 +96,6 @@ Read-Only:
- `numa_affinity` (String) - `numa_affinity` (String)
- `numa_node_id` (Number) - `numa_node_id` (Number)
- `pinned` (Boolean) - `pinned` (Boolean)
- `preferred_cpu` (List of Number)
- `ram` (Number) - `ram` (Number)
- `reference_id` (String) - `reference_id` (String)
- `registered` (Boolean) - `registered` (Boolean)

View File

@@ -60,7 +60,6 @@ Read-Only:
- `affinity_weight` (Number) - `affinity_weight` (Number)
- `anti_affinity_rules` (List of Object) (see [below for nested schema](#nestedobjatt--items--anti_affinity_rules)) - `anti_affinity_rules` (List of Object) (see [below for nested schema](#nestedobjatt--items--anti_affinity_rules))
- `arch` (String) - `arch` (String)
- `auto_start_w_node` (Boolean)
- `boot_order` (List of String) - `boot_order` (List of String)
- `bootdisk_size` (Number) - `bootdisk_size` (Number)
- `cd_image_id` (Number) - `cd_image_id` (Number)
@@ -95,7 +94,6 @@ Read-Only:
- `numa_affinity` (String) - `numa_affinity` (String)
- `numa_node_id` (Number) - `numa_node_id` (Number)
- `pinned` (Boolean) - `pinned` (Boolean)
- `preferred_cpu` (List of Number)
- `ram` (Number) - `ram` (Number)
- `reference_id` (String) - `reference_id` (String)
- `registered` (Boolean) - `registered` (Boolean)

View File

@@ -108,7 +108,6 @@ Read-Only:
- `tech_status` (String) - `tech_status` (String)
- `type` (String) - `type` (String)
- `vins` (List of Number) - `vins` (List of Number)
- `vnc_password` (String)
- `vnf_id` (Number) - `vnf_id` (Number)
- `vnf_name` (String) - `vnf_name` (String)
@@ -249,7 +248,10 @@ Read-Only:
Read-Only: Read-Only:
- `account_id` (Number) - `client_type` (String)
- `desc` (String)
- `domainname` (String)
- `hostname` (String)
- `ip` (String) - `ip` (String)
- `mac` (String) - `mac` (String)
- `type` (String) - `type` (String)

View File

@@ -62,7 +62,6 @@ description: |-
- `res_name` (String) - `res_name` (String)
- `rescuecd` (Boolean) - `rescuecd` (Boolean)
- `size` (Number) image size - `size` (Number) image size
- `snapshot_id` (String) snapshot id
- `status` (String) status - `status` (String) status
- `tech_status` (String) tech atatus - `tech_status` (String) tech atatus
- `unc_path` (String) unc path - `unc_path` (String) unc path

View File

@@ -37,7 +37,6 @@ description: |-
- `ntp` (List of String) List of NTP addresses - `ntp` (List of String) List of NTP addresses
- `ovs_bridge` (String) OpenvSwith bridge name for ExtNet connection - `ovs_bridge` (String) OpenvSwith bridge name for ExtNet connection
- `pre_reservations_num` (Number) Number of pre created reservations - `pre_reservations_num` (Number) Number of pre created reservations
- `reserved_ip` (Block Set) (see [below for nested schema](#nestedblock--reserved_ip))
- `restart` (Boolean) restart extnet vnf device - `restart` (Boolean) restart extnet vnf device
- `set_default` (Boolean) Set current extnet as default (can not be undone) - `set_default` (Boolean) Set current extnet as default (can not be undone)
- `shared_with` (Set of Number) - `shared_with` (Set of Number)
@@ -89,19 +88,6 @@ Required:
- `ip_start` (String) - `ip_start` (String)
<a id="nestedblock--reserved_ip"></a>
### Nested Schema for `reserved_ip`
Required:
- `account_id` (Number)
Optional:
- `ip_count` (Number)
- `ips` (Set of String)
<a id="nestedblock--timeouts"></a> <a id="nestedblock--timeouts"></a>
### Nested Schema for `timeouts` ### Nested Schema for `timeouts`
@@ -133,7 +119,6 @@ Read-Only:
Read-Only: Read-Only:
- `account_id` (Number)
- `client_type` (String) - `client_type` (String)
- `desc` (String) - `desc` (String)
- `domain_name` (String) - `domain_name` (String)

View File

@@ -67,7 +67,6 @@ description: |-
- `res_name` (String) - `res_name` (String)
- `rescuecd` (Boolean) - `rescuecd` (Boolean)
- `size` (Number) image size - `size` (Number) image size
- `snapshot_id` (String) snapshot id
- `status` (String) status - `status` (String) status
- `tech_status` (String) tech atatus - `tech_status` (String) tech atatus
- `unc_path` (String) unc path - `unc_path` (String) unc path

View File

@@ -64,7 +64,6 @@ description: |-
- `res_name` (String) - `res_name` (String)
- `rescuecd` (Boolean) - `rescuecd` (Boolean)
- `size` (Number) - `size` (Number)
- `snapshot_id` (String) snapshot id
- `status` (String) - `status` (String)
- `tech_status` (String) - `tech_status` (String)
- `unc_path` (String) - `unc_path` (String)

View File

@@ -64,7 +64,6 @@ description: |-
- `res_name` (String) - `res_name` (String)
- `rescuecd` (Boolean) - `rescuecd` (Boolean)
- `size` (Number) - `size` (Number)
- `snapshot_id` (String) snapshot id
- `status` (String) - `status` (String)
- `tech_status` (String) - `tech_status` (String)
- `unc_path` (String) - `unc_path` (String)

View File

@@ -29,13 +29,14 @@ description: |-
- `affinity_rules` (Block List) (see [below for nested schema](#nestedblock--affinity_rules)) - `affinity_rules` (Block List) (see [below for nested schema](#nestedblock--affinity_rules))
- `alt_boot_id` (Number) ID of CD-ROM live image to boot - `alt_boot_id` (Number) ID of CD-ROM live image to boot
- `anti_affinity_rules` (Block List) (see [below for nested schema](#nestedblock--anti_affinity_rules)) - `anti_affinity_rules` (Block List) (see [below for nested schema](#nestedblock--anti_affinity_rules))
- `auto_start_w_node` (Boolean) - `auto_start` (Boolean) Flag for redeploy compute
- `boot_disk_size` (Number) This compute instance boot disk size in GB. Make sure it is large enough to accomodate selected OS image. - `boot_disk_size` (Number) This compute instance boot disk size in GB. Make sure it is large enough to accomodate selected OS image.
- `cd` (Block Set, Max: 1) (see [below for nested schema](#nestedblock--cd)) - `cd` (Block Set, Max: 1) (see [below for nested schema](#nestedblock--cd))
- `chipset` (String) Type of the emulated system. - `chipset` (String) Type of the emulated system.
- `cloud_init` (String) Optional cloud_init parameters. Applied when creating new compute instance only, ignored in all other cases. - `cloud_init` (String) Optional cloud_init parameters. Applied when creating new compute instance only, ignored in all other cases.
- `cpu_pin` (Boolean) Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node. - `cpu_pin` (Boolean) Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node.
- `custom_fields` (String) - `custom_fields` (String)
- `data_disks` (String) Flag for redeploy compute
- `depresent` (Boolean) whether to depresent compute disks from node or not - `depresent` (Boolean) whether to depresent compute disks from node or not
- `description` (String) Optional text description of this compute instance. - `description` (String) Optional text description of this compute instance.
- `detach_disks` (Boolean) - `detach_disks` (Boolean)
@@ -58,7 +59,6 @@ description: |-
- `pin_to_stack` (Boolean) - `pin_to_stack` (Boolean)
- `pool` (String) Pool to use if sepId is set, can be also empty if needed to be chosen by system. - `pool` (String) Pool to use if sepId is set, can be also empty if needed to be chosen by system.
- `port_forwarding` (Block Set) (see [below for nested schema](#nestedblock--port_forwarding)) - `port_forwarding` (Block Set) (see [below for nested schema](#nestedblock--port_forwarding))
- `preferred_cpu` (List of Number) Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
- `reset` (Boolean) - `reset` (Boolean)
- `restore` (Boolean) - `restore` (Boolean)
- `rollback` (Block Set, Max: 1) (see [below for nested schema](#nestedblock--rollback)) - `rollback` (Block Set, Max: 1) (see [below for nested schema](#nestedblock--rollback))
@@ -67,6 +67,7 @@ description: |-
- `stack_id` (Number) ID of stack to start compute - `stack_id` (Number) ID of stack to start compute
- `started` (Boolean) Is compute started. - `started` (Boolean) Is compute started.
- `tags` (Block Set) (see [below for nested schema](#nestedblock--tags)) - `tags` (Block Set) (see [below for nested schema](#nestedblock--tags))
- `target_stack_id` (Number)
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
- `user_access` (Block Set) (see [below for nested schema](#nestedblock--user_access)) - `user_access` (Block Set) (see [below for nested schema](#nestedblock--user_access))
- `without_boot_disk` (Boolean) If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state. - `without_boot_disk` (Boolean) If True, the imageId, bootDisk, sepId, pool parameters are ignored and the compute is created without a boot disk in the stopped state.
@@ -127,7 +128,6 @@ description: |-
- `vgpus` (List of Number) - `vgpus` (List of Number)
- `virtual_image_id` (Number) - `virtual_image_id` (Number)
- `virtual_image_name` (String) - `virtual_image_name` (String)
- `vnc_password` (String)
<a id="nestedblock--affinity_rules"></a> <a id="nestedblock--affinity_rules"></a>
### Nested Schema for `affinity_rules` ### Nested Schema for `affinity_rules`

View File

@@ -37,10 +37,11 @@ description: |-
### Read-Only ### Read-Only
- `ckey` (String) ckey
- `guid` (Number) guid - `guid` (Number) guid
- `id` (String) The ID of this resource. - `id` (String) The ID of this resource.
- `meta` (List of String) meta
- `milestones` (Number) milestones - `milestones` (Number) milestones
- `multipath_num` (Number) multipath_num
- `obj_status` (String) object status - `obj_status` (String) object status
- `tech_status` (String) tech status - `tech_status` (String) tech status

View File

@@ -167,7 +167,6 @@ Read-Only:
- `tech_status` (String) - `tech_status` (String)
- `type` (String) - `type` (String)
- `vins` (List of Number) - `vins` (List of Number)
- `vnc_password` (String)
<a id="nestedobjatt--vnf_dev--config"></a> <a id="nestedobjatt--vnf_dev--config"></a>
### Nested Schema for `vnf_dev.config` ### Nested Schema for `vnf_dev.config`
@@ -307,7 +306,10 @@ Read-Only:
Read-Only: Read-Only:
- `account_id` (Number) - `client_type` (String)
- `description` (String)
- `domain_name` (String)
- `host_name` (String)
- `ip` (String) - `ip` (String)
- `mac` (String) - `mac` (String)
- `type` (String) - `type` (String)

View File

@@ -24,11 +24,11 @@ description: |-
### Optional ### Optional
- `compute_ids` (List of Number)
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
### Read-Only ### Read-Only
- `compute_ids` (List of Number)
- `guid` (String) - `guid` (String)
- `id` (String) The ID of this resource. - `id` (String) The ID of this resource.
- `route_id` (Number) Unique ID of the static route - `route_id` (Number) Unique ID of the static route

View File

@@ -61,7 +61,6 @@ description: |-
- `rescuecd` (Boolean) - `rescuecd` (Boolean)
- `sep_id` (Number) storage endpoint provider ID - `sep_id` (Number) storage endpoint provider ID
- `size` (Number) image size - `size` (Number) image size
- `snapshot_id` (String) snapshot id
- `status` (String) status - `status` (String) status
- `tech_status` (String) tech atatus - `tech_status` (String) tech atatus
- `unc_path` (String) unc path - `unc_path` (String) unc path

View File

@@ -28,13 +28,14 @@ description: |-
- `affinity_label` (String) Set affinity label for compute - `affinity_label` (String) Set affinity label for compute
- `affinity_rules` (Block List) (see [below for nested schema](#nestedblock--affinity_rules)) - `affinity_rules` (Block List) (see [below for nested schema](#nestedblock--affinity_rules))
- `anti_affinity_rules` (Block List) (see [below for nested schema](#nestedblock--anti_affinity_rules)) - `anti_affinity_rules` (Block List) (see [below for nested schema](#nestedblock--anti_affinity_rules))
- `auto_start_w_node` (Boolean) Flag for start compute after node exits from MAINTENANCE state - `auto_start` (Boolean) Flag for redeploy compute
- `boot_disk_size` (Number) This compute instance boot disk size in GB. Make sure it is large enough to accomodate selected OS image. - `boot_disk_size` (Number) This compute instance boot disk size in GB. Make sure it is large enough to accomodate selected OS image.
- `cd` (Block Set, Max: 1) (see [below for nested schema](#nestedblock--cd)) - `cd` (Block Set, Max: 1) (see [below for nested schema](#nestedblock--cd))
- `chipset` (String) Type of the emulated system. - `chipset` (String) Type of the emulated system.
- `cloud_init` (String) Optional cloud_init parameters. Applied when creating new compute instance only, ignored in all other cases. - `cloud_init` (String) Optional cloud_init parameters. Applied when creating new compute instance only, ignored in all other cases.
- `cpu_pin` (Boolean) Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node. - `cpu_pin` (Boolean) Run VM on dedicated CPUs. To use this feature, the system must be pre-configured by allocating CPUs on the physical node.
- `custom_fields` (String) - `custom_fields` (String)
- `data_disks` (String) Flag for redeploy compute
- `description` (String) Optional text description of this compute instance. - `description` (String) Optional text description of this compute instance.
- `detach_disks` (Boolean) - `detach_disks` (Boolean)
- `disks` (Block List) (see [below for nested schema](#nestedblock--disks)) - `disks` (Block List) (see [below for nested schema](#nestedblock--disks))
@@ -54,7 +55,6 @@ description: |-
- `pin_to_stack` (Boolean) - `pin_to_stack` (Boolean)
- `pool` (String) Pool to use if sepId is set, can be also empty if needed to be chosen by system. - `pool` (String) Pool to use if sepId is set, can be also empty if needed to be chosen by system.
- `port_forwarding` (Block Set) (see [below for nested schema](#nestedblock--port_forwarding)) - `port_forwarding` (Block Set) (see [below for nested schema](#nestedblock--port_forwarding))
- `preferred_cpu` (List of Number) Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False
- `reset` (Boolean) - `reset` (Boolean)
- `restore` (Boolean) - `restore` (Boolean)
- `rollback` (Block Set, Max: 1) (see [below for nested schema](#nestedblock--rollback)) - `rollback` (Block Set, Max: 1) (see [below for nested schema](#nestedblock--rollback))
@@ -118,10 +118,9 @@ description: |-
- `updated_by` (String) - `updated_by` (String)
- `updated_time` (Number) - `updated_time` (Number)
- `user_managed` (Boolean) - `user_managed` (Boolean)
- `vgpus` (List of Number) - `vgpus` (List of Object) (see [below for nested schema](#nestedatt--vgpus))
- `virtual_image_id` (Number) - `virtual_image_id` (Number)
- `virtual_image_name` (String) - `virtual_image_name` (String)
- `vnc_password` (String)
<a id="nestedblock--affinity_rules"></a> <a id="nestedblock--affinity_rules"></a>
### Nested Schema for `affinity_rules` ### Nested Schema for `affinity_rules`
@@ -358,3 +357,29 @@ Read-Only:
- `guid` (String) - `guid` (String)
- `label` (String) - `label` (String)
- `timestamp` (Number) - `timestamp` (Number)
<a id="nestedatt--vgpus"></a>
### Nested Schema for `vgpus`
Read-Only:
- `account_id` (Number)
- `bus_number` (Number)
- `created_time` (Number)
- `deleted_time` (Number)
- `gid` (Number)
- `guid` (Number)
- `id` (Number)
- `last_claimed_by` (Number)
- `last_update_time` (Number)
- `mode` (String)
- `pci_slot` (Number)
- `pgpuid` (Number)
- `profile_id` (Number)
- `ram` (Number)
- `reference_id` (String)
- `rg_id` (Number)
- `status` (String)
- `type` (String)
- `vmid` (Number)

View File

@@ -77,7 +77,7 @@ description: |-
Optional: Optional:
- `ext_net_id` (Number) - `ext_net_id` (Number)
- `ext_net_ip` (String) - `ext_net_ip` (Number)
<a id="nestedblock--ip"></a> <a id="nestedblock--ip"></a>
@@ -163,7 +163,6 @@ Read-Only:
- `tech_status` (String) - `tech_status` (String)
- `type` (String) - `type` (String)
- `vins` (List of Number) - `vins` (List of Number)
- `vnc_password` (String)
- `vnf_id` (Number) - `vnf_id` (Number)
- `vnf_name` (String) - `vnf_name` (String)
@@ -304,7 +303,10 @@ Read-Only:
Read-Only: Read-Only:
- `account_id` (Number) - `client_type` (String)
- `desc` (String)
- `domainname` (String)
- `hostname` (String)
- `ip` (String) - `ip` (String)
- `mac` (String) - `mac` (String)
- `type` (String) - `type` (String)

View File

@@ -24,12 +24,12 @@ description: |-
### Optional ### Optional
- `compute_ids` (List of Number)
- `route_id` (Number) - `route_id` (Number)
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts)) - `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
### Read-Only ### Read-Only
- `compute_ids` (List of Number)
- `guid` (String) - `guid` (String)
- `id` (String) The ID of this resource. - `id` (String) The ID of this resource.

2
go.mod
View File

@@ -8,7 +8,7 @@ require (
github.com/hashicorp/terraform-plugin-sdk/v2 v2.33.0 github.com/hashicorp/terraform-plugin-sdk/v2 v2.33.0
github.com/sirupsen/logrus v1.9.0 github.com/sirupsen/logrus v1.9.0
golang.org/x/net v0.23.0 golang.org/x/net v0.23.0
repository.basistech.ru/BASIS/decort-golang-sdk v1.10.2 repository.basistech.ru/BASIS/decort-golang-sdk v1.9.4
) )
require ( require (

4
go.sum
View File

@@ -273,5 +273,5 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
repository.basistech.ru/BASIS/decort-golang-sdk v1.10.2 h1:sA/ZngL4xvkyz8lVGkqbi2RBi4CrHJjho2WV21KX918= repository.basistech.ru/BASIS/decort-golang-sdk v1.9.4 h1:BQ7Q6whTFTmBiBcvdRI6bXmYLkhekvJDiNpW258+j24=
repository.basistech.ru/BASIS/decort-golang-sdk v1.10.2/go.mod h1:OaUynHHuSjWMzpfyoL4au6oLcUogqUkPPBKA15pbHWo= repository.basistech.ru/BASIS/decort-golang-sdk v1.9.4/go.mod h1:OaUynHHuSjWMzpfyoL4au6oLcUogqUkPPBKA15pbHWo=

View File

@@ -137,7 +137,6 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_extnet_computes_list": extnet.DataSourceExtnetComputesList(), "decort_extnet_computes_list": extnet.DataSourceExtnetComputesList(),
"decort_extnet": extnet.DataSourceExtnet(), "decort_extnet": extnet.DataSourceExtnet(),
"decort_extnet_default": extnet.DataSourceExtnetDefault(), "decort_extnet_default": extnet.DataSourceExtnetDefault(),
"decort_extnet_reserved_ip_list": extnet.DataSourceExtnetReservedIp(),
"decort_locations_list": locations.DataSourceLocationsList(), "decort_locations_list": locations.DataSourceLocationsList(),
"decort_location_url": locations.DataSourceLocationUrl(), "decort_location_url": locations.DataSourceLocationUrl(),
"decort_image_list": image.DataSourceImageList(), "decort_image_list": image.DataSourceImageList(),
@@ -181,7 +180,6 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_cb_extnet": cb_extnet.DataSourceExtnetCB(), "decort_cb_extnet": cb_extnet.DataSourceExtnetCB(),
"decort_cb_extnet_list": cb_extnet.DataSourceExtnetListCB(), "decort_cb_extnet_list": cb_extnet.DataSourceExtnetListCB(),
"decort_cb_extnet_default": cb_extnet.DataSourceExtnetDefaultCB(), "decort_cb_extnet_default": cb_extnet.DataSourceExtnetDefaultCB(),
"decort_cb_extnet_reserved_ip_list": cb_extnet.DataSourceExtnetReservedIp(),
"decort_cb_extnet_static_route_list": cb_extnet.DataSourceStaticRouteList(), "decort_cb_extnet_static_route_list": cb_extnet.DataSourceStaticRouteList(),
"decort_cb_extnet_static_route": cb_extnet.DataSourceStaticRoute(), "decort_cb_extnet_static_route": cb_extnet.DataSourceStaticRoute(),
"decort_cb_image": cb_image.DataSourceImage(), "decort_cb_image": cb_image.DataSourceImage(),
@@ -189,6 +187,7 @@ func newDataSourcesMap() map[string]*schema.Resource {
"decort_cb_grid_get_status": cb_grid.DataSourceGridGetStatus(), "decort_cb_grid_get_status": cb_grid.DataSourceGridGetStatus(),
"decort_cb_grid_post_status": cb_grid.DataSourceGridPostStatus(), "decort_cb_grid_post_status": cb_grid.DataSourceGridPostStatus(),
"decort_cb_grid_get_diagnosis": cb_grid.DataSourceGridGetDiagnosis(), "decort_cb_grid_get_diagnosis": cb_grid.DataSourceGridGetDiagnosis(),
"decort_cb_grid_post_diagnosis": cb_grid.DataSourceGridPostDiagnosis(),
"decort_cb_grid_get_settings": cb_grid.DataSourceGridGetSettings(), "decort_cb_grid_get_settings": cb_grid.DataSourceGridGetSettings(),
"decort_cb_grid_list": cb_grid.DataSourceGridList(), "decort_cb_grid_list": cb_grid.DataSourceGridList(),
"decort_cb_grid_list_emails": cb_grid.DataSourceGridListEmails(), "decort_cb_grid_list_emails": cb_grid.DataSourceGridListEmails(),

View File

@@ -204,10 +204,6 @@ func dataSourceExtnetSchemaMake() map[string]*schema.Schema {
Computed: true, Computed: true,
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"account_id": {
Type: schema.TypeInt,
Computed: true,
},
"client_type": { "client_type": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,

View File

@@ -1,137 +0,0 @@
/*
Copyright (c) 2019-2022 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>
Tim Tkachev, <tvtkachev@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 extnet
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 dataSourceExtnetReservedIpRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
reservedList, err := utilityExtnetReservedIpCheckPresence(ctx, d, m)
if err != nil {
return diag.FromErr(err)
}
id := uuid.New()
d.SetId(id.String())
d.Set("items", flattenExtnetReservedIp(reservedList))
return nil
}
func dataSourceExtnetReservedIpSchemaMake() map[string]*schema.Schema {
res := map[string]*schema.Schema{
"account_id": {
Type: schema.TypeInt,
Required: true,
},
"extnet_id": {
Type: schema.TypeInt,
Optional: true,
},
"items": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"extnet_id": {
Type: schema.TypeInt,
Computed: true,
},
"reservations": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"account_id": {
Type: schema.TypeInt,
Computed: true,
},
"client_type": {
Type: schema.TypeString,
Computed: true,
},
"domain_name": {
Type: schema.TypeString,
Computed: true,
},
"hostname": {
Type: schema.TypeString,
Computed: true,
},
"ip": {
Type: schema.TypeString,
Computed: true,
},
"mac": {
Type: schema.TypeString,
Computed: true,
},
"type": {
Type: schema.TypeString,
Computed: true,
},
"vm_id": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
},
},
},
}
return res
}
func DataSourceExtnetReservedIp() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceExtnetReservedIpRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceExtnetReservedIpSchemaMake(),
}
}

View File

@@ -54,7 +54,6 @@ func flattenExtnetReservations(ers extnet.ListReservations) []map[string]interfa
res := make([]map[string]interface{}, 0, len(ers)) res := make([]map[string]interface{}, 0, len(ers))
for _, er := range ers { for _, er := range ers {
temp := map[string]interface{}{ temp := map[string]interface{}{
"account_id": er.AccountID,
"client_type": er.ClientType, "client_type": er.ClientType,
"domainname": er.DomainName, "domainname": er.DomainName,
"hostname": er.Hostname, "hostname": er.Hostname,
@@ -136,29 +135,3 @@ func flattenExtnetList(el *extnet.ListExtNets) []map[string]interface{} {
} }
return res return res
} }
func flattenExtnetReservedIp(el []extnet.RecordReservedIP) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(el))
for _, e := range el {
reservations := make([]map[string]interface{}, 0, len(e.Reservations))
for _, r := range e.Reservations {
temp := map[string]interface{}{
"account_id": r.AccountID,
"client_type": r.ClientType,
"domain_name": r.DomainName,
"hostname": r.Hostname,
"ip": r.IP,
"mac": r.Mac,
"type": r.Type,
"vm_id": r.VMID,
}
reservations = append(reservations, temp)
}
item := map[string]interface{}{
"extnet_id": e.ExtnetID,
"reservations": reservations,
}
res = append(res, item)
}
return res
}

View File

@@ -1,61 +0,0 @@
/*
Copyright (c) 2019-2022 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 extnet
import (
"context"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/extnet"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityExtnetReservedIpCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) ([]extnet.RecordReservedIP, error) {
c := m.(*controller.ControllerCfg)
req := extnet.GetReservedIP{
AccountID: uint64(d.Get("account_id").(int)),
}
if extNetID, ok := d.GetOk("extnet_id"); ok {
req.ExtNetID = uint64(extNetID.(int))
}
log.Debugf("utilityExtnetReservedIpCheckPresence")
res, err := c.CloudAPI().ExtNet().GetReservedIP(ctx, req)
if err != nil {
return nil, err
}
return res, nil
}

View File

@@ -703,10 +703,6 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"auto_start_w_node": {
Type: schema.TypeBool,
Computed: true,
},
"chipset": { "chipset": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -885,13 +881,6 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"preferred_cpu": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"ram": { "ram": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
@@ -961,15 +950,84 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"vnc_password": {
Type: schema.TypeString,
Computed: true,
},
"vgpus": { "vgpus": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Elem: &schema.Schema{ Elem: &schema.Resource{
Type: schema.TypeInt, Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeInt,
Computed: true,
},
"gid": {
Type: schema.TypeInt,
Computed: true,
},
"type": {
Type: schema.TypeString,
Computed: true,
},
"mode": {
Type: schema.TypeString,
Computed: true,
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"profile_id": {
Type: schema.TypeInt,
Computed: true,
},
"ram": {
Type: schema.TypeInt,
Computed: true,
},
"last_update_time": {
Type: schema.TypeInt,
Computed: true,
},
"created_time": {
Type: schema.TypeInt,
Computed: true,
},
"deleted_time": {
Type: schema.TypeInt,
Computed: true,
},
"vmid": {
Type: schema.TypeInt,
Computed: true,
},
"pgpuid": {
Type: schema.TypeInt,
Computed: true,
},
"reference_id": {
Type: schema.TypeString,
Computed: true,
},
"account_id": {
Type: schema.TypeInt,
Computed: true,
},
"rg_id": {
Type: schema.TypeInt,
Computed: true,
},
"last_claimed_by": {
Type: schema.TypeInt,
Computed: true,
},
"pci_slot": {
Type: schema.TypeInt,
Computed: true,
},
"guid": {
Type: schema.TypeInt,
Computed: true,
},
},
}, },
}, },
"virtual_image_id": { "virtual_image_id": {

View File

@@ -121,10 +121,6 @@ func itemComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"auto_start_w_node": {
Type: schema.TypeBool,
Computed: true,
},
"boot_order": { "boot_order": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
@@ -273,13 +269,6 @@ func itemComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"preferred_cpu": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"ram": { "ram": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,

View File

@@ -183,7 +183,6 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"affinity_weight": compute.AffinityWeight, "affinity_weight": compute.AffinityWeight,
"anti_affinity_rules": flattenListRules(compute.AntiAffinityRules), "anti_affinity_rules": flattenListRules(compute.AntiAffinityRules),
"arch": compute.Architecture, "arch": compute.Architecture,
"auto_start_w_node": compute.AutoStart,
"boot_order": compute.BootOrder, "boot_order": compute.BootOrder,
"bootdisk_size": compute.BootDiskSize, "bootdisk_size": compute.BootDiskSize,
"chipset": compute.Chipset, "chipset": compute.Chipset,
@@ -218,7 +217,6 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"numa_affinity": compute.NumaAffinity, "numa_affinity": compute.NumaAffinity,
"numa_node_id": compute.NumaNodeId, "numa_node_id": compute.NumaNodeId,
"pinned": compute.Pinned, "pinned": compute.Pinned,
"preferred_cpu": compute.PreferredCPU,
"ram": compute.RAM, "ram": compute.RAM,
"reference_id": compute.ReferenceID, "reference_id": compute.ReferenceID,
"registered": compute.Registered, "registered": compute.Registered,
@@ -364,7 +362,6 @@ func flattenCompute(d *schema.ResourceData, computeRec compute.RecordCompute, pc
d.Set("account_name", computeRec.AccountName) d.Set("account_name", computeRec.AccountName)
d.Set("affinity_weight", computeRec.AffinityWeight) d.Set("affinity_weight", computeRec.AffinityWeight)
d.Set("arch", computeRec.Architecture) d.Set("arch", computeRec.Architecture)
d.Set("auto_start_w_node", computeRec.AutoStart)
d.Set("boot_order", computeRec.BootOrder) d.Set("boot_order", computeRec.BootOrder)
// 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)
@@ -416,7 +413,6 @@ func flattenCompute(d *schema.ResourceData, computeRec compute.RecordCompute, pc
return err return err
} }
d.Set("pinned", computeRec.Pinned) d.Set("pinned", computeRec.Pinned)
d.Set("preferred_cpu", computeRec.PreferredCPU)
d.Set("ram", computeRec.RAM) d.Set("ram", computeRec.RAM)
d.Set("reference_id", computeRec.ReferenceID) d.Set("reference_id", computeRec.ReferenceID)
d.Set("registered", computeRec.Registered) d.Set("registered", computeRec.Registered)
@@ -433,8 +429,7 @@ func flattenCompute(d *schema.ResourceData, computeRec compute.RecordCompute, pc
d.Set("updated_by", computeRec.UpdatedBy) d.Set("updated_by", computeRec.UpdatedBy)
d.Set("updated_time", computeRec.UpdatedTime) d.Set("updated_time", computeRec.UpdatedTime)
d.Set("user_managed", computeRec.UserManaged) d.Set("user_managed", computeRec.UserManaged)
d.Set("vnc_password", computeRec.VNCPassword) d.Set("vgpus", flattenVGPUs(computeRec.VGPUs))
d.Set("vgpus", computeRec.VGPUs)
d.Set("virtual_image_id", computeRec.VirtualImageID) d.Set("virtual_image_id", computeRec.VirtualImageID)
d.Set("virtual_image_name", computeRec.VirtualImageName) d.Set("virtual_image_name", computeRec.VirtualImageName)
@@ -618,7 +613,6 @@ func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute
d.Set("affinity_rules", flattenAffinityRules(computeRec.AffinityRules)) d.Set("affinity_rules", flattenAffinityRules(computeRec.AffinityRules))
d.Set("affinity_weight", computeRec.AffinityWeight) d.Set("affinity_weight", computeRec.AffinityWeight)
d.Set("anti_affinity_rules", flattenListRules(computeRec.AntiAffinityRules)) d.Set("anti_affinity_rules", flattenListRules(computeRec.AntiAffinityRules))
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("boot_order", computeRec.BootOrder) d.Set("boot_order", computeRec.BootOrder)
@@ -661,7 +655,6 @@ func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute
d.Set("natable_vins_network_name", computeRec.NatableVINSNetworkName) d.Set("natable_vins_network_name", computeRec.NatableVINSNetworkName)
d.Set("os_users", flattenOsUsers(computeRec.OSUsers)) d.Set("os_users", flattenOsUsers(computeRec.OSUsers))
d.Set("pinned", computeRec.Pinned) d.Set("pinned", computeRec.Pinned)
d.Set("preferred_CPU", computeRec.PreferredCPU)
d.Set("ram", computeRec.RAM) d.Set("ram", computeRec.RAM)
d.Set("reference_id", computeRec.ReferenceID) d.Set("reference_id", computeRec.ReferenceID)
d.Set("registered", computeRec.Registered) d.Set("registered", computeRec.Registered)
@@ -679,8 +672,7 @@ func flattenDataCompute(d *schema.ResourceData, computeRec compute.RecordCompute
d.Set("updated_time", computeRec.UpdatedTime) d.Set("updated_time", computeRec.UpdatedTime)
d.Set("user_managed", computeRec.UserManaged) d.Set("user_managed", computeRec.UserManaged)
d.Set("userdata", string(userdata)) d.Set("userdata", string(userdata))
d.Set("vnc_password", computeRec.VNCPassword) d.Set("vgpus", flattenVGPUs(computeRec.VGPUs))
d.Set("vgpus", computeRec.VGPUs)
d.Set("virtual_image_id", computeRec.VirtualImageID) d.Set("virtual_image_id", computeRec.VirtualImageID)
d.Set("virtual_image_name", computeRec.VirtualImageName) d.Set("virtual_image_name", computeRec.VirtualImageName)
d.Set("pci_devices", flattenPCI(*pciList)) d.Set("pci_devices", flattenPCI(*pciList))
@@ -821,3 +813,33 @@ func flattenPCIDevice(deviceList []compute.ItemPCIDevice) []map[string]interface
} }
return res return res
} }
func flattenVGPUs(vgpus []compute.ItemVGPU) []map[string]interface{} {
res := make([]map[string]interface{}, len(vgpus))
for i, vgpu := range vgpus {
res[i] = map[string]interface{}{
"id": int(vgpu.ID),
"gid": int(vgpu.GID),
"type": vgpu.Type,
"mode": vgpu.Mode,
"status": vgpu.Status,
"profile_id": vgpu.ProfileID,
"ram": int(vgpu.RAM),
"last_update_time": int(vgpu.LastUpdateTime),
"created_time": int(vgpu.CreatedTime),
"deleted_time": int(vgpu.DeletedTime),
"vmid": int(vgpu.VMID),
"pgpuid": int(vgpu.PGPUID),
"reference_id": vgpu.ReferenceID,
"account_id": int(vgpu.AccountID),
"rg_id": int(vgpu.RGID),
"last_claimed_by": int(vgpu.LastClaimedBy),
"pci_slot": int(vgpu.PCISlot),
"guid": int(vgpu.GUID),
}
}
return res
}

View File

@@ -248,16 +248,6 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
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 preferredCPU, ok := d.GetOk("preferred_cpu"); ok {
preferredList := preferredCPU.([]interface{})
if len(preferredList) > 0 {
for _, v := range preferredList {
cpuNum := v.(int)
createReqX86.PreferredCPU = append(createReqX86.PreferredCPU, int64(cpuNum))
}
}
}
log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86") log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86")
apiResp, err := c.CloudAPI().KVMX86().Create(ctx, createReqX86) apiResp, err := c.CloudAPI().KVMX86().Create(ctx, createReqX86)
if err != nil { if err != nil {
@@ -288,25 +278,6 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
log.Debugf("resourceComputeCreate: new simple Compute ID %d, name %s created", computeId, d.Get("name").(string)) log.Debugf("resourceComputeCreate: new simple Compute ID %d, name %s created", computeId, d.Get("name").(string))
if ars, ok := d.GetOk("pci_devices"); ok {
log.Debugf("resourceComputeCreate: add pci devices on ComputeID: %d", computeId)
addedPciDevices := ars.(*schema.Set).List()
if len(addedPciDevices) > 0 {
for _, v := range addedPciDevices {
devicesConv := v.(int)
req := compute.AttachPCIDeviceRequest{
ComputeID: computeId,
DeviceID: uint64(devicesConv),
}
_, err := c.CloudAPI().Compute().AttachPCIDevice(ctx, req)
if err != nil {
warnings.Add(err)
}
}
}
}
argVal, ok = d.GetOk("extra_disks") argVal, ok = d.GetOk("extra_disks")
if ok && argVal.(*schema.Set).Len() > 0 { if ok && argVal.(*schema.Set).Len() > 0 {
log.Debugf("resourceComputeCreate: calling utilityComputeExtraDisksConfigure to attach %d extra disk(s)", argVal.(*schema.Set).Len()) log.Debugf("resourceComputeCreate: calling utilityComputeExtraDisksConfigure to attach %d extra disk(s)", argVal.(*schema.Set).Len())
@@ -336,17 +307,6 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.Get("pin_to_stack").(bool) {
req := compute.PinToStackRequest{
ComputeID: computeId,
}
req.AutoStart = d.Get("auto_start_w_node").(bool)
_, err := c.CloudAPI().Compute().PinToStack(ctx, req)
if err != nil {
warnings.Add(err)
}
}
// Note bene: we created compute in a STOPPED state (this is required to properly attach 1st network interface), // Note bene: we created compute in a STOPPED state (this is required to properly attach 1st network interface),
// now we need to start it before we report the sequence complete // now we need to start it before we report the sequence complete
if start, ok := d.GetOk("started"); ok { if start, ok := d.GetOk("started"); ok {
@@ -527,14 +487,11 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if !d.Get("pin_to_stack").(bool) && d.Get("auto_start_w_node").(bool) { if d.Get("pin_to_stack").(bool) {
req := compute.UpdateRequest{ req := compute.PinToStackRequest{
ComputeID: computeId, ComputeID: computeId,
AutoStart: d.Get("auto_start_w_node").(bool),
CPUPin: d.Get("cpu_pin").(bool),
HPBacked: d.Get("hp_backed").(bool),
} }
_, err := c.CloudAPI().Compute().Update(ctx, req) _, err := c.CloudAPI().Compute().PinToStack(ctx, req)
if err != nil { if err != nil {
warnings.Add(err) warnings.Add(err)
} }
@@ -550,6 +507,24 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if ars, ok := d.GetOk("pci_devices"); ok {
log.Debugf("resourceComputeCreate: add pci devices on ComputeID: %d", computeId)
addedPciDevices := ars.(*schema.Set).List()
if len(addedPciDevices) > 0 {
for _, v := range addedPciDevices {
devicesConv := v.(int)
req := compute.AttachPCIDeviceRequest{
ComputeID: computeId,
DeviceID: uint64(devicesConv),
}
_, err := c.CloudAPI().Compute().AttachPCIDevice(ctx, req)
if err != nil {
warnings.Add(err)
}
}
}
}
} }
log.Debugf("resourceComputeCreate: new Compute ID %d, name %s creation sequence complete", computeId, d.Get("name").(string)) log.Debugf("resourceComputeCreate: new Compute ID %d, name %s creation sequence complete", computeId, d.Get("name").(string))
@@ -644,7 +619,7 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
if !hasRG { if !hasRG {
return diag.Errorf("resourceComputeUpdate: can't update Compute because rgID %d not allowed or does not exist", d.Get("rg_id").(int)) return diag.Errorf("resourceComputeUpdate: can't update Compute bacause rgID %d not allowed or does not exist", d.Get("rg_id").(int))
} }
hasImage, err := existImageId(ctx, d, m) hasImage, err := existImageId(ctx, d, m)
@@ -653,7 +628,7 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
if !hasImage { if !hasImage {
return diag.Errorf("resourceComputeUpdate: can't update Compute because imageID %d not allowed or does not exist", d.Get("image_id").(int)) return diag.Errorf("resourceComputeUpdate: can't update Compute bacause imageID %d not allowed or does not exist", d.Get("image_id").(int))
} }
if disks, ok := d.GetOk("disks"); ok { if disks, ok := d.GetOk("disks"); ok {
@@ -787,24 +762,6 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
log.Debugf("resourceComputeUpdate: enable=%s Compute ID %v after completing its resource configuration", d.Id(), enabled) log.Debugf("resourceComputeUpdate: enable=%s Compute ID %v after completing its resource configuration", d.Id(), enabled)
} }
if d.HasChange("started") {
start := d.Get("started").(bool)
if start {
req := compute.StartRequest{ComputeID: computeRec.ID}
if _, err := c.CloudAPI().Compute().Start(ctx, req); err != nil {
return diag.FromErr(err)
}
}
if !start {
req := compute.StopRequest{ComputeID: computeRec.ID}
if _, err := c.CloudAPI().Compute().Stop(ctx, req); err != nil {
return diag.FromErr(err)
}
}
}
warnings := dc.Warnings{} warnings := dc.Warnings{}
oldSize, newSize := d.GetChange("boot_disk_size") oldSize, newSize := d.GetChange("boot_disk_size")
@@ -842,34 +799,22 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChange("pin_to_stack") { if d.HasChange("network") {
oldPin, newPin := d.GetChange("pin_to_stack") err = utilityComputeNetworksConfigure(ctx, d, m)
if !newPin.(bool) { if err != nil {
req := compute.UnpinFromStackRequest{ return diag.FromErr(err)
ComputeID: computeRec.ID,
}
_, err := c.CloudAPI().Compute().UnpinFromStack(ctx, req)
if err != nil {
return diag.FromErr(err)
}
}
if !oldPin.(bool) {
req := compute.PinToStackRequest{
ComputeID: computeRec.ID,
}
req.AutoStart = d.Get("auto_start_w_node").(bool)
_, err := c.CloudAPI().Compute().PinToStack(ctx, req)
if err != nil {
return diag.FromErr(err)
}
} }
} }
// Note bene: numa_affinity, cpu_pin and hp_backed, cpu, ram are not allowed to be changed for compute in STARTED tech status. // Note bene: numa_affinity, cpu_pin, old_cpu > new_cpu and hp_backed are not allowed to be changed for compute in STARTED tech status.
// If STARTED, we need to stop it before update // If STARTED, we need to stop it before update
var isStopRequired bool var isStopRequired bool
if d.HasChanges("numa_affinity", "cpu_pin", "hp_backed", "chipset", "preferred_cpu", "ram", "cpu") && d.Get("started").(bool) { if d.HasChanges("numa_affinity", "cpu_pin", "hp_backed") && d.Get("started").(bool) {
isStopRequired = true
}
old, new := d.GetChange("cpu")
if old.(int) > new.(int) && d.Get("started").(bool) {
isStopRequired = true isStopRequired = true
} }
if isStopRequired { if isStopRequired {
@@ -878,6 +823,7 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
// resize
doUpdate := false doUpdate := false
resizeReq := compute.ResizeRequest{ resizeReq := compute.ResizeRequest{
ComputeID: computeRec.ID, ComputeID: computeRec.ID,
@@ -898,22 +844,6 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
resizeReq.CPU = 0 resizeReq.CPU = 0
} }
if resizeReq.CPU != 0 {
if preferredCPU, ok := d.GetOk("preferred_cpu"); ok {
preferredList := preferredCPU.([]interface{})
if len(preferredList) > 0 {
for _, v := range preferredList {
cpuNum := v.(int)
resizeReq.PreferredCPU = append(resizeReq.PreferredCPU, int64(cpuNum))
}
}
}
oldPCPU, newPCPU := d.GetChange("preferred_cpu")
if len(oldPCPU.([]interface{})) != 0 && len(newPCPU.([]interface{})) == 0 {
resizeReq.PreferredCPU = []int64{-1}
}
}
oldRam, newRam := d.GetChange("ram") oldRam, newRam := d.GetChange("ram")
if oldRam.(int) != newRam.(int) { if oldRam.(int) != newRam.(int) {
resizeReq.RAM = uint64(newRam.(int)) resizeReq.RAM = uint64(newRam.(int))
@@ -932,7 +862,7 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChanges("description", "name", "numa_affinity", "cpu_pin", "hp_backed", "chipset", "auto_start_w_node", "preferred_cpu") { if d.HasChanges("description", "name", "numa_affinity", "cpu_pin", "hp_backed") {
req := compute.UpdateRequest{ req := compute.UpdateRequest{
ComputeID: computeRec.ID, ComputeID: computeRec.ID,
} }
@@ -946,27 +876,16 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
if d.HasChange("numa_affinity") { if d.HasChange("numa_affinity") {
req.NumaAffinity = d.Get("numa_affinity").(string) req.NumaAffinity = d.Get("numa_affinity").(string)
} }
if d.HasChange("cpu_pin") {
req.CPUPin = d.Get("cpu_pin").(bool)
}
if d.HasChange("hp_backed") {
req.HPBacked = d.Get("hp_backed").(bool)
}
if d.HasChange("chipset") { if d.HasChange("chipset") {
req.Chipset = d.Get("chipset").(string) req.Chipset = d.Get("chipset").(string)
} }
if d.HasChange("preferred_cpu") {
if preferredCPU, ok := d.GetOk("preferred_cpu"); ok {
preferredList := preferredCPU.([]interface{})
if len(preferredList) > 0 {
for _, v := range preferredList {
cpuNum := v.(int)
req.PreferredCPU = append(req.PreferredCPU, int64(cpuNum))
}
}
}
oldPCPU, newPCPU := d.GetChange("preferred_cpu")
if len(oldPCPU.([]interface{})) != 0 && len(newPCPU.([]interface{})) == 0 {
req.PreferredCPU = []int64{-1}
}
}
req.CPUPin = d.Get("cpu_pin").(bool)
req.HPBacked = d.Get("hp_backed").(bool)
req.AutoStart = d.Get("auto_start_w_node").(bool)
// perform update // perform update
if _, err := c.CloudAPI().Compute().Update(ctx, req); err != nil { if _, err := c.CloudAPI().Compute().Update(ctx, req); err != nil {
@@ -982,13 +901,6 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChange("network") {
err = utilityComputeNetworksConfigure(ctx, d, m)
if err != nil {
return diag.FromErr(err)
}
}
if d.HasChange("disks") { if d.HasChange("disks") {
deletedDisks := make([]interface{}, 0) deletedDisks := make([]interface{}, 0)
addedDisks := make([]interface{}, 0) addedDisks := make([]interface{}, 0)
@@ -1143,6 +1055,24 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChange("started") {
if d.Get("started").(bool) {
req := compute.StartRequest{
ComputeID: computeRec.ID,
}
if _, err := c.CloudAPI().Compute().Start(ctx, req); err != nil {
return diag.FromErr(err)
}
} else {
req := compute.StopRequest{
ComputeID: computeRec.ID,
}
if _, err := c.CloudAPI().Compute().Stop(ctx, req); err != nil {
return diag.FromErr(err)
}
}
}
if d.HasChange("affinity_label") { if d.HasChange("affinity_label") {
affinityLabel := d.Get("affinity_label").(string) affinityLabel := d.Get("affinity_label").(string)
if affinityLabel == "" { if affinityLabel == "" {
@@ -1524,6 +1454,30 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChange("pin_to_stack") {
oldPin, newPin := d.GetChange("pin_to_stack")
if !newPin.(bool) {
req := compute.UnpinFromStackRequest{
ComputeID: computeRec.ID,
}
_, err := c.CloudAPI().Compute().UnpinFromStack(ctx, req)
if err != nil {
return diag.FromErr(err)
}
}
if !oldPin.(bool) {
req := compute.PinToStackRequest{
ComputeID: computeRec.ID,
}
_, err := c.CloudAPI().Compute().PinToStack(ctx, req)
if err != nil {
return diag.FromErr(err)
}
}
}
if d.HasChange("pause") { if d.HasChange("pause") {
oldPause, newPause := d.GetChange("pause") oldPause, newPause := d.GetChange("pause")
if !newPause.(bool) { if !newPause.(bool) {
@@ -1566,9 +1520,6 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
ComputeID: computeRec.ID, ComputeID: computeRec.ID,
Force: false, Force: false,
} }
if forceStop, ok := d.GetOk("force_stop"); ok {
stopReq.Force = forceStop.(bool)
}
_, err := c.CloudAPI().Compute().Stop(ctx, stopReq) _, err := c.CloudAPI().Compute().Stop(ctx, stopReq)
if err != nil { if err != nil {
@@ -1579,13 +1530,15 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
req := compute.RedeployRequest{ req := compute.RedeployRequest{
ComputeID: computeRec.ID, ComputeID: computeRec.ID,
ImageID: uint64(newImage.(int)), ImageID: uint64(newImage.(int)),
DataDisks: "KEEP",
} }
if diskSize, ok := d.GetOk("boot_disk_size"); ok { if diskSize, ok := d.GetOk("boot_disk_size"); ok {
req.DiskSize = uint64(diskSize.(int)) req.DiskSize = uint64(diskSize.(int))
} }
if autoStart, ok := d.GetOk("started"); ok { if dataDisks, ok := d.GetOk("data_disks"); ok {
req.DataDisks = dataDisks.(string)
}
if autoStart, ok := d.GetOk("auto_start"); ok {
req.AutoStart = autoStart.(bool) req.AutoStart = autoStart.(bool)
} }
if forceStop, ok := d.GetOk("force_stop"); ok { if forceStop, ok := d.GetOk("force_stop"); ok {
@@ -1701,16 +1654,6 @@ func resourceComputeDelete(ctx context.Context, d *schema.ResourceData, m interf
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
computeId, _ := strconv.ParseUint(d.Id(), 10, 64) computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
if start, ok := d.GetOk("started"); ok {
if start.(bool) {
req := compute.StopRequest{ComputeID: computeId}
log.Debugf("resourceComputeDelete: stoping Compute ID %d", computeId)
if _, err := c.CloudAPI().Compute().Stop(ctx, req); err != nil {
diag.FromErr(err)
}
}
}
pciList, ok := d.GetOk("pci_devices") pciList, ok := d.GetOk("pci_devices")
if d.Get("permanently").(bool) && ok { if d.Get("permanently").(bool) && ok {
@@ -2169,11 +2112,11 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
Optional: true, Optional: true,
Default: false, Default: false,
}, },
"auto_start_w_node": { "auto_start": {
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
Computed: true, Default: false,
Description: "Flag for start compute after node exits from MAINTENANCE state", Description: "Flag for redeploy compute",
}, },
"force_stop": { "force_stop": {
Type: schema.TypeBool, Type: schema.TypeBool,
@@ -2187,6 +2130,13 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
Default: false, Default: false,
Description: "Flag for resize compute", Description: "Flag for resize compute",
}, },
"data_disks": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"KEEP", "DETACH", "DESTROY"}, false),
Default: "DETACH",
Description: "Flag for redeploy compute",
},
"started": { "started": {
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
@@ -2232,15 +2182,6 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
Default: false, Default: false,
Description: "Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node.", Description: "Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node.",
}, },
"preferred_cpu": {
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
Description: "Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False",
},
"pci_devices": { "pci_devices": {
Type: schema.TypeSet, Type: schema.TypeSet,
Optional: true, Optional: true,
@@ -2459,15 +2400,88 @@ func ResourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"vnc_password": {
Type: schema.TypeString,
Computed: true,
},
"vgpus": { "vgpus": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Elem: &schema.Schema{ Elem: &schema.Resource{
Type: schema.TypeInt, Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeInt,
Computed: true,
},
"gid": {
Type: schema.TypeInt,
Computed: true,
},
"type": {
Type: schema.TypeString,
Computed: true,
},
"mode": {
Type: schema.TypeString,
Computed: true,
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"profile_id": {
Type: schema.TypeInt,
Computed: true,
},
"ram": {
Type: schema.TypeInt,
Computed: true,
},
"last_update_time": {
Type: schema.TypeInt,
Computed: true,
},
"created_time": {
Type: schema.TypeInt,
Computed: true,
},
"deleted_time": {
Type: schema.TypeInt,
Computed: true,
},
"vmid": {
Type: schema.TypeInt,
Computed: true,
},
"pgpuid": {
Type: schema.TypeInt,
Computed: true,
},
"reference_id": {
Type: schema.TypeString,
Computed: true,
},
"account_id": {
Type: schema.TypeInt,
Computed: true,
},
"rg_id": {
Type: schema.TypeInt,
Computed: true,
},
"last_claimed_by": {
Type: schema.TypeInt,
Computed: true,
},
"pci_slot": {
Type: schema.TypeInt,
Computed: true,
},
"bus_number": {
Type: schema.TypeInt,
Computed: true,
},
"guid": {
Type: schema.TypeInt,
Computed: true,
},
},
}, },
}, },
"virtual_image_id": { "virtual_image_id": {
@@ -2496,14 +2510,11 @@ func ResourceCompute() *schema.Resource {
}, },
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_stack", "auto_start_w_node", "network", "affinity_rules", "anti_affinity_rules", if diff.HasChanges() || diff.HasChanges("network", "affinity_rules", "anti_affinity_rules",
"extra_disks", "tags", "port_forwarding", "user_access", "snapshot", "pci_devices", "preferred_cpu") { "disks", "extra_disks", "tags", "port_forwarding", "user_access", "snapshot", "pci_devices") {
diff.SetNewComputed("updated_time") diff.SetNewComputed("updated_time")
diff.SetNewComputed("updated_by") diff.SetNewComputed("updated_by")
} }
if diff.HasChanges("pin_to_stack") {
diff.SetNewComputed("pinned")
}
return nil return nil
}, },

View File

@@ -98,14 +98,6 @@ func utilityComputeExtraDisksConfigure(ctx context.Context, d *schema.ResourceDa
if detach_set.Len() > 0 { if detach_set.Len() > 0 {
computeId, _ := strconv.ParseUint(d.Id(), 10, 64) computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
stopReq := compute.StopRequest{
ComputeID: computeId,
Force: false,
}
_, err := c.CloudAPI().Compute().Stop(ctx, stopReq)
if err != nil {
return err
}
for _, diskId := range detach_set.List() { for _, diskId := range detach_set.List() {
req := compute.DiskDetachRequest{ req := compute.DiskDetachRequest{
@@ -120,14 +112,6 @@ func utilityComputeExtraDisksConfigure(ctx context.Context, d *schema.ResourceDa
} }
} }
req := compute.StartRequest{
ComputeID: computeId,
AltBootID: 0,
}
_, err = c.CloudAPI().Compute().Start(ctx, req)
if err != nil {
return err
}
} }
attach_set := new_set.(*schema.Set).Difference(old_set.(*schema.Set)) attach_set := new_set.(*schema.Set).Difference(old_set.(*schema.Set))

View File

@@ -347,10 +347,6 @@ func vnfDevSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"vnc_password": {
Type: schema.TypeString,
Computed: true,
},
"vins": { "vins": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
@@ -376,8 +372,20 @@ func vinsComputeSchemaMake() map[string]*schema.Schema {
func reservationSchemaMake() map[string]*schema.Schema { func reservationSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{ return map[string]*schema.Schema{
"account_id": { "client_type": {
Type: schema.TypeInt, Type: schema.TypeString,
Computed: true,
},
"desc": {
Type: schema.TypeString,
Computed: true,
},
"domainname": {
Type: schema.TypeString,
Computed: true,
},
"hostname": {
Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"ip": { "ip": {

View File

@@ -151,7 +151,6 @@ func flattenVNFDev(vnfDev vins.RecordVNFDev) []map[string]interface{} {
"status": vnfDev.Status, "status": vnfDev.Status,
"tech_status": vnfDev.TechStatus, "tech_status": vnfDev.TechStatus,
"type": vnfDev.Type, "type": vnfDev.Type,
"vnc_password": vnfDev.VNCPassword,
"vins": vnfDev.VINS, "vins": vnfDev.VINS,
} }
@@ -177,11 +176,14 @@ func flattenReservations(reservations vins.ListReservations) []map[string]interf
res := make([]map[string]interface{}, 0, len(reservations)) res := make([]map[string]interface{}, 0, len(reservations))
for _, reservation := range reservations { for _, reservation := range reservations {
temp := map[string]interface{}{ temp := map[string]interface{}{
"account_id": reservation.AccountID, "client_type": reservation.ClientType,
"ip": reservation.IP, "desc": reservation.Description,
"mac": reservation.MAC, "domainname": reservation.DomainName,
"type": reservation.Type, "hostname": reservation.Hostname,
"vm_id": reservation.VMID, "ip": reservation.IP,
"mac": reservation.MAC,
"type": reservation.Type,
"vm_id": reservation.VMID,
} }
res = append(res, temp) res = append(res, temp)
} }

View File

@@ -1,194 +1,277 @@
/* /*
Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved. Copyright (c) 2019-2022 Digital Energy Cloud Solutions LLC. All Rights Reserved.
Authors: Authors:
Petr Krutov, <petr.krutov@digitalenergy.online> Petr Krutov, <petr.krutov@digitalenergy.online>
Stanislav Solovev, <spsolovev@digitalenergy.online> Stanislav Solovev, <spsolovev@digitalenergy.online>
Kasim Baybikov, <kmbaybikov@basistech.ru> Kasim Baybikov, <kmbaybikov@basistech.ru>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
/* /*
Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud Terraform DECORT provider - manage resources provided by DECORT (Digital Energy Cloud
Orchestration Technology) with Terraform by Hashicorp. Orchestration Technology) with Terraform by Hashicorp.
Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort Source code: https://repository.basistech.ru/BASIS/terraform-provider-decort
Please see README.md to learn where to place source code so that it Please see README.md to learn where to place source code so that it
builds seamlessly. builds seamlessly.
Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki Documentation: https://repository.basistech.ru/BASIS/terraform-provider-decort/wiki
*/ */
package vins package vins
import ( import (
"context" "context"
"fmt" "fmt"
"strconv" "strconv"
"strings" "strings"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vins" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudapi/vins"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
) )
func resourceStaticRouteCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { func resourceStaticRouteCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
if _, ok := d.GetOk("vins_id"); ok { if _, ok := d.GetOk("vins_id"); ok {
haveVinsID, err := existVinsID(ctx, d, m) haveVinsID, err := existVinsID(ctx, d, m)
if err != nil { if err != nil {
return diag.FromErr(err) return diag.FromErr(err)
} }
if !haveVinsID { if !haveVinsID {
return diag.Errorf("resourceStaticRouteCreate: can't create Static Route because Vins ID %d is not allowed or does not exist", d.Get("vins_id").(int)) return diag.Errorf("resourceStaticRouteCreate: can't create Static Route because Vins ID %d is not allowed or does not exist", d.Get("vins_id").(int))
} }
} }
req := vins.StaticRouteAddRequest{ req := vins.StaticRouteAddRequest{
VINSID: uint64(d.Get("vins_id").(int)), VINSID: uint64(d.Get("vins_id").(int)),
Destination: d.Get("destination").(string), Destination: d.Get("destination").(string),
Netmask: d.Get("netmask").(string), Netmask: d.Get("netmask").(string),
Gateway: d.Get("gateway").(string), Gateway: d.Get("gateway").(string),
} }
_, err := c.CloudAPI().VINS().StaticRouteAdd(ctx, req) if computesIDS, ok := d.GetOk("compute_ids"); ok {
if err != nil { ids := computesIDS.([]interface{})
return diag.FromErr(err)
} res := make([]uint64, 10)
staticRouteData, err := getStaticRouteData(ctx, d, m) for _, id := range ids {
if err != nil { computeId := uint64(id.(int))
d.SetId("") res = append(res, computeId)
return diag.FromErr(err) }
}
req.ComputeIds = res
d.SetId(fmt.Sprintf("%d#%d", req.VINSID, staticRouteData.ID)) }
return resourceStaticRouteRead(ctx, d, m) _, err := c.CloudAPI().VINS().StaticRouteAdd(ctx, req)
} if err != nil {
return diag.FromErr(err)
func resourceStaticRouteRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { }
warnings := dc.Warnings{}
staticRouteData, err := getStaticRouteData(ctx, d, m)
staticRouteData, err := utilityDataStaticRouteCheckPresence(ctx, d, m) if err != nil {
if err != nil { d.SetId("")
d.SetId("") return diag.FromErr(err)
return diag.FromErr(err) }
}
d.SetId(fmt.Sprintf("%d#%d", req.VINSID, staticRouteData.ID))
flattenStaticRouteData(d, staticRouteData)
return resourceStaticRouteRead(ctx, d, m)
return warnings.Get() }
}
func resourceStaticRouteRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
func resourceStaticRouteUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { warnings := dc.Warnings{}
return nil
} staticRouteData, err := utilityDataStaticRouteCheckPresence(ctx, d, m)
if err != nil {
func resourceStaticRouteDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { d.SetId("")
c := m.(*controller.ControllerCfg) return diag.FromErr(err)
arr := strings.Split(d.Id(), "#") }
if len(arr) != 2 {
return diag.FromErr(fmt.Errorf("broken state id")) flattenStaticRouteData(d, staticRouteData)
}
return warnings.Get()
vinsId, _ := strconv.ParseUint(arr[0], 10, 64) }
routeId, _ := strconv.ParseUint(arr[1], 10, 64)
func resourceStaticRouteUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
req := vins.StaticRouteDelRequest{ c := m.(*controller.ControllerCfg)
VINSID: vinsId, warnings := dc.Warnings{}
RouteId: routeId,
} if _, ok := d.GetOk("vins_id"); ok {
haveVinsID, err := existVinsID(ctx, d, m)
_, err := c.CloudAPI().VINS().StaticRouteDel(ctx, req) if err != nil {
if err != nil { return diag.FromErr(err)
return diag.FromErr(err) }
}
if !haveVinsID {
d.SetId("") return diag.Errorf("resourceVinsUpdate: can't update Static Route because VinsID %d is not allowed or does not exist", d.Get("vins_id").(int))
}
return nil }
}
staticRouteData, err := utilityDataStaticRouteCheckPresence(ctx, d, m)
func resourceStaticRouteSchemaMake() map[string]*schema.Schema { if err != nil {
rets := dataSourceStaticRouteSchemaMake() d.SetId("")
rets["route_id"] = &schema.Schema{ return diag.FromErr(err)
Type: schema.TypeInt, }
Computed: true,
Optional: true, if d.HasChange("compute_ids") {
} deletedIds := make([]uint64, 0)
rets["compute_ids"] = &schema.Schema{ addedIds := make([]uint64, 0)
Type: schema.TypeList,
Computed: true, oldComputeIds, newComputeIds := d.GetChange("compute_ids")
Elem: &schema.Schema{ oldComputeIdsSlice := oldComputeIds.([]interface{})
Type: schema.TypeInt, newComputeIdsSlice := newComputeIds.([]interface{})
},
} for _, el := range oldComputeIdsSlice {
rets["destination"] = &schema.Schema{ if !isContainsIds(newComputeIdsSlice, el) {
Type: schema.TypeString, convertedEl := uint64(el.(int))
Required: true, deletedIds = append(deletedIds, convertedEl)
} }
}
rets["gateway"] = &schema.Schema{
Type: schema.TypeString, for _, el := range newComputeIdsSlice {
Required: true, if !isContainsIds(oldComputeIdsSlice, el) {
} convertedEl := uint64(el.(int))
rets["netmask"] = &schema.Schema{ addedIds = append(addedIds, convertedEl)
Type: schema.TypeString, }
Required: true, }
}
if len(deletedIds) > 0 {
return rets req := vins.StaticRouteAccessRevokeRequest{
} VINSID: uint64(d.Get("vins_id").(int)),
RouteId: staticRouteData.ID,
func isContainsIds(els []interface{}, el interface{}) bool { ComputeIds: deletedIds,
convEl := el.(int) }
for _, elOld := range els {
if convEl == elOld.(int) { _, err := c.CloudAPI().VINS().StaticRouteAccessRevoke(ctx, req)
return true if err != nil {
} warnings.Add(err)
} }
return false }
}
if len(addedIds) > 0 {
func ResourceStaticRoute() *schema.Resource { req := vins.StaticRouteAccessGrantRequest{
return &schema.Resource{ VINSID: uint64(d.Get("vins_id").(int)),
SchemaVersion: 1, RouteId: staticRouteData.ID,
ComputeIds: addedIds,
CreateContext: resourceStaticRouteCreate, }
ReadContext: resourceStaticRouteRead,
UpdateContext: resourceStaticRouteUpdate, _, err := c.CloudAPI().VINS().StaticRouteAccessGrant(ctx, req)
DeleteContext: resourceStaticRouteDelete, if err != nil {
warnings.Add(err)
Importer: &schema.ResourceImporter{ }
StateContext: schema.ImportStatePassthroughContext, }
}, }
Timeouts: &schema.ResourceTimeout{ return append(warnings.Get(), resourceStaticRouteRead(ctx, d, m)...)
Create: &constants.Timeout20m, }
Read: &constants.Timeout600s,
Update: &constants.Timeout20m, func resourceStaticRouteDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
Delete: &constants.Timeout600s, c := m.(*controller.ControllerCfg)
Default: &constants.Timeout600s, arr := strings.Split(d.Id(), "#")
}, if len(arr) != 2 {
return diag.FromErr(fmt.Errorf("broken state id"))
Schema: resourceStaticRouteSchemaMake(), }
}
} vinsId, _ := strconv.ParseUint(arr[0], 10, 64)
routeId, _ := strconv.ParseUint(arr[1], 10, 64)
req := vins.StaticRouteDelRequest{
VINSID: vinsId,
RouteId: routeId,
}
_, err := c.CloudAPI().VINS().StaticRouteDel(ctx, req)
if err != nil {
return diag.FromErr(err)
}
d.SetId("")
return nil
}
func resourceStaticRouteSchemaMake() map[string]*schema.Schema {
rets := dataSourceStaticRouteSchemaMake()
rets["route_id"] = &schema.Schema{
Type: schema.TypeInt,
Computed: true,
Optional: true,
}
rets["compute_ids"] = &schema.Schema{
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
}
rets["destination"] = &schema.Schema{
Type: schema.TypeString,
Required: true,
}
rets["gateway"] = &schema.Schema{
Type: schema.TypeString,
Required: true,
}
rets["netmask"] = &schema.Schema{
Type: schema.TypeString,
Required: true,
}
return rets
}
func isContainsIds(els []interface{}, el interface{}) bool {
convEl := el.(int)
for _, elOld := range els {
if convEl == elOld.(int) {
return true
}
}
return false
}
func ResourceStaticRoute() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
CreateContext: resourceStaticRouteCreate,
ReadContext: resourceStaticRouteRead,
UpdateContext: resourceStaticRouteUpdate,
DeleteContext: resourceStaticRouteDelete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Timeouts: &schema.ResourceTimeout{
Create: &constants.Timeout20m,
Read: &constants.Timeout600s,
Update: &constants.Timeout20m,
Delete: &constants.Timeout600s,
Default: &constants.Timeout600s,
},
Schema: resourceStaticRouteSchemaMake(),
}
}

View File

@@ -706,7 +706,7 @@ func extNetSchemaMake() map[string]*schema.Schema {
Optional: true, Optional: true,
}, },
"ext_net_ip": { "ext_net_ip": {
Type: schema.TypeString, Type: schema.TypeInt,
Optional: true, Optional: true,
Default: "", Default: "",
}, },

View File

@@ -1,71 +0,0 @@
/*
Copyright (c) 2019-2022 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>
Tim Tkachev, <tvtkachev@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 extnet
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 dataSourceExtnetReservedIpRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
reservedList, err := utilityExtnetReservedIpCheckPresence(ctx, d, m)
if err != nil {
return diag.FromErr(err)
}
id := uuid.New()
d.SetId(id.String())
d.Set("items", flattenExtnetReservedIp(reservedList))
return nil
}
func DataSourceExtnetReservedIp() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceExtnetReservedIpRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceExtnetReservedIpSchemaMake(),
}
}

View File

@@ -133,6 +133,7 @@ func flattenRecordExtnetResource(d *schema.ResourceData, recNet *extnet.RecordEx
d.Set("routes", flattenStaticRouteList(staticRouteList)) d.Set("routes", flattenStaticRouteList(staticRouteList))
} }
func flattenExtnetExcluded(ers extnet.ListReservations) []map[string]interface{} { func flattenExtnetExcluded(ers extnet.ListReservations) []map[string]interface{} {
res := make([]map[string]interface{}, 0) res := make([]map[string]interface{}, 0)
for _, er := range ers { for _, er := range ers {
@@ -156,7 +157,6 @@ func flattenExtnetReservations(ers extnet.ListReservations) []map[string]interfa
res := make([]map[string]interface{}, 0) res := make([]map[string]interface{}, 0)
for _, er := range ers { for _, er := range ers {
temp := map[string]interface{}{ temp := map[string]interface{}{
"account_id": er.AccountID,
"client_type": er.ClientType, "client_type": er.ClientType,
"domain_name": er.DomainName, "domain_name": er.DomainName,
"hostname": er.Hostname, "hostname": er.Hostname,
@@ -217,30 +217,4 @@ func flattenStaticRouteData(d *schema.ResourceData, route *extnet.ItemRoutes) {
d.Set("netmask", route.Netmask) d.Set("netmask", route.Netmask)
d.Set("compute_ids", route.ComputeIds) d.Set("compute_ids", route.ComputeIds)
d.Set("route_id", route.ID) d.Set("route_id", route.ID)
} }
func flattenExtnetReservedIp(el []extnet.RecordReservedIP) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(el))
for _, e := range el {
reservations := make([]map[string]interface{}, 0, len(e.Reservations))
for _, r := range e.Reservations {
temp := map[string]interface{}{
"account_id": r.AccountID,
"client_type": r.ClientType,
"domain_name": r.DomainName,
"hostname": r.Hostname,
"ip": r.IP,
"mac": r.Mac,
"type": r.Type,
"vm_id": r.VMID,
}
reservations = append(reservations, temp)
}
item := map[string]interface{}{
"extnet_id": e.ExtnetID,
"reservations": reservations,
}
res = append(res, item)
}
return res
}

View File

@@ -54,9 +54,6 @@ func resourceExtnetCreate(ctx context.Context, d *schema.ResourceData, m interfa
if err := ic.ExistGID(ctx, uint64(d.Get("gid").(int)), c); err != nil { if err := ic.ExistGID(ctx, uint64(d.Get("gid").(int)), c); err != nil {
return diag.FromErr(err) return diag.FromErr(err)
} }
if err := checkReserveIp(ctx, d, c); err != nil {
return diag.FromErr(err)
}
req := extnet.CreateRequest{ req := extnet.CreateRequest{
Name: d.Get("name").(string), Name: d.Get("name").(string),
@@ -194,34 +191,6 @@ func resourceExtnetCreate(ctx context.Context, d *schema.ResourceData, m interfa
} }
} }
// for reserve IP extnet must be enabled
if d.Get("reserved_ip").(*schema.Set).Len() > 0 {
for _, reservedIP := range d.Get("reserved_ip").(*schema.Set).List() {
reservedIPMap := reservedIP.(map[string]interface{})
req := extnet.AddReserveIPRequest{
AccountID: uint64(reservedIPMap["account_id"].(int)),
ExtNetID: netID,
}
if ipCount, ok := reservedIPMap["ip_count"]; ok {
req.IPCount = uint64(ipCount.(int))
}
if reservedIPMap["ips"].(*schema.Set).Len() > 0 {
ips := reservedIPMap["ips"].(*schema.Set).List()
for i, ip := range ips {
if i >= int(req.IPCount) {
break
}
req.IPs = append(req.IPs, ip.(string))
}
}
_, err := c.CloudBroker().ExtNet().AddReserveIP(ctx, req)
if err != nil {
w.Add(err)
}
}
}
return resourceExtnetRead(ctx, d, m) return resourceExtnetRead(ctx, d, m)
} }
@@ -246,10 +215,6 @@ func resourceExtnetUpdate(ctx context.Context, d *schema.ResourceData, m interfa
log.Debugf("cloudbroker: resourceExtnetUpdate called with id %s", d.Id()) log.Debugf("cloudbroker: resourceExtnetUpdate called with id %s", d.Id())
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
if err := checkReserveIp(ctx, d, c); err != nil {
return diag.FromErr(err)
}
recNet, err := utilityExtnetCheckPresence(ctx, d, m) recNet, err := utilityExtnetCheckPresence(ctx, d, m)
if err != nil { if err != nil {
d.SetId("") d.SetId("")
@@ -302,12 +267,6 @@ func resourceExtnetUpdate(ctx context.Context, d *schema.ResourceData, m interfa
} }
} }
if d.HasChange("reserved_ip") {
if err := reservedIPsUpdate(ctx, d, c, recNet); err != nil {
return diag.FromErr(err)
}
}
if d.HasChange("shared_with") { if d.HasChange("shared_with") {
if err := handleSharedWithUpdate(ctx, d, c); err != nil { if err := handleSharedWithUpdate(ctx, d, c); err != nil {
return diag.FromErr(err) return diag.FromErr(err)
@@ -371,8 +330,6 @@ func ResourceExtnetCB() *schema.Resource {
Default: &constants.Timeout300s, Default: &constants.Timeout300s,
}, },
CustomizeDiff: validateReserveIPs,
Schema: resourceExtnetSchemaMake(), Schema: resourceExtnetSchemaMake(),
} }
} }

View File

@@ -1,9 +1,6 @@
package extnet package extnet
import ( import "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
func dataSourceExtnetDefaultSchemaMake() map[string]*schema.Schema { func dataSourceExtnetDefaultSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{ return map[string]*schema.Schema{
@@ -477,10 +474,6 @@ func dataSourceExtnetSchemaMake() map[string]*schema.Schema {
Computed: true, Computed: true,
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"account_id": {
Type: schema.TypeInt,
Computed: true,
},
"client_type": { "client_type": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -735,30 +728,6 @@ func resourceExtnetSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
}, },
}, },
"reserved_ip": {
Type: schema.TypeSet,
Optional: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"account_id": {
Type: schema.TypeInt,
Required: true,
},
"ip_count": {
Type: schema.TypeInt,
Optional: true,
ValidateFunc: validation.IntBetween(1, 255),
},
"ips": {
Type: schema.TypeSet,
Optional: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
},
},
},
"ckey": { "ckey": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -899,10 +868,6 @@ func resourceExtnetSchemaMake() map[string]*schema.Schema {
Computed: true, Computed: true,
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"account_id": {
Type: schema.TypeInt,
Computed: true,
},
"client_type": { "client_type": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -940,69 +905,3 @@ func resourceExtnetSchemaMake() map[string]*schema.Schema {
}, },
} }
} }
func dataSourceExtnetReservedIpSchemaMake() map[string]*schema.Schema {
res := map[string]*schema.Schema{
"account_id": {
Type: schema.TypeInt,
Required: true,
},
"extnet_id": {
Type: schema.TypeInt,
Optional: true,
},
"items": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"extnet_id": {
Type: schema.TypeInt,
Computed: true,
},
"reservations": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"account_id": {
Type: schema.TypeInt,
Computed: true,
},
"client_type": {
Type: schema.TypeString,
Computed: true,
},
"domain_name": {
Type: schema.TypeString,
Computed: true,
},
"hostname": {
Type: schema.TypeString,
Computed: true,
},
"ip": {
Type: schema.TypeString,
Computed: true,
},
"mac": {
Type: schema.TypeString,
Computed: true,
},
"type": {
Type: schema.TypeString,
Computed: true,
},
"vm_id": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
},
},
},
}
return res
}

View File

@@ -1,61 +0,0 @@
/*
Copyright (c) 2019-2022 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 extnet
import (
"context"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/extnet"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
)
func utilityExtnetReservedIpCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) ([]extnet.RecordReservedIP, error) {
c := m.(*controller.ControllerCfg)
req := extnet.GetReservedIP{
AccountID: uint64(d.Get("account_id").(int)),
}
if extNetID, ok := d.GetOk("extnet_id"); ok {
req.ExtNetID = uint64(extNetID.(int))
}
log.Debugf("utilityExtnetReservedIpCheckPresence")
res, err := c.CloudBroker().ExtNet().GetReservedIP(ctx, req)
if err != nil {
return nil, err
}
return res, nil
}

View File

@@ -35,8 +35,6 @@ package extnet
import ( import (
"context" "context"
"errors"
"fmt"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@@ -343,255 +341,3 @@ func handleMigrateUpdate(ctx context.Context, d *schema.ResourceData, c *control
return nil return nil
} }
func checkReserveIp(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg) error {
var err error
if d.Get("reserved_ip").(*schema.Set).Len() > 0 {
reservedIPList := d.Get("reserved_ip").(*schema.Set).List()
accountMap := make(map[int]struct{}, len(reservedIPList))
for _, reservedIP := range reservedIPList {
reservedIPMap := reservedIP.(map[string]interface{})
accountId := reservedIPMap["account_id"].(int)
if _, ok := accountMap[accountId]; ok {
err = errors.Join(err, fmt.Errorf("checkReserveIp: you must have only one block with id %d", accountId))
}
accountMap[accountId] = struct{}{}
_, okCount := reservedIPMap["ip_count"]
if !okCount && reservedIPMap["ips"].(*schema.Set).Len() == 0 {
err = errors.Join(err, fmt.Errorf("checkReserveIp: either ip_count or set of ips must be specified"))
}
existErr := ic.ExistAccount(ctx, uint64(accountId), c)
if existErr != nil {
err = errors.Join(err, existErr)
}
}
}
return err
}
func reservedIPsUpdate(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg, recNet *extnet.RecordExtNet) error {
addSet, delSet, err := differenceIPReserved(ctx, d, c)
if err != nil {
return err
}
if len(delSet) > 0 {
for _, del := range delSet {
delMap := del.(map[string]interface{})
log.Debugf("reservedIPsUpdate: removing reserved IPs for account %d", delMap["account_id"].(int))
req := extnet.DelReserveIPRequest{
AccountID: uint64(delMap["account_id"].(int)),
ExtNetID: recNet.ID,
}
if ipCount, ok := delMap["ip_count"]; ok {
req.IPCount = uint64(ipCount.(int))
}
if delIPs, ok := delMap["ips"]; ok {
ips := delIPs.(*schema.Set).List()
for _, ip := range ips {
req.IPs = append(req.IPs, ip.(string))
}
}
_, err := c.CloudBroker().ExtNet().DelReserveIP(ctx, req)
if err != nil {
return err
}
}
}
if len(addSet) > 0 {
for _, add := range addSet {
addMap := add.(map[string]interface{})
log.Debugf("reservedIPsUpdate: add reserved IPs for account %d", addMap["account_id"].(int))
req := extnet.AddReserveIPRequest{
AccountID: uint64(addMap["account_id"].(int)),
ExtNetID: recNet.ID,
}
if ipCount, ok := addMap["ip_count"]; ok {
req.IPCount = uint64(ipCount.(int))
}
if addIPs, ok := addMap["ips"]; ok {
ips := addIPs.(*schema.Set).List()
for _, ip := range ips {
req.IPs = append(req.IPs, ip.(string))
}
}
_, err := c.CloudBroker().ExtNet().AddReserveIP(ctx, req)
if err != nil {
return err
}
}
}
return nil
}
func differenceIPReserved(ctx context.Context, d *schema.ResourceData, c *controller.ControllerCfg) (addList, delList []interface{}, errs error) {
addList = make([]interface{}, 0)
delList = make([]interface{}, 0)
oldSet, newSet := d.GetChange("reserved_ip")
oldList := oldSet.(*schema.Set).List()
newList := newSet.(*schema.Set).List()
for _, oldReservedIP := range oldList {
oldMap := oldReservedIP.(map[string]interface{})
found := false
for _, newReservedIP := range newList {
newMap := newReservedIP.(map[string]interface{})
if newMap["account_id"] == oldMap["account_id"] && newMap["ip_count"] == oldMap["ip_count"] && newMap["ips"] == oldMap["ips"] {
found = true
break
}
if newMap["account_id"] == oldMap["account_id"] {
add := make(map[string]interface{}, 0)
del := make(map[string]interface{}, 0)
delSet := oldMap["ips"].(*schema.Set).Difference(newMap["ips"].(*schema.Set))
addSet := newMap["ips"].(*schema.Set).Difference(oldMap["ips"].(*schema.Set))
if delSet.Len() > 0 {
del["account_id"] = oldMap["account_id"].(int)
del["ips"] = delSet
if oldMap["ip_count"].(int)-newMap["ip_count"].(int) >= delSet.Len() {
del["ip_count"] = oldMap["ip_count"].(int) - newMap["ip_count"].(int)
} else {
del["ip_count"] = delSet.Len()
newMap["ip_count"] = newMap["ip_count"].(int) + delSet.Len()
}
} else if newMap["ip_count"].(int) < oldMap["ip_count"].(int) {
del["account_id"] = oldMap["account_id"].(int)
del["ip_count"] = oldMap["ip_count"].(int) - newMap["ip_count"].(int)
}
if addSet.Len() > 0 {
add["account_id"] = oldMap["account_id"].(int)
add["ips"] = addSet
add["ip_count"] = newMap["ip_count"].(int) - oldMap["ip_count"].(int)
if add["ip_count"].(int) < 0 {
add["ip_count"] = 0
}
if add["ip_count"].(int)-addSet.Len() < 0 {
del["account_id"] = oldMap["account_id"].(int)
if _, ok := del["ip_count"]; ok {
del["ip_count"] = del["ip_count"].(int) + addSet.Len()
} else {
del["ip_count"] = addSet.Len()
}
}
} else if newMap["ip_count"].(int)-oldMap["ip_count"].(int) > 0 {
add["account_id"] = oldMap["account_id"].(int)
add["ip_count"] = newMap["ip_count"].(int) - oldMap["ip_count"].(int)
}
if _, ok := add["account_id"]; ok {
addList = append(addList, add)
}
if _, ok := del["account_id"]; ok {
ipsLen := 0
if _, ok := del["ips"]; ok {
ipsLen = del["ips"].(*schema.Set).Len()
}
freeCount := del["ip_count"].(int) - ipsLen
if freeCount > 0 {
req := extnet.GetReservedIP{
AccountID: uint64(del["account_id"].(int)),
ExtNetID: uint64(d.Get("extnet_id").(int)),
}
resIpsList, err := c.CloudBroker().ExtNet().GetReservedIP(ctx, req)
if err != nil {
errs = errors.Join(errs, err)
}
freeIPs := getFreeIps(resIpsList[0].Reservations, newMap["ips"], del["ips"])
if _, ok := del["ips"]; !ok {
del["ips"] = schema.NewSet(schema.HashString, []interface{}{})
}
for i := 0; i < freeCount; i++ {
del["ips"].(*schema.Set).Add(freeIPs[i])
}
}
delList = append(delList, del)
}
found = true
break
}
}
if found {
continue
}
delList = append(delList, oldReservedIP)
}
for _, newReservedIP := range newList {
newMap := newReservedIP.(map[string]interface{})
found := false
for _, oldReservedIP := range oldList {
oldMap := oldReservedIP.(map[string]interface{})
if newMap["account_id"] == oldMap["account_id"] {
found = true
break
}
}
if found {
continue
}
addList = append(addList, newReservedIP)
}
if errs != nil {
d.Set("reserved_ip", oldSet)
}
return
}
// getFreeIps returns array IPs which can be deleted
func getFreeIps(reserved []extnet.Reservations, newIps, delIps interface{}) []string {
newIpsList := make([]interface{}, 0)
delIpsList := make([]interface{}, 0)
if newIps != nil {
newIpsList = newIps.(*schema.Set).List()
}
if delIps != nil {
delIpsList = delIps.(*schema.Set).List()
}
newIpsMap := make(map[string]struct{}, len(newIpsList))
delIpsMap := make(map[string]struct{}, len(delIpsList))
freeIPs := make([]string, 0)
for _, ip := range newIpsList {
newIpsMap[ip.(string)] = struct{}{}
}
for _, ip := range delIpsList {
delIpsMap[ip.(string)] = struct{}{}
}
for _, item := range reserved {
if _, ok := newIpsMap[item.IP]; ok {
continue
}
if _, ok := delIpsMap[item.IP]; ok {
continue
}
freeIPs = append(freeIPs, item.IP)
}
return freeIPs
}
func validateReserveIPs(ctx context.Context, d *schema.ResourceDiff, m interface{}) error {
list := d.Get("reserved_ip").(*schema.Set).List()
var errs error
for _, reservedIP := range list {
reservedIPMap := reservedIP.(map[string]interface{})
var countIP, ipsLen int
if _, ok := reservedIPMap["ip_count"]; ok {
countIP = reservedIPMap["ip_count"].(int)
}
if _, ok := reservedIPMap["ips"]; ok {
ipsLen = reservedIPMap["ips"].(*schema.Set).Len()
}
if ipsLen > countIP {
errs = errors.Join(errs, fmt.Errorf("for the reserved_ip block with account_id %d the count parameter must be greater than or equal to len the ips array", reservedIPMap["account_id"].(int)))
}
}
return errs
}

View File

@@ -34,45 +34,21 @@ package grid
import ( import (
"context" "context"
"os" "strconv"
"github.com/google/uuid"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
) )
func dataSourceGridGetDiagnosisRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { func dataSourceGridGetDiagnosisRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
filePath := "diagnosis.tar.gz"
if userPath, ok := d.GetOk("file_path"); ok {
filePath = userPath.(string)
}
log.Debugf("dataSourceGridGetDiagnosisRead: create file with name: %s", filePath)
file, err := os.Create(filePath)
defer file.Close()
if err != nil {
d.SetId("") // ensure ID is empty in this case
return diag.FromErr(err)
}
diagnosis, err := utilityGridGetDiagnosisCheckPresence(ctx, d, m) diagnosis, err := utilityGridGetDiagnosisCheckPresence(ctx, d, m)
if err != nil { if err != nil {
d.SetId("") d.SetId("")
return diag.FromErr(err) return diag.FromErr(err)
} }
d.SetId(strconv.Itoa(d.Get("gid").(int)))
log.Debugf("dataSourceGridGetDiagnosisRead: write data to file with name: %s", filePath) d.Set("diagnosis", diagnosis)
_, err = file.WriteString(diagnosis)
if err != nil {
d.SetId("") // ensure ID is empty in this case
return diag.FromErr(err)
}
id := uuid.New()
d.SetId(id.String())
return nil return nil
} }
@@ -90,3 +66,29 @@ func DataSourceGridGetDiagnosis() *schema.Resource {
Schema: dataSourceGridGetDiagnosisSchemaMake(), Schema: dataSourceGridGetDiagnosisSchemaMake(),
} }
} }
func dataSourceGridPostDiagnosisRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
diagnosis, err := utilityGridPostDiagnosisCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
d.SetId(strconv.Itoa(d.Get("gid").(int)))
d.Set("diagnosis", diagnosis)
return nil
}
func DataSourceGridPostDiagnosis() *schema.Resource {
return &schema.Resource{
SchemaVersion: 1,
ReadContext: dataSourceGridPostDiagnosisRead,
Timeouts: &schema.ResourceTimeout{
Read: &constants.Timeout30s,
Default: &constants.Timeout60s,
},
Schema: dataSourceGridPostDiagnosisSchemaMake(),
}
}

View File

@@ -586,10 +586,23 @@ func dataSourceGridGetDiagnosisSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Required: true, Required: true,
}, },
"file_path": { "diagnosis": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true,
},
}
}
func dataSourceGridPostDiagnosisSchemaMake() map[string]*schema.Schema {
return map[string]*schema.Schema{
"gid": {
Type: schema.TypeInt,
Required: true, Required: true,
}, },
"diagnosis": {
Type: schema.TypeString,
Computed: true,
},
} }
} }

View File

@@ -62,3 +62,23 @@ func utilityGridGetDiagnosisCheckPresence(ctx context.Context, d *schema.Resourc
return gridGetDiagnosis, nil return gridGetDiagnosis, nil
} }
func utilityGridPostDiagnosisCheckPresence(ctx context.Context, d *schema.ResourceData, m interface{}) (string, error) {
c := m.(*controller.ControllerCfg)
req := grid.GetDiagnosisRequest{}
if d.Id() != "" {
id, _ := strconv.ParseUint(d.Id(), 10, 64)
req.GID = id
} else {
req.GID = uint64(d.Get("gid").(int))
}
log.Debugf("utilityGridPostDiagnosisCheckPresence: load grid post diagnosis")
gridPostDiagnosis, err := c.CloudBroker().Grid().GetDiagnosis(ctx, req)
if err != nil {
return "", err
}
return gridPostDiagnosis, nil
}

View File

@@ -48,7 +48,6 @@ func flattenImage(d *schema.ResourceData, img *image.RecordImage) {
d.Set("sep_id", img.SEPID) d.Set("sep_id", img.SEPID)
d.Set("shared_with", img.SharedWith) d.Set("shared_with", img.SharedWith)
d.Set("size", img.Size) d.Set("size", img.Size)
d.Set("snapshot_id", img.SnapshotID)
d.Set("status", img.Status) d.Set("status", img.Status)
d.Set("tech_status", img.TechStatus) d.Set("tech_status", img.TechStatus)
d.Set("image_type", img.Type) d.Set("image_type", img.Type)
@@ -93,48 +92,47 @@ func flattenImageList(il *image.ListImages) []map[string]interface{} {
cdPresentedTo, _ := json.Marshal(item.CdPresentedTo) cdPresentedTo, _ := json.Marshal(item.CdPresentedTo)
temp := map[string]interface{}{ temp := map[string]interface{}{
"image_id": item.ID, "image_id": item.ID,
"unc_path": item.UNCPath, "unc_path": item.UNCPath,
"account_id": item.AccountID, "account_id": item.AccountID,
"acl": flattenAcl(item.ACL), "acl": flattenAcl(item.ACL),
"architecture": item.Architecture, "architecture": item.Architecture,
"boot_type": item.BootType, "boot_type": item.BootType,
"bootable": item.Bootable, "bootable": item.Bootable,
"computeci_id": item.ComputeCIID, "computeci_id": item.ComputeCIID,
"cd_presented_to": string(cdPresentedTo), "cd_presented_to": string(cdPresentedTo),
"deleted_time": item.DeletedTime, "deleted_time": item.DeletedTime,
"desc": item.Description, "desc": item.Description,
"drivers": item.Drivers, "drivers": item.Drivers,
"enabled": item.Enabled, "enabled": item.Enabled,
"gid": item.GID, "gid": item.GID,
"guid": item.GUID, "guid": item.GUID,
"history": flattenHistory(item.History), "history": flattenHistory(item.History),
"hot_resize": item.HotResize, "hot_resize": item.HotResize,
"last_modified": item.LastModified, "last_modified": item.LastModified,
"link_to": item.LinkTo, "link_to": item.LinkTo,
"milestones": item.Milestones, "milestones": item.Milestones,
"name": item.Name, "name": item.Name,
"network_interface_naming": item.NetworkInterfaceNaming, "network_interface_naming": item.NetworkInterfaceNaming,
"password": item.Password, "password": item.Password,
"pool_name": item.Pool, "pool_name": item.Pool,
"present_to": item.PresentTo, "present_to": item.PresentTo,
"provider_name": item.ProviderName, "provider_name": item.ProviderName,
"purge_attempts": item.PurgeAttempts, "purge_attempts": item.PurgeAttempts,
"reference_id": item.ReferenceID, "reference_id": item.ReferenceID,
"res_id": item.ResID, "res_id": item.ResID,
"res_name": item.ResName, "res_name": item.ResName,
"rescuecd": item.RescueCD, "rescuecd": item.RescueCD,
"sep_id": item.SEPID, "sep_id": item.SEPID,
"shared_with": item.SharedWith, "shared_with": item.SharedWith,
"size": item.Size, "size": item.Size,
"snapshot_id": item.SnapshotID, "status": item.Status,
"status": item.Status, "tech_status": item.TechStatus,
"tech_status": item.TechStatus, "image_type": item.Type,
"image_type": item.Type, "url": item.URL,
"url": item.URL, "username": item.Username,
"username": item.Username, "version": item.Version,
"version": item.Version, "virtual": item.Virtual,
"virtual": item.Virtual,
} }
res = append(res, temp) res = append(res, temp)
} }

View File

@@ -622,11 +622,6 @@ func dataSourceImageListSchemaMake() map[string]*schema.Schema {
Computed: true, Computed: true,
Description: "image size", Description: "image size",
}, },
"snapshot_id": {
Type: schema.TypeString,
Computed: true,
Description: "snapshot id",
},
"status": { "status": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -880,11 +875,6 @@ func dataSourceImageSchemaMake() map[string]*schema.Schema {
Computed: true, Computed: true,
Description: "image size", Description: "image size",
}, },
"snapshot_id": {
Type: schema.TypeString,
Computed: true,
Description: "snapshot id",
},
"status": { "status": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -1134,11 +1124,6 @@ func resourceCDROMImageSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
}, },
}, },
"snapshot_id": {
Type: schema.TypeString,
Computed: true,
Description: "snapshot id",
},
"status": { "status": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -1430,11 +1415,6 @@ func resourceImageSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
}, },
}, },
"snapshot_id": {
Type: schema.TypeString,
Computed: true,
Description: "snapshot id",
},
"status": { "status": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -1709,11 +1689,6 @@ func resourceVirtualImageSchemaMake() map[string]*schema.Schema {
Computed: true, Computed: true,
Description: "image size", Description: "image size",
}, },
"snapshot_id": {
Type: schema.TypeString,
Computed: true,
Description: "snapshot id",
},
"status": { "status": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -1992,11 +1967,6 @@ func resourceImageFromBlankComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"snapshot_id": {
Type: schema.TypeString,
Computed: true,
Description: "snapshot id",
},
"status": { "status": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -2271,11 +2241,6 @@ func resourceImageFromPlatformDiskSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"snapshot_id": {
Type: schema.TypeString,
Computed: true,
Description: "snapshot id",
},
"status": { "status": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,

View File

@@ -34,7 +34,6 @@ func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute, p
d.Set("affinity_rules", flattenAffinityRules(computeRec.AffinityRules)) d.Set("affinity_rules", flattenAffinityRules(computeRec.AffinityRules))
d.Set("anti_affinity_rules", flattenAffinityRules(computeRec.AntiAffinityRules)) d.Set("anti_affinity_rules", flattenAffinityRules(computeRec.AntiAffinityRules))
d.Set("arch", computeRec.Arch) d.Set("arch", computeRec.Arch)
d.Set("auto_start_w_node", computeRec.AutoStart)
d.Set("boot_order", computeRec.BootOrder) d.Set("boot_order", computeRec.BootOrder)
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
@@ -76,7 +75,6 @@ func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute, p
d.Set("numa_node_id", computeRec.NumaNodeId) d.Set("numa_node_id", computeRec.NumaNodeId)
d.Set("os_users", flattenOSUsers(computeRec.OSUsers)) d.Set("os_users", flattenOSUsers(computeRec.OSUsers))
d.Set("pinned", computeRec.Pinned) d.Set("pinned", computeRec.Pinned)
d.Set("preferred_cpu", computeRec.PreferredCPU)
d.Set("reference_id", computeRec.ReferenceID) d.Set("reference_id", computeRec.ReferenceID)
d.Set("registered", computeRec.Registered) d.Set("registered", computeRec.Registered)
d.Set("res_name", computeRec.ResName) d.Set("res_name", computeRec.ResName)
@@ -94,8 +92,7 @@ func flattenCompute(d *schema.ResourceData, computeRec *compute.RecordCompute, p
d.Set("updated_time", computeRec.UpdatedTime) d.Set("updated_time", computeRec.UpdatedTime)
d.Set("user_data", string(userData)) d.Set("user_data", string(userData))
d.Set("user_managed", computeRec.UserManaged) d.Set("user_managed", computeRec.UserManaged)
d.Set("vnc_password", computeRec.VNCPassword) d.Set("vgpus", flattenVGPUs(computeRec.VGPUs))
d.Set("vgpus", computeRec.VGPUs)
d.Set("virtual_image_id", computeRec.VirtualImageID) d.Set("virtual_image_id", computeRec.VirtualImageID)
d.Set("virtual_image_name", computeRec.VirtualImageName) d.Set("virtual_image_name", computeRec.VirtualImageName)
d.Set("pci_devices", flattenPCI(*pciList)) d.Set("pci_devices", flattenPCI(*pciList))
@@ -297,7 +294,6 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"affinity_weight": computeItem.AffinityWeight, "affinity_weight": computeItem.AffinityWeight,
"anti_affinity_rules": flattenListRules(computeItem.AntiAffinityRules), "anti_affinity_rules": flattenListRules(computeItem.AntiAffinityRules),
"arch": computeItem.Arch, "arch": computeItem.Arch,
"auto_start_w_node": computeItem.AutoStart,
"chipset": computeItem.Chipset, "chipset": computeItem.Chipset,
"cd_image_id": computeItem.CdImageId, "cd_image_id": computeItem.CdImageId,
"boot_order": computeItem.BootOrder, "boot_order": computeItem.BootOrder,
@@ -333,7 +329,6 @@ func flattenComputeList(computes *compute.ListComputes) []map[string]interface{}
"numa_node_id": computeItem.NumaNodeId, "numa_node_id": computeItem.NumaNodeId,
"os_users": flattenOSUsers(computeItem.OSUsers), "os_users": flattenOSUsers(computeItem.OSUsers),
"pinned": computeItem.Pinned, "pinned": computeItem.Pinned,
"preferred_cpu": computeItem.PreferredCPU,
"ram": computeItem.RAM, "ram": computeItem.RAM,
"reference_id": computeItem.ReferenceID, "reference_id": computeItem.ReferenceID,
"registered": computeItem.Registered, "registered": computeItem.Registered,
@@ -618,7 +613,6 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
d.Set("affinity_weight", compFacts.AffinityWeight) d.Set("affinity_weight", compFacts.AffinityWeight)
d.Set("anti_affinity_rules", flattenAffinityRules(compFacts.AntiAffinityRules)) d.Set("anti_affinity_rules", flattenAffinityRules(compFacts.AntiAffinityRules))
d.Set("arch", compFacts.Arch) d.Set("arch", compFacts.Arch)
d.Set("auto_start_w_node", compFacts.AutoStart)
d.Set("boot_order", compFacts.BootOrder) d.Set("boot_order", compFacts.BootOrder)
d.Set("chipset", compFacts.Chipset) d.Set("chipset", compFacts.Chipset)
d.Set("cd_image_id", compFacts.CdImageId) d.Set("cd_image_id", compFacts.CdImageId)
@@ -658,7 +652,6 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
d.Set("numa_node_id", compFacts.NumaNodeId) d.Set("numa_node_id", compFacts.NumaNodeId)
d.Set("os_users", flattenOSUsers(compFacts.OSUsers)) d.Set("os_users", flattenOSUsers(compFacts.OSUsers))
d.Set("pinned", compFacts.Pinned) d.Set("pinned", compFacts.Pinned)
d.Set("preferred_cpu", compFacts.PreferredCPU)
d.Set("ram", compFacts.RAM) d.Set("ram", compFacts.RAM)
d.Set("reference_id", compFacts.ReferenceID) d.Set("reference_id", compFacts.ReferenceID)
d.Set("registered", compFacts.Registered) d.Set("registered", compFacts.Registered)
@@ -678,8 +671,7 @@ func flattenDataCompute(d *schema.ResourceData, compFacts *compute.RecordCompute
d.Set("updated_time", compFacts.UpdatedTime) d.Set("updated_time", compFacts.UpdatedTime)
d.Set("user_data", string(userData)) d.Set("user_data", string(userData))
d.Set("user_managed", compFacts.UserManaged) d.Set("user_managed", compFacts.UserManaged)
d.Set("vnc_password", compFacts.VNCPassword) d.Set("vgpus", flattenVGPUs(compFacts.VGPUs))
d.Set("vgpus", compFacts.VGPUs)
d.Set("virtual_image_id", compFacts.VirtualImageID) d.Set("virtual_image_id", compFacts.VirtualImageID)
d.Set("virtual_image_name", compFacts.VirtualImageName) d.Set("virtual_image_name", compFacts.VirtualImageName)
d.Set("pci_devices", flattenPCI(*pciList)) d.Set("pci_devices", flattenPCI(*pciList))
@@ -837,3 +829,33 @@ func flattendDiskSnapshotList(sl compute.ListDetailedSnapshots) []interface{} {
return res return res
} }
func flattenVGPUs(vgpus []compute.ItemVGPU) []map[string]interface{} {
res := make([]map[string]interface{}, len(vgpus))
for i, vgpu := range vgpus {
res[i] = map[string]interface{}{
"id": int(vgpu.ID),
"gid": int(vgpu.GID),
"type": vgpu.Type,
"mode": vgpu.Mode,
"status": vgpu.Status,
"profile_id": vgpu.ProfileID,
"ram": int(vgpu.RAM),
"last_update_time": int(vgpu.LastUpdateTime),
"created_time": int(vgpu.CreatedTime),
"deleted_time": int(vgpu.DeletedTime),
"vmid": int(vgpu.VMID),
"pgpuid": int(vgpu.PGPUID),
"reference_id": vgpu.ReferenceID,
"account_id": int(vgpu.AccountID),
"rg_id": int(vgpu.RGID),
"last_claimed_by": int(vgpu.LastClaimedBy),
"pci_slot": int(vgpu.PCISlot),
"guid": int(vgpu.GUID),
}
}
return res
}

View File

@@ -197,16 +197,6 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
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 preferredCPU, ok := d.GetOk("preferred_cpu"); ok {
preferredList := preferredCPU.([]interface{})
if len(preferredList) > 0 {
for _, v := range preferredList {
cpuNum := v.(int)
createReqX86.PreferredCPU = append(createReqX86.PreferredCPU, int64(cpuNum))
}
}
}
log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86") log.Debugf("resourceComputeCreate: creating Compute of type KVM VM x86")
apiResp, err := c.CloudBroker().KVMX86().Create(ctx, createReqX86) apiResp, err := c.CloudBroker().KVMX86().Create(ctx, createReqX86)
if err != nil { if err != nil {
@@ -242,25 +232,6 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
log.Debugf("resourceComputeCreate: new simple Compute ID %d, name %s created", computeId, d.Get("name").(string)) log.Debugf("resourceComputeCreate: new simple Compute ID %d, name %s created", computeId, d.Get("name").(string))
if ars, ok := d.GetOk("pci_devices"); ok {
log.Debugf("resourceComputeCreate: add pci devices on ComputeID: %d", computeId)
addedPciDevices := ars.(*schema.Set).List()
if len(addedPciDevices) > 0 {
for _, v := range addedPciDevices {
devicesConv := v.(int)
req := compute.AttachPCIDeviceRequest{
ComputeID: computeId,
DeviceID: uint64(devicesConv),
}
_, err := c.CloudBroker().Compute().AttachPCIDevice(ctx, req)
if err != nil {
warnings.Add(err)
}
}
}
}
extraDisks, ok := d.GetOk("extra_disks") extraDisks, ok := d.GetOk("extra_disks")
if ok && extraDisks.(*schema.Set).Len() > 0 { if ok && extraDisks.(*schema.Set).Len() > 0 {
log.Debugf("resourceComputeCreate: calling utilityComputeExtraDisksConfigure to attach %d extra disk(s)", extraDisks.(*schema.Set).Len()) log.Debugf("resourceComputeCreate: calling utilityComputeExtraDisksConfigure to attach %d extra disk(s)", extraDisks.(*schema.Set).Len())
@@ -289,26 +260,6 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if pin, ok := d.GetOk("pin_to_stack"); ok && pin.(bool) {
req := compute.PinToStackRequest{
ComputeID: computeId,
TargetStackID: uint64(d.Get("stack_id").(int)),
}
if force, ok := d.Get("force_pin").(bool); ok {
req.Force = force
}
if autoStart, ok := d.Get("auto_start_w_node").(bool); ok {
req.AutoStart = autoStart
}
_, err := c.CloudBroker().Compute().PinToStack(ctx, req)
if err != nil {
warnings.Add(err)
}
}
if libvirtSettings, ok := d.GetOk("libvirt_settings"); ok { if libvirtSettings, ok := d.GetOk("libvirt_settings"); ok {
if libvirtSettings.(*schema.Set).Len() > 0 { if libvirtSettings.(*schema.Set).Len() > 0 {
lvs := libvirtSettings.(*schema.Set).List() lvs := libvirtSettings.(*schema.Set).List()
@@ -523,14 +474,17 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if !d.Get("pin_to_stack").(bool) && d.Get("auto_start_w_node").(bool) { if pin, ok := d.GetOk("pin_to_stack"); ok && pin.(bool) {
req := compute.UpdateRequest{ req := compute.PinToStackRequest{
ComputeID: computeId, ComputeID: computeId,
AutoStart: d.Get("auto_start_w_node").(bool), TargetStackID: uint64(d.Get("target_stack_id").(int)),
CPUPin: d.Get("cpu_pin").(bool),
HPBacked: d.Get("hp_backed").(bool),
} }
_, err := c.CloudBroker().Compute().Update(ctx, req)
if force, ok := d.Get("force_pin").(bool); ok {
req.Force = force
}
_, err := c.CloudBroker().Compute().PinToStack(ctx, req)
if err != nil { if err != nil {
warnings.Add(err) warnings.Add(err)
} }
@@ -553,6 +507,24 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if ars, ok := d.GetOk("pci_devices"); ok {
log.Debugf("resourceComputeCreate: add pci devices on ComputeID: %d", computeId)
addedPciDevices := ars.(*schema.Set).List()
if len(addedPciDevices) > 0 {
for _, v := range addedPciDevices {
devicesConv := v.(int)
req := compute.AttachPCIDeviceRequest{
ComputeID: computeId,
DeviceID: uint64(devicesConv),
}
_, err := c.CloudBroker().Compute().AttachPCIDevice(ctx, req)
if err != nil {
warnings.Add(err)
}
}
}
}
} }
log.Debugf("resourceComputeCreate: new Compute ID %d, name %s creation sequence complete", computeId, d.Get("name").(string)) log.Debugf("resourceComputeCreate: new Compute ID %d, name %s creation sequence complete", computeId, d.Get("name").(string))
@@ -682,12 +654,6 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChange("started") {
if err := utilityComputeStarted(ctx, d, m); err != nil {
return diag.FromErr(err)
}
}
if d.HasChanges("cpu", "ram") { if d.HasChanges("cpu", "ram") {
if err := utilityComputeResize(ctx, d, m); err != nil { if err := utilityComputeResize(ctx, d, m); err != nil {
return diag.FromErr(err) return diag.FromErr(err)
@@ -707,18 +673,6 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChange("pin_to_stack") {
if err := utilityComputePinToStack(ctx, d, m); err != nil {
return diag.FromErr(err)
}
}
if d.HasChanges("description", "name", "numa_affinity", "cpu_pin", "hp_backed", "chipset", "auto_start_w_node", "preferred_cpu") {
if err := utilityComputeUpdate(ctx, d, m); err != nil {
return diag.FromErr(err)
}
}
if d.HasChanges("network", "libvirt_settings") { if d.HasChanges("network", "libvirt_settings") {
err = utilityComputeNetworksConfigure(ctx, d, m) // pass do_delta = true to apply changes, if any err = utilityComputeNetworksConfigure(ctx, d, m) // pass do_delta = true to apply changes, if any
if err != nil { if err != nil {
@@ -726,6 +680,12 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChanges("description", "name", "numa_affinity", "cpu_pin", "hp_backed") {
if err := utilityComputeUpdate(ctx, d, m); err != nil {
return diag.FromErr(err)
}
}
if d.HasChange("disks") { if d.HasChange("disks") {
if err := utilityComputeUpdateDisks(ctx, d, m); err != nil { if err := utilityComputeUpdateDisks(ctx, d, m); err != nil {
return diag.FromErr(err) return diag.FromErr(err)
@@ -786,6 +746,12 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChange("pin_to_stack") {
if err := utilityComputePinToStack(ctx, d, m); err != nil {
return diag.FromErr(err)
}
}
if d.HasChange("pause") { if d.HasChange("pause") {
if err := utilityComputePause(ctx, d, m); err != nil { if err := utilityComputePause(ctx, d, m); err != nil {
return diag.FromErr(err) return diag.FromErr(err)
@@ -816,6 +782,12 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
} }
} }
if d.HasChange("started") {
if err := utilityComputeStarted(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()...)
} }
@@ -830,16 +802,6 @@ func resourceComputeDelete(ctx context.Context, d *schema.ResourceData, m interf
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
computeId, _ := strconv.ParseUint(d.Id(), 10, 64) computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
if start, ok := d.GetOk("started"); ok {
if start.(bool) {
req := compute.StopRequest{ComputeID: computeId}
log.Debugf("resourceComputeDelete: stoping Compute ID %d", computeId)
if _, err := c.CloudBroker().Compute().Stop(ctx, req); err != nil {
diag.FromErr(err)
}
}
}
pciList, ok := d.GetOk("pci_devices") pciList, ok := d.GetOk("pci_devices")
if d.Get("permanently").(bool) && ok { if d.Get("permanently").(bool) && ok {
@@ -877,16 +839,8 @@ func ResourceCompute() *schema.Resource {
SchemaVersion: 1, SchemaVersion: 1,
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_stack", "auto_start_w_node", "libvirt_settings", "network", "affinity_rules", "anti_affinity_rules", if diff.HasChanges() || diff.HasChanges("libvirt_settings", "network", "affinity_rules", "anti_affinity_rules",
"extra_disks", "tags", "port_forwarding", "user_access", "snapshot", "pci_devices", "preferred_cpu") { "disks", "extra_disks", "tags", "port_forwarding", "user_access", "snapshot", "pci_devices") {
diff.SetNewComputed("updated_time")
diff.SetNewComputed("updated_by")
}
if diff.HasChanges("pin_to_stack") {
diff.SetNewComputed("pinned")
}
if diff.HasChanges("started") {
diff.SetNewComputed("tech_status")
diff.SetNewComputed("updated_time") diff.SetNewComputed("updated_time")
diff.SetNewComputed("updated_by") diff.SetNewComputed("updated_by")
} }

View File

@@ -134,10 +134,6 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"auto_start_w_node": {
Type: schema.TypeBool,
Computed: true,
},
"boot_order": { "boot_order": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
@@ -792,13 +788,6 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"preferred_cpu": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"ram": { "ram": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
@@ -913,15 +902,88 @@ func dataSourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"vnc_password": {
Type: schema.TypeString,
Computed: true,
},
"vgpus": { "vgpus": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Elem: &schema.Schema{ Elem: &schema.Resource{
Type: schema.TypeInt, Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeInt,
Computed: true,
},
"gid": {
Type: schema.TypeInt,
Computed: true,
},
"type": {
Type: schema.TypeString,
Computed: true,
},
"mode": {
Type: schema.TypeString,
Computed: true,
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"profile_id": {
Type: schema.TypeInt,
Computed: true,
},
"ram": {
Type: schema.TypeInt,
Computed: true,
},
"last_update_time": {
Type: schema.TypeInt,
Computed: true,
},
"created_time": {
Type: schema.TypeInt,
Computed: true,
},
"deleted_time": {
Type: schema.TypeInt,
Computed: true,
},
"vmid": {
Type: schema.TypeInt,
Computed: true,
},
"pgpuid": {
Type: schema.TypeInt,
Computed: true,
},
"reference_id": {
Type: schema.TypeString,
Computed: true,
},
"account_id": {
Type: schema.TypeInt,
Computed: true,
},
"rg_id": {
Type: schema.TypeInt,
Computed: true,
},
"last_claimed_by": {
Type: schema.TypeInt,
Computed: true,
},
"pci_slot": {
Type: schema.TypeInt,
Computed: true,
},
"bus_number": {
Type: schema.TypeInt,
Computed: true,
},
"guid": {
Type: schema.TypeInt,
Computed: true,
},
},
}, },
}, },
"virtual_image_id": { "virtual_image_id": {
@@ -1005,11 +1067,6 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Optional: true, Optional: true,
Description: "Find by image ID", Description: "Find by image ID",
}, },
"cd_image_id": {
Type: schema.TypeInt,
Optional: true,
Description: "Find by CD image ID",
},
"extnet_name": { "extnet_name": {
Type: schema.TypeString, Type: schema.TypeString,
Optional: true, Optional: true,
@@ -1165,10 +1222,6 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"auto_start_w_node": {
Type: schema.TypeBool,
Computed: true,
},
"boot_order": { "boot_order": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
@@ -1498,13 +1551,6 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"preferred_cpu": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"ram": { "ram": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
@@ -1622,8 +1668,85 @@ func dataSourceComputeListSchemaMake() map[string]*schema.Schema {
"vgpus": { "vgpus": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Elem: &schema.Schema{ Elem: &schema.Resource{
Type: schema.TypeInt, Schema: map[string]*schema.Schema{
"id": {
Type: schema.TypeInt,
Computed: true,
},
"gid": {
Type: schema.TypeInt,
Computed: true,
},
"type": {
Type: schema.TypeString,
Computed: true,
},
"mode": {
Type: schema.TypeString,
Computed: true,
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"profile_id": {
Type: schema.TypeInt,
Computed: true,
},
"ram": {
Type: schema.TypeInt,
Computed: true,
},
"last_update_time": {
Type: schema.TypeInt,
Computed: true,
},
"created_time": {
Type: schema.TypeInt,
Computed: true,
},
"deleted_time": {
Type: schema.TypeInt,
Computed: true,
},
"vmid": {
Type: schema.TypeInt,
Computed: true,
},
"pgpuid": {
Type: schema.TypeInt,
Computed: true,
},
"reference_id": {
Type: schema.TypeString,
Computed: true,
},
"account_id": {
Type: schema.TypeInt,
Computed: true,
},
"rg_id": {
Type: schema.TypeInt,
Computed: true,
},
"last_claimed_by": {
Type: schema.TypeInt,
Computed: true,
},
"pci_slot": {
Type: schema.TypeInt,
Computed: true,
},
"bus_number": {
Type: schema.TypeInt,
Computed: true,
},
"guid": {
Type: schema.TypeInt,
Computed: true,
},
},
}, },
}, },
"vins_connected": { "vins_connected": {
@@ -1833,10 +1956,6 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"auto_start_w_node": {
Type: schema.TypeBool,
Computed: true,
},
"boot_order": { "boot_order": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
@@ -2118,13 +2237,6 @@ func dataSourceComputeListDeletedSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"preferred_cpu": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"reference_id": { "reference_id": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -3417,10 +3529,9 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Optional: true, Optional: true,
Default: false, Default: false,
}, },
"auto_start_w_node": { "target_stack_id": {
Type: schema.TypeBool, Type: schema.TypeInt,
Optional: true, Optional: true,
Computed: true,
}, },
"force_pin": { "force_pin": {
Type: schema.TypeBool, Type: schema.TypeBool,
@@ -3448,6 +3559,12 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Optional: true, Optional: true,
Default: false, Default: false,
}, },
"auto_start": {
Type: schema.TypeBool,
Optional: true,
Default: false,
Description: "Flag for redeploy compute",
},
"force_stop": { "force_stop": {
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
@@ -3460,6 +3577,13 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Default: false, Default: false,
Description: "Flag for resize compute", Description: "Flag for resize compute",
}, },
"data_disks": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"KEEP", "DETACH", "DESTROY"}, false),
Default: "DETACH",
Description: "Flag for redeploy compute",
},
"detach_disks": { "detach_disks": {
Type: schema.TypeBool, Type: schema.TypeBool,
Optional: true, Optional: true,
@@ -3489,15 +3613,6 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Default: false, Default: false,
Description: "Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node.", Description: "Use Huge Pages to allocate RAM of the virtual machine. The system must be pre-configured by allocating Huge Pages on the physical node.",
}, },
"preferred_cpu": {
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
Description: "Recommended isolated CPUs. Field is ignored if compute.cpupin=False or compute.pinned=False",
},
"pci_devices": { "pci_devices": {
Type: schema.TypeSet, Type: schema.TypeSet,
Optional: true, Optional: true,
@@ -3945,10 +4060,6 @@ func resourceComputeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"vnc_password": {
Type: schema.TypeString,
Computed: true,
},
"vgpus": { "vgpus": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,

View File

@@ -114,11 +114,19 @@ func utilityComputeResize(ctx context.Context, d *schema.ResourceData, m interfa
c := m.(*controller.ControllerCfg) c := m.(*controller.ControllerCfg)
computeId, _ := strconv.ParseUint(d.Id(), 10, 64) computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
if d.Get("started").(bool) { var isStopRequired bool
old, new := d.GetChange("cpu")
if d.Get("started").(bool) && (old.(int) > new.(int)) {
isStopRequired = true
}
if isStopRequired {
stopReq := compute.StopRequest{ stopReq := compute.StopRequest{
ComputeID: computeId, ComputeID: computeId,
Force: false, Force: false,
} }
if depresent, ok := d.Get("depresent").(bool); ok {
stopReq.Depresent = depresent
}
if _, err := c.CloudBroker().Compute().Stop(ctx, stopReq); err != nil { if _, err := c.CloudBroker().Compute().Stop(ctx, stopReq); err != nil {
return err return err
} }
@@ -145,22 +153,6 @@ func utilityComputeResize(ctx context.Context, d *schema.ResourceData, m interfa
resizeReq.CPU = 0 resizeReq.CPU = 0
} }
if resizeReq.CPU != 0 {
if preferredCPU, ok := d.GetOk("preferred_cpu"); ok {
preferredList := preferredCPU.([]interface{})
if len(preferredList) > 0 {
for _, v := range preferredList {
cpuNum := v.(int)
resizeReq.PreferredCPU = append(resizeReq.PreferredCPU, int64(cpuNum))
}
}
}
oldPCPU, newPCPU := d.GetChange("preferred_cpu")
if len(oldPCPU.([]interface{})) != 0 && len(newPCPU.([]interface{})) == 0 {
resizeReq.PreferredCPU = []int64{-1}
}
}
oldRam, newRam := d.GetChange("ram") oldRam, newRam := d.GetChange("ram")
if oldRam.(int) != newRam.(int) { if oldRam.(int) != newRam.(int) {
resizeReq.RAM = uint64(newRam.(int)) resizeReq.RAM = uint64(newRam.(int))
@@ -179,7 +171,7 @@ func utilityComputeResize(ctx context.Context, d *schema.ResourceData, m interfa
} }
} }
if d.Get("started").(bool) { if isStopRequired {
if _, err := c.CloudBroker().Compute().Start(ctx, compute.StartRequest{ComputeID: computeId}); err != nil { if _, err := c.CloudBroker().Compute().Start(ctx, compute.StartRequest{ComputeID: computeId}); err != nil {
return err return err
} }
@@ -490,19 +482,6 @@ func utilityComputeExtraDisksConfigure(ctx context.Context, d *schema.ResourceDa
if detach_set.Len() > 0 { if detach_set.Len() > 0 {
computeId, _ := strconv.ParseUint(d.Id(), 10, 64) computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
stopReq := compute.StopRequest{
ComputeID: computeId,
Force: false,
}
if depresent, ok := d.Get("depresent").(bool); ok {
stopReq.Depresent = depresent
}
_, err := c.CloudBroker().Compute().Stop(ctx, stopReq)
if err != nil {
return err
}
for _, diskId := range detach_set.List() { for _, diskId := range detach_set.List() {
req := compute.DiskDetachRequest{ req := compute.DiskDetachRequest{
@@ -517,14 +496,6 @@ func utilityComputeExtraDisksConfigure(ctx context.Context, d *schema.ResourceDa
} }
} }
req := compute.StartRequest{
ComputeID: computeId,
AltBootID: 0,
}
_, err = c.CloudBroker().Compute().Start(ctx, req)
if err != nil {
return err
}
} }
attach_set := new_set.(*schema.Set).Difference(old_set.(*schema.Set)) attach_set := new_set.(*schema.Set).Difference(old_set.(*schema.Set))
@@ -884,33 +855,21 @@ func utilityComputeUpdate(ctx context.Context, d *schema.ResourceData, m interfa
if d.HasChange("numa_affinity") { if d.HasChange("numa_affinity") {
req.NumaAffinity = d.Get("numa_affinity").(string) req.NumaAffinity = d.Get("numa_affinity").(string)
} }
if d.HasChange("cpu_pin") {
req.CPUPin = d.Get("cpu_pin").(bool)
}
if d.HasChange("hp_backed") {
req.HPBacked = d.Get("hp_backed").(bool)
}
if d.HasChange("chipset") { if d.HasChange("chipset") {
req.Chipset = d.Get("chipset").(string) req.Chipset = d.Get("chipset").(string)
} }
req.CPUPin = d.Get("cpu_pin").(bool)
req.HPBacked = d.Get("hp_backed").(bool)
req.AutoStart = d.Get("auto_start_w_node").(bool)
if d.HasChange("preferred_cpu") {
if preferredCPU, ok := d.GetOk("preferred_cpu"); ok {
preferredList := preferredCPU.([]interface{})
if len(preferredList) > 0 {
for _, v := range preferredList {
cpuNum := v.(int)
req.PreferredCPU = append(req.PreferredCPU, int64(cpuNum))
}
}
}
oldPCPU, newPCPU := d.GetChange("preferred_cpu")
if len(oldPCPU.([]interface{})) != 0 && len(newPCPU.([]interface{})) == 0 {
req.PreferredCPU = []int64{-1}
}
}
// Note bene: numa_affinity, cpu_pin and hp_backed are not allowed to be changed for compute in STARTED tech status. // Note bene: numa_affinity, cpu_pin and hp_backed are not allowed to be changed for compute in STARTED tech status.
// If STARTED, we need to stop it before update // If STARTED, we need to stop it before update
var isStopRequired bool var isStopRequired bool
if d.HasChanges("numa_affinity", "cpu_pin", "hp_backed", "chipset", "preferred_cpu") && d.Get("started").(bool) { if d.HasChanges("numa_affinity", "cpu_pin", "hp_backed") && d.Get("started").(bool) {
isStopRequired = true isStopRequired = true
} }
if isStopRequired { if isStopRequired {
@@ -1472,17 +1431,12 @@ func utilityComputePinToStack(ctx context.Context, d *schema.ResourceData, m int
if !oldPin.(bool) && newPin.(bool) { if !oldPin.(bool) && newPin.(bool) {
req := compute.PinToStackRequest{ req := compute.PinToStackRequest{
ComputeID: computeId, ComputeID: computeId,
TargetStackID: uint64(d.Get("stack_id").(int)), TargetStackID: uint64(d.Get("target_stack_id").(int)),
} }
if force, ok := d.Get("force_pin").(bool); ok { if force, ok := d.Get("force_pin").(bool); ok {
req.Force = force req.Force = force
} }
if autoStart, ok := d.Get("auto_start_w_node").(bool); ok {
req.AutoStart = autoStart
}
_, err := c.CloudBroker().Compute().PinToStack(ctx, req) _, err := c.CloudBroker().Compute().PinToStack(ctx, req)
if err != nil { if err != nil {
return err return err
@@ -1550,9 +1504,6 @@ func utilityComputeUpdateImage(ctx context.Context, d *schema.ResourceData, m in
if depresent, ok := d.Get("depresent").(bool); ok { if depresent, ok := d.Get("depresent").(bool); ok {
stopReq.Depresent = depresent stopReq.Depresent = depresent
} }
if forceStop, ok := d.GetOk("force_stop"); ok {
stopReq.Force = forceStop.(bool)
}
_, err := c.CloudBroker().Compute().Stop(ctx, stopReq) _, err := c.CloudBroker().Compute().Stop(ctx, stopReq)
if err != nil { if err != nil {
@@ -1563,13 +1514,15 @@ func utilityComputeUpdateImage(ctx context.Context, d *schema.ResourceData, m in
req := compute.RedeployRequest{ req := compute.RedeployRequest{
ComputeID: computeId, ComputeID: computeId,
ImageID: uint64(newImage.(int)), ImageID: uint64(newImage.(int)),
DataDisks: "KEEP",
} }
if diskSize, ok := d.GetOk("boot_disk_size"); ok { if diskSize, ok := d.GetOk("boot_disk_size"); ok {
req.DiskSize = uint64(diskSize.(int)) req.DiskSize = uint64(diskSize.(int))
} }
if autoStart, ok := d.GetOk("started"); ok { if dataDisks, ok := d.GetOk("data_disks"); ok {
req.DataDisks = dataDisks.(string)
}
if autoStart, ok := d.GetOk("auto_start"); ok {
req.AutoStart = autoStart.(bool) req.AutoStart = autoStart.(bool)
} }
if forceStop, ok := d.GetOk("force_stop"); ok { if forceStop, ok := d.GetOk("force_stop"); ok {

View File

@@ -75,9 +75,6 @@ func utilityDataComputeListCheckPresence(ctx context.Context, d *schema.Resource
if imageID, ok := d.GetOk("image_id"); ok { if imageID, ok := d.GetOk("image_id"); ok {
req.ImageID = imageID.(uint64) req.ImageID = imageID.(uint64)
} }
if cdImageID, ok := d.GetOk("cd_image_id"); ok {
req.CDImageID = cdImageID.(uint64)
}
if extNetName, ok := d.GetOk("extnet_name"); ok { if extNetName, ok := d.GetOk("extnet_name"); ok {
req.ExtNetName = extNetName.(string) req.ExtNetName = extNetName.(string)
} }

View File

@@ -46,14 +46,11 @@ func flattenNode(d *schema.ResourceData, item *node.RecordNode) {
d.Set("consumption", flattenConsumption(item.Consumption)) d.Set("consumption", flattenConsumption(item.Consumption))
d.Set("cpu_info", flattenCpuInfo(item.CpuInfo)) d.Set("cpu_info", flattenCpuInfo(item.CpuInfo))
d.Set("cpu_allocation_ratio", item.CPUAllocationRatio) d.Set("cpu_allocation_ratio", item.CPUAllocationRatio)
d.Set("dpdk", flattenDPDKItem(item.DPDK))
d.Set("gid", item.GID) d.Set("gid", item.GID)
d.Set("ipaddr", item.IPAddr) d.Set("ipaddr", item.IPAddr)
d.Set("isolated_cpus", flattenNodeItem(item.IsolatedCpus)) d.Set("isolated_cpus", flattenNodeItem(item.IsolatedCpus))
d.Set("name", item.Name) d.Set("name", item.Name)
d.Set("need_reboot", item.NeedReboot) d.Set("need_reboot", item.NeedReboot)
d.Set("net_addr", flattenGetNetAddr(item.NetAddr))
d.Set("network_mode", item.NetworkMode)
d.Set("nic_info", flattenNicInfo(item.NicInfo)) d.Set("nic_info", flattenNicInfo(item.NicInfo))
d.Set("numa_topology", flattenNumaTopology(item.NumaTopology)) d.Set("numa_topology", flattenNumaTopology(item.NumaTopology))
d.Set("reserved_cpus", flattenNodeItem(item.ReservedCPUs)) d.Set("reserved_cpus", flattenNodeItem(item.ReservedCPUs))
@@ -61,10 +58,6 @@ func flattenNode(d *schema.ResourceData, item *node.RecordNode) {
d.Set("sriov_enabled", item.SriovEnabled) d.Set("sriov_enabled", item.SriovEnabled)
d.Set("stack_id", item.StackID) d.Set("stack_id", item.StackID)
d.Set("status", item.Status) d.Set("status", item.Status)
d.Set("to_active", flattenRole(item.ToActive))
d.Set("to_installing", flattenRole(item.ToInstalling))
d.Set("to_maintenance", flattenRole(item.ToMaintenance))
d.Set("to_restricted", flattenRole(item.ToRestricted))
d.Set("version", item.Version) d.Set("version", item.Version)
} }
@@ -113,46 +106,44 @@ func flattenNodeList(nodes *node.ListNodes) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(nodes.Data)) res := make([]map[string]interface{}, 0, len(nodes.Data))
for _, item := range nodes.Data { for _, item := range nodes.Data {
temp := map[string]interface{}{ temp := map[string]interface{}{
"additional_pkgs": flattenNodeItem(item.AdditionalPkgs), "additional_pkgs": flattenNodeItem(item.AdditionalPkgs),
"cpu_info": flattenCpuInfo(item.CpuInfo), "cpu_info": flattenCpuInfo(item.CpuInfo),
"description": item.Description, "description": item.Description,
"dpdk": flattenDPDKItem(item.DPDK), "gid": item.GID,
"gid": item.GID, "guid": item.GUID,
"guid": item.GUID, "hostkey": item.HostKey,
"hostkey": item.HostKey, "node_id": item.ID,
"node_id": item.ID, "ipaddr": item.IPAddr,
"ipaddr": item.IPAddr, "isolated_cpus": flattenNodeItem(item.IsolatedCpus),
"isolated_cpus": flattenNodeItem(item.IsolatedCpus), "lastcheck": item.LastCheck,
"lastcheck": item.LastCheck, "machine_guid": item.MachineGUID,
"machine_guid": item.MachineGUID, "mainboard_sn": item.MainboardSN,
"mainboard_sn": item.MainboardSN, "memory": item.Memory,
"memory": item.Memory, "milestones": item.Milestones,
"milestones": item.Milestones, "model": item.Model,
"model": item.Model, "name": item.Name,
"name": item.Name, "need_reboot": item.NeedReboot,
"need_reboot": item.NeedReboot, "net_addr": flattenNetAddr(item.NetAddr),
"net_addr": flattenNetAddr(item.NetAddr), "network_mode": item.NetworkMode,
"network_mode": item.NetworkMode, "nic_info": flattenNicInfo(item.NicInfo),
"nic_info": flattenNicInfo(item.NicInfo), "node_uuid": item.NodeUUID,
"node_uuid": item.NodeUUID, "numa_topology": flattenNumaTopology(item.NumaTopology),
"numa_topology": flattenNumaTopology(item.NumaTopology), "peer_backup": item.PeerBackup,
"peer_backup": item.PeerBackup, "peer_log": item.PeerLog,
"peer_log": item.PeerLog, "peer_stats": item.PeerStats,
"peer_stats": item.PeerStats, "pgpus": item.Pgpus,
"pgpus": item.Pgpus, "public_keys": item.PublicKeys,
"public_keys": item.PublicKeys, "release": item.Release,
"release": item.Release, "reserved_cpus": flattenNodeItem(item.ReservedCPUs),
"reserved_cpus": flattenNodeItem(item.ReservedCPUs), "roles": item.Roles,
"roles": item.Roles, "seps": item.Seps,
"seps": item.Seps, "serial_num": item.SerialNum,
"serial_num": item.SerialNum, "sriov_enabled": item.SriovEnabled,
"sriov_enabled": item.SriovEnabled, "stack_id": item.StackID,
"stack_id": item.StackID, "status": item.Status,
"status": item.Status, "tags": item.Tags,
"tags": item.Tags, "type": item.Type,
"type": item.Type, "version": item.Version,
"uefi_firmware_file": item.UEFIFirmwareFile,
"version": item.Version,
} }
res = append(res, temp) res = append(res, temp)
} }
@@ -214,9 +205,9 @@ func flattenVFList(vfList []interface{}) []map[string]interface{} {
return res return res
} }
func flattenNetAddr(addresses node.ListNetAddr) []map[string]interface{} { func flattenNetAddr(adresses node.ListNetAddr) []map[string]interface{} {
res := make([]map[string]interface{}, 0, len(addresses)) res := make([]map[string]interface{}, 0, len(adresses))
for _, item := range addresses { for _, item := range adresses {
temp := map[string]interface{}{ temp := map[string]interface{}{
"cidr": item.CIDR, "cidr": item.CIDR,
"index": item.Index, "index": item.Index,
@@ -230,16 +221,6 @@ func flattenNetAddr(addresses node.ListNetAddr) []map[string]interface{} {
return res return res
} }
func flattenGetNetAddr(address node.NetAddr) []map[string]interface{} {
res := make([]map[string]interface{}, 1)
temp := map[string]interface{}{
"ip": address.IP,
"name": address.Name,
}
res[0] = temp
return res
}
func flattenCpuInfo(info node.CpuInfo) []map[string]interface{} { func flattenCpuInfo(info node.CpuInfo) []map[string]interface{} {
res := make([]map[string]interface{}, 1) res := make([]map[string]interface{}, 1)
temp := map[string]interface{}{ temp := map[string]interface{}{
@@ -269,36 +250,3 @@ func flattenNodeItem(m []interface{}) []string {
} }
return output return output
} }
func flattenDPDKItem(dpdk node.DPDK) []map[string]interface{} {
res := make([]map[string]interface{}, 1)
bridges := make([]map[string]interface{}, 1)
backplane := make([]map[string]interface{}, 1)
backplane[0] = map[string]interface{}{
"interfaces": dpdk.Bridges.Backplane1.Interfaces,
"numa_node": dpdk.Bridges.Backplane1.NumaNode,
}
bridges[0] = map[string]interface{}{
"backplane1": backplane,
}
res[0] = map[string]interface{}{
"bridges": bridges,
"hp_memory": dpdk.HPMemory,
"pmd_cpu": dpdk.PMDCPU,
}
return res
}
func flattenRole(role node.Role) []map[string]interface{} {
res := make([]map[string]interface{}, 1)
temp := map[string]interface{}{
"actor": role.Actor,
"reason": role.Reason,
"time": role.Time,
}
res[0] = temp
return res
}

View File

@@ -105,55 +105,6 @@ func dataSourceNodeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
}, },
"dpdk": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"bridges": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"backplane1": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"interfaces": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"numa_node": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
},
},
},
"hp_memory": {
Type: schema.TypeMap,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"pmd_cpu": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
},
},
},
"gid": { "gid": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
@@ -180,29 +131,6 @@ func dataSourceNodeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeBool, Type: schema.TypeBool,
Computed: true, Computed: true,
}, },
"net_addr": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"ip": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"name": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"network_mode": {
Type: schema.TypeString,
Computed: true,
},
"nic_info": { "nic_info": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
@@ -325,86 +253,6 @@ func dataSourceNodeSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"to_active": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"actor": {
Type: schema.TypeString,
Computed: true,
},
"reason": {
Type: schema.TypeString,
Computed: true,
},
"time": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
"to_installing": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"actor": {
Type: schema.TypeString,
Computed: true,
},
"reason": {
Type: schema.TypeString,
Computed: true,
},
"time": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
"to_maintenance": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"actor": {
Type: schema.TypeString,
Computed: true,
},
"reason": {
Type: schema.TypeString,
Computed: true,
},
"time": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
"to_restricted": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"actor": {
Type: schema.TypeString,
Computed: true,
},
"reason": {
Type: schema.TypeString,
Computed: true,
},
"time": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
"version": { "version": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -501,55 +349,6 @@ func dataSourceNodeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"dpdk": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"bridges": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"backplane1": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"interfaces": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"numa_node": {
Type: schema.TypeInt,
Computed: true,
},
},
},
},
},
},
},
"hp_memory": {
Type: schema.TypeMap,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
"pmd_cpu": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{
Type: schema.TypeInt,
},
},
},
},
},
"gid": { "gid": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
@@ -832,10 +631,6 @@ func dataSourceNodeListSchemaMake() map[string]*schema.Schema {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
}, },
"uefi_firmware_file": {
Type: schema.TypeString,
Computed: true,
},
"version": { "version": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,

View File

@@ -37,16 +37,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/flattens"
) )
func flattenSep(d *schema.ResourceData, desSep *sep.RecordSEP) { func flattenSep(d *schema.ResourceData, desSep *sep.RecordSEP) {
d.Set("ckey", desSep.CKey)
d.Set("meta", flattens.FlattenMeta(desSep.Meta))
d.Set("consumed_by", desSep.ConsumedBy) d.Set("consumed_by", desSep.ConsumedBy)
d.Set("desc", desSep.Description) d.Set("desc", desSep.Description)
d.Set("gid", desSep.GID) d.Set("gid", desSep.GID)
d.Set("guid", desSep.GUID) d.Set("guid", desSep.GUID)
d.Set("sep_id", desSep.ID) d.Set("sep_id", desSep.ID)
d.Set("milestones", desSep.Milestones) d.Set("milestones", desSep.Milestones)
d.Set("multipath_num", desSep.MultipathNum)
d.Set("name", desSep.Name) d.Set("name", desSep.Name)
d.Set("obj_status", desSep.ObjStatus) d.Set("obj_status", desSep.ObjStatus)
d.Set("provided_by", desSep.ProvidedBy) d.Set("provided_by", desSep.ProvidedBy)
@@ -62,20 +64,21 @@ func flattenSepListItems(sl *sep.ListSEP) []map[string]interface{} {
for _, item := range sl.Data { for _, item := range sl.Data {
data, _ := json.Marshal(item.Config) data, _ := json.Marshal(item.Config)
temp := map[string]interface{}{ temp := map[string]interface{}{
"consumed_by": item.ConsumedBy, "ckey": item.CKey,
"desc": item.Description, "meta": flattens.FlattenMeta(item.Meta),
"gid": item.GID, "consumed_by": item.ConsumedBy,
"guid": item.GUID, "desc": item.Description,
"sep_id": item.ID, "gid": item.GID,
"milestones": item.Milestones, "guid": item.GUID,
"name": item.Name, "sep_id": item.ID,
"multipath_num": item.MultipathNum, "milestones": item.Milestones,
"obj_status": item.ObjStatus, "name": item.Name,
"provided_by": item.ProvidedBy, "obj_status": item.ObjStatus,
"shared_with": item.SharedWith, "provided_by": item.ProvidedBy,
"tech_status": item.TechStatus, "shared_with": item.SharedWith,
"type": item.Type, "tech_status": item.TechStatus,
"config": string(data), "type": item.Type,
"config": string(data),
} }
res = append(res, temp) res = append(res, temp)
} }

View File

@@ -9,6 +9,19 @@ func dataSourceSepCSchemaMake() map[string]*schema.Schema {
Required: true, Required: true,
Description: "sep type des id", Description: "sep type des id",
}, },
"ckey": {
Type: schema.TypeString,
Computed: true,
Description: "ckey",
},
"meta": {
Type: schema.TypeList,
Computed: true,
Description: "meta",
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"config": { "config": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -37,11 +50,6 @@ func dataSourceSepCSchemaMake() map[string]*schema.Schema {
Computed: true, Computed: true,
Description: "guid", Description: "guid",
}, },
"multipath_num": {
Type: schema.TypeInt,
Computed: true,
Description: "multipath_num",
},
"milestones": { "milestones": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
@@ -287,6 +295,19 @@ func dataSourceSepListSchemaMake() map[string]*schema.Schema {
Description: "sep list", Description: "sep list",
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"ckey": {
Type: schema.TypeString,
Computed: true,
Description: "ckey",
},
"meta": {
Type: schema.TypeList,
Computed: true,
Description: "meta",
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"config": { "config": {
Description: "config", Description: "config",
Type: schema.TypeString, Type: schema.TypeString,
@@ -325,11 +346,6 @@ func dataSourceSepListSchemaMake() map[string]*schema.Schema {
Computed: true, Computed: true,
Description: "milestones", Description: "milestones",
}, },
"multipath_num": {
Type: schema.TypeInt,
Computed: true,
Description: "multipath_num",
},
"name": { "name": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -591,6 +607,19 @@ func resourceSepSchemaMake() map[string]*schema.Schema {
}, },
}, },
}, },
"ckey": {
Type: schema.TypeString,
Computed: true,
Description: "ckey",
},
"meta": {
Type: schema.TypeList,
Computed: true,
Description: "meta",
Elem: &schema.Schema{
Type: schema.TypeString,
},
},
"config": { "config": {
Type: schema.TypeString, Type: schema.TypeString,
Required: true, Required: true,
@@ -622,11 +651,6 @@ func resourceSepSchemaMake() map[string]*schema.Schema {
Computed: true, Computed: true,
Description: "milestones", Description: "milestones",
}, },
"multipath_num": {
Type: schema.TypeInt,
Computed: true,
Description: "multipath_num",
},
"obj_status": { "obj_status": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,

View File

@@ -150,7 +150,6 @@ func flattenVinsVNFDev(vd vins.VNFDev) []map[string]interface{} {
"status": vd.Status, "status": vd.Status,
"tech_status": vd.TechStatus, "tech_status": vd.TechStatus,
"type": vd.Type, "type": vd.Type,
"vnc_password": vd.VNCPassword,
"vins": vd.VINS, "vins": vd.VINS,
} }
res = append(res, temp) res = append(res, temp)
@@ -372,11 +371,14 @@ func flattenVinsListReservations(li vins.ListReservations) []map[string]interfac
res := make([]map[string]interface{}, 0, len(li)) res := make([]map[string]interface{}, 0, len(li))
for _, v := range li { for _, v := range li {
temp := map[string]interface{}{ temp := map[string]interface{}{
"account_id": v.AccountID, "client_type": v.ClientType,
"ip": v.IP, "description": v.Description,
"mac": v.MAC, "domain_name": v.DomainName,
"type": v.Type, "host_name": v.Hostname,
"vm_id": v.VMID, "ip": v.IP,
"mac": v.MAC,
"type": v.Type,
"vm_id": v.VMID,
} }
res = append(res, temp) res = append(res, temp)
} }

View File

@@ -38,12 +38,14 @@ import (
"strconv" "strconv"
"strings" "strings"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
"repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vins" "repository.basistech.ru/BASIS/decort-golang-sdk/pkg/cloudbroker/vins"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/constants"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller" "repository.basistech.ru/BASIS/terraform-provider-decort/internal/controller"
"repository.basistech.ru/BASIS/terraform-provider-decort/internal/dc"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
) )
func resourceStaticRouteCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { func resourceStaticRouteCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
@@ -62,6 +64,19 @@ func resourceStaticRouteCreate(ctx context.Context, d *schema.ResourceData, m in
Gateway: d.Get("gateway").(string), Gateway: d.Get("gateway").(string),
} }
if computesIDS, ok := d.GetOk("compute_ids"); ok {
ids := computesIDS.([]interface{})
res := make([]uint64, 10)
for _, id := range ids {
computeId := uint64(id.(int))
res = append(res, computeId)
}
req.ComputeIds = res
}
_, err := c.CloudBroker().VINS().StaticRouteAdd(ctx, req) _, err := c.CloudBroker().VINS().StaticRouteAdd(ctx, req)
if err != nil { if err != nil {
d.SetId("") d.SetId("")
@@ -93,7 +108,30 @@ func resourceStaticRouteRead(ctx context.Context, d *schema.ResourceData, m inte
} }
func resourceStaticRouteUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { func resourceStaticRouteUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
return nil log.Debugf("resourceStaticRouteUpdate: called for static route id %s", d.Id())
c := m.(*controller.ControllerCfg)
if diags := checkParamsExistenceStaticRoute(ctx, d, c); diags != nil {
return diags
}
staticRouteData, err := utilityDataStaticRouteCheckPresence(ctx, d, m)
if err != nil {
d.SetId("")
return diag.FromErr(err)
}
warnings := dc.Warnings{}
if d.HasChange("compute_ids") {
if errs := resourceStaticRouteChangeComputeIds(ctx, d, m, staticRouteData); len(errs) != 0 {
for _, err := range errs {
warnings.Add(err)
}
}
}
return append(warnings.Get(), resourceStaticRouteRead(ctx, d, m)...)
} }
func resourceStaticRouteDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { func resourceStaticRouteDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
@@ -120,6 +158,61 @@ func resourceStaticRouteDelete(ctx context.Context, d *schema.ResourceData, m in
return nil return nil
} }
func resourceStaticRouteChangeComputeIds(ctx context.Context, d *schema.ResourceData, m interface{}, staticRouteData *vins.ItemRoutes) []error {
c := m.(*controller.ControllerCfg)
var errs []error
vinsId := uint64(d.Get("vins_id").(int))
deletedIds := make([]uint64, 0)
addedIds := make([]uint64, 0)
oldComputeIds, newComputeIds := d.GetChange("compute_ids")
oldComputeIdsSlice := oldComputeIds.([]interface{})
newComputeIdsSlice := newComputeIds.([]interface{})
for _, el := range oldComputeIdsSlice {
if !isContainsIds(newComputeIdsSlice, el) {
convertedEl := uint64(el.(int))
deletedIds = append(deletedIds, convertedEl)
}
}
for _, el := range newComputeIdsSlice {
if !isContainsIds(oldComputeIdsSlice, el) {
convertedEl := uint64(el.(int))
addedIds = append(addedIds, convertedEl)
}
}
if len(deletedIds) > 0 {
req := vins.StaticRouteAccessRevokeRequest{
VINSID: vinsId,
RouteId: staticRouteData.ID,
ComputeIds: deletedIds,
}
if _, err := c.CloudBroker().VINS().StaticRouteAccessRevoke(ctx, req); err != nil {
errs = append(errs, err)
}
}
if len(addedIds) > 0 {
req := vins.StaticRouteAccessGrantRequest{
VINSID: vinsId,
RouteId: staticRouteData.ID,
ComputeIds: addedIds,
}
if _, err := c.CloudBroker().VINS().StaticRouteAccessGrant(ctx, req); err != nil {
errs = append(errs, err)
}
}
return errs
}
func isContainsIds(els []interface{}, el interface{}) bool { func isContainsIds(els []interface{}, el interface{}) bool {
convEl := el.(int) convEl := el.(int)
for _, elOld := range els { for _, elOld := range els {

View File

@@ -341,10 +341,6 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true, Computed: true,
Description: "type", Description: "type",
}, },
"vnc_password": {
Type: schema.TypeString,
Computed: true,
},
"vins": { "vins": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
@@ -590,11 +586,26 @@ func dataSourceVinsSchemaMake() map[string]*schema.Schema {
Description: "reservations", Description: "reservations",
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"account_id": { "client_type": {
Type: schema.TypeInt, Type: schema.TypeString,
Computed: true, Computed: true,
Description: "client type", Description: "client type",
}, },
"description": {
Type: schema.TypeString,
Computed: true,
Description: "description",
},
"domain_name": {
Type: schema.TypeString,
Computed: true,
Description: "domain name",
},
"host_name": {
Type: schema.TypeString,
Computed: true,
Description: "host name",
},
"ip": { "ip": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -2498,10 +2509,6 @@ func resourceVinsSchemaMake() map[string]*schema.Schema {
Computed: true, Computed: true,
Description: "type", Description: "type",
}, },
"vnc_password": {
Type: schema.TypeString,
Computed: true,
},
"vins": { "vins": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
@@ -2692,11 +2699,26 @@ func resourceVinsSchemaMake() map[string]*schema.Schema {
Description: "reservations", Description: "reservations",
Elem: &schema.Resource{ Elem: &schema.Resource{
Schema: map[string]*schema.Schema{ Schema: map[string]*schema.Schema{
"account_id": { "client_type": {
Type: schema.TypeInt, Type: schema.TypeString,
Computed: true, Computed: true,
Description: "client type", Description: "client type",
}, },
"description": {
Type: schema.TypeString,
Computed: true,
Description: "description",
},
"domain_name": {
Type: schema.TypeString,
Computed: true,
Description: "domain name",
},
"host_name": {
Type: schema.TypeString,
Computed: true,
Description: "host name",
},
"ip": { "ip": {
Type: schema.TypeString, Type: schema.TypeString,
Computed: true, Computed: true,
@@ -2723,6 +2745,7 @@ func resourceVinsSchemaMake() map[string]*schema.Schema {
}, },
}, },
}, },
"created_time": { "created_time": {
Type: schema.TypeInt, Type: schema.TypeInt,
Computed: true, Computed: true,
@@ -3366,6 +3389,7 @@ func resourceStaticRouteSchemaMake() map[string]*schema.Schema {
"compute_ids": { "compute_ids": {
Type: schema.TypeList, Type: schema.TypeList,
Computed: true, Computed: true,
Optional: true,
Elem: &schema.Schema{ Elem: &schema.Schema{
Type: schema.TypeInt, Type: schema.TypeInt,
}, },

View File

@@ -43,7 +43,6 @@
- extnet_computes_list - extnet_computes_list
- extnet_default - extnet_default
- extnet_list - extnet_list
- extnet_reserved_ip_list
- flipgroup - flipgroup
- flipgroup_list - flipgroup_list
- image - image
@@ -158,7 +157,6 @@
- cb_extnet - cb_extnet
- cb_extnet_default - cb_extnet_default
- cb_extnet_list - cb_extnet_list
- cb_extnet_reserved_ip_list
- cb_extnet_static_route - cb_extnet_static_route
- cb_extnet_static_route_list - cb_extnet_static_route_list
- cb_flipgroup - cb_flipgroup
@@ -171,6 +169,7 @@
- cb_grid_list - cb_grid_list
- cb_grid_list_consumption - cb_grid_list_consumption
- cb_grid_list_emails - cb_grid_list_emails
- cb_grid_post_diagnosis
- cb_grid_post_status - cb_grid_post_status
- cb_image - cb_image
- cb_image_list - cb_image_list

View File

@@ -269,7 +269,7 @@ resource "decort_kvmvm" "comp" {
#тип сети #тип сети
#обязательный параметр #обязательный параметр
#тип - строка #тип - строка
#возможные значения - "VINS", "EXTNET", "VFNIC", "DPDK" (при выборе типа DPDK, необходимо указать hp_backed = true) #возможные значения - "VINS", "EXTNET", "VFNIC", "DPDK"
net_type = "VINS" net_type = "VINS"
#id сети #id сети
@@ -396,17 +396,6 @@ resource "decort_kvmvm" "comp" {
#тип - булев #тип - булев
pin_to_stack = true pin_to_stack = true
#список ядер для использования в механизме vcpupinning. Количество указанных ядер должно быть равно количеству виртуальных процессоров ВМ
#игнорируется если cpu_pin=false или pin_to_stack=false
#опциональный параметр
#тип - массив целых чисел
preferred_cpu = [1234, 456]
#флаг для старта компьюта при рестарте ноды
#опциональный параметр
#тип - булев
auto_start_w_node = true
#флаг доступности компьюта для проведения с ним операций #флаг доступности компьюта для проведения с ним операций
#опциональный параметр #опциональный параметр
#тип - булев #тип - булев
@@ -427,6 +416,11 @@ resource "decort_kvmvm" "comp" {
#тип - булев #тип - булев
restore = true restore = true
#флаг для редеплоя компьюта
#опциональный параметр
#тип - булев
auto_start = true
#флаг для редеплоя компьюта #флаг для редеплоя компьюта
#опциональный параметр #опциональный параметр
#тип - булев #тип - булев
@@ -437,6 +431,11 @@ resource "decort_kvmvm" "comp" {
#тип - булев #тип - булев
force_resize = true force_resize = true
#поле для редеплоя компьюта
#опциональный параметр
#тип - строка
data_disks = "KEEP"
#запуск/стоп компьюта #запуск/стоп компьюта
#опциональный параметр #опциональный параметр
#тип - булев #тип - булев

View File

@@ -52,6 +52,12 @@ resource "decort_vins_static_route" "sr" {
#обязательный параметр #обязательный параметр
#тип - строка #тип - строка
gateway = "192.168.201.40" gateway = "192.168.201.40"
#список виртуальных машин, которым будет предоставлен доступ к роуту
#опциональный параметр
#тип - массив целых чисел
compute_ids = [111, 222]
} }
output "sr" { output "sr" {

View File

@@ -1,43 +0,0 @@
/*
Пример использования
Получение информации о зарезервированных IP адресах или пуле адресов
*/
#Расскомментируйте этот код,
#и внесите необходимые правки в версию и путь,
#чтобы работать с установленным вручную (не через 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_extnet_reserved_ip_list" "ex_reserved_ip" {
#идентификатор аккаунта, для которого зарезервированны ресурсы
#обязательный параметр
#тип - целое число
account_id = 1111
#идентификатор сети
#опциональный параметр
#тип - целое число
#extnet_id = 1111
}
output "test" {
value = data.decort_cb_extnet_reserved_ip_list.ex_reserved_ip
}

View File

@@ -168,26 +168,6 @@ resource "decort_cb_extnet" "new_extnet" {
#e_rate = 0 #e_rate = 0
} }
#список зарезервированных IP или пула адресов
#опциональный параметр
#тип - блок
reserved_ip {
#идентификатор аккаунта, для которого резервируются ресурсы
#обязательный параметр
#тип - целое число
account_id = 11111
#количество резервируемых IP
#опциональный параметр
#тип - целое число
ip_count = 15
#список резервируемых IP
#опциональный параметр
#тип - массив строк
ips = ["192.168.10.10", "192.168.10.20"]
}
#ID stack на который происходит миграция #ID stack на который происходит миграция
#опциональный параметр #опциональный параметр
#тип - целое число #тип - целое число

View File

@@ -32,10 +32,6 @@ data "decort_cb_grid_get_diagnosis" "grid" {
#тип - целое число #тип - целое число
gid = 215 gid = 215
#путь, где будет создан архив, если не указан, создается в директории с main.tf с именем "diagnosis.tar.gz"
#обязательный параметр
#тип - строка
file_path = "abcdefg.tar.gz"
} }
output "test" { output "test" {

View File

@@ -1,6 +1,6 @@
/* /*
Пример использования Пример использования
Получение информации о зарезервированных IP адресах или пуле адресов Получение снимка платформы с дополнительной диагностической информацией, такой как журналы и т.д.
*/ */
#Расскомментируйте этот код, #Расскомментируйте этот код,
@@ -26,18 +26,14 @@ provider "decort" {
allow_unverified_ssl = true allow_unverified_ssl = true
} }
data "decort_extnet_reserved_ip_list" "ex_reserved_ip" { data "decort_cb_grid_post_diagnosis" "grid" {
#идентификатор аккаунта, для которого зарезервированны ресурсы #id grid для получения информации
#обязательный параметр #обязательный параметр
#тип - целое число #тип - целое число
account_id = 1111 gid = 215
#идентификатор сети
#опциональный параметр
#тип - целое число
#extnet_id = 1111
} }
output "test" { output "test" {
value = data.decort_extnet_reserved_ip_list.ex_reserved_ip value = data.decort_cb_grid_post_diagnosis.grid
} }

View File

@@ -66,21 +66,6 @@ data "decort_cb_kvmvm_list" "compute_list" {
#тип - строка #тип - строка
#ip_address = "test" #ip_address = "test"
#фильтр по stack id
#опциональный параметр
#тип - целое число
#stack_id = 123
#фильтр по image id
#опциональный параметр
#тип - целое число
#image_id = 123
#фильтр по cd image id
#опциональный параметр
#тип - целое число
#cd_image_id = 123
#фильтр по имени extnet #фильтр по имени extnet
#опциональный параметр #опциональный параметр
#тип - строка #тип - строка

View File

@@ -281,7 +281,7 @@ resource "decort_cb_kvmvm" "comp" {
#network { #network {
#тип сети #тип сети
#обязательный параметр #обязательный параметр
#возможные значения - "VINS", "EXTNET", "VFNIC", "DPDK" (при выборе типа DPDK, необходимо указать hp_backed = true) #возможные значения - "VINS", "EXTNET", "VFNIC", "DPDK"
#тип - строка #тип - строка
#net_type = "VINS" #net_type = "VINS"
@@ -409,16 +409,10 @@ resource "decort_cb_kvmvm" "comp" {
#тип - булев #тип - булев
#pin_to_stack = true #pin_to_stack = true
#список ядер для использования в механизме vcpupinning. Количество указанных ядер должно быть равно количеству виртуальных процессоров ВМ #id stack для добавления компьюта на этот стэк
#игнорируется если cpu_pin=false или pin_to_stack=false
#опциональный параметр #опциональный параметр
#тип - массив целых чисел #тип - целое число
#preferred_cpu = [1234, 456] #target_stack_id = 1
#флаг для старта компьюта при рестарте ноды
#опциональный параметр
#тип - булев
#auto_start_w_node = true
#флаг для принужительного добавления компьюта на стэк #флаг для принужительного добавления компьюта на стэк
#опциональный параметр #опциональный параметр
@@ -450,6 +444,11 @@ resource "decort_cb_kvmvm" "comp" {
#тип - булев #тип - булев
#restore = true #restore = true
#флаг для редеплоя компьюта
#опциональный параметр
#тип - булев
#auto_start = true
#флаг для редеплоя компьюта #флаг для редеплоя компьюта
#опциональный параметр #опциональный параметр
#тип - булев #тип - булев
@@ -466,6 +465,11 @@ resource "decort_cb_kvmvm" "comp" {
#тип - булев #тип - булев
#force_resize = true #force_resize = true
#поле для редеплоя компьюта
#опциональный параметр
#тип - строка
#data_disks = "KEEP"
#запуск/стоп компьюта #запуск/стоп компьюта
#опциональный параметр #опциональный параметр
#тип - булев #тип - булев

View File

@@ -42,7 +42,7 @@ resource "decort_cb_sep" "s" {
#тип sep #тип sep
#обязательный параметр #обязательный параметр
#возможные значения - des, dorado, tatlin, hitachi, ovs, local, shared #возможные значения - des, dorado, tatlin, hitachi
#тип - строка #тип - строка
type = "des" type = "des"

View File

@@ -51,6 +51,12 @@ resource "decort_cb_vins_static_route" "sr" {
#обязательный параметр #обязательный параметр
#тип - строка #тип - строка
gateway = "192.168.201.40" gateway = "192.168.201.40"
#список виртуальных машин, которым будет предоставлен доступ к роуту
#опциональный параметр
#тип - массив целых чисел
#compute_ids = [111,222]
} }
output "sr" { output "sr" {