Skip to content

Commit ae951db

Browse files
authored
fix(vmbda): fix VMBDA stuck in InProgress when cloning VM with hotplug disks (#2080)
Root cause: when cloning a VM, getVirtualDisks() set AttachedToVirtualMachines to the original VM name from vmSnapshot.Spec.VirtualMachineName. This caused WaitForFirstConsumer logic to bypass correctly since len(AttachedToVirtualMachines)==1. Fix: - snapshot_resources.go: pass operation type to getVirtualDisks() and only set AttachedToVirtualMachines for restore operation. For clone, leave it empty so WaitForFirstConsumer logic works correctly. - vd_restorer.go: update AttachedToVirtualMachines in Customize() method for defense in depth. Signed-off-by: Daniil Antoshin <daniil.antoshin@flant.com>
1 parent cfe9d24 commit ae951db

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

images/virtualization-artifact/pkg/controller/service/restorer/restorers/vd_restorer.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ func (v *VirtualDiskHandler) Override(rules []v1alpha2.NameReplacement) {
7070

7171
func (v *VirtualDiskHandler) Customize(prefix, suffix string) {
7272
v.vd.Name = common.ApplyNameCustomization(v.vd.Name, prefix, suffix)
73+
74+
for i := range v.vd.Status.AttachedToVirtualMachines {
75+
oldName := v.vd.Status.AttachedToVirtualMachines[i].Name
76+
v.vd.Status.AttachedToVirtualMachines[i].Name = common.ApplyNameCustomization(oldName, prefix, suffix)
77+
}
7378
}
7479

7580
func (v *VirtualDiskHandler) ValidateRestore(ctx context.Context) error {

images/virtualization-artifact/pkg/controller/service/restorer/snapshot_resources.go

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func (r *SnapshotResources) Prepare(ctx context.Context) error {
112112
return err
113113
}
114114

115-
vds, err := getVirtualDisks(ctx, r.client, r.vmSnapshot)
115+
vds, err := getVirtualDisks(ctx, r.client, r.vmSnapshot, r.kind)
116116
if err != nil {
117117
return err
118118
}
@@ -329,7 +329,7 @@ func isRetryError(err error) bool {
329329
return false
330330
}
331331

332-
func getVirtualDisks(ctx context.Context, client client.Client, vmSnapshot *v1alpha2.VirtualMachineSnapshot) ([]*v1alpha2.VirtualDisk, error) {
332+
func getVirtualDisks(ctx context.Context, client client.Client, vmSnapshot *v1alpha2.VirtualMachineSnapshot, kind v1alpha2.VMOPType) ([]*v1alpha2.VirtualDisk, error) {
333333
vds := make([]*v1alpha2.VirtualDisk, 0, len(vmSnapshot.Status.VirtualDiskSnapshotNames))
334334

335335
for _, vdSnapshotName := range vmSnapshot.Status.VirtualDiskSnapshotNames {
@@ -343,6 +343,15 @@ func getVirtualDisks(ctx context.Context, client client.Client, vmSnapshot *v1al
343343
return nil, fmt.Errorf("failed to get the virtual disk snapshot %q: %w", vdSnapshotName, common.ErrVirtualDiskSnapshotNotFound)
344344
}
345345

346+
// Set AttachedToVirtualMachines only for restore operation.
347+
// For clone operation, leave it empty so WaitForFirstConsumer logic works correctly.
348+
var attachedVMs []v1alpha2.AttachedVirtualMachine
349+
if kind == v1alpha2.VMOPTypeRestore {
350+
attachedVMs = []v1alpha2.AttachedVirtualMachine{
351+
{Name: vmSnapshot.Spec.VirtualMachineName, Mounted: true},
352+
}
353+
}
354+
346355
vd := v1alpha2.VirtualDisk{
347356
TypeMeta: metav1.TypeMeta{
348357
Kind: v1alpha2.VirtualDiskKind,
@@ -362,9 +371,7 @@ func getVirtualDisks(ctx context.Context, client client.Client, vmSnapshot *v1al
362371
},
363372
},
364373
Status: v1alpha2.VirtualDiskStatus{
365-
AttachedToVirtualMachines: []v1alpha2.AttachedVirtualMachine{
366-
{Name: vmSnapshot.Spec.VirtualMachineName, Mounted: true},
367-
},
374+
AttachedToVirtualMachines: attachedVMs,
368375
},
369376
}
370377

0 commit comments

Comments
 (0)