@@ -35,6 +35,7 @@ import (
35
35
"github.com/deckhouse/virtualization-controller/pkg/common/object"
36
36
pvcspec "github.com/deckhouse/virtualization-controller/pkg/common/pvc"
37
37
commonvd "github.com/deckhouse/virtualization-controller/pkg/common/vd"
38
+ commonvmop "github.com/deckhouse/virtualization-controller/pkg/common/vmop"
38
39
"github.com/deckhouse/virtualization-controller/pkg/controller/conditions"
39
40
"github.com/deckhouse/virtualization-controller/pkg/controller/service"
40
41
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,
155
156
}
156
157
157
158
if commonvd .IsMigrating (vd ) {
158
- return h .getActionIfMigrationInProgress (vd , vm , log ), nil
159
+ return h .getActionIfMigrationInProgress (vd , vm , log )
159
160
}
160
161
161
162
vmMigrating , _ := conditions .GetCondition (vmcondition .TypeMigrating , vm .Status .Conditions )
@@ -171,6 +172,7 @@ func (h MigrationHandler) getAction(ctx context.Context, vd *virtv2.VirtualDisk,
171
172
}
172
173
173
174
if commonvd .StorageClassChanged (vd ) {
175
+ log .Info ("StorageClass Changed. VirtualDisk should be migrated." )
174
176
return migrate , nil
175
177
}
176
178
@@ -179,35 +181,49 @@ func (h MigrationHandler) getAction(ctx context.Context, vd *virtv2.VirtualDisk,
179
181
return none , nil
180
182
}
181
183
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 ) {
183
185
// If VirtualMachine is not running, we can't migrate it. Should be reverted.
184
186
running , _ := conditions .GetCondition (vmcondition .TypeRunning , vm .Status .Conditions )
185
187
if running .Status != metav1 .ConditionTrue {
186
188
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
188
190
}
189
191
190
192
if commonvd .IsMigrationsMatched (vm , vd ) {
191
193
if vm .Status .MigrationState == nil {
192
194
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
194
196
}
195
197
switch vm .Status .MigrationState .Result {
196
198
case virtv2 .MigrationResultFailed :
197
- return revert
199
+ return revert , nil
198
200
case virtv2 .MigrationResultSucceeded :
199
- return complete
201
+ return complete , nil
200
202
}
201
203
}
202
204
203
205
// 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 )
205
207
if ! migratingFound {
206
208
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
208
224
}
209
225
210
- return none
226
+ return none , nil
211
227
}
212
228
213
229
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
451
467
return nil
452
468
}
453
469
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
+
454
488
func (h MigrationHandler ) createTargetPersistentVolumeClaim (ctx context.Context , vd * virtv2.VirtualDisk , sc * storev1.StorageClass , size resource.Quantity ) (* corev1.PersistentVolumeClaim , error ) {
455
489
pvcs , err := listPersistentVolumeClaims (ctx , vd , h .client )
456
490
if err != nil {
0 commit comments