diff --git a/CHANGELOG.md b/CHANGELOG.md
index 883bb2e..a49994e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,23 +1,9 @@
-## Version 4.9.2
-
-### Добавлено
+## Version 4.9.3
### Исправлено
-#### image
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BATF-999 | Изменен тип поля `url` с optional на required в resource `decort_cb_image` в cloudbroker/image |
-
#### kvmvm
| Идентификатор
задачи | Описание |
| --- | --- |
-| BATF-1002 | Ошибка при смене `ip_address` в блоке `network` приводящаяя к смене MAC адрес сети в resource `decort_compute` и `decort_cb_compute` в cloupapi/kvmvm и cloudbroker/kvmvm |
-
-### Удалено
-
-#### image
-| Идентификатор
задачи | Описание |
-| --- | --- |
-| BATF-999 | Опциональное поле `file_path` в resource `decort_cb_image` в cloudbroker/image |
-
+| BATF-1016 | Ошибка при изменении полей `ram` и `cpu`, приводящая к невозможности измения параметров виртуальной машины в resources `decort_kvmvm` и `decort_cb_kvmvm` в cloudapi/kvmvm и в cloudbroker/kvmvm |
+| BATF-1018 | Ошибка при изменении поля `started`, приводящая к невозможности запуска виртуальной машины в resources `decort_kvmvm` в cloudapi/kvmvm |
diff --git a/Makefile b/Makefile
index 90ca8ac..52e3325 100644
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ ZIPDIR = ./zip
BINARY=${NAME}
WORKPATH= ./examples/terraform.d/plugins/${HOSTNAME}/${NAMESPACE}/${NAMESPACE}/${VERSION}/${OS_ARCH}
MAINPATH = ./cmd/decort/
-VERSION=4.9.2
+VERSION=4.9.3
OS_ARCH=$(shell go env GOHOSTOS)_$(shell go env GOHOSTARCH)
FILES = ${BINARY}_${VERSION}_darwin_amd64\
diff --git a/internal/service/cloudapi/kvmvm/resource_compute.go b/internal/service/cloudapi/kvmvm/resource_compute.go
index 231b26d..26999f4 100644
--- a/internal/service/cloudapi/kvmvm/resource_compute.go
+++ b/internal/service/cloudapi/kvmvm/resource_compute.go
@@ -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")
if oldSize.(int) < newSize.(int) {
req := compute.DiskResizeRequest{ComputeID: computeRec.ID}
@@ -957,6 +901,74 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
}
}
+ // Note bene: numa_affinity, cpu_pin and hp_backed, cpu, ram 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)
+ }
+ }
+
+ 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",
"name",
"numa_affinity",
@@ -1020,28 +1032,17 @@ func resourceComputeUpdate(ctx context.Context, d *schema.ResourceData, m interf
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
if _, err := c.CloudAPI().Compute().Update(ctx, req); err != nil {
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 {
- 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 {
+ return diag.FromErr(err)
}
}
@@ -1206,24 +1207,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") {
affinityLabel := d.Get("affinity_label").(string)
if affinityLabel == "" {
diff --git a/internal/service/cloudbroker/kvmvm/utility_compute.go b/internal/service/cloudbroker/kvmvm/utility_compute.go
index ded3dcc..5728ecc 100644
--- a/internal/service/cloudbroker/kvmvm/utility_compute.go
+++ b/internal/service/cloudbroker/kvmvm/utility_compute.go
@@ -111,6 +111,16 @@ func utilityComputeResize(ctx context.Context, d *schema.ResourceData, m interfa
c := m.(*controller.ControllerCfg)
computeId, _ := strconv.ParseUint(d.Id(), 10, 64)
+ if d.Get("started").(bool) {
+ stopReq := compute.StopRequest{
+ ComputeID: computeId,
+ Force: false,
+ }
+ if _, err := c.CloudBroker().Compute().Stop(ctx, stopReq); err != nil {
+ return err
+ }
+ }
+
resizeReq := compute.ResizeRequest{
ComputeID: computeId,
}
@@ -166,6 +176,12 @@ func utilityComputeResize(ctx context.Context, d *schema.ResourceData, m interfa
}
}
+ if d.Get("started").(bool) {
+ if _, err := c.CloudBroker().Compute().Start(ctx, compute.StartRequest{ComputeID: computeId}); err != nil {
+ return err
+ }
+ }
+
return nil
}