diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/datasource_ready.go b/images/virtualization-artifact/pkg/controller/vd/internal/datasource_ready.go index 00c73d1155..19d85f47e3 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/datasource_ready.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/datasource_ready.go @@ -53,6 +53,13 @@ func (h DatasourceReadyHandler) Handle(ctx context.Context, vd *v1alpha2.Virtual return reconcile.Result{}, nil } + // Data is already on PV or provisioning is done; DataSource is not needed for export, migration, or when disk is ready/lost. + if vd.Status.Phase == v1alpha2.DiskExporting || vd.Status.Phase == v1alpha2.DiskMigrating || + vd.Status.Phase == v1alpha2.DiskReady || vd.Status.Phase == v1alpha2.DiskLost { + conditions.RemoveCondition(vdcondition.DatasourceReadyType, &vd.Status.Conditions) + return reconcile.Result{}, nil + } + readyCondition, _ := conditions.GetCondition(vdcondition.ReadyType, vd.Status.Conditions) if source.IsDiskProvisioningFinished(readyCondition) { conditions.RemoveCondition(vdcondition.DatasourceReadyType, &vd.Status.Conditions) diff --git a/images/virtualization-artifact/pkg/controller/vd/internal/life_cycle.go b/images/virtualization-artifact/pkg/controller/vd/internal/life_cycle.go index b53e426b50..3f8c61473d 100644 --- a/images/virtualization-artifact/pkg/controller/vd/internal/life_cycle.go +++ b/images/virtualization-artifact/pkg/controller/vd/internal/life_cycle.go @@ -98,7 +98,11 @@ func (h LifeCycleHandler) Handle(ctx context.Context, vd *v1alpha2.VirtualDisk) cb := conditions.NewConditionBuilder(vdcondition.ReadyType).Generation(vd.Generation) - if !source.IsDiskProvisioningFinished(readyCondition) { + // DataSource is not required when data is already on PV (exporting or migrating). + requireDatasourceReady := !source.IsDiskProvisioningFinished(readyCondition) && + vd.Status.Phase != v1alpha2.DiskExporting && vd.Status.Phase != v1alpha2.DiskMigrating + + if requireDatasourceReady { ds, _ := conditions.GetCondition(vdcondition.DatasourceReadyType, vd.Status.Conditions) if ds.Status != metav1.ConditionTrue || !conditions.IsLastUpdated(ds, vd) {