Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 987fef81d7 | |||
|
|
f44c69003b | ||
| 22897c3bf5 | |||
|
|
bae25296bb | ||
|
|
1b81a71504 |
36
CHANGELOG.md
36
CHANGELOG.md
@@ -1,40 +1,8 @@
|
|||||||
## Version 4.9.1
|
## Version 4.9.6
|
||||||
|
|
||||||
### Добавлено
|
|
||||||
|
|
||||||
### Исправлено
|
### Исправлено
|
||||||
|
|
||||||
#### account
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-823 | Ошибка удаления resource 'decort_cb_account' в cloudbroker/account |
|
|
||||||
| BATF-832 | Ошибка отлючения resource 'decort_account' в cloudapi/account и resource 'decort_cb_account' в cloudbroker/account |
|
|
||||||
|
|
||||||
#### k8s
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-955 | Ошибка редактирования resource 'decort_cb_k8s_cp' в cloudbroker/k8s |
|
|
||||||
|
|
||||||
#### sep
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-823 | Ошибка при получении данных при заданном поле `rg_id` в datasource `decort_cb_available_sep_and_pools_list` в cloudbroker/sep и в datasource `decort_available_sep_and_pools_list` в cloudapi/sep |
|
|
||||||
|
|
||||||
### Удалено
|
|
||||||
|
|
||||||
#### image
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-835 | Вычисляемое поле `meta` в resources `decort_cb_cdrom_image`, `decort_cb_virtual_image` и data source `decort_cb_image_list_stacks` в cloudbroker/image |
|
|
||||||
| BATF-825 | Опциональное поле `accounts` в resources `decort_cb_image`, `decort_cb_image_from_blank_compute` `decort_cb_image_from_platform_disk` в cloudbroker/image |
|
|
||||||
|
|
||||||
#### kvmvm
|
#### kvmvm
|
||||||
| Идентификатор<br>задачи | Описание |
|
| Идентификатор<br>задачи | Описание |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| BATF-962 | Поле `stateless` в resource `decort_kvmvm` в cloudapi/kvmvm|
|
| BATF-1147 | Остановка виртуальной машины перед удалением в resources `decort_kvmvm` и `decort_cb_kvmvm` в cloudapi/kvmvm и в cloudbroker/kvmvm |
|
||||||
|
|
||||||
#### vins
|
|
||||||
| Идентификатор<br>задачи | Описание |
|
|
||||||
| --- | --- |
|
|
||||||
| BATF-881 | Значение по умолчанию в поле `pre_reservations_num` в resource `decort_vins` в cloudapi/vins и в resource `decort_cb_vins` в cloudbroker/vins |
|
|
||||||
|
|
||||||
2
Makefile
2
Makefile
@@ -7,7 +7,7 @@ ZIPDIR = ./zip
|
|||||||
BINARY=${NAME}
|
BINARY=${NAME}
|
||||||
WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH}
|
WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH}
|
||||||
MAINPATH = ./cmd/decort/
|
MAINPATH = ./cmd/decort/
|
||||||
VERSION=4.9.1
|
VERSION=4.9.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\
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Terraform provider для платформы Digital Energy Cloud Orchestration Technology (DECORT)
|
Terraform provider для платформы Digital Energy Cloud Orchestration Technology (DECORT)
|
||||||
|
|
||||||
## Соответсвие версий платформы версиям провайдера
|
## Соответствие версий платформы версиям провайдера
|
||||||
|
|
||||||
| Версия DECORT API | Версия провайдера Terraform |
|
| Версия DECORT API | Версия провайдера Terraform |
|
||||||
| ------ | ------ |
|
| ------ | ------ |
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ description: |-
|
|||||||
- `boot_type` (String) Boot type of image bios or uefi
|
- `boot_type` (String) Boot type of image bios or uefi
|
||||||
- `image_type` (String) Image type linux, windows or other
|
- `image_type` (String) Image type linux, windows or other
|
||||||
- `name` (String) Name of the rescue disk
|
- `name` (String) Name of the rescue disk
|
||||||
|
- `url` (String) URL where to download media from
|
||||||
|
|
||||||
### Optional
|
### Optional
|
||||||
|
|
||||||
@@ -30,7 +31,6 @@ description: |-
|
|||||||
- `drivers` (List of String) List of types of compute suitable for image. Example: [ "KVM_X86" ]
|
- `drivers` (List of String) List of types of compute suitable for image. Example: [ "KVM_X86" ]
|
||||||
- `enabled` (Boolean)
|
- `enabled` (Boolean)
|
||||||
- `enabled_stacks` (List of Number)
|
- `enabled_stacks` (List of Number)
|
||||||
- `file_path` (String) path to image file
|
|
||||||
- `hot_resize` (Boolean) Does this machine supports hot resize
|
- `hot_resize` (Boolean) Does this machine supports hot resize
|
||||||
- `network_interface_naming` (String) select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming
|
- `network_interface_naming` (String) select a network interface naming pattern for your Linux machine. eth - onboard, ens - pci slot naming
|
||||||
- `password` (String) Optional password for the image
|
- `password` (String) Optional password for the image
|
||||||
@@ -40,7 +40,6 @@ description: |-
|
|||||||
- `shared_with` (List of Number)
|
- `shared_with` (List of Number)
|
||||||
- `sync_mode` (Boolean) Create image from a media identified by URL (in synchronous mode)
|
- `sync_mode` (Boolean) Create image from a media identified by URL (in synchronous mode)
|
||||||
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
- `timeouts` (Block, Optional) (see [below for nested schema](#nestedblock--timeouts))
|
||||||
- `url` (String) URL where to download media from
|
|
||||||
- `username` (String) Optional username for the image
|
- `username` (String) Optional username for the image
|
||||||
- `username_dl` (String) username for upload binary media
|
- `username_dl` (String) username for upload binary media
|
||||||
|
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -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.11.4
|
repository.basistech.ru/BASIS/decort-golang-sdk v1.11.6
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
|||||||
4
go.sum
4
go.sum
@@ -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.11.4 h1:OEFgSEGjzut+vVMGeNgoNq3dtk63FbXB6yGLTywtAas=
|
repository.basistech.ru/BASIS/decort-golang-sdk v1.11.6 h1:CTcMkUJgwDsUA+Az8FI5iLpZDk4ubOO4JnAfbOwDnM0=
|
||||||
repository.basistech.ru/BASIS/decort-golang-sdk v1.11.4/go.mod h1:OaUynHHuSjWMzpfyoL4au6oLcUogqUkPPBKA15pbHWo=
|
repository.basistech.ru/BASIS/decort-golang-sdk v1.11.6/go.mod h1:OaUynHHuSjWMzpfyoL4au6oLcUogqUkPPBKA15pbHWo=
|
||||||
|
|||||||
@@ -297,7 +297,7 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
|
|||||||
|
|
||||||
loaderType, loaderTypeOk := d.GetOk("loader_type")
|
loaderType, loaderTypeOk := d.GetOk("loader_type")
|
||||||
bootType, bootTypeOk := d.GetOk("boot_type")
|
bootType, bootTypeOk := d.GetOk("boot_type")
|
||||||
hotResize, hotResizeOk := d.GetOk("hot_resize")
|
hotResize, hotResizeOk := d.GetOkExists("hot_resize")
|
||||||
networkInterfaceNaming, networkInterfaceNamingOk := d.GetOk("network_interface_naming")
|
networkInterfaceNaming, networkInterfaceNamingOk := d.GetOk("network_interface_naming")
|
||||||
|
|
||||||
if loaderTypeOk {
|
if loaderTypeOk {
|
||||||
@@ -842,62 +842,6 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
doUpdate := false
|
|
||||||
resizeReq := compute.ResizeRequest{
|
|
||||||
ComputeID: computeRec.ID,
|
|
||||||
}
|
|
||||||
forceResize, ok := d.GetOk("force_resize")
|
|
||||||
if ok {
|
|
||||||
resizeReq.Force = forceResize.(bool)
|
|
||||||
}
|
|
||||||
|
|
||||||
warnings := dc.Warnings{}
|
|
||||||
|
|
||||||
oldCpu, newCpu := d.GetChange("cpu")
|
|
||||||
if oldCpu.(int) > newCpu.(int) && !forceResize.(bool) {
|
|
||||||
return diag.Errorf("Cannot resize compute ID %d: enable 'force_resize' to reduce compute vCPUs", computeRec.ID)
|
|
||||||
}
|
|
||||||
if oldCpu.(int) != newCpu.(int) {
|
|
||||||
resizeReq.CPU = uint64(newCpu.(int))
|
|
||||||
doUpdate = true
|
|
||||||
} else {
|
|
||||||
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")
|
|
||||||
if oldRam.(int) != newRam.(int) {
|
|
||||||
resizeReq.RAM = uint64(newRam.(int))
|
|
||||||
doUpdate = true
|
|
||||||
} else {
|
|
||||||
resizeReq.RAM = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if doUpdate {
|
|
||||||
log.Debugf("resourceComputeUpdate: changing CPU %d -> %d and/or RAM %d -> %d",
|
|
||||||
oldCpu.(int), newCpu.(int),
|
|
||||||
oldRam.(int), newRam.(int))
|
|
||||||
_, err := c.CloudAPI().Compute().Resize(ctx, resizeReq)
|
|
||||||
if err != nil {
|
|
||||||
return diag.FromErr(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
oldSize, newSize := d.GetChange("boot_disk_size")
|
oldSize, newSize := d.GetChange("boot_disk_size")
|
||||||
if oldSize.(int) < newSize.(int) {
|
if oldSize.(int) < newSize.(int) {
|
||||||
req := compute.DiskResizeRequest{ComputeID: computeRec.ID}
|
req := compute.DiskResizeRequest{ComputeID: computeRec.ID}
|
||||||
@@ -957,6 +901,79 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
var isStopRequired bool
|
||||||
|
if d.HasChanges("numa_affinity", "cpu_pin", "hp_backed", "chipset", "preferred_cpu", "hot_resize") && d.Get("started").(bool) {
|
||||||
|
isStopRequired = true
|
||||||
|
}
|
||||||
|
|
||||||
|
old, new := d.GetChange("cpu")
|
||||||
|
if old.(int) > new.(int) && d.Get("started").(bool) && d.Get("force_resize").(bool) {
|
||||||
|
isStopRequired = true
|
||||||
|
}
|
||||||
|
if isStopRequired {
|
||||||
|
if _, err := c.CloudAPI().Compute().Stop(ctx, compute.StopRequest{ComputeID: computeRec.ID}); err != nil {
|
||||||
|
return diag.FromErr(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
doUpdate := false
|
||||||
|
resizeReq := compute.ResizeRequest{
|
||||||
|
ComputeID: computeRec.ID,
|
||||||
|
}
|
||||||
|
forceResize, ok := d.GetOk("force_resize")
|
||||||
|
if ok {
|
||||||
|
resizeReq.Force = forceResize.(bool)
|
||||||
|
}
|
||||||
|
|
||||||
|
warnings := dc.Warnings{}
|
||||||
|
|
||||||
|
oldCpu, newCpu := d.GetChange("cpu")
|
||||||
|
if oldCpu.(int) > newCpu.(int) && !forceResize.(bool) {
|
||||||
|
return diag.Errorf("Cannot resize compute ID %d: enable 'force_resize' to reduce compute vCPUs", computeRec.ID)
|
||||||
|
}
|
||||||
|
if oldCpu.(int) != newCpu.(int) {
|
||||||
|
resizeReq.CPU = uint64(newCpu.(int))
|
||||||
|
doUpdate = true
|
||||||
|
} else {
|
||||||
|
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")
|
||||||
|
if oldRam.(int) != newRam.(int) {
|
||||||
|
resizeReq.RAM = uint64(newRam.(int))
|
||||||
|
doUpdate = true
|
||||||
|
} else {
|
||||||
|
resizeReq.RAM = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if doUpdate {
|
||||||
|
log.Debugf("resourceComputeUpdate: changing CPU %d -> %d and/or RAM %d -> %d",
|
||||||
|
oldCpu.(int), newCpu.(int),
|
||||||
|
oldRam.(int), newRam.(int))
|
||||||
|
_, err := c.CloudAPI().Compute().Resize(ctx, resizeReq)
|
||||||
|
if err != nil {
|
||||||
|
return diag.FromErr(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if d.HasChanges("description",
|
if d.HasChanges("description",
|
||||||
"name",
|
"name",
|
||||||
"numa_affinity",
|
"numa_affinity",
|
||||||
@@ -1020,28 +1037,17 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
|
|||||||
req.NetworkInterfaceNaming = d.Get("network_interface_naming").(string)
|
req.NetworkInterfaceNaming = d.Get("network_interface_naming").(string)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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
|
|
||||||
var isStopRequired bool
|
|
||||||
if d.HasChanges("numa_affinity", "cpu_pin", "hp_backed", "chipset", "preferred_cpu") && d.Get("started").(bool) {
|
|
||||||
isStopRequired = true
|
|
||||||
}
|
|
||||||
if isStopRequired {
|
|
||||||
if _, err := c.CloudAPI().Compute().Stop(ctx, compute.StopRequest{ComputeID: computeRec.ID}); err != nil {
|
|
||||||
return diag.FromErr(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// perform update
|
// perform update
|
||||||
if _, err := c.CloudAPI().Compute().Update(ctx, req); err != nil {
|
if _, err := c.CloudAPI().Compute().Update(ctx, req); err != nil {
|
||||||
return diag.FromErr(err)
|
return diag.FromErr(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If used to be STARTED, we need to start it after update
|
}
|
||||||
if isStopRequired {
|
|
||||||
if _, err := c.CloudAPI().Compute().Start(ctx, compute.StartRequest{ComputeID: computeRec.ID}); err != nil {
|
// If used to be STARTED, we need to start it after update
|
||||||
return diag.FromErr(err)
|
if isStopRequired {
|
||||||
}
|
if _, err := c.CloudAPI().Compute().Start(ctx, compute.StartRequest{ComputeID: computeRec.ID}); err != nil {
|
||||||
|
return diag.FromErr(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1097,15 +1103,6 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(deletedDisks) > 0 {
|
if len(deletedDisks) > 0 {
|
||||||
stopReq := compute.StopRequest{
|
|
||||||
ComputeID: computeRec.ID,
|
|
||||||
Force: false,
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := c.CloudAPI().Compute().Stop(ctx, stopReq)
|
|
||||||
if err != nil {
|
|
||||||
return diag.FromErr(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, disk := range deletedDisks {
|
for _, disk := range deletedDisks {
|
||||||
diskConv := disk.(map[string]interface{})
|
diskConv := disk.(map[string]interface{})
|
||||||
@@ -1126,14 +1123,7 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
|
|||||||
return diag.FromErr(err)
|
return diag.FromErr(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req := compute.StartRequest{
|
|
||||||
ComputeID: computeRec.ID,
|
|
||||||
AltBootID: 0,
|
|
||||||
}
|
|
||||||
_, err = c.CloudAPI().Compute().Start(ctx, req)
|
|
||||||
if err != nil {
|
|
||||||
return diag.FromErr(err)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(addedDisks) > 0 {
|
if len(addedDisks) > 0 {
|
||||||
@@ -1206,24 +1196,6 @@ 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 == "" {
|
||||||
@@ -1782,32 +1754,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")
|
|
||||||
|
|
||||||
if d.Get("permanently").(bool) && ok {
|
|
||||||
pciDevices := pciList.(*schema.Set).List()
|
|
||||||
for _, v := range pciDevices {
|
|
||||||
pciID := v.(int)
|
|
||||||
req := compute.DetachPCIDeviceRequest{
|
|
||||||
ComputeID: computeId,
|
|
||||||
DeviceID: uint64(pciID),
|
|
||||||
}
|
|
||||||
_, err := c.CloudAPI().Compute().DetachPCIDevice(ctx, req)
|
|
||||||
if err != nil {
|
|
||||||
return diag.FromErr(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
req := compute.DeleteRequest{
|
req := compute.DeleteRequest{
|
||||||
ComputeID: computeId,
|
ComputeID: computeId,
|
||||||
Permanently: d.Get("permanently").(bool),
|
Permanently: d.Get("permanently").(bool),
|
||||||
|
|||||||
@@ -397,15 +397,12 @@ func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap,
|
|||||||
newMap := newNetwork.(map[string]interface{})
|
newMap := newNetwork.(map[string]interface{})
|
||||||
if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] && (newMap["mtu"] == oldMap["mtu"] || newMap["mtu"].(int) == 0) {
|
if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] && (newMap["mtu"] == oldMap["mtu"] || newMap["mtu"].(int) == 0) {
|
||||||
found = true
|
found = true
|
||||||
switch {
|
if (newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "VINS") && (newMap["ip_address"] != oldMap["ip_address"] && newMap["ip_address"].(string) != "") {
|
||||||
case (newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "VINS") && (newMap["ip_address"] != oldMap["ip_address"] && newMap["ip_address"].(string) != ""):
|
|
||||||
changeIpMap = append(changeIpMap, newMap)
|
changeIpMap = append(changeIpMap, newMap)
|
||||||
found = true
|
}
|
||||||
fallthrough
|
if newMap["mac"] != oldMap["mac"] && newMap["mac"].(string) != "" {
|
||||||
case newMap["mac"] != oldMap["mac"] && newMap["mac"].(string) != "":
|
|
||||||
newMap["old_mac"] = oldMap["mac"]
|
newMap["old_mac"] = oldMap["mac"]
|
||||||
changeMacMap = append(changeMacMap, newMap)
|
changeMacMap = append(changeMacMap, newMap)
|
||||||
found = true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if found {
|
if found {
|
||||||
|
|||||||
@@ -49,30 +49,13 @@ import (
|
|||||||
func resourceImageCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
|
func resourceImageCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
|
||||||
log.Debugf("resourceImageCreate: called for image %s", d.Get("name").(string))
|
log.Debugf("resourceImageCreate: called for image %s", d.Get("name").(string))
|
||||||
|
|
||||||
url, urlOk := d.GetOk("url")
|
url, _ := d.GetOk("url")
|
||||||
filePath, fileImageOk := d.GetOk("file_path")
|
|
||||||
|
|
||||||
if !urlOk && !fileImageOk {
|
|
||||||
return diag.Errorf("resourceImageCreate: no valid url or file_path specified")
|
|
||||||
}
|
|
||||||
|
|
||||||
if urlOk && fileImageOk {
|
|
||||||
return diag.Errorf("resourceImageCreate: either url or resource file_path should be specified")
|
|
||||||
}
|
|
||||||
|
|
||||||
c := m.(*controller.ControllerCfg)
|
c := m.(*controller.ControllerCfg)
|
||||||
|
|
||||||
syncMode := d.Get("sync_mode").(bool)
|
syncMode := d.Get("sync_mode").(bool)
|
||||||
var imageId uint64
|
var imageId uint64
|
||||||
|
|
||||||
if fileImageOk {
|
|
||||||
var err error
|
|
||||||
url, err = c.CloudBroker().Image().UploadImageFile(ctx, filePath.(string))
|
|
||||||
if err != nil {
|
|
||||||
return diag.FromErr(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if syncMode {
|
if syncMode {
|
||||||
req, err := SyncCreateRequest(ctx, d, m, url.(string))
|
req, err := SyncCreateRequest(ctx, d, m, url.(string))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -1174,15 +1174,9 @@ func resourceImageSchemaMake() map[string]*schema.Schema {
|
|||||||
},
|
},
|
||||||
"url": {
|
"url": {
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Optional: true,
|
Required: true,
|
||||||
Computed: true,
|
|
||||||
Description: "URL where to download media from",
|
Description: "URL where to download media from",
|
||||||
},
|
},
|
||||||
"file_path": {
|
|
||||||
Type: schema.TypeString,
|
|
||||||
Optional: true,
|
|
||||||
Description: "path to image file",
|
|
||||||
},
|
|
||||||
"boot_type": {
|
"boot_type": {
|
||||||
Type: schema.TypeString,
|
Type: schema.TypeString,
|
||||||
Required: true,
|
Required: true,
|
||||||
|
|||||||
@@ -251,7 +251,7 @@ func resourceComputeCreate(ctx context.Context, d *schema.ResourceData, m interf
|
|||||||
|
|
||||||
loaderType, loaderTypeOk := d.GetOk("loader_type")
|
loaderType, loaderTypeOk := d.GetOk("loader_type")
|
||||||
bootType, bootTypeOk := d.GetOk("boot_type")
|
bootType, bootTypeOk := d.GetOk("boot_type")
|
||||||
hotResize, hotResizeOk := d.GetOk("hot_resize")
|
hotResize, hotResizeOk := d.GetOkExists("hot_resize")
|
||||||
networkInterfaceNaming, networkInterfaceNamingOk := d.GetOk("network_interface_naming")
|
networkInterfaceNaming, networkInterfaceNamingOk := d.GetOk("network_interface_naming")
|
||||||
|
|
||||||
if loaderTypeOk {
|
if loaderTypeOk {
|
||||||
@@ -875,33 +875,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")
|
|
||||||
|
|
||||||
if d.Get("permanently").(bool) && ok {
|
|
||||||
pciDevices := pciList.(*schema.Set).List()
|
|
||||||
for _, v := range pciDevices {
|
|
||||||
pciID := v.(int)
|
|
||||||
req := compute.DetachPCIDeviceRequest{
|
|
||||||
ComputeID: computeId,
|
|
||||||
DeviceID: uint64(pciID),
|
|
||||||
}
|
|
||||||
_, err := c.CloudBroker().Compute().DetachPciDevice(ctx, req)
|
|
||||||
if err != nil {
|
|
||||||
return diag.FromErr(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
req := compute.DeleteRequest{
|
req := compute.DeleteRequest{
|
||||||
ComputeID: computeId,
|
ComputeID: computeId,
|
||||||
Permanently: d.Get("permanently").(bool),
|
Permanently: d.Get("permanently").(bool),
|
||||||
|
|||||||
@@ -111,6 +111,22 @@ 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)
|
||||||
|
|
||||||
|
var isStopRequired bool
|
||||||
|
|
||||||
|
old, new := d.GetChange("cpu")
|
||||||
|
if d.Get("started").(bool) && (old.(int) > new.(int)) && d.Get("force_resize").(bool) {
|
||||||
|
isStopRequired = true
|
||||||
|
}
|
||||||
|
if isStopRequired {
|
||||||
|
stopReq := compute.StopRequest{
|
||||||
|
ComputeID: computeId,
|
||||||
|
Force: false,
|
||||||
|
}
|
||||||
|
if _, err := c.CloudBroker().Compute().Stop(ctx, stopReq); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
resizeReq := compute.ResizeRequest{
|
resizeReq := compute.ResizeRequest{
|
||||||
ComputeID: computeId,
|
ComputeID: computeId,
|
||||||
}
|
}
|
||||||
@@ -166,6 +182,12 @@ func utilityComputeResize(ctx context.Context, d *schema.ResourceData, m interfa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if isStopRequired {
|
||||||
|
if _, err := c.CloudBroker().Compute().Start(ctx, compute.StartRequest{ComputeID: computeId}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -259,15 +281,6 @@ func utilityComputeUpdateDisks(ctx context.Context, d *schema.ResourceData, m in
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(deletedDisks) > 0 {
|
if len(deletedDisks) > 0 {
|
||||||
stopReq := compute.StopRequest{
|
|
||||||
ComputeID: computeId,
|
|
||||||
Force: false,
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err := c.CloudBroker().Compute().Stop(ctx, stopReq)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, disk := range deletedDisks {
|
for _, disk := range deletedDisks {
|
||||||
diskConv := disk.(map[string]interface{})
|
diskConv := disk.(map[string]interface{})
|
||||||
@@ -286,14 +299,7 @@ func utilityComputeUpdateDisks(ctx context.Context, d *schema.ResourceData, m in
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
req := compute.StartRequest{
|
|
||||||
ComputeID: computeId,
|
|
||||||
AltBootID: 0,
|
|
||||||
}
|
|
||||||
_, err = c.CloudBroker().Compute().Start(ctx, req)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(addedDisks) > 0 {
|
if len(addedDisks) > 0 {
|
||||||
@@ -764,15 +770,12 @@ func differenceNetwork(oldList, newList []interface{}) (detachMap, changeIpMap,
|
|||||||
newMap := newNetwork.(map[string]interface{})
|
newMap := newNetwork.(map[string]interface{})
|
||||||
if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] && (newMap["mtu"] == oldMap["mtu"] || newMap["mtu"].(int) == 0) {
|
if newMap["net_type"] == oldMap["net_type"] && newMap["net_id"] == oldMap["net_id"] && newMap["weight"] == oldMap["weight"] && (newMap["mtu"] == oldMap["mtu"] || newMap["mtu"].(int) == 0) {
|
||||||
found = true
|
found = true
|
||||||
switch {
|
if (newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "VINS") && (newMap["ip_address"] != oldMap["ip_address"] && newMap["ip_address"].(string) != "") {
|
||||||
case (newMap["net_type"].(string) == "EXTNET" || newMap["net_type"].(string) == "VINS") && (newMap["ip_address"] != oldMap["ip_address"] && newMap["ip_address"].(string) != ""):
|
|
||||||
changeIpMap = append(changeIpMap, newMap)
|
changeIpMap = append(changeIpMap, newMap)
|
||||||
found = true
|
}
|
||||||
fallthrough
|
if newMap["mac"] != oldMap["mac"] && newMap["mac"].(string) != "" {
|
||||||
case newMap["mac"] != oldMap["mac"] && newMap["mac"].(string) != "":
|
|
||||||
newMap["old_mac"] = oldMap["mac"]
|
newMap["old_mac"] = oldMap["mac"]
|
||||||
changeMacMap = append(changeMacMap, newMap)
|
changeMacMap = append(changeMacMap, newMap)
|
||||||
found = true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if found {
|
if found {
|
||||||
@@ -908,7 +911,7 @@ func utilityComputeUpdate(ctx context.Context, d *schema.ResourceData, m interfa
|
|||||||
// 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", "chipset", "preferred_cpu", "hot_resize") && d.Get("started").(bool) {
|
||||||
isStopRequired = true
|
isStopRequired = true
|
||||||
}
|
}
|
||||||
if isStopRequired {
|
if isStopRequired {
|
||||||
|
|||||||
@@ -38,19 +38,11 @@ resource "decort_cb_image" "my_image" {
|
|||||||
name = "test_image_rename"
|
name = "test_image_rename"
|
||||||
|
|
||||||
#адрес образа
|
#адрес образа
|
||||||
#опциональный параметр
|
#обязательный параметр
|
||||||
#внимание, для создания ресурса обязательно должен быть указан или url, или file_path
|
|
||||||
#тип - строка
|
#тип - строка
|
||||||
#используется при создании
|
#используется при создании
|
||||||
url = "https://colba.decs.online/index.php/s/G3H7AREngzeKGw2/download"
|
url = "https://colba.decs.online/index.php/s/G3H7AREngzeKGw2/download"
|
||||||
|
|
||||||
#путь к образу для загрузки
|
|
||||||
#опциональный параметр
|
|
||||||
#внимание, для создания ресурса обязательно должен быть указан или url, или file_path
|
|
||||||
#тип - строка
|
|
||||||
#используется при создании
|
|
||||||
file_path = "img.iso"
|
|
||||||
|
|
||||||
#тип загрузки образа
|
#тип загрузки образа
|
||||||
#обязательный параметр
|
#обязательный параметр
|
||||||
#тип - строка
|
#тип - строка
|
||||||
|
|||||||
Reference in New Issue
Block a user