Skip to content

Commit 5fa8df6

Browse files
author
awlsring
committed
feat: remove unused disk
1 parent 96d7c3b commit 5fa8df6

File tree

4 files changed

+59
-161
lines changed

4 files changed

+59
-161
lines changed

internal/service/configure_vm.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,10 @@ func (c *Proxmox) ConfigureVirtualMachine(ctx context.Context, input *ConfigureV
277277
for _, n := range input.CloudInit.Ip {
278278
config := FormIpConfigString(n.V4, n.V6)
279279
fmt.Println("config str: ", *config)
280-
vm.AllocateCiNetConfig(n.Position, config, &content)
280+
err := vm.AllocateCiNetConfig(n.Position, config, &content)
281+
if err != nil {
282+
return err
283+
}
281284
}
282285
}
283286
if input.StartOnBoot {
@@ -291,7 +294,10 @@ func (c *Proxmox) ConfigureVirtualMachine(ctx context.Context, input *ConfigureV
291294

292295
for _, d := range input.Disks {
293296
config := FormDiskString(d)
294-
vm.AllocateDiskConfig(d.InterfaceType, d.Position, config, &content)
297+
err := vm.AllocateDiskConfig(d.InterfaceType, d.Position, config, &content)
298+
if err != nil {
299+
return err
300+
}
295301
}
296302

297303
for _, p := range input.PCIDevices {
@@ -303,7 +309,10 @@ func (c *Proxmox) ConfigureVirtualMachine(ctx context.Context, input *ConfigureV
303309
n.MAC = vm.GenerateMAC()
304310
}
305311
config := FormNetworkInterfaceString(n)
306-
vm.AllocateNetworkInterfaceConfig(n.Position, config, &content)
312+
err := vm.AllocateNetworkInterfaceConfig(n.Position, config, &content)
313+
if err != nil {
314+
return err
315+
}
307316
}
308317

309318
request := c.client.ApplyVirtualMachineConfigurationSync(ctx, input.Node, vmId)

internal/service/vm/vm_disk_configuration.go

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ func DetermineDiskConfiguration(cfg *proxmox.VirtualMachineConfigurationSummary)
6161
}
6262
virtualDisks = append(virtualDisks, sataDisks...)
6363

64+
unusedDisks, err := readDiskMap(cfgMap, "unused", 7)
65+
if err != nil {
66+
return nil, err
67+
}
68+
virtualDisks = append(virtualDisks, unusedDisks...)
69+
6470
return virtualDisks, nil
6571
}
6672

@@ -163,22 +169,3 @@ func readDiskString(diskString string) (VirtualMachineDisk, error) {
163169
disk.SpeedLimits = &diskSpeedLimits
164170
return disk, nil
165171
}
166-
167-
// func StrToBytes(sizeStr string) int64 {
168-
// sizeStr = strings.ToUpper(sizeStr)
169-
// size, _ := strconv.ParseInt(sizeStr[:len(sizeStr)-1], 10, 64)
170-
// unit := sizeStr[len(sizeStr)-1]
171-
172-
// switch unit {
173-
// case 'G':
174-
// return size * 1024 * 1024 * 1024
175-
// case 'M':
176-
// return size * 1024 * 1024
177-
// case 'K':
178-
// return size * 1024
179-
// case 'T':
180-
// return size * 1024 * 1024 * 1024 * 1024
181-
// default:
182-
// return size
183-
// }
184-
// }

proxmox/qemu/vms/configure_vm.go

Lines changed: 36 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ package vms
22

