From d3f39cbd313cbf47c3e899e1cfa59571debac198 Mon Sep 17 00:00:00 2001 From: Alex Kalenyuk Date: Thu, 18 Jan 2024 18:22:21 +0200 Subject: [PATCH] Controller: adapt to fake client honoring status subresource Signed-off-by: Alex Kalenyuk --- pkg/controller/clone-controller_test.go | 2 +- .../external-population-controller_test.go | 13 ++--- .../datavolume/import-controller_test.go | 52 +++++++++++-------- .../datavolume/pvc-clone-controller_test.go | 18 +++---- .../snapshot-clone-controller_test.go | 18 +++---- .../datavolume/static-volume_test.go | 13 +++-- .../datavolume/upload-controller_test.go | 23 ++++---- pkg/controller/datavolume/util_test.go | 5 +- pkg/controller/transfer/controller_test.go | 7 +-- pkg/controller/transfer/dv_test.go | 20 ++++++- pkg/controller/transfer/pvc_test.go | 20 ++++++- 11 files changed, 117 insertions(+), 74 deletions(-) diff --git a/pkg/controller/clone-controller_test.go b/pkg/controller/clone-controller_test.go index 74e622633e..8fb5e50204 100644 --- a/pkg/controller/clone-controller_test.go +++ b/pkg/controller/clone-controller_test.go @@ -393,7 +393,7 @@ var _ = Describe("Clone controller reconcile loop", func() { sourcePod, err = reconciler.findCloneSourcePod(testPvc) Expect(err).ToNot(HaveOccurred()) sourcePod.Status.Phase = corev1.PodSucceeded - err = reconciler.client.Update(context.TODO(), sourcePod) + err = reconciler.client.Status().Update(context.TODO(), sourcePod) Expect(err).ToNot(HaveOccurred()) _, err = reconciler.findCloneSourcePod(testPvc) Expect(err).ToNot(HaveOccurred()) diff --git a/pkg/controller/datavolume/external-population-controller_test.go b/pkg/controller/datavolume/external-population-controller_test.go index 5c30e785b0..60b02e507f 100644 --- a/pkg/controller/datavolume/external-population-controller_test.go +++ b/pkg/controller/datavolume/external-population-controller_test.go @@ -29,10 +29,10 @@ import ( extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/tools/record" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -328,22 +328,22 @@ var _ = Describe("All external-population tests", func() { }) }) -func createPopulatorReconciler(objects ...runtime.Object) *PopulatorReconciler { +func createPopulatorReconciler(objects ...client.Object) *PopulatorReconciler { cdiConfig := MakeEmptyCDIConfigSpec(common.ConfigName) cdiConfig.Status = cdiv1.CDIConfigStatus{ ScratchSpaceStorageClass: testStorageClass, } cdiConfig.Spec.FeatureGates = []string{featuregates.HonorWaitForFirstConsumer} - objs := []runtime.Object{} + objs := []client.Object{} objs = append(objs, objects...) objs = append(objs, cdiConfig) return createPopulatorReconcilerWithoutConfig(objs...) } -func createPopulatorReconcilerWithoutConfig(objects ...runtime.Object) *PopulatorReconciler { - objs := []runtime.Object{} +func createPopulatorReconcilerWithoutConfig(objects ...client.Object) *PopulatorReconciler { + objs := []client.Object{} objs = append(objs, objects...) // Register operator types with the runtime scheme. @@ -356,7 +356,8 @@ func createPopulatorReconcilerWithoutConfig(objects ...runtime.Object) *Populato builder := fake.NewClientBuilder(). WithScheme(s). - WithRuntimeObjects(objs...) + WithObjects(objs...). + WithStatusSubresource(objs...) for _, ia := range getIndexArgs() { builder = builder.WithIndex(ia.obj, ia.field, ia.extractValue) diff --git a/pkg/controller/datavolume/import-controller_test.go b/pkg/controller/datavolume/import-controller_test.go index 31592ef2a7..2cc695885d 100644 --- a/pkg/controller/datavolume/import-controller_test.go +++ b/pkg/controller/datavolume/import-controller_test.go @@ -40,6 +40,7 @@ import ( "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/tools/record" "k8s.io/utils/ptr" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -168,7 +169,7 @@ var _ = Describe("All DataVolume Tests", func() { Expect(err).ToNot(HaveOccurred()) dv.Status.Phase = cdiv1.Succeeded - err = reconciler.client.Update(context.TODO(), dv) + err = reconciler.client.Status().Update(context.TODO(), dv) Expect(err).ToNot(HaveOccurred()) _, err = reconciler.Reconcile(context.TODO(), reconcile.Request{NamespacedName: types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}}) @@ -208,7 +209,7 @@ var _ = Describe("All DataVolume Tests", func() { err = reconciler.client.Get(context.TODO(), types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}, dv) Expect(err).ToNot(HaveOccurred()) dv.Status.Phase = cdiv1.Succeeded - err = reconciler.client.Update(context.Background(), dv) + err = reconciler.client.Status().Update(context.Background(), dv) Expect(err).ToNot(HaveOccurred()) _, err = reconciler.Reconcile(context.TODO(), reconcile.Request{NamespacedName: types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}}) Expect(err).ToNot(HaveOccurred()) @@ -727,7 +728,7 @@ var _ = Describe("All DataVolume Tests", func() { Expect(dv.Status.Phase).To(BeEquivalentTo("")) pvc.Status.Phase = corev1.ClaimPending - err = reconciler.client.Update(context.TODO(), pvc) + err = reconciler.client.Status().Update(context.TODO(), pvc) Expect(err).ToNot(HaveOccurred()) _, err = reconciler.Reconcile(context.TODO(), reconcile.Request{NamespacedName: types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}}) @@ -1086,7 +1087,7 @@ var _ = Describe("All DataVolume Tests", func() { err = reconciler.client.Get(context.TODO(), types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}, dv) Expect(err).ToNot(HaveOccurred()) dv.Status.Phase = current - err = reconciler.client.Update(context.TODO(), dv) + err = reconciler.client.Status().Update(context.TODO(), dv) Expect(err).ToNot(HaveOccurred()) pvc := &corev1.PersistentVolumeClaim{} @@ -1135,7 +1136,7 @@ var _ = Describe("All DataVolume Tests", func() { Expect(err).ToNot(HaveOccurred()) Expect(pvc.Name).To(Equal("test-dv")) pvc.Status.Phase = corev1.ClaimPending - err = reconciler.client.Update(context.TODO(), pvc) + err = reconciler.client.Status().Update(context.TODO(), pvc) Expect(err).ToNot(HaveOccurred()) _, err = reconciler.updateStatus(getReconcileRequest(dv), nil, reconciler) Expect(err).ToNot(HaveOccurred()) @@ -1177,7 +1178,7 @@ var _ = Describe("All DataVolume Tests", func() { Expect(err).ToNot(HaveOccurred()) Expect(pvc.Name).To(Equal("test-dv")) pvc.Status.Phase = corev1.ClaimPending - err = reconciler.client.Update(context.TODO(), pvc) + err = reconciler.client.Status().Update(context.TODO(), pvc) Expect(err).ToNot(HaveOccurred()) _, err = reconciler.updateStatus(getReconcileRequest(dv), nil, reconciler) Expect(err).ToNot(HaveOccurred()) @@ -1222,7 +1223,7 @@ var _ = Describe("All DataVolume Tests", func() { Expect(err).ToNot(HaveOccurred()) Expect(pvc.Name).To(Equal("test-dv")) pvc.Status.Phase = corev1.ClaimPending - err = reconciler.client.Update(context.TODO(), pvc) + err = reconciler.client.Status().Update(context.TODO(), pvc) Expect(err).ToNot(HaveOccurred()) _, err = reconciler.updateStatus(getReconcileRequest(dv), nil, reconciler) Expect(err).ToNot(HaveOccurred()) @@ -1270,7 +1271,7 @@ var _ = Describe("All DataVolume Tests", func() { Expect(err).ToNot(HaveOccurred()) Expect(pvc.Name).To(Equal("test-dv")) pvc.Status.Phase = corev1.ClaimPending - err = reconciler.client.Update(context.TODO(), pvc) + err = reconciler.client.Status().Update(context.TODO(), pvc) Expect(err).ToNot(HaveOccurred()) _, err = reconciler.updateStatus(getReconcileRequest(dv), nil, reconciler) Expect(err).ToNot(HaveOccurred()) @@ -1315,10 +1316,12 @@ var _ = Describe("All DataVolume Tests", func() { err = reconciler.client.Get(context.TODO(), types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}, pvc) Expect(err).ToNot(HaveOccurred()) Expect(pvc.Name).To(Equal("test-dv")) - pvc.Status.Phase = corev1.ClaimPending AddAnnotation(pvc, AnnSelectedNode, "node01") err = reconciler.client.Update(context.TODO(), pvc) Expect(err).ToNot(HaveOccurred()) + pvc.Status.Phase = corev1.ClaimPending + err = reconciler.client.Status().Update(context.TODO(), pvc) + Expect(err).ToNot(HaveOccurred()) // Creating a valid PVC Prime pvcPrime := &corev1.PersistentVolumeClaim{} @@ -1402,11 +1405,13 @@ var _ = Describe("All DataVolume Tests", func() { err = reconciler.client.Get(context.TODO(), types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}, pvc) Expect(err).ToNot(HaveOccurred()) Expect(pvc.Name).To(Equal("test-dv")) - pvc.Status.Phase = corev1.ClaimPending pvc.SetAnnotations(make(map[string]string)) pvc.GetAnnotations()[AnnPodPhase] = string(corev1.PodSucceeded) err = reconciler.client.Update(context.TODO(), pvc) Expect(err).ToNot(HaveOccurred()) + pvc.Status.Phase = corev1.ClaimPending + err = reconciler.client.Status().Update(context.TODO(), pvc) + Expect(err).ToNot(HaveOccurred()) _, err = reconciler.updateStatus(getReconcileRequest(dv), nil, reconciler) Expect(err).ToNot(HaveOccurred()) dv = &cdiv1.DataVolume{} @@ -1448,12 +1453,14 @@ var _ = Describe("All DataVolume Tests", func() { err = reconciler.client.Get(context.TODO(), types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}, pvc) Expect(err).ToNot(HaveOccurred()) Expect(pvc.Name).To(Equal("test-dv")) - pvc.Status.Phase = corev1.ClaimPending pvc.SetAnnotations(make(map[string]string)) pvc.GetAnnotations()[AnnCurrentCheckpoint] = "current" pvc.GetAnnotations()[AnnPodPhase] = string(corev1.PodSucceeded) err = reconciler.client.Update(context.TODO(), pvc) Expect(err).ToNot(HaveOccurred()) + pvc.Status.Phase = corev1.ClaimPending + err = reconciler.client.Status().Update(context.TODO(), pvc) + Expect(err).ToNot(HaveOccurred()) _, err = reconciler.updateStatus(getReconcileRequest(dv), nil, reconciler) Expect(err).ToNot(HaveOccurred()) dv = &cdiv1.DataVolume{} @@ -1483,7 +1490,7 @@ var _ = Describe("All DataVolume Tests", func() { Expect(readyCondition.Message).To(Equal("")) }) - DescribeTable("DV phase", func(testDv runtime.Object, current, expected cdiv1.DataVolumePhase, pvcPhase corev1.PersistentVolumeClaimPhase, podPhase corev1.PodPhase, ann, expectedEvent string, extraAnnotations ...string) { + DescribeTable("DV phase", func(testDv client.Object, current, expected cdiv1.DataVolumePhase, pvcPhase corev1.PersistentVolumeClaimPhase, podPhase corev1.PodPhase, ann, expectedEvent string, extraAnnotations ...string) { // First we test the non-populator flow scName := "testpvc" sc := CreateStorageClassWithProvisioner(scName, map[string]string{AnnDefaultStorageClass: "true"}, map[string]string{}, "csi-plugin") @@ -1888,14 +1895,13 @@ func dvPhaseTest(reconciler ReconcilerBase, dvc dvController, testDv runtime.Obj err = reconciler.client.Get(context.TODO(), types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}, dv) Expect(err).ToNot(HaveOccurred()) dv.Status.Phase = current - err = reconciler.client.Update(context.TODO(), dv) + err = reconciler.client.Status().Update(context.TODO(), dv) 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.Name).To(Equal("test-dv")) - pvc.Status.Phase = pvcPhase pvc.SetAnnotations(make(map[string]string)) pvc.GetAnnotations()[ann] = "something" pvc.GetAnnotations()[AnnPodPhase] = string(podPhase) @@ -1904,6 +1910,9 @@ func dvPhaseTest(reconciler ReconcilerBase, dvc dvController, testDv runtime.Obj } err = reconciler.client.Update(context.TODO(), pvc) Expect(err).ToNot(HaveOccurred()) + pvc.Status.Phase = pvcPhase + err = reconciler.client.Status().Update(context.TODO(), pvc) + Expect(err).ToNot(HaveOccurred()) _, err = reconciler.updateStatus(getReconcileRequest(dv), nil, dvc) Expect(err).ToNot(HaveOccurred()) @@ -1978,30 +1987,30 @@ func readyStatusByPhase(phase cdiv1.DataVolumePhase) corev1.ConditionStatus { } } -func createImportReconcilerWFFCDisabled(objects ...runtime.Object) *ImportReconciler { +func createImportReconcilerWFFCDisabled(objects ...client.Object) *ImportReconciler { return createImportReconcilerWithFeatureGates(nil, objects...) } -func createImportReconciler(objects ...runtime.Object) *ImportReconciler { +func createImportReconciler(objects ...client.Object) *ImportReconciler { return createImportReconcilerWithFeatureGates([]string{featuregates.HonorWaitForFirstConsumer}, objects...) } -func createImportReconcilerWithFeatureGates(featureGates []string, objects ...runtime.Object) *ImportReconciler { +func createImportReconcilerWithFeatureGates(featureGates []string, objects ...client.Object) *ImportReconciler { cdiConfig := MakeEmptyCDIConfigSpec(common.ConfigName) cdiConfig.Status = cdiv1.CDIConfigStatus{ ScratchSpaceStorageClass: testStorageClass, } cdiConfig.Spec.FeatureGates = featureGates - objs := []runtime.Object{} + objs := []client.Object{} objs = append(objs, objects...) objs = append(objs, cdiConfig) return createImportReconcilerWithoutConfig(objs...) } -func createImportReconcilerWithoutConfig(objects ...runtime.Object) *ImportReconciler { - objs := []runtime.Object{} +func createImportReconcilerWithoutConfig(objects ...client.Object) *ImportReconciler { + objs := []client.Object{} objs = append(objs, objects...) // Register operator types with the runtime scheme. @@ -2014,7 +2023,8 @@ func createImportReconcilerWithoutConfig(objects ...runtime.Object) *ImportRecon builder := fake.NewClientBuilder(). WithScheme(s). - WithRuntimeObjects(objs...) + WithObjects(objs...). + WithStatusSubresource(objs...) for _, ia := range getIndexArgs() { builder = builder.WithIndex(ia.obj, ia.field, ia.extractValue) diff --git a/pkg/controller/datavolume/pvc-clone-controller_test.go b/pkg/controller/datavolume/pvc-clone-controller_test.go index 48a415d10f..6b316fb0bc 100644 --- a/pkg/controller/datavolume/pvc-clone-controller_test.go +++ b/pkg/controller/datavolume/pvc-clone-controller_test.go @@ -32,7 +32,6 @@ import ( k8serrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/tools/record" @@ -342,7 +341,7 @@ var _ = Describe("All DataVolume Tests", func() { }) var _ = Describe("Reconcile Datavolume status", func() { - DescribeTable("DV phase", func(testDv runtime.Object, current, expected cdiv1.DataVolumePhase, pvcPhase corev1.PersistentVolumeClaimPhase, podPhase corev1.PodPhase, ann, expectedEvent string, extraAnnotations ...string) { + DescribeTable("DV phase", func(testDv client.Object, current, expected cdiv1.DataVolumePhase, pvcPhase corev1.PersistentVolumeClaimPhase, podPhase corev1.PodPhase, ann, expectedEvent string, extraAnnotations ...string) { scName := "testpvc" srcPvc := CreatePvcInStorageClass("test", metav1.NamespaceDefault, &scName, nil, nil, corev1.ClaimBound) sc := CreateStorageClassWithProvisioner(scName, map[string]string{AnnDefaultStorageClass: "true"}, map[string]string{}, "csi-plugin") @@ -833,30 +832,30 @@ var _ = Describe("All DataVolume Tests", func() { }) }) -func createCloneReconcilerWFFCDisabled(objects ...runtime.Object) *PvcCloneReconciler { +func createCloneReconcilerWFFCDisabled(objects ...client.Object) *PvcCloneReconciler { return createCloneReconcilerWithFeatureGates(nil, objects...) } -func createCloneReconciler(objects ...runtime.Object) *PvcCloneReconciler { +func createCloneReconciler(objects ...client.Object) *PvcCloneReconciler { return createCloneReconcilerWithFeatureGates([]string{featuregates.HonorWaitForFirstConsumer}, objects...) } -func createCloneReconcilerWithFeatureGates(featireGates []string, objects ...runtime.Object) *PvcCloneReconciler { +func createCloneReconcilerWithFeatureGates(featireGates []string, objects ...client.Object) *PvcCloneReconciler { cdiConfig := MakeEmptyCDIConfigSpec(common.ConfigName) cdiConfig.Status = cdiv1.CDIConfigStatus{ ScratchSpaceStorageClass: testStorageClass, } cdiConfig.Spec.FeatureGates = featireGates - objs := []runtime.Object{} + objs := []client.Object{} objs = append(objs, objects...) objs = append(objs, cdiConfig) return createCloneReconcilerWithoutConfig(objs...) } -func createCloneReconcilerWithoutConfig(objects ...runtime.Object) *PvcCloneReconciler { - objs := []runtime.Object{} +func createCloneReconcilerWithoutConfig(objects ...client.Object) *PvcCloneReconciler { + objs := []client.Object{} objs = append(objs, objects...) // Register operator types with the runtime scheme. @@ -869,7 +868,8 @@ func createCloneReconcilerWithoutConfig(objects ...runtime.Object) *PvcCloneReco builder := fake.NewClientBuilder(). WithScheme(s). - WithRuntimeObjects(objs...) + WithObjects(objs...). + WithStatusSubresource(objs...) for _, ia := range getIndexArgs() { builder = builder.WithIndex(ia.obj, ia.field, ia.extractValue) diff --git a/pkg/controller/datavolume/snapshot-clone-controller_test.go b/pkg/controller/datavolume/snapshot-clone-controller_test.go index f479a48b9e..0b72d2f6c3 100644 --- a/pkg/controller/datavolume/snapshot-clone-controller_test.go +++ b/pkg/controller/datavolume/snapshot-clone-controller_test.go @@ -32,7 +32,6 @@ import ( k8serrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/tools/record" @@ -133,7 +132,7 @@ var _ = Describe("All DataVolume Tests", func() { Expect(pvc.Annotations[AnnCloneRequest]).To(Equal(fmt.Sprintf("%s/%s", snapshot.Namespace, tempPvcName))) By("Mark target PVC bound like it would be in a live cluster, so DV status is updated") pvc.Status.Phase = corev1.ClaimBound - err = reconciler.client.Update(context.TODO(), pvc) + err = reconciler.client.Status().Update(context.TODO(), pvc) Expect(err).ToNot(HaveOccurred()) _, err = reconciler.Reconcile(context.TODO(), reconcile.Request{NamespacedName: types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}}) Expect(err).ToNot(HaveOccurred()) @@ -514,36 +513,36 @@ var _ = Describe("All DataVolume Tests", func() { }) }) -func createSnapshotCloneReconcilerWFFCDisabled(objects ...runtime.Object) *SnapshotCloneReconciler { +func createSnapshotCloneReconcilerWFFCDisabled(objects ...client.Object) *SnapshotCloneReconciler { cdiConfig := MakeEmptyCDIConfigSpec(common.ConfigName) cdiConfig.Status = cdiv1.CDIConfigStatus{ ScratchSpaceStorageClass: testStorageClass, } cdiConfig.Spec.FeatureGates = []string{} - objs := []runtime.Object{} + objs := []client.Object{} objs = append(objs, objects...) objs = append(objs, cdiConfig) return createSnapshotCloneReconcilerWithoutConfig(objs...) } -func createSnapshotCloneReconciler(objects ...runtime.Object) *SnapshotCloneReconciler { +func createSnapshotCloneReconciler(objects ...client.Object) *SnapshotCloneReconciler { cdiConfig := MakeEmptyCDIConfigSpec(common.ConfigName) cdiConfig.Status = cdiv1.CDIConfigStatus{ ScratchSpaceStorageClass: testStorageClass, } cdiConfig.Spec.FeatureGates = []string{featuregates.HonorWaitForFirstConsumer} - objs := []runtime.Object{} + objs := []client.Object{} objs = append(objs, objects...) objs = append(objs, cdiConfig) return createSnapshotCloneReconcilerWithoutConfig(objs...) } -func createSnapshotCloneReconcilerWithoutConfig(objects ...runtime.Object) *SnapshotCloneReconciler { - objs := []runtime.Object{} +func createSnapshotCloneReconcilerWithoutConfig(objects ...client.Object) *SnapshotCloneReconciler { + objs := []client.Object{} objs = append(objs, objects...) // Register operator types with the runtime scheme. @@ -556,7 +555,8 @@ func createSnapshotCloneReconcilerWithoutConfig(objects ...runtime.Object) *Snap builder := fake.NewClientBuilder(). WithScheme(s). - WithRuntimeObjects(objs...) + WithObjects(objs...). + WithStatusSubresource(objs...) for _, ia := range getIndexArgs() { builder = builder.WithIndex(ia.obj, ia.field, ia.extractValue) diff --git a/pkg/controller/datavolume/static-volume_test.go b/pkg/controller/datavolume/static-volume_test.go index f424856877..533386d646 100644 --- a/pkg/controller/datavolume/static-volume_test.go +++ b/pkg/controller/datavolume/static-volume_test.go @@ -26,7 +26,6 @@ import ( corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -40,7 +39,7 @@ var _ = Describe("checkStaticVolume Tests", func() { type testArgs struct { newDV func() *cdiv1.DataVolume - newReconciler func(...runtime.Object) (reconcile.Reconciler, client.Client) + newReconciler func(...client.Object) (reconcile.Reconciler, client.Client) } addAnno := func(obj metav1.Object) { @@ -56,7 +55,7 @@ var _ = Describe("checkStaticVolume Tests", func() { return dv } - importReconciler := func(objects ...runtime.Object) (reconcile.Reconciler, client.Client) { + importReconciler := func(objects ...client.Object) (reconcile.Reconciler, client.Client) { r := createImportReconciler(objects...) return r, r.client } @@ -74,7 +73,7 @@ var _ = Describe("checkStaticVolume Tests", func() { return dv } - uploadReconciler := func(objects ...runtime.Object) (reconcile.Reconciler, client.Client) { + uploadReconciler := func(objects ...client.Object) (reconcile.Reconciler, client.Client) { r := createUploadReconciler(objects...) return r, r.client } @@ -92,7 +91,7 @@ var _ = Describe("checkStaticVolume Tests", func() { return dv } - cloneReconciler := func(objects ...runtime.Object) (reconcile.Reconciler, client.Client) { + cloneReconciler := func(objects ...client.Object) (reconcile.Reconciler, client.Client) { r := createCloneReconciler(objects...) return r, r.client } @@ -110,7 +109,7 @@ var _ = Describe("checkStaticVolume Tests", func() { return dv } - snapshotCloneReconciler := func(objects ...runtime.Object) (reconcile.Reconciler, client.Client) { + snapshotCloneReconciler := func(objects ...client.Object) (reconcile.Reconciler, client.Client) { r := createSnapshotCloneReconciler(objects...) return r, r.client } @@ -132,7 +131,7 @@ var _ = Describe("checkStaticVolume Tests", func() { return dv } - populatorReconciler := func(objects ...runtime.Object) (reconcile.Reconciler, client.Client) { + populatorReconciler := func(objects ...client.Object) (reconcile.Reconciler, client.Client) { r := createPopulatorReconciler(objects...) return r, r.client } diff --git a/pkg/controller/datavolume/upload-controller_test.go b/pkg/controller/datavolume/upload-controller_test.go index 52e295b0ac..b0dbf49aaa 100644 --- a/pkg/controller/datavolume/upload-controller_test.go +++ b/pkg/controller/datavolume/upload-controller_test.go @@ -29,10 +29,10 @@ import ( extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/tools/record" + "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/reconcile" @@ -120,7 +120,7 @@ var _ = Describe("All DataVolume Tests", func() { Expect(err).ToNot(HaveOccurred()) dv.Status.Phase = cdiv1.Succeeded - err = reconciler.client.Update(context.TODO(), dv) + err = reconciler.client.Status().Update(context.TODO(), dv) Expect(err).ToNot(HaveOccurred()) _, err = reconciler.Reconcile(context.TODO(), reconcile.Request{NamespacedName: types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}}) @@ -278,7 +278,7 @@ var _ = Describe("All DataVolume Tests", func() { }) var _ = Describe("Reconcile Datavolume status", func() { - DescribeTable("DV phase", func(testDv runtime.Object, current, expected cdiv1.DataVolumePhase, pvcPhase corev1.PersistentVolumeClaimPhase, podPhase corev1.PodPhase, ann, expectedEvent string, extraAnnotations ...string) { + DescribeTable("DV phase", func(testDv client.Object, current, expected cdiv1.DataVolumePhase, pvcPhase corev1.PersistentVolumeClaimPhase, podPhase corev1.PodPhase, ann, expectedEvent string, extraAnnotations ...string) { // We first test the non-populator flow scName := "testpvc" sc := CreateStorageClassWithProvisioner(scName, map[string]string{AnnDefaultStorageClass: "true"}, map[string]string{}, "csi-plugin") @@ -334,10 +334,12 @@ var _ = Describe("All DataVolume Tests", func() { err = reconciler.client.Get(context.TODO(), types.NamespacedName{Name: "test-dv", Namespace: metav1.NamespaceDefault}, pvc) Expect(err).ToNot(HaveOccurred()) Expect(pvc.Name).To(Equal("test-dv")) - pvc.Status.Phase = corev1.ClaimPending AddAnnotation(pvc, AnnSelectedNode, "node01") err = reconciler.client.Update(context.TODO(), pvc) Expect(err).ToNot(HaveOccurred()) + pvc.Status.Phase = corev1.ClaimPending + err = reconciler.client.Status().Update(context.TODO(), pvc) + Expect(err).ToNot(HaveOccurred()) // Create PVC Prime pvcPrime := &corev1.PersistentVolumeClaim{} @@ -411,26 +413,26 @@ var _ = Describe("All DataVolume Tests", func() { }) }) -func createUploadReconciler(objects ...runtime.Object) *UploadReconciler { +func createUploadReconciler(objects ...client.Object) *UploadReconciler { return createUploadReconcilerWithFeatureGates([]string{featuregates.HonorWaitForFirstConsumer}, objects...) } -func createUploadReconcilerWithFeatureGates(featureGates []string, objects ...runtime.Object) *UploadReconciler { +func createUploadReconcilerWithFeatureGates(featureGates []string, objects ...client.Object) *UploadReconciler { cdiConfig := MakeEmptyCDIConfigSpec(common.ConfigName) cdiConfig.Status = cdiv1.CDIConfigStatus{ ScratchSpaceStorageClass: testStorageClass, } cdiConfig.Spec.FeatureGates = featureGates - objs := []runtime.Object{} + objs := []client.Object{} objs = append(objs, objects...) objs = append(objs, cdiConfig) return createUploadReconcilerWithoutConfig(objs...) } -func createUploadReconcilerWithoutConfig(objects ...runtime.Object) *UploadReconciler { - objs := []runtime.Object{} +func createUploadReconcilerWithoutConfig(objects ...client.Object) *UploadReconciler { + objs := []client.Object{} objs = append(objs, objects...) // Register operator types with the runtime scheme. @@ -443,7 +445,8 @@ func createUploadReconcilerWithoutConfig(objects ...runtime.Object) *UploadRecon builder := fake.NewClientBuilder(). WithScheme(s). - WithRuntimeObjects(objs...) + WithObjects(objs...). + WithStatusSubresource(objs...) for _, ia := range getIndexArgs() { builder = builder.WithIndex(ia.obj, ia.field, ia.extractValue) diff --git a/pkg/controller/datavolume/util_test.go b/pkg/controller/datavolume/util_test.go index 40b8987d1e..e20aacbb30 100644 --- a/pkg/controller/datavolume/util_test.go +++ b/pkg/controller/datavolume/util_test.go @@ -14,7 +14,6 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/scheme" "k8s.io/utils/ptr" @@ -271,14 +270,14 @@ func createDataVolumeWithStorageAPI(name, ns string, source *cdiv1.DataVolumeSou } } -func createClient(objs ...runtime.Object) client.Client { +func createClient(objs ...client.Object) client.Client { // Register cdi types with the runtime scheme. s := scheme.Scheme _ = cdiv1.AddToScheme(s) // Register other types with the runtime scheme. _ = ocpconfigv1.Install(s) // Create a fake client to mock API calls. - return fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(objs...).Build() + return fake.NewClientBuilder().WithScheme(s).WithObjects(objs...).Build() } type fakeClientWithGetServiceUnavailableErr struct { diff --git a/pkg/controller/transfer/controller_test.go b/pkg/controller/transfer/controller_test.go index 81c7632a84..e1cb586df9 100644 --- a/pkg/controller/transfer/controller_test.go +++ b/pkg/controller/transfer/controller_test.go @@ -7,7 +7,6 @@ import ( . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/record" "sigs.k8s.io/controller-runtime/pkg/client" @@ -58,11 +57,7 @@ func createReconciler(objects ...client.Object) *transfer.ObjectTransferReconcil _ = corev1.AddToScheme(s) _ = cdiv1.AddToScheme(s) - var runtimeObjects []runtime.Object - for _, obj := range objects { - runtimeObjects = append(runtimeObjects, obj) - } - cl := fake.NewClientBuilder().WithScheme(s).WithRuntimeObjects(runtimeObjects...).Build() + cl := fake.NewClientBuilder().WithScheme(s).WithObjects(objects...).WithStatusSubresource(objects...).Build() return &transfer.ObjectTransferReconciler{ Client: cl, diff --git a/pkg/controller/transfer/dv_test.go b/pkg/controller/transfer/dv_test.go index d86fb7d974..b123c6ece4 100644 --- a/pkg/controller/transfer/dv_test.go +++ b/pkg/controller/transfer/dv_test.go @@ -90,7 +90,7 @@ var _ = Describe("DataVolume Transfer Tests", func() { Expect(err).ToNot(HaveOccurred()) Expect(xfer.Status.Phase).To(Equal(cdiv1.ObjectTransferRunning)) - Expect(xfer.Status.Data).To(Equal(dvTransferRunning().Status.Data)) + Expect(xfer.Status.Data).To(Equal(dvTransferRunningWithSucceededDV().Status.Data)) checkCompleteFalse(xfer, "Running", "") }) @@ -287,6 +287,24 @@ func dvTransferRunning() *cdiv1.ObjectTransfer { return t } +func dvTransferRunningWithSucceededDV() *cdiv1.ObjectTransfer { + t := dvTransfer(cdiv1.ObjectTransferRunning) + dv := createPopulatedDV() + dv.Kind = "DataVolume" + dv.APIVersion = "cdi.kubevirt.io/v1beta1" + dv.ResourceVersion = "1000" + dv.Annotations = map[string]string{ + "cdi.kubevirt.io/objectTransferName": "dvTransfer", + } + dv.Status = cdiv1.DataVolumeStatus{Phase: cdiv1.Succeeded} + bs, _ := json.Marshal(dv) + t.Status.Data = map[string]string{ + "source": string(bs), + "pvcName": dv.Name, + } + return t +} + func dvTransfer(phase cdiv1.ObjectTransferPhase) *cdiv1.ObjectTransfer { targetNamespace := "target-ns" targetName := "target-dv" diff --git a/pkg/controller/transfer/pvc_test.go b/pkg/controller/transfer/pvc_test.go index 17859268f9..f932a8c315 100644 --- a/pkg/controller/transfer/pvc_test.go +++ b/pkg/controller/transfer/pvc_test.go @@ -173,7 +173,7 @@ var _ = Describe("PVC Transfer Tests", func() { Expect(err).ToNot(HaveOccurred()) Expect(xfer.Status.Phase).To(Equal(cdiv1.ObjectTransferRunning)) - Expect(xfer.Status.Data).To(Equal(pvcTransferRunning().Status.Data)) + Expect(xfer.Status.Data).To(Equal(pvcTransferRunningWithBoundPVC().Status.Data)) checkCompleteFalse(xfer, "Running", "") }) @@ -507,6 +507,24 @@ func pvcTransferRunning() *cdiv1.ObjectTransfer { return t } +func pvcTransferRunningWithBoundPVC() *cdiv1.ObjectTransfer { + t := pvcTransfer(cdiv1.ObjectTransferRunning) + pvc := createBoundPVC() + pvc.Kind = "PersistentVolumeClaim" + pvc.APIVersion = "v1" + pvc.ResourceVersion = "1000" + pvc.Annotations = map[string]string{ + "cdi.kubevirt.io/objectTransferName": "pvcTransfer", + } + pvc.Status = corev1.PersistentVolumeClaimStatus{Phase: corev1.ClaimBound} + bs, _ := json.Marshal(pvc) + t.Status.Data = map[string]string{ + "source": string(bs), + "pvName": "source-pv", + } + return t +} + func sourcePV() *corev1.PersistentVolume { return &corev1.PersistentVolume{ ObjectMeta: metav1.ObjectMeta{