Skip to content

Commit bdee925

Browse files
fix
Signed-off-by: Yaroslav Borbat <[email protected]>
1 parent c187693 commit bdee925

File tree

2 files changed

+44
-10
lines changed

2 files changed

+44
-10
lines changed

images/virtualization-artifact/pkg/controller/vd/internal/migration.go

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import (
3535
"github.com/deckhouse/virtualization-controller/pkg/common/object"
3636
pvcspec "github.com/deckhouse/virtualization-controller/pkg/common/pvc"
3737
commonvd "github.com/deckhouse/virtualization-controller/pkg/common/vd"
38+
commonvmop "github.com/deckhouse/virtualization-controller/pkg/common/vmop"
3839
"github.com/deckhouse/virtualization-controller/pkg/controller/conditions"
3940
"github.com/deckhouse/virtualization-controller/pkg/controller/service"
4041
vdsupplements "github.com/deckhouse/virtualization-controller/pkg/controller/vd/internal/supplements"
@@ -155,7 +156,7 @@ func (h MigrationHandler) getAction(ctx context.Context, vd *virtv2.VirtualDisk,
155156
}
156157

157158
if commonvd.IsMigrating(vd) {
158-
return h.getActionIfMigrationInProgress(vd, vm, log), nil
159+
return h.getActionIfMigrationInProgress(vd, vm, log)
159160
}
160161

161162
vmMigrating, _ := conditions.GetCondition(vmcondition.TypeMigrating, vm.Status.Conditions)
@@ -171,6 +172,7 @@ func (h MigrationHandler) getAction(ctx context.Context, vd *virtv2.VirtualDisk,
171172
}
172173

173174
if commonvd.StorageClassChanged(vd) {
175+
log.Info("StorageClass Changed. VirtualDisk should be migrated.")
174176
return migrate, nil
175177
}
176178

@@ -179,35 +181,49 @@ func (h MigrationHandler) getAction(ctx context.Context, vd *virtv2.VirtualDisk,
179181
return none, nil
180182
}
181183

182-
func (h MigrationHandler) getActionIfMigrationInProgress(vd *virtv2.VirtualDisk, vm *virtv2.VirtualMachine, log *slog.Logger) action {
184+
func (h MigrationHandler) getActionIfMigrationInProgress(vd *virtv2.VirtualDisk, vm *virtv2.VirtualMachine, log *slog.Logger) (action, error) {
183185
// If VirtualMachine is not running, we can't migrate it. Should be reverted.
184186
running, _ := conditions.GetCondition(vmcondition.TypeRunning, vm.Status.Conditions)
185187
if running.Status != metav1.ConditionTrue {
186188
log.Info("VirtualMachine is not running. Will be reverted.", slog.String("vm.name", vm.Name), slog.String("vm.namespace", vm.Namespace))
187-
return revert
189+
return revert, nil
188190
}
189191

190192
if commonvd.IsMigrationsMatched(vm, vd) {
191193
if vm.Status.MigrationState == nil {
192194
log.Error("VirtualMachine migration state is empty. Please report a bug.", slog.String("vm.name", vm.Name), slog.String("vm.namespace", vm.Namespace))
193-
return none
195+
return none, nil
194196
}
195197
switch vm.Status.MigrationState.Result {
196198
case virtv2.MigrationResultFailed:
197-
return revert
199+
return revert, nil
198200
case virtv2.MigrationResultSucceeded:
199-
return complete
201+
return complete, nil
200202
}
201203
}
202204

203205
// If migration is in progress. VirtualMachine must have the migrating condition.
204-
_, migratingFound := conditions.GetCondition(vmcondition.TypeMigrating, vm.Status.Conditions)
206+
migrating, migratingFound := conditions.GetCondition(vmcondition.TypeMigrating, vm.Status.Conditions)
205207
if !migratingFound {
206208
log.Info("VirtualMachine is not migrating. Will be reverted.", slog.String("vm.name", vm.Name), slog.String("vm.namespace", vm.Namespace))
207-
return revert
209+
return revert, nil
210+
}
211+
if migrating.Reason == vmcondition.ReasonLastMigrationFinishedWithError.String() {
212+
log.Info("Last VirtualMachine migration failed. Will be reverted.", slog.String("vm.name", vm.Name), slog.String("vm.namespace", vm.Namespace))
213+
return revert, nil
214+
}
215+
216+
// If not found InProgress migrating vmop, that means some wrong migration happened. Revert.
217+
vmop, err := h.getInProgressMigratingVMOP(vm)
218+
if err != nil {
219+
return none, err
220+
}
221+
if vmop == nil {
222+
log.Info("VirtualMachine is not migrating. Will be reverted.", slog.String("vm.name", vm.Name), slog.String("vm.namespace", vm.Namespace))
223+
return revert, nil
208224
}
209225

210-
return none
226+
return none, nil
211227
}
212228

213229
func (h MigrationHandler) getActionIfDisksNotMigratable(ctx context.Context, vd *virtv2.VirtualDisk, log *slog.Logger) (action, error) {
@@ -451,6 +467,24 @@ func (h MigrationHandler) handleComplete(ctx context.Context, vd *virtv2.Virtual
451467
return nil
452468
}
453469

470+
func (h MigrationHandler) getInProgressMigratingVMOP(vm *virtv2.VirtualMachine) (*virtv2.VirtualMachineOperation, error) {
471+
vmops := &virtv2.VirtualMachineOperationList{}
472+
err := h.client.List(context.Background(), vmops, client.InNamespace(vm.Namespace))
473+
if err != nil {
474+
return nil, err
475+
}
476+
477+
for _, vmop := range vmops.Items {
478+
479+
if commonvmop.IsMigration(&vmop) && commonvmop.IsInProgressOrPending(&vmop) {
480+
return &vmop, nil
481+
}
482+
483+
}
484+
485+
return nil, nil
486+
}
487+
454488
func (h MigrationHandler) createTargetPersistentVolumeClaim(ctx context.Context, vd *virtv2.VirtualDisk, sc *storev1.StorageClass, size resource.Quantity) (*corev1.PersistentVolumeClaim, error) {
455489
pvcs, err := listPersistentVolumeClaims(ctx, vd, h.client)
456490
if err != nil {

images/virtualization-artifact/pkg/controller/vmop/migration/internal/handler/lifecycle.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ func (h LifecycleHandler) canExecute(vmop *v1alpha2.VirtualMachineOperation, vm
331331
}
332332

333333
if featuregates.Default().Enabled(featuregates.VolumeMigration) {
334-
if migratable.Reason == vmcondition.ReasonDisksNotMigratable.String() {
334+
if migratable.Reason == vmcondition.ReasonDisksNotMigratable.String() || isVolumeMigration {
335335
migrating, _ := conditions.GetCondition(vmcondition.TypeMigrating, vm.Status.Conditions)
336336
if migrating.Reason == vmcondition.ReasonReadyToMigrate.String() {
337337
return true

0 commit comments

Comments
 (0)