/
change_validators.go
88 lines (79 loc) · 3.42 KB
/
change_validators.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package vms
import (
"context"
"fmt"
"github.com/awlsring/terraform-provider-proxmox/internal/service"
"github.com/awlsring/terraform-provider-proxmox/proxmox/qemu/types"
vt "github.com/awlsring/terraform-provider-proxmox/proxmox/qemu/vms/types"
"github.com/hashicorp/terraform-plugin-framework/resource"
)
func disksAreSame(sd types.VirtualMachineDiskModel, pd types.VirtualMachineDiskModel) bool {
if sd.Storage.ValueString() != pd.Storage.ValueString() {
return false
}
if sd.Position.ValueInt64() != pd.Position.ValueInt64() {
return false
}
if sd.InterfaceType.ValueString() != pd.InterfaceType.ValueString() {
return false
}
return true
}
func isDiskInList(disk types.VirtualMachineDiskModel, list []types.VirtualMachineDiskModel) bool {
for _, d := range list {
if disksAreSame(disk, d) {
return true
}
}
return false
}
func changeValidatorDiskSize(_ context.Context, state *vt.VirtualMachineResourceModel, plan *vt.VirtualMachineResourceModel, resp *resource.ModifyPlanResponse) {
for i, disk := range plan.Disks.Disks {
previous := state.Disks.Disks[i]
if !disksAreSame(previous, disk) {
continue
}
if disk.Size.ValueInt64() < previous.Size.ValueInt64() {
resp.Diagnostics.AddError("Disk size cannot be reduced", fmt.Sprintf("Disk %s%v size cannot be reduced from %d to %d", disk.InterfaceType.ValueString(), disk.Position.ValueInt64(), previous.Size.ValueInt64(), disk.Size.ValueInt64()))
return
}
}
}
func changeValidatorDiskStorage(_ context.Context, state *vt.VirtualMachineResourceModel, plan *vt.VirtualMachineResourceModel, resp *resource.ModifyPlanResponse) {
for i, disk := range plan.Disks.Disks {
previous := state.Disks.Disks[i]
if disksAreSame(previous, disk) {
continue
}
diskName := fmt.Sprintf("%s%v", disk.InterfaceType.ValueString(), disk.Position.ValueInt64())
if disk.Storage.ValueString() != previous.Storage.ValueString() {
resp.Diagnostics.AddWarning(fmt.Sprintf("Changing disk storage for %s", diskName), fmt.Sprintf("Detected storage changed from %s to %s for disk %s. This will result in a new disk being created.", previous.Storage.ValueString(), disk.Storage.ValueString(), diskName))
return
}
}
}
func changeValidatorDiskRemoved(_ context.Context, state *vt.VirtualMachineResourceModel, plan *vt.VirtualMachineResourceModel, resp *resource.ModifyPlanResponse) {
removedDisks := []types.VirtualMachineDiskModel{}
for _, disk := range state.Disks.Disks {
if !isDiskInList(disk, plan.Disks.Disks) {
removedDisks = append(removedDisks, disk)
}
}
removedDisksName := []string{}
for _, disk := range removedDisks {
removedDisksName = append(removedDisksName, fmt.Sprintf("%s%v", disk.InterfaceType.ValueString(), disk.Position.ValueInt64()))
}
if len(removedDisks) > 0 {
resp.Diagnostics.AddWarning("Detected disk(s) removal", fmt.Sprintf("Detected removal of disk(s) %v. This will result in the disk(s) being deleted.", removedDisksName))
}
}
func powerOffValidator(ctx context.Context, client *service.Proxmox, state *vt.VirtualMachineResourceModel, plan *vt.VirtualMachineResourceModel, resp *resource.ModifyPlanResponse) {
isSensitive, err := isSensitivePropertyChanged(ctx, state, plan)
if err != nil {
resp.Diagnostics.AddError("Error checking if sensitive property changed", err.Error())
return
}
if isSensitive {
resp.Diagnostics.AddWarning("Sensitive property changed", "Sensitive property changed. VM will be powered off to apply changes.")
}
}