diff --git a/images/virtualization-artifact/pkg/common/vm/vm.go b/images/virtualization-artifact/pkg/common/vm/vm.go index 5559a4fb8a..d8c2841f78 100644 --- a/images/virtualization-artifact/pkg/common/vm/vm.go +++ b/images/virtualization-artifact/pkg/common/vm/vm.go @@ -22,16 +22,13 @@ import ( "strings" corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/types" virtv1 "kubevirt.io/api/core/v1" "sigs.k8s.io/controller-runtime/pkg/client" "github.com/deckhouse/virtualization-controller/pkg/common/object" - "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization/api/core/v1alpha2" - "github.com/deckhouse/virtualization/api/core/v1alpha2/vmcondition" ) // VMContainerNameSuffix - a name suffix for container with virt-launcher, libvirt and qemu processes. @@ -78,15 +75,6 @@ func ApprovalMode(vm *v1alpha2.VirtualMachine) v1alpha2.RestartApprovalMode { return vm.Spec.Disruptions.RestartApprovalMode } -func RestartRequired(vm *v1alpha2.VirtualMachine) bool { - if vm == nil { - return false - } - - cond, _ := conditions.GetCondition(vmcondition.TypeAwaitingRestartToApplyConfiguration, vm.Status.Conditions) - return cond.Status == metav1.ConditionTrue -} - func IsComputeContainer(name string) bool { return strings.HasSuffix(name, VMContainerNameSuffix) } diff --git a/images/virtualization-artifact/pkg/controller/vm/internal/service/migration_volumes.go b/images/virtualization-artifact/pkg/controller/vm/internal/service/migration_volumes.go index bba2336fbc..d2ea35d71a 100644 --- a/images/virtualization-artifact/pkg/controller/vm/internal/service/migration_volumes.go +++ b/images/virtualization-artifact/pkg/controller/vm/internal/service/migration_volumes.go @@ -36,7 +36,6 @@ import ( "github.com/deckhouse/virtualization-controller/pkg/common/patch" commonvd "github.com/deckhouse/virtualization-controller/pkg/common/vd" - commonvm "github.com/deckhouse/virtualization-controller/pkg/common/vm" commonvmop "github.com/deckhouse/virtualization-controller/pkg/common/vmop" "github.com/deckhouse/virtualization-controller/pkg/controller/conditions" "github.com/deckhouse/virtualization-controller/pkg/controller/kvbuilder" @@ -63,7 +62,7 @@ func NewMigrationVolumesService(client client.Client, makeKVVMFromSpec func(ctx } } -func (s MigrationVolumesService) SyncVolumes(ctx context.Context, vmState state.VirtualMachineState) (reconcile.Result, error) { +func (s MigrationVolumesService) SyncVolumes(ctx context.Context, vmState state.VirtualMachineState, restartRequired bool) (reconcile.Result, error) { log := logger.FromContext(ctx).With("func", "SyncVolumes") log.Debug("Start") defer log.Debug("End") @@ -71,7 +70,7 @@ func (s MigrationVolumesService) SyncVolumes(ctx context.Context, vmState state. vm := vmState.VirtualMachine().Changed() // TODO: refactor syncKVVM and allow migration - if commonvm.RestartRequired(vm) { + if restartRequired { log.Info("Virtualmachine is restart required, skip volume migration.") return reconcile.Result{}, nil } diff --git a/images/virtualization-artifact/pkg/controller/vm/internal/sync_kvvm.go b/images/virtualization-artifact/pkg/controller/vm/internal/sync_kvvm.go index 9c9a840920..445a34e485 100644 --- a/images/virtualization-artifact/pkg/controller/vm/internal/sync_kvvm.go +++ b/images/virtualization-artifact/pkg/controller/vm/internal/sync_kvvm.go @@ -49,7 +49,7 @@ import ( const nameSyncKvvmHandler = "SyncKvvmHandler" type syncVolumesService interface { - SyncVolumes(ctx context.Context, s state.VirtualMachineState) (reconcile.Result, error) + SyncVolumes(ctx context.Context, s state.VirtualMachineState, restartRequired bool) (reconcile.Result, error) } func NewSyncKvvmHandler(dvcrSettings *dvcr.Settings, client client.Client, recorder eventrecord.EventRecorderLogger, syncVolumesService syncVolumesService) *SyncKvvmHandler { @@ -226,8 +226,10 @@ func (h *SyncKvvmHandler) Handle(ctx context.Context, s state.VirtualMachineStat // 5. Set RestartRequired from KVVM condition. if cbAwaitingRestart.Condition().Status == metav1.ConditionFalse && kvvm != nil { + // The check for StateChangeRequests is added to ignore the RestartRequired condition when it is set while + // the virtual machine is in the process of rebooting. cond, _ := conditions.GetKVVMCondition(virtv1.VirtualMachineRestartRequired, kvvm.Status.Conditions) - if cond.Status == corev1.ConditionTrue { + if cond.Status == corev1.ConditionTrue && len(kvvm.Status.StateChangeRequests) == 0 { msg := "Please restart the virtual machine to synchronize its configuration." log.Error(msg) cbAwaitingRestart. @@ -238,7 +240,7 @@ func (h *SyncKvvmHandler) Handle(ctx context.Context, s state.VirtualMachineStat } // 6. Sync migrating volumes if needed. - result, migrateVolumesErr := h.syncVolumesService.SyncVolumes(ctx, s) + result, migrateVolumesErr := h.syncVolumesService.SyncVolumes(ctx, s, cbAwaitingRestart.Condition().Status == metav1.ConditionTrue) if migrateVolumesErr != nil { errs = errors.Join(errs, fmt.Errorf("failed to sync migrating volumes: %w", migrateVolumesErr)) }