diff --git a/pkg/controller/populators/import-populator.go b/pkg/controller/populators/import-populator.go index cddecbdb78..28a93f5bdd 100644 --- a/pkg/controller/populators/import-populator.go +++ b/pkg/controller/populators/import-populator.go @@ -63,7 +63,10 @@ type ImportPopulatorReconciler struct { } // http client to get metrics -var httpClient *http.Client +var ( + httpClient *http.Client + errCapacityNotUpdated = errors.New("target PVC has no storage capacity") +) // NewImportPopulator creates a new instance of the import-populator controller func NewImportPopulator( @@ -170,6 +173,10 @@ func (r *ImportPopulatorReconciler) reconcileTargetPVC(pvc, pvcPrime *corev1.Per if err := cc.Rebind(context.TODO(), r.client, pvcPrime, pvcCopy); err != nil { return reconcile.Result{}, err } + if storage := pvcCopy.Status.Capacity.Storage(); storage == nil || storage.IsZero() { + r.log.Info("target PVC %s went through rebind but capacity hasn't been updated yet", "pvcName", pvcCopy.Name) + return reconcile.Result{}, errCapacityNotUpdated + } } } diff --git a/pkg/controller/populators/import-populator_test.go b/pkg/controller/populators/import-populator_test.go index 495a7d2475..644f9ba968 100644 --- a/pkg/controller/populators/import-populator_test.go +++ b/pkg/controller/populators/import-populator_test.go @@ -172,6 +172,35 @@ var _ = Describe("Import populator tests", func() { Expect(found).To(BeTrue()) }) + It("should error if post rebind target PVC has no storage capacity", func() { + targetPvc := CreatePvcInStorageClass(targetPvcName, metav1.NamespaceDefault, &sc.Name, nil, nil, corev1.ClaimPending) + targetPvc.Spec.DataSourceRef = dataSourceRef + targetPvc.Status.Capacity = corev1.ResourceList{ + corev1.ResourceStorage: resource.MustParse("0"), + } + volumeImportSource := getVolumeImportSource(true, metav1.NamespaceDefault) + pvcPrime := getPVCPrime(targetPvc, nil) + pvcPrime.Annotations = map[string]string{AnnPodPhase: string(corev1.PodSucceeded)} + pv := &corev1.PersistentVolume{ + ObjectMeta: metav1.ObjectMeta{ + Name: "pv", + }, + Spec: corev1.PersistentVolumeSpec{ + ClaimRef: &corev1.ObjectReference{ + Namespace: pvcPrime.Namespace, + Name: pvcPrime.Name, + }, + }, + } + pvcPrime.Spec.VolumeName = pv.Name + + By("Reconcile") + reconciler = createImportPopulatorReconciler(targetPvc, pvcPrime, pv, volumeImportSource, sc) + _, err := reconciler.Reconcile(context.TODO(), reconcile.Request{NamespacedName: types.NamespacedName{Name: targetPvcName, Namespace: metav1.NamespaceDefault}}) + Expect(err).To(HaveOccurred()) + Expect(err).To(MatchError(errCapacityNotUpdated)) + }) + It("should ignore namespaced dataSourceRefs", func() { targetPvc := CreatePvcInStorageClass(targetPvcName, metav1.NamespaceDefault, &sc.Name, nil, nil, corev1.ClaimPending) targetPvc.Spec.DataSourceRef = namespacedDataSourceRef