@@ -2,9 +2,7 @@ package vms
22
33import (
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
2118func (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,
5350func (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
194206func 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-
567465func FormNetworkInterfaceConfig (nics []ct.VirtualMachineNetworkInterfaceModel ) []service.ConfigureVirtualMachineNetworkInterfaceOptions {
568466 n := make ([]service.ConfigureVirtualMachineNetworkInterfaceOptions , len (nics ))
569467 for i , v := range nics {
0 commit comments