Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion api/core/v1alpha2/vmcondition/condition.go
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,6 @@ const (
ReasonMigratingPending MigratingReason = "Pending"
ReasonReadyToMigrate MigratingReason = "ReadyToMigrate"
ReasonMigratingInProgress MigratingReason = "InProgress"
ReasonLastMigrationFinishedWithError MigratingReason = "LastMigrationFinishedWithError"
)

type MaintenanceReason string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -219,15 +219,11 @@ func (h MigrationHandler) getActionIfMigrationInProgress(ctx context.Context, vd
}

// If migration is in progress. VirtualMachine must have the migrating condition.
migrating, migratingFound := conditions.GetCondition(vmcondition.TypeMigrating, vm.Status.Conditions)
_, migratingFound := conditions.GetCondition(vmcondition.TypeMigrating, vm.Status.Conditions)
if !migratingFound {
log.Info("VirtualMachine is not migrating. Will be reverted.", slog.String("vm.name", vm.Name), slog.String("vm.namespace", vm.Namespace))
return revert, nil
}
if migrating.Reason == vmcondition.ReasonLastMigrationFinishedWithError.String() {
log.Info("Last VirtualMachine migration failed. Will be reverted.", slog.String("vm.name", vm.Name), slog.String("vm.namespace", vm.Namespace))
return revert, nil
}

// If not found InProgress migrating vmop, that means some wrong migration happened. Revert.
vmop, err := h.getInProgressMigratingVMOP(ctx, vm)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,9 @@ func (h *MigratingHandler) Handle(ctx context.Context, s state.VirtualMachineSta
return reconcile.Result{}, err
}

vm.Status.MigrationState = h.wrapMigrationState(kvvmi)
if migrationState := h.wrapMigrationState(kvvmi); migrationState != nil {
vm.Status.MigrationState = migrationState
}

