Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion pkg/controller/populators/import-populator.go
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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
}
}
}

Expand Down
29 changes: 29 additions & 0 deletions pkg/controller/populators/import-populator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down