Skip to content

Commit 5702982

Browse files
author
awlsring
committed
fix: disk setting and resizing
1 parent 42bdd80 commit 5702982

File tree

6 files changed

+124
-44
lines changed

6 files changed

+124
-44
lines changed

internal/service/configure_vm.go

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ type ConfigureVirtualMachineDiskOptions struct {
5656
SpeedLimits *ConfigureVirtualMachineDiskSpeedLimitsOptions `json:"speedLimits,omitempty"`
5757
SSDEmulation bool `json:"ssdEmulation"`
5858
Discard bool `json:"discard"`
59+
Name *string `json:"diskName,omitempty"`
60+
New bool `json:"new"`
5961
}
6062

6163
type ConfigureVirtualMachineDiskSpeedLimitsOptions struct {
@@ -138,7 +140,7 @@ func FormAgentString(agent bool, fstrim bool, t *string) *string {
138140
return &agentStr
139141
}
140142

141-
func FormDiskString(opts ConfigureVirtualMachineDiskOptions) *string {
143+
func FormNewDiskString(opts ConfigureVirtualMachineDiskOptions) *string {
142144
diskstr := opts.Storage + ":" + strconv.Itoa(opts.Size)
143145
if opts.Discard {
144146
diskstr = diskstr + ",discard=on"
@@ -170,6 +172,38 @@ func FormDiskString(opts ConfigureVirtualMachineDiskOptions) *string {
170172
return &diskstr
171173
}
172174

175+
func FormDiskString(opts ConfigureVirtualMachineDiskOptions) *string {
176+
diskstr := opts.Storage + ":" + *opts.Name
177+
if opts.Discard {
178+
diskstr = diskstr + ",discard=on"
179+
}
180+
if opts.SSDEmulation {
181+
diskstr = diskstr + ",ssd=on"
182+
}
183+
if opts.UseIOThreads {
184+
diskstr = diskstr + ",iothread=1"
185+
}
186+
if opts.FileFormat != nil {
187+
diskstr = diskstr + ",format=" + *opts.FileFormat
188+
}
189+
if opts.SpeedLimits != nil {
190+
if opts.SpeedLimits.Read != nil {
191+
diskstr = diskstr + fmt.Sprintf(",mbps_rd=%v", *opts.SpeedLimits.Read)
192+
}
193+
if opts.SpeedLimits.Write != nil {
194+
diskstr = diskstr + fmt.Sprintf(",mbps_wr=%v", *opts.SpeedLimits.Write)
195+
}
196+
if opts.SpeedLimits.WriteBurstable != nil {
197+
diskstr = diskstr + fmt.Sprintf(",mbps_wr_max=%v", *opts.SpeedLimits.WriteBurstable)
198+
}
199+
if opts.SpeedLimits.ReadBurstable != nil {
200+
diskstr = diskstr + fmt.Sprintf(",mbps_rd_max=%v", *opts.SpeedLimits.ReadBurstable)
201+
}
202+
}
203+
204+
return &diskstr
205+
}
206+
173207
func FormNetworkInterfaceString(opts ConfigureVirtualMachineNetworkInterfaceOptions) *string {
174208
firewallOn := "0"
175209
isEnabled := "1"
@@ -293,10 +327,18 @@ func (c *Proxmox) ConfigureVirtualMachine(ctx context.Context, input *ConfigureV
293327
}
294328

295329
for _, d := range input.Disks {
296-
config := FormDiskString(d)
297-
err := vm.AllocateDiskConfig(d.InterfaceType, d.Position, config, &content)
298-
if err != nil {
299-
return err
330+
if d.New {
331+
config := FormNewDiskString(d)
332+
err := vm.AllocateDiskConfig(d.InterfaceType, d.Position, config, &content)
333+
if err != nil {
334+
return err
335+
}
336+
} else {
337+
config := FormDiskString(d)
338+
err := vm.AllocateDiskConfig(d.InterfaceType, d.Position, config, &content)
339+
if err != nil {
340+
return err
341+
}
300342
}
301343
}
302344

internal/service/vm/vm_disk_configuration.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type VirtualMachineDisk struct {
2020
SpeedLimits *VirtualMachineDiskSpeedLimits
2121
SSDEmulation bool
2222
Discard bool
23+
Name string
2324
}
2425

2526
type VirtualMachineDiskSpeedLimits struct {
@@ -110,6 +111,7 @@ func readDiskString(diskString string) (VirtualMachineDisk, error) {
110111
return disk, fmt.Errorf("invalid disk storage string: %s", storageStr)
111112
}
112113
disk.Storage = storage[0]
114+
disk.Name = storage[1]
113115

114116
diskSpeedLimits := VirtualMachineDiskSpeedLimits{}
115117
for _, option := range options {

proxmox/qemu/schemas/disk_object_schema.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/hashicorp/terraform-plugin-framework/resource/schema/boolplanmodifier"
99
"github.com/hashicorp/terraform-plugin-framework/resource/schema/objectplanmodifier"
1010
"github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier"
11+
"github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier"
1112
"github.com/hashicorp/terraform-plugin-framework/schema/validator"
1213
)
1314

@@ -29,6 +30,10 @@ var DiskObjectDataSourceSchema = dschema.NestedAttributeObject{
2930
Computed: true,
3031
Description: "Whether to use an iothread for the disk.",
3132
},
33+
"name": dschema.StringAttribute{
34+
Computed: true,
35+
Description: "The disks generated name",
36+
},
3237
"speed_limits": dschema.SingleNestedAttribute{
3338
Computed: true,
3439
Description: "The speed limits of the disk. If not set, no speed limitations are applied.",
@@ -136,6 +141,13 @@ var DiskObjectSchema = schema.NestedAttributeObject{
136141
),
137142
},
138143
},
144+
"name": schema.StringAttribute{
145+
Computed: true,
146+
Description: "The disks generated name",
147+
PlanModifiers: []planmodifier.String{
148+
stringplanmodifier.UseStateForUnknown(),
149+
},
150+
},
139151
// add conflict with virtio
140152
"ssd_emulation": schema.BoolAttribute{
141153
Computed: true,

proxmox/qemu/types/vm_disk_set.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ var VirtualMachineDisk = types.ObjectType{
1818
"storage": types.StringType,
1919
"file_format": types.StringType,
2020
"size": types.Int64Type,
21+
"name": types.StringType,
2122
"use_iothread": types.BoolType,
2223
"speed_limits": types.ObjectType{
2324
AttrTypes: map[string]attr.Type{
@@ -121,6 +122,7 @@ type VirtualMachineDiskModel struct {
121122
SSDEmulation types.Bool `tfsdk:"ssd_emulation"`
122123
Position types.Int64 `tfsdk:"position"`
123124
Discard types.Bool `tfsdk:"discard"`
125+
Name types.String `tfsdk:"name"`
124126
}
125127

126128
type VirtualMachineDiskSpeedLimitsModel struct {
@@ -142,6 +144,7 @@ func VirtualMachineDiskToSetValue(ctx context.Context, disks []vm.VirtualMachine
142144
SSDEmulation: types.BoolValue(disk.SSDEmulation),
143145
Position: types.Int64Value(int64(disk.Position)),
144146
Discard: types.BoolValue(disk.Discard),
147+
Name: types.StringValue(disk.Name),
145148
}
146149
if disk.FileFormat != nil {
147150
m.FileFormat = types.StringValue(string(*disk.FileFormat))

proxmox/qemu/vms/configure_vm.go

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -206,10 +206,11 @@ func (r *virtualMachineResource) removeUnusedDisks(ctx context.Context, node str
206206
func determineUpdates(ctx context.Context, node string, vmId int, state *vt.VirtualMachineResourceModel, plan *vt.VirtualMachineResourceModel) *service.ConfigureVirtualMachineInput {
207207
tflog.Debug(ctx, "determine configuration updates method")
208208
request := &service.ConfigureVirtualMachineInput{
209-
Node: node,
210-
VmId: vmId,
211-
Memory: FormMemoryConfig(&plan.Memory),
212-
CPU: FormCPUConfig(&plan.CPU),
209+
Node: node,
210+
VmId: vmId,
211+
Memory: FormMemoryConfig(&plan.Memory),
212+
CPU: FormCPUConfig(&plan.CPU),
213+
NetworkInterfaces: FormNetworkInterfaceConfig(plan.NetworkInterfaces.Nics),
213214
}
214215

215216
old := state
@@ -229,15 +230,11 @@ func determineUpdates(ctx context.Context, node string, vmId int, state *vt.Virt
229230
request.Tags = utils.SetTypeToStringSlice(plan.Tags)
230231
}
231232

232-
newDisks := determineAddedDisks(ctx, old.Disks.Disks, plan.Disks.Disks)
233+
newDisks, existingDisks := determineAddedDisks(ctx, old.Disks.Disks, plan.Disks.Disks)
233234
if len(newDisks) > 0 {
234-
request.Disks = FormDiskConfig(ctx, newDisks)
235-
}
236-
237-
newNics := determineAddedNetworkInterfaces(ctx, old.NetworkInterfaces.Nics, plan.NetworkInterfaces.Nics)
238-
if len(newNics) > 0 {
239-
request.NetworkInterfaces = FormNetworkInterfaceConfig(newNics)
235+
request.Disks = FormDiskConfig(ctx, newDisks, true)
240236
}
237+
request.Disks = append(request.Disks, FormDiskConfig(ctx, existingDisks, false)...)
241238

242239
if plan.Agent != nil {
243240
request.Agent = FormAgentConfig(plan.Agent)
@@ -395,23 +392,6 @@ func determineRemovedNetworkInterfaces(ctx context.Context, state []ct.VirtualMa
395392
return removeNics
396393
}
397394

398-
func determineAddedNetworkInterfaces(ctx context.Context, state []ct.VirtualMachineNetworkInterfaceModel, plan []ct.VirtualMachineNetworkInterfaceModel) []ct.VirtualMachineNetworkInterfaceModel {
399-
stateNics, planNics := flattenNetworkInterfaces(ctx, state, plan)
400-
401-
addNics := []ct.VirtualMachineNetworkInterfaceModel{}
402-
for _, nic := range planNics {
403-
if !utils.ListContains(stateNics, nic) {
404-
for _, n := range plan {
405-
if fmt.Sprintf("net%v", n.Position.ValueInt64()) == nic {
406-
addNics = append(addNics, n)
407-
}
408-
}
409-
}
410-
}
411-
412-
return addNics
413-
}
414-
415395
func determineRemovedDisks(ctx context.Context, state []ct.VirtualMachineDiskModel, plan []ct.VirtualMachineDiskModel) []string {
416396
stateDisks, planDisks := flattenDisks(ctx, state, plan)
417397
tflog.Debug(ctx, fmt.Sprintf("stateDisks: %v", stateDisks))
@@ -444,22 +424,45 @@ func flattenDisks(ctx context.Context, state []ct.VirtualMachineDiskModel, plan
444424
return stateDisks, planDisks
445425
}
446426

447-
func determineAddedDisks(ctx context.Context, state []ct.VirtualMachineDiskModel, plan []ct.VirtualMachineDiskModel) []ct.VirtualMachineDiskModel {
427+
func determineAddedDisks(ctx context.Context, state []ct.VirtualMachineDiskModel, plan []ct.VirtualMachineDiskModel) ([]ct.VirtualMachineDiskModel, []ct.VirtualMachineDiskModel) {
448428
stateDisks, planDisks := flattenDisks(ctx, state, plan)
449429

450-
addDisks := []ct.VirtualMachineDiskModel{}
430+
addedDisks := []ct.VirtualMachineDiskModel{}
431+
existingDisks := []ct.VirtualMachineDiskModel{}
451432
for _, disk := range planDisks {
452433
if !utils.ListContains(stateDisks, disk) {
453-
d := strings.Split(disk, ":")[0]
454-
for _, pd := range plan {
455-
if fmt.Sprintf("%s%v", pd.InterfaceType.ValueString(), pd.Position.ValueInt64()) == d {
456-
addDisks = append(addDisks, pd)
434+
addedDisks = append(addedDisks, formDiskModel(disk, plan)...)
435+
} else {
436+
diskModels := formDiskModel(disk, plan)
437+
438+
for _, diskModel := range diskModels {
439+
for _, s := range state {
440+
d1 := fmt.Sprintf("%s%v", diskModel.InterfaceType.ValueString(), diskModel.Position.ValueInt64())
441+
d2 := fmt.Sprintf("%s%v", s.InterfaceType.ValueString(), s.Position.ValueInt64())
442+
if d1 == d2 {
443+
tflog.Info(ctx, fmt.Sprintf("size of plan disk %s is %v", d1, diskModel.Size.ValueInt64()))
444+
tflog.Info(ctx, fmt.Sprintf("size of state disk %s is %v", d2, s.Size.ValueInt64()))
445+
diskModel.Size = s.Size
446+
diskModel.Name = s.Name
447+
existingDisks = append(existingDisks, diskModel)
448+
}
457449
}
458450
}
459451
}
460452
}
461453

462-
return addDisks
454+
return addedDisks, existingDisks
455+
}
456+
457+
func formDiskModel(disk string, models []ct.VirtualMachineDiskModel) []ct.VirtualMachineDiskModel {
458+
disks := []ct.VirtualMachineDiskModel{}
459+
d := strings.Split(disk, ":")[0]
460+
for _, pd := range models {
461+
if fmt.Sprintf("%s%v", pd.InterfaceType.ValueString(), pd.Position.ValueInt64()) == d {
462+
disks = append(disks, pd)
463+
}
464+
}
465+
return disks
463466
}
464467

465468
func FormNetworkInterfaceConfig(nics []ct.VirtualMachineNetworkInterfaceModel) []service.ConfigureVirtualMachineNetworkInterfaceOptions {
@@ -481,20 +484,26 @@ func FormNetworkInterfaceConfig(nics []ct.VirtualMachineNetworkInterfaceModel) [
481484
return n
482485
}
483486

484-
func FormDiskConfig(ctx context.Context, disks []ct.VirtualMachineDiskModel) []service.ConfigureVirtualMachineDiskOptions {
487+
func FormDiskConfig(ctx context.Context, disks []ct.VirtualMachineDiskModel, new bool) []service.ConfigureVirtualMachineDiskOptions {
485488
tflog.Debug(ctx, "Entered form disk config")
486489
d := make([]service.ConfigureVirtualMachineDiskOptions, len(disks))
487490
tflog.Debug(ctx, fmt.Sprintf("Disks to configure: %v", len(disks)))
488491
for i, v := range disks {
489492
dconfig := service.ConfigureVirtualMachineDiskOptions{
490493
Storage: v.Storage.ValueString(),
491494
FileFormat: utils.OptionalToPointerString(v.FileFormat.ValueString()),
492-
Size: int(v.Size.ValueInt64()),
493495
UseIOThreads: v.UseIOThread.ValueBool(),
496+
Size: int(v.Size.ValueInt64()),
494497
Position: int(v.Position.ValueInt64()),
495498
InterfaceType: v.InterfaceType.ValueString(),
496499
SSDEmulation: v.SSDEmulation.ValueBool(),
497500
Discard: v.Discard.ValueBool(),
501+
New: new,
502+
}
503+
504+
if !v.Name.IsNull() || !v.Name.IsUnknown() {
505+
name := v.Name.ValueString()
506+
dconfig.Name = &name
498507
}
499508

500509
if v.SpeedLimits != nil {
@@ -506,7 +515,7 @@ func FormDiskConfig(ctx context.Context, disks []ct.VirtualMachineDiskModel) []s
506515
dconfig.SpeedLimits = &s
507516
}
508517

509-
tflog.Debug(ctx, fmt.Sprintf("Disk %v: %v", i, dconfig))
518+
tflog.Info(ctx, fmt.Sprintf("Disk %v: %v", i, dconfig))
510519

511520
d[i] = dconfig
512521
}

proxmox/qemu/vms/resource.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,9 +146,21 @@ func (r *virtualMachineResource) Create(ctx context.Context, req resource.Create
146146
return
147147
}
148148

149+
node := plan.Node.ValueString()
150+
vmId := int(plan.ID.ValueInt64())
151+
vm, err := r.client.DescribeVirtualMachine(ctx, node, vmId)
152+
if err != nil {
153+
resp.Diagnostics.AddError(
154+
"Error creating virtual machine",
155+
"Could not create virtual machine, unexpected error: "+err.Error(),
156+
)
157+
return
158+
}
159+
currentModel := vt.VMToResourceModel(ctx, vm, &plan)
160+
149161
// configure
150162
tflog.Debug(ctx, "Configuring virtual machine")
151-
err = r.determineVmConfigurations(ctx, nil, &plan)
163+
err = r.determineVmConfigurations(ctx, currentModel, &plan)
152164
if err != nil {
153165
resp.Diagnostics.AddError(
154166
"Error configuring virtual machine",

0 commit comments

Comments
 (0)