diff --git a/images/virtualization-artifact/pkg/controller/kvbuilder/kvvm_utils.go b/images/virtualization-artifact/pkg/controller/kvbuilder/kvvm_utils.go index 284c21eaa1..1763656846 100644 --- a/images/virtualization-artifact/pkg/controller/kvbuilder/kvvm_utils.go +++ b/images/virtualization-artifact/pkg/controller/kvbuilder/kvvm_utils.go @@ -20,6 +20,7 @@ import ( "crypto/md5" "encoding/hex" "fmt" + "sort" "strings" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -234,6 +235,27 @@ func ApplyVirtualMachineSpec( return err } + diskOrder := make(map[string]int) + for i, bd := range vm.Status.BlockDeviceRefs { + diskOrder[bd.Name] = i + } + sort.Slice(hotpluggedDevices, func(i, j int) bool { + nameI, _ := GetOriginalDiskName(hotpluggedDevices[i].VolumeName) + nameJ, _ := GetOriginalDiskName(hotpluggedDevices[j].VolumeName) + orderI, okI := diskOrder[nameI] + orderJ, okJ := diskOrder[nameJ] + if !okI && !okJ { + return hotpluggedDevices[i].VolumeName < hotpluggedDevices[j].VolumeName + } + if !okI { + return false + } + if !okJ { + return true + } + return orderI < orderJ + }) + for _, device := range hotpluggedDevices { name, kind := GetOriginalDiskName(device.VolumeName) diff --git a/images/virtualization-artifact/pkg/controller/service/restorer/restorers/vm_restorer.go b/images/virtualization-artifact/pkg/controller/service/restorer/restorers/vm_restorer.go index 937fec7c08..0e92ae6f55 100644 --- a/images/virtualization-artifact/pkg/controller/service/restorer/restorers/vm_restorer.go +++ b/images/virtualization-artifact/pkg/controller/service/restorer/restorers/vm_restorer.go @@ -213,6 +213,15 @@ func (v *VirtualMachineHandler) ProcessRestore(ctx context.Context) error { return fmt.Errorf("failed to update the `VirtualMachine`: %w", updErr) } + vm.Status.BlockDeviceRefs = v.vm.Status.BlockDeviceRefs + updErr = v.client.Status().Update(ctx, vm) + if updErr != nil { + if apierrors.IsConflict(updErr) { + return fmt.Errorf("waiting for the `VirtualMachine` status %w", common.ErrUpdating) + } + return fmt.Errorf("failed to update the `VirtualMachine` status: %w", updErr) + } + // Always clean up VMBDAs first, regardless of VM state err = v.deleteCurrentVirtualMachineBlockDeviceAttachments(ctx) if err != nil {