@@ -359,19 +359,18 @@ func (r *DataImportCronReconciler) update(ctx context.Context, dataImportCron *c
359359 return res , err
360360 }
361361 if desiredStorageClass != nil {
362- if deleted , err := r .deleteOutdatedPendingPvc (ctx , pvc , desiredStorageClass .Name , dataImportCron .Name ); deleted || err != nil {
362+ desiredSc := desiredStorageClass .Name
363+ outdated , err := r .importOutdated (ctx , dataImportCron , dv , pvc , desiredStorageClass )
364+ if err != nil {
363365 return res , err
364366 }
365- currentSc , hasCurrent := dataImportCron .Annotations [AnnStorageClass ]
366- desiredSc := desiredStorageClass .Name
367- if hasCurrent && currentSc != desiredSc {
368- r .log .Info ("Storage class changed, delete most recent source on the old sc as it's no longer the desired" , "currentSc" , currentSc , "desiredSc" , desiredSc )
369- if err := r .handleStorageClassChange (ctx , dataImportCron , desiredSc ); err != nil {
367+ if outdated {
368+ if err := r .recreateImport (ctx , dataImportCron , desiredSc ); err != nil {
370369 return res , err
371370 }
372371 return reconcile.Result {RequeueAfter : time .Second }, nil
373372 }
374- cc .AddAnnotation (dataImportCron , AnnStorageClass , desiredStorageClass . Name )
373+ cc .AddAnnotation (dataImportCron , AnnStorageClass , desiredSc )
375374 }
376375 format , err := r .getSourceFormat (ctx , desiredStorageClass )
377376 if err != nil {
@@ -974,7 +973,7 @@ func (p *authProxy) GetDataSource(namespace, name string) (*cdiv1.DataSource, er
974973 return das , nil
975974}
976975
977- func (r * DataImportCronReconciler ) handleStorageClassChange (ctx context.Context , dataImportCron * cdiv1.DataImportCron , desiredStorageClass string ) error {
976+ func (r * DataImportCronReconciler ) recreateImport (ctx context.Context , dataImportCron * cdiv1.DataImportCron , desiredStorageClass string ) error {
978977 digest , ok := dataImportCron .Annotations [AnnSourceDesiredDigest ]
979978 if ! ok {
980979 // nothing to delete
@@ -1111,6 +1110,37 @@ func (r *DataImportCronReconciler) handleSnapshotClassChange(ctx context.Context
11111110 return true , nil
11121111}
11131112
1113+ func (r * DataImportCronReconciler ) importOutdated (ctx context.Context , cron * cdiv1.DataImportCron , currentDV * cdiv1.DataVolume , pvc * corev1.PersistentVolumeClaim , desiredSC * storagev1.StorageClass ) (bool , error ) {
1114+ currentSc , hasCurrent := cron .Annotations [AnnStorageClass ]
1115+ scChanged := currentSc != desiredSC .Name
1116+ needsReset := hasCurrent || len (cron .Status .CurrentImports ) > 0
1117+ if scChanged && needsReset {
1118+ r .log .Info ("Storage class changed, resetting import" , "currentSc" , currentSc , "desiredSc" , desiredSC .Name )
1119+ return true , nil
1120+ }
1121+
1122+ if pvc != nil && pvc .Status .Phase == corev1 .ClaimPending &&
1123+ pvc .Labels [common .DataImportCronLabel ] == cron .Name &&
1124+ pvc .Spec .StorageClassName != nil && * pvc .Spec .StorageClassName != desiredSC .Name {
1125+ r .log .Info ("Pending PVC has outdated storage class, resetting import" , "pvc" , pvc .Name , "pvcSc" , * pvc .Spec .StorageClassName , "desiredSc" , desiredSC .Name )
1126+ return true , nil
1127+ }
1128+
1129+ if currentDV != nil {
1130+ sp := & cdiv1.StorageProfile {}
1131+ if err := r .client .Get (ctx , types.NamespacedName {Name : desiredSC .Name }, sp ); err != nil {
1132+ return false , err
1133+ }
1134+ desiredDV := r .newSourceDataVolume (cron , currentDV .Name , sp )
1135+ if ! reflect .DeepEqual (currentDV .Spec , desiredDV .Spec ) {
1136+ r .log .Info ("Import DV spec changed, resetting import" , "dv" , currentDV .Name )
1137+ return true , nil
1138+ }
1139+ }
1140+
1141+ return false , nil
1142+ }
1143+
11141144// getSnapshotClassForDataImportCron returns the VolumeSnapshotClass name to use for DataImportCron snapshots.
11151145func (r * DataImportCronReconciler ) getSnapshotClassForDataImportCron (pvc * corev1.PersistentVolumeClaim , storageProfile * cdiv1.StorageProfile ) (string , error ) {
11161146 if vscName := storageProfile .Annotations [cc .AnnSnapshotClassForDataImportCron ]; vscName != "" {
@@ -1533,23 +1563,6 @@ func getReconcileRequestsForDicsWithoutExplicitStorageClass(ctx context.Context,
15331563 return reqs , nil
15341564}
15351565
1536- func (r * DataImportCronReconciler ) deleteOutdatedPendingPvc (ctx context.Context , pvc * corev1.PersistentVolumeClaim , desiredStorageClass , cronName string ) (bool , error ) {
1537- if pvc == nil || pvc .Status .Phase != corev1 .ClaimPending || pvc .Labels [common .DataImportCronLabel ] != cronName {
1538- return false , nil
1539- }
1540-
1541- sc := pvc .Spec .StorageClassName
1542- if sc == nil || * sc == desiredStorageClass {
1543- return false , nil
1544- }
1545-
1546- r .log .Info ("Delete pending pvc" , "name" , pvc .Name , "ns" , pvc .Namespace , "sc" , * sc )
1547- if err := r .client .Delete (ctx , pvc ); cc .IgnoreNotFound (err ) != nil {
1548- return false , err
1549- }
1550-
1551- return true , nil
1552- }
15531566
15541567func (r * DataImportCronReconciler ) cronJobExistsAndUpdated (ctx context.Context , cron * cdiv1.DataImportCron ) (bool , error ) {
15551568 cronJob := & batchv1.CronJob {}
0 commit comments