Skip to content

Commit

Permalink
Controller: adapt to fake client honoring status subresource
Browse files Browse the repository at this point in the history
Signed-off-by: Alex Kalenyuk <akalenyu@redhat.com>
  • Loading branch information
akalenyu committed Jan 22, 2024
1 parent 87e8eda commit d3f39cb
Show file tree
Hide file tree
Showing 11 changed files with 117 additions and 74 deletions.
2 changes: 1 addition & 1 deletion pkg/controller/clone-controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
13 changes: 7 additions & 6 deletions pkg/controller/datavolume/external-population-controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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.
Expand All @@ -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)
Expand Down
52 changes: 31 additions & 21 deletions pkg/controller/datavolume/import-controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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}})
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -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}})
Expand Down Expand Up @@ -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{}
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -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{}
Expand Down Expand Up @@ -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{}
Expand Down Expand Up @@ -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{}
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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)
Expand All @@ -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())
Expand Down Expand Up @@ -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.
Expand All @@ -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)
Expand Down
18 changes: 9 additions & 9 deletions pkg/controller/datavolume/pvc-clone-controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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.
Expand All @@ -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)
Expand Down
18 changes: 9 additions & 9 deletions pkg/controller/datavolume/snapshot-clone-controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -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.
Expand All @@ -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)
Expand Down
Loading

0 comments on commit d3f39cb

Please sign in to comment.