add annotation cdi.kubevirt.io/garbageCollected to PVCs when DVs are garbage collected (#3059)

Signed-off-by: Michael Henriksen <mhenriks@redhat.com>
This commit is contained in:
Michael Henriksen 2024-01-14 06:11:57 -05:00 committed by GitHub
parent 9ff5671e53
commit 61368754b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 32 additions and 0 deletions

View File

@ -245,6 +245,9 @@ const (
// be dynamically provisioned. Its value is the name of the selected node.
AnnSelectedNode = "volume.kubernetes.io/selected-node"
// AnnGarbageCollected is a PVC annotation indicating that the PVC was garbage collected
AnnGarbageCollected = AnnAPIGroup + "/garbageCollected"
// CloneUniqueID is used as a special label to be used when we search for the pod
CloneUniqueID = "cdi.kubevirt.io/storage.clone.cloneUniqeId"

View File

@ -104,6 +104,7 @@ func (r *ReconcilerBase) canUpdateFinalizers(ownerRef metav1.OwnerReference) (bo
func (r *ReconcilerBase) detachPvcDeleteDv(syncState *dvSyncState) error {
updatePvcOwnerRefs(syncState.pvc, syncState.dv)
delete(syncState.pvc.Annotations, cc.AnnPopulatedFor)
cc.AddAnnotation(syncState.pvc, cc.AnnGarbageCollected, "true")
if err := r.updatePVC(syncState.pvc); err != nil {
return err
}

View File

@ -1624,6 +1624,34 @@ var _ = Describe("All DataVolume Tests", func() {
Expect(pvc.OwnerReferences).To(HaveLen(4))
Expect(pvc.OwnerReferences).To(Equal([]metav1.OwnerReference{ref("1"), ref("2"), ref("3"), vmOwnerRef}))
})
It("should update PVC when garbage collecting", func() {
dv := NewImportDataVolume("test-dv")
AddAnnotation(dv, AnnDeleteAfterCompletion, "true")
dv.Status.Phase = cdiv1.Succeeded
vmOwnerRef := metav1.OwnerReference{Kind: "VirtualMachine", Name: "test-vm", UID: "test-vm-uid", Controller: ptr.To(true)}
dv.OwnerReferences = append(dv.OwnerReferences, vmOwnerRef)
pvc := CreatePvc("test-dv", metav1.NamespaceDefault, nil, nil)
dvOwnerRef := metav1.OwnerReference{Kind: "DataVolume", Name: "test-dv", UID: dv.UID, Controller: ptr.To(true)}
pvc.OwnerReferences = append(pvc.OwnerReferences, dvOwnerRef)
cdiConfig := MakeEmptyCDIConfigSpec(common.ConfigName)
cdiConfig.Status = cdiv1.CDIConfigStatus{
ScratchSpaceStorageClass: testStorageClass,
}
cdiConfig.Spec.FeatureGates = []string{featuregates.HonorWaitForFirstConsumer}
cdiConfig.Spec.DataVolumeTTLSeconds = ptr.To(int32(0))
reconciler = createImportReconcilerWithoutConfig(dv, pvc, cdiConfig)
_, err := reconciler.Reconcile(context.TODO(), reconcile.Request{NamespacedName: types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}})
Expect(err).ToNot(HaveOccurred())
pvc = &corev1.PersistentVolumeClaim{}
err = reconciler.client.Get(context.TODO(), types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}, pvc)
Expect(err).ToNot(HaveOccurred())
Expect(pvc.OwnerReferences).To(Equal([]metav1.OwnerReference{vmOwnerRef}))
Expect(pvc.Annotations[AnnGarbageCollected]).To(Equal("true"))
})
})
var _ = Describe("shouldUseCDIPopulator", func() {