33
import (
44
"context"
5-
"encoding/json"
65
"fmt"
7-
"strconv"
86
"strings"
97

108
"github.com/awlsring/proxmox-go/proxmox"
@@ -15,7 +13,6 @@ import (
1513
"github.com/hashicorp/terraform-plugin-framework/types"
1614
"github.com/hashicorp/terraform-plugin-framework/types/basetypes"
1715
"github.com/hashicorp/terraform-plugin-log/tflog"
18-
"github.com/r3labs/diff/v3"
1916
)
2017

2118
func (r *virtualMachineResource) modifyResourcePool(ctx context.Context, id int, was types.String, is types.String) error {
@@ -53,6 +50,7 @@ func (r *virtualMachineResource) modifyResourcePool(ctx context.Context, id int,
5350
func (r *virtualMachineResource) determineVmConfigurations(ctx context.Context, state *vt.VirtualMachineResourceModel, plan *vt.VirtualMachineResourceModel) error {
5451
tflog.Debug(ctx, "determine virtual machine configurations method")
5552
updates, deletes := formConfigureRequests(ctx, state, plan)
53+
5654
resizes, err := r.formResizeRequests(ctx, plan.Node.ValueString(), int(plan.ID.ValueInt64()), plan)
5755
if err != nil {
5856
return err
@@ -88,6 +86,12 @@ func (r *virtualMachineResource) determineVmConfigurations(ctx context.Context,
8886
return err
8987
}
9088
}
89+
90+
err = r.removeUnusedDisks(ctx, node, vmId)
91+
if err != nil {
92+
return err
93+
}
94+
9195
return nil
9296
}
9397

@@ -102,7 +106,10 @@ func (r *virtualMachineResource) configureVm(ctx context.Context, node string, v
102106
tflog.Debug(ctx, "configure virtual machine complete")
103107

104108
tflog.Debug(ctx, "waiting for lock")
105-
r.waitForLock(ctx, node, vmId, r.timeouts.Configure)
109+
err = r.waitForLock(ctx, node, vmId, r.timeouts.Configure)
110+
if err != nil {
111+
return err
112+
}
106113
tflog.Debug(ctx, "lock released")
107114
return nil
108115
}
@@ -114,7 +121,10 @@ func (r *virtualMachineResource) resizeDisk(ctx context.Context, node string, vm
114121
}
115122

116123
tflog.Debug(ctx, "waiting for lock")
117-
r.waitForLock(ctx, node, vmId, r.timeouts.Configure)
124+
err = r.waitForLock(ctx, node, vmId, r.timeouts.Configure)
125+
if err != nil {
126+
return err
127+
}
118128
tflog.Debug(ctx, "lock released")
119129

120130
return nil
@@ -165,30 +175,32 @@ func (r *virtualMachineResource) formResizeRequests(ctx context.Context, node st
165175
return resizes, nil
166176
}
167177

168-
func determineDiskResizes(ctx context.Context, node string, vmId int, state *vt.VirtualMachineResourceModel, plan *vt.VirtualMachineResourceModel) []service.ResizeVirtualMachineDiskInput {
169-
tflog.Debug(ctx, "determine disk resizes method")
170-
var resizes []service.ResizeVirtualMachineDiskInput
171-
if state == nil {
172-
return resizes
178+
func (r *virtualMachineResource) removeUnusedDisks(ctx context.Context, node string, vmId int) error {
179+
current, err := r.client.DescribeVirtualMachine(ctx, node, vmId)
180+
if err != nil {
181+
return err
173182
}
174183

175-
for _, planDisk := range plan.Disks.Disks {
176-
for _, stateDisk := range state.Disks.Disks {
177-
if planDisk.Position.ValueInt64() == stateDisk.Position.ValueInt64() && planDisk.InterfaceType.ValueString() == stateDisk.InterfaceType.ValueString() && planDisk.Storage.ValueString() == stateDisk.Storage.ValueString() {
178-
if planDisk.Size.ValueInt64() != stateDisk.Size.ValueInt64() {
179-
disk := fmt.Sprintf("%s%v", planDisk.InterfaceType.ValueString(), planDisk.Position.ValueInt64())
180-
resizes = append(resizes, service.ResizeVirtualMachineDiskInput{
181-
Node: node,
182-
VmId: vmId,
183-
Disk: disk,
184-
Size: utils.GbToBytes(planDisk.Size.ValueInt64()),
185-
})
186-
}
187-
}
184+
deletes := []string{}
185+
for _, disk := range current.Disks {
186+
if disk.InterfaceType == "unused" {
187+
deletes = append(deletes, fmt.Sprintf("%s%v", disk.InterfaceType, disk.Position))
188188
}
189189
}
190190

191-
return resizes
191+
if len(deletes) != 0 {
192+
tflog.Debug(ctx, fmt.Sprintf("removing unused disks %v", deletes))
193+
err = r.configureVm(ctx, node, vmId, &service.ConfigureVirtualMachineInput{
194+
Node: node,
195+
VmId: vmId,
196+
Delete: deletes,
197+
})
198+
if err != nil {
199+
return err
200+
}
201+
}
202+
203+
return nil
192204
}
193205

194206
func determineUpdates(ctx context.Context, node string, vmId int, state *vt.VirtualMachineResourceModel, plan *vt.VirtualMachineResourceModel) *service.ConfigureVirtualMachineInput {
@@ -450,120 +462,6 @@ func determineAddedDisks(ctx context.Context, state []ct.VirtualMachineDiskModel
450462
return addDisks
451463
}
452464

453-
func formConfigureRequestsOld(ctx context.Context, state *vt.VirtualMachineResourceModel, plan *vt.VirtualMachineResourceModel) (*service.ConfigureVirtualMachineInput, []service.ResizeVirtualMachineDiskInput, error) {
454-
node := plan.Node.ValueString()
455-
vmId := int(plan.ID.ValueInt64())
456-
457-
pre := state
458-
if state == nil {
459-
pre = &vt.VirtualMachineResourceModel{}
460-
}
461-
462-
diff, err := diff.Diff(*pre, *plan)
463-
if err != nil {
464-
return nil, nil, err
465-
}
466-
j, _ := json.Marshal(diff)
467-
tflog.Debug(ctx, fmt.Sprintf("diff: %+v", string(j)))
468-
469-
r := service.ConfigureVirtualMachineInput{
470-
Node: node,
471-
VmId: vmId,
472-
}
473-
474-
resizeRequests := []service.ResizeVirtualMachineDiskInput{}
475-
476-
do := false
477-
for _, d := range diff {
478-
if len(d.Path) == 0 {
479-
continue
480-
}
481-
field := d.Path[0]
482-
switch d.Type {
483-
case "update":
484-
if d.From != d.To {
485-
if field == "Disks" {
486-
if len(d.Path) <= 4 {
487-
continue
488-
}
489-
if d.Path[3] == "Size" {
490-
i, err := strconv.Atoi(d.Path[2])
491-
if err != nil {
492-
return nil, nil, err
493-
}
494-
resizeRequests = append(resizeRequests, formResizeRequest(ctx, i, plan))
495-
}
496-
} else {
497-
do = true
498-
setField(ctx, field, plan, &r)
499-
}
500-
}
501-
case "create":
502-
do = true
503-
setField(ctx, field, plan, &r)
504-
case "delete":
505-
// create some conditional branch to formulate a removal
506-
do = true
507-
setField(ctx, field, plan, &r)
508-
}
509-
}
510-
511-
if do {
512-
return &r, resizeRequests, nil
513-
}
514-
return nil, resizeRequests, nil
515-
}
516-
517-
func setField(ctx context.Context, f string, m *vt.VirtualMachineResourceModel, r *service.ConfigureVirtualMachineInput) {
518-
switch f {
519-
case "Node":
520-
r.Node = m.Node.ValueString()
521-
case "VmId":
522-
r.VmId = int(m.ID.ValueInt64())
523-
case "Name":
524-
r.Name = utils.OptionalToPointerString(m.Name.ValueString())
525-
case "Description":
526-
r.Description = utils.OptionalToPointerString(m.Description.ValueString())
527-
case "Tags":
528-
r.Tags = utils.SetTypeToStringSlice(m.Tags)
529-
case "Agent":
530-
r.Agent = FormAgentConfig(m.Agent)
531-
case "Bios":
532-
r.Bios = FormBIOSConfig(m.BIOS)
533-
case "CPU":
534-
r.CPU = FormCPUConfig(&m.CPU)
535-
case "Disks":
536-
r.Disks = FormDiskConfig(ctx, m.Disks.Disks)
537-
case "NetworkInterfaces":
538-
r.NetworkInterfaces = FormNetworkInterfaceConfig(m.NetworkInterfaces.Nics)
539-
case "Memory":
540-
r.Memory = FormMemoryConfig(&m.Memory)
541-
case "CloudInit":
542-
r.CloudInit = FormCloudInitConfig(ctx, m.CloudInit)
543-
case "OsType":
544-
r.OsType = FormOSTypeConfig(m.Type)
545-
case "MachineType":
546-
r.MachineType = utils.OptionalToPointerString(m.MachineType.ValueString())
547-
case "KVMArguments":
548-
r.KVMArguments = utils.OptionalToPointerString(m.KVMArguments.ValueString())
549-
case "KeyboardLayout":
550-
r.KeyboardLayout = FormKeyboardConfig(m.KeyboardLayout)
551-
case "StartOnNodeBoot":
552-
r.StartOnBoot = m.StartOnNodeBoot.ValueBool()
553-
}
554-
}
555-
556-
func formResizeRequest(ctx context.Context, elm int, m *vt.VirtualMachineResourceModel) service.ResizeVirtualMachineDiskInput {
557-
d := m.Disks.Disks[elm]
558-
disk := fmt.Sprintf("%v%v", d.InterfaceType.ValueString(), d.Position.ValueInt64())
559-
return service.ResizeVirtualMachineDiskInput{
560-
Node: m.Node.ValueString(),
561-
VmId: int(m.ID.ValueInt64()),
562-
Disk: disk,
563-
Size: utils.GbToBytes(d.Size.ValueInt64()),
564-
}
565-
}
566-
567465
func FormNetworkInterfaceConfig(nics []ct.VirtualMachineNetworkInterfaceModel) []service.ConfigureVirtualMachineNetworkInterfaceOptions {
568466
n := make([]service.ConfigureVirtualMachineNetworkInterfaceOptions, len(nics))
569467
for i, v := range nics {

proxmox/qemu/vms/create_vm.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,11 @@ func (r *virtualMachineResource) clone(ctx context.Context, plan *vt.VirtualMach
4747
}
4848

4949
// wait till clone is complete
50-
r.waitForLock(ctx, node, vmId, r.timeouts.Clone)
50+
err = r.waitForLock(ctx, node, vmId, r.timeouts.Clone)
51+
if err != nil {
52+
tflog.Error(ctx, "clone recieved error: "+err.Error())
53+
return err
54+
}
5155

5256
tflog.Debug(ctx, "clone virtual machine complete")
5357
return nil

0 commit comments

Comments
 (0)