err = h.syncMigratable(ctx, s, vm, kvvm)
if err != nil {
Expand Down Expand Up @@ -135,10 +137,7 @@ func (h *MigratingHandler) getMigrationResult(state *virtv1.VirtualMachineInstan
func (h *MigratingHandler) syncMigrating(ctx context.Context, s state.VirtualMachineState, vm *v1alpha2.VirtualMachine, kvvmi *virtv1.VirtualMachineInstance) error {
// 0. If KVVMI is nil, migration cannot be in progress. Remove Migrating condition, but keep if migration failed.
if kvvmi == nil {
migrating, _ := conditions.GetCondition(vmcondition.TypeMigrating, vm.Status.Conditions)
if migrating.Reason != vmcondition.ReasonLastMigrationFinishedWithError.String() {
conditions.RemoveCondition(vmcondition.TypeMigrating, &vm.Status.Conditions)
}
conditions.RemoveCondition(vmcondition.TypeMigrating, &vm.Status.Conditions)
return nil
}

Expand Down Expand Up @@ -184,29 +183,6 @@ func (h *MigratingHandler) syncMigrating(ctx context.Context, s state.VirtualMac
case vmopcondition.ReasonMigrationRunning.String():
cb.Status(metav1.ConditionTrue).Reason(vmcondition.ReasonMigratingInProgress)

case vmopcondition.ReasonOperationFailed.String():
cb.Reason(vmcondition.ReasonLastMigrationFinishedWithError).Message(completed.Message)

case vmopcondition.ReasonNotApplicableForVMPhase.String():
cb.Reason(vmcondition.ReasonLastMigrationFinishedWithError).Message(
fmt.Sprintf("Migration is not possible for the `%s` phase of a virtual machine; VirtualMachineOperation: %s.", vm.Status.Phase, vmop.Name),
)

case vmopcondition.ReasonNotApplicableForLiveMigrationPolicy.String():
cb.Reason(vmcondition.ReasonLastMigrationFinishedWithError).Message(
fmt.Sprintf("Migration is not possible for the `%s` live migration policy; VirtualMachineOperation: %s.", vm.Spec.LiveMigrationPolicy, vmop.Name),
)

case vmopcondition.ReasonNotApplicableForRunPolicy.String():
cb.Reason(vmcondition.ReasonLastMigrationFinishedWithError).Message(
fmt.Sprintf("Migration is not possible for the `%s` run policy; VirtualMachineOperation: %s.", vm.Spec.RunPolicy, vmop.Name),
)

case vmopcondition.ReasonOtherMigrationInProgress.String():
cb.Reason(vmcondition.ReasonLastMigrationFinishedWithError).Message(
fmt.Sprintf("Another migration is in progress; VirtualMachineOperation: %s.", vmop.Name),
)

case vmopcondition.ReasonOperationCompleted.String():
conditions.RemoveCondition(vmcondition.TypeMigrating, &vm.Status.Conditions)
return nil
Expand All @@ -228,46 +204,18 @@ func (h *MigratingHandler) syncMigrating(ctx context.Context, s state.VirtualMac
fmt.Sprintf("Wait until operation is completed; VirtualMachineOperation: %s.", vmop.Name),
)

case v1alpha2.VMOPPhaseCompleted:
case v1alpha2.VMOPPhaseCompleted, v1alpha2.VMOPPhaseFailed, v1alpha2.VMOPPhaseTerminating:
conditions.RemoveCondition(vmcondition.TypeMigrating, &vm.Status.Conditions)
return nil

case v1alpha2.VMOPPhaseFailed:
cb.Reason(vmcondition.ReasonLastMigrationFinishedWithError).Message(
fmt.Sprintf("Operation failed; VirtualMachineOperation: %s.", vmop.Name),
)

case v1alpha2.VMOPPhaseTerminating:
cb.Reason(vmcondition.ReasonLastMigrationFinishedWithError).Message(
fmt.Sprintf("Operation terminated; VirtualMachineOperation: %s.", vmop.Name),
)
}
}

conditions.SetCondition(cb, &vm.Status.Conditions)
return nil
}

// 4. Set error if migration failed.
if liveMigrationFailed(vm.Status.MigrationState) {
msg := kvvmi.Status.MigrationState.FailureReason
cb.Status(metav1.ConditionFalse).
Reason(vmcondition.ReasonLastMigrationFinishedWithError).
Message(msg)
conditions.SetCondition(cb, &vm.Status.Conditions)
return nil
}

if liveMigrationSucceeded(vm.Status.MigrationState) {
conditions.RemoveCondition(vmcondition.TypeMigrating, &vm.Status.Conditions)
return nil
}

// 5. Remove Migrating condition if migration is finished successfully. Or migration was not be requested.
migrating, _ := conditions.GetCondition(vmcondition.TypeMigrating, vm.Status.Conditions)
if migrating.Reason != vmcondition.ReasonLastMigrationFinishedWithError.String() {
conditions.RemoveCondition(vmcondition.TypeMigrating, &vm.Status.Conditions)
}
// 4. Remove Migrating condition if migration is finished or migration was not be requested.
conditions.RemoveCondition(vmcondition.TypeMigrating, &vm.Status.Conditions)
return nil
}

Expand Down Expand Up @@ -390,11 +338,3 @@ func (h *MigratingHandler) syncMigratable(ctx context.Context, s state.VirtualMa
func liveMigrationInProgress(migrationState *v1alpha2.VirtualMachineMigrationState) bool {
return migrationState != nil && migrationState.StartTimestamp != nil && migrationState.EndTimestamp == nil
}

func liveMigrationFailed(migrationState *v1alpha2.VirtualMachineMigrationState) bool {
return migrationState != nil && migrationState.EndTimestamp != nil && migrationState.Result == v1alpha2.MigrationResultFailed
}

func liveMigrationSucceeded(migrationState *v1alpha2.VirtualMachineMigrationState) bool {
return migrationState != nil && migrationState.EndTimestamp != nil && migrationState.Result == v1alpha2.MigrationResultSucceeded
}
Original file line number Diff line number Diff line change
Expand Up @@ -136,11 +136,8 @@ var _ = Describe("MigratingHandler", func() {
err := fakeClient.Get(ctx, client.ObjectKeyFromObject(vm), newVM)
Expect(err).NotTo(HaveOccurred())

cond, exists := conditions.GetCondition(vmcondition.TypeMigrating, newVM.Status.Conditions)
Expect(exists).To(BeTrue())
Expect(cond.Status).To(Equal(metav1.ConditionFalse))
Expect(cond.Reason).To(Equal(vmcondition.ReasonLastMigrationFinishedWithError.String()))
Expect(cond.Message).To(Equal("Network issues"))
_, exists := conditions.GetCondition(vmcondition.TypeMigrating, newVM.Status.Conditions)
Expect(exists).To(BeFalse())
})

It("Should remove migrating condition when migration is not in progress", func() {
Expand Down
Loading