From 40dc51c5c3b9925e9def2b050fb1c5dd01009e24 Mon Sep 17 00:00:00 2001 From: michaelawyu Date: Fri, 12 Dec 2025 01:04:43 +1100 Subject: [PATCH] Set the work applier to skip status updates if possible Signed-off-by: michaelawyu --- .../workapplier/backoff_integration_test.go | 4 +- .../controller_integration_test.go | 500 +++++++++--------- pkg/controllers/workapplier/status.go | 50 +- .../workapplier/status_integration_test.go | 299 +++++++++++ pkg/controllers/workapplier/suite_test.go | 90 +++- .../workapplier/waves_integration_test.go | 10 +- 6 files changed, 684 insertions(+), 269 deletions(-) create mode 100644 pkg/controllers/workapplier/status_integration_test.go diff --git a/pkg/controllers/workapplier/backoff_integration_test.go b/pkg/controllers/workapplier/backoff_integration_test.go index 36571cc50..49efc919a 100644 --- a/pkg/controllers/workapplier/backoff_integration_test.go +++ b/pkg/controllers/workapplier/backoff_integration_test.go @@ -295,7 +295,7 @@ var _ = Describe("exponential backoff", func() { deleteWorkObject(workName, memberReservedNSName2) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -512,7 +512,7 @@ var _ = Describe("exponential backoff", func() { deleteWorkObject(workName, memberReservedNSName2) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) diff --git a/pkg/controllers/workapplier/controller_integration_test.go b/pkg/controllers/workapplier/controller_integration_test.go index 1e38ac695..8e6bd311d 100644 --- a/pkg/controllers/workapplier/controller_integration_test.go +++ b/pkg/controllers/workapplier/controller_integration_test.go @@ -137,11 +137,11 @@ func marshalK8sObjJSON(obj runtime.Object) []byte { return json } -func workFinalizerAddedActual(workName string) func() error { +func workFinalizerAddedActual(workNS, workName string) func() error { return func() error { // Retrieve the Work object. work := &fleetv1beta1.Work{} - if err := hubClient.Get(ctx, client.ObjectKey{Name: workName, Namespace: memberReservedNSName1}, work); err != nil { + if err := hubClient.Get(ctx, client.ObjectKey{Name: workName, Namespace: workNS}, work); err != nil { return fmt.Errorf("failed to retrieve the Work object: %w", err) } @@ -153,11 +153,11 @@ func workFinalizerAddedActual(workName string) func() error { } } -func appliedWorkCreatedActual(workName string) func() error { +func appliedWorkCreatedActual(memberClient client.Client, workNS, workName string) func() error { return func() error { // Retrieve the AppliedWork object. appliedWork := &fleetv1beta1.AppliedWork{} - if err := memberClient1.Get(ctx, client.ObjectKey{Name: workName, Namespace: memberReservedNSName1}, appliedWork); err != nil { + if err := memberClient.Get(ctx, client.ObjectKey{Name: workName}, appliedWork); err != nil { return fmt.Errorf("failed to retrieve the AppliedWork object: %w", err) } @@ -167,7 +167,7 @@ func appliedWorkCreatedActual(workName string) func() error { }, Spec: fleetv1beta1.AppliedWorkSpec{ WorkName: workName, - WorkNamespace: memberReservedNSName1, + WorkNamespace: workNS, }, } if diff := cmp.Diff( @@ -181,10 +181,10 @@ func appliedWorkCreatedActual(workName string) func() error { } } -func prepareAppliedWorkOwnerRef(workName string) *metav1.OwnerReference { +func prepareAppliedWorkOwnerRef(memberClient client.Client, workNS, workName string) *metav1.OwnerReference { // Retrieve the AppliedWork object. appliedWork := &fleetv1beta1.AppliedWork{} - Expect(memberClient1.Get(ctx, client.ObjectKey{Name: workName, Namespace: memberReservedNSName1}, appliedWork)).To(Succeed(), "Failed to retrieve the AppliedWork object") + Expect(memberClient.Get(ctx, client.ObjectKey{Name: workName, Namespace: workNS}, appliedWork)).To(Succeed(), "Failed to retrieve the AppliedWork object") // Prepare the expected OwnerReference. return &metav1.OwnerReference{ @@ -196,11 +196,11 @@ func prepareAppliedWorkOwnerRef(workName string) *metav1.OwnerReference { } } -func regularNSObjectAppliedActual(nsName string, appliedWorkOwnerRef *metav1.OwnerReference) func() error { +func regularNSObjectAppliedActual(memberClient client.Client, nsName string, appliedWorkOwnerRef *metav1.OwnerReference) func() error { return func() error { // Retrieve the NS object. gotNS := &corev1.Namespace{} - if err := memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, gotNS); err != nil { + if err := memberClient.Get(ctx, client.ObjectKey{Name: nsName}, gotNS); err != nil { return fmt.Errorf("failed to retrieve the NS object: %w", err) } @@ -378,11 +378,11 @@ func regularClusterRoleObjectAppliedActual(clusterRoleName string, appliedWorkOw } } -func regularConfigMapObjectAppliedActual(nsName, configMapName string, appliedWorkOwnerRef *metav1.OwnerReference) func() error { +func regularConfigMapObjectAppliedActual(memberClient client.Client, nsName, configMapName string, appliedWorkOwnerRef *metav1.OwnerReference) func() error { return func() error { // Retrieve the ConfigMap object. gotConfigMap := &corev1.ConfigMap{} - if err := memberClient1.Get(ctx, client.ObjectKey{Namespace: nsName, Name: configMapName}, gotConfigMap); err != nil { + if err := memberClient.Get(ctx, client.ObjectKey{Namespace: nsName, Name: configMapName}, gotConfigMap); err != nil { return fmt.Errorf("failed to retrieve the ConfigMap object: %w", err) } @@ -557,11 +557,11 @@ func workStatusUpdated( } } -func appliedWorkStatusUpdated(workName string, appliedResourceMeta []fleetv1beta1.AppliedResourceMeta) func() error { +func appliedWorkStatusUpdated(memberClient client.Client, workName string, appliedResourceMeta []fleetv1beta1.AppliedResourceMeta) func() error { return func() error { // Retrieve the AppliedWork object. appliedWork := &fleetv1beta1.AppliedWork{} - if err := memberClient1.Get(ctx, client.ObjectKey{Name: workName, Namespace: memberReservedNSName1}, appliedWork); err != nil { + if err := memberClient.Get(ctx, client.ObjectKey{Name: workName}, appliedWork); err != nil { return fmt.Errorf("failed to retrieve the AppliedWork object: %w", err) } @@ -602,10 +602,10 @@ func deleteWorkObject(workName, memberClusterReservedNSName string) { Expect(hubClient.Delete(ctx, work)).To(Succeed(), "Failed to delete the Work object") } -func checkNSOwnerReferences(workName, nsName string) { +func checkNSOwnerReferences(memberClient client.Client, workName, nsName string) { // Retrieve the AppliedWork object. appliedWork := &fleetv1beta1.AppliedWork{} - Expect(memberClient1.Get(ctx, client.ObjectKey{Name: workName}, appliedWork)).To(Succeed(), "Failed to retrieve the AppliedWork object") + Expect(memberClient.Get(ctx, client.ObjectKey{Name: workName}, appliedWork)).To(Succeed(), "Failed to retrieve the AppliedWork object") // Check that the Namespace object has the AppliedWork as an owner reference. ns := &corev1.Namespace{ @@ -613,7 +613,7 @@ func checkNSOwnerReferences(workName, nsName string) { Name: nsName, }, } - Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, ns)).To(Succeed(), "Failed to retrieve the Namespace object") + Expect(memberClient.Get(ctx, client.ObjectKey{Name: nsName}, ns)).To(Succeed(), "Failed to retrieve the Namespace object") Expect(ns.OwnerReferences).To(ContainElement(metav1.OwnerReference{ APIVersion: fleetv1beta1.GroupVersion.String(), Kind: "AppliedWork", @@ -623,7 +623,7 @@ func checkNSOwnerReferences(workName, nsName string) { }), " AppliedWork OwnerReference not found in Namespace object") } -func appliedWorkRemovedActual(workName, nsName string) func() error { +func appliedWorkRemovedActual(workName string) func() error { return func() error { // Retrieve the AppliedWork object. appliedWork := &fleetv1beta1.AppliedWork{} @@ -683,7 +683,7 @@ func regularClusterRoleRemovedActual(clusterRoleName string) func() error { } } -func regularConfigMapRemovedActual(nsName, configMapName string) func() error { +func regularConfigMapRemovedActual(memberClient client.Client, nsName, configMapName string) func() error { return func() error { // Retrieve the ConfigMap object. configMap := &corev1.ConfigMap{ @@ -692,12 +692,12 @@ func regularConfigMapRemovedActual(nsName, configMapName string) func() error { Name: configMapName, }, } - if err := memberClient1.Delete(ctx, configMap); err != nil && !errors.IsNotFound(err) { + if err := memberClient.Delete(ctx, configMap); err != nil && !errors.IsNotFound(err) { return fmt.Errorf("failed to delete the ConfigMap object: %w", err) } // Check that the ConfigMap object has been deleted. - if err := memberClient1.Get(ctx, client.ObjectKey{Namespace: nsName, Name: configMapName}, configMap); !errors.IsNotFound(err) { + if err := memberClient.Get(ctx, client.ObjectKey{Namespace: nsName, Name: configMapName}, configMap); !errors.IsNotFound(err) { return fmt.Errorf("configMap object still exists or an unexpected error occurred: %w", err) } return nil @@ -796,20 +796,20 @@ var _ = Describe("applying manifests", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -923,7 +923,7 @@ var _ = Describe("applying manifests", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -937,10 +937,10 @@ var _ = Describe("applying manifests", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -978,20 +978,20 @@ var _ = Describe("applying manifests", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -1105,7 +1105,7 @@ var _ = Describe("applying manifests", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -1186,7 +1186,7 @@ var _ = Describe("applying manifests", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -1196,10 +1196,10 @@ var _ = Describe("applying manifests", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -1244,15 +1244,15 @@ var _ = Describe("applying manifests", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply some of the manifests", func() { @@ -1383,7 +1383,7 @@ var _ = Describe("applying manifests", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -1393,10 +1393,10 @@ var _ = Describe("applying manifests", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -1444,26 +1444,26 @@ var _ = Describe("applying manifests", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") // Ensure that the ConfigMap object has been applied as expected. - regularConfigMapObjectAppliedActual := regularConfigMapObjectAppliedActual(nsName, configMapName, appliedWorkOwnerRef) + regularConfigMapObjectAppliedActual := regularConfigMapObjectAppliedActual(memberClient1, nsName, configMapName, appliedWorkOwnerRef) Eventually(regularConfigMapObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the ConfigMap object") Expect(memberClient1.Get(ctx, client.ObjectKey{Namespace: nsName, Name: configMapName}, regularConfigMap)).To(Succeed(), "Failed to retrieve the ConfigMap object") }) @@ -1575,7 +1575,7 @@ var _ = Describe("applying manifests", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -1584,15 +1584,15 @@ var _ = Describe("applying manifests", func() { deleteWorkObject(workName, memberReservedNSName1) // Ensure applied manifest has been removed. - regularConfigMapRemovedActual := regularConfigMapRemovedActual(nsName, configMapName) + regularConfigMapRemovedActual := regularConfigMapRemovedActual(memberClient1, nsName, configMapName) Eventually(regularConfigMapRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the ConfigMap object") // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -1632,15 +1632,15 @@ var _ = Describe("applying manifests", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should not apply malformed manifest", func() { @@ -1656,7 +1656,7 @@ var _ = Describe("applying manifests", func() { It("should apply the other manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -1738,7 +1738,7 @@ var _ = Describe("applying manifests", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -1747,7 +1747,7 @@ var _ = Describe("applying manifests", func() { deleteWorkObject(workName, memberReservedNSName1) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -1793,20 +1793,20 @@ var _ = Describe("work applier garbage collection", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -1920,7 +1920,7 @@ var _ = Describe("work applier garbage collection", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -2004,10 +2004,10 @@ var _ = Describe("work applier garbage collection", func() { AfterAll(func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -2058,20 +2058,20 @@ var _ = Describe("work applier garbage collection", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -2226,7 +2226,7 @@ var _ = Describe("work applier garbage collection", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -2320,14 +2320,14 @@ var _ = Describe("work applier garbage collection", func() { AfterAll(func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure applied manifest has been removed. regularDeployRemovedActual := regularDeployRemovedActual(nsName, deployName) Eventually(regularDeployRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the deployment object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -2377,20 +2377,20 @@ var _ = Describe("work applier garbage collection", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -2545,7 +2545,7 @@ var _ = Describe("work applier garbage collection", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -2637,14 +2637,14 @@ var _ = Describe("work applier garbage collection", func() { AfterAll(func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure applied manifest has been removed. regularClusterRoleRemovedActual := regularClusterRoleRemovedActual(clusterRoleName) Eventually(regularClusterRoleRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the ClusterRole object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -2700,20 +2700,20 @@ var _ = Describe("drift detection and takeover", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -2825,7 +2825,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -2839,10 +2839,10 @@ var _ = Describe("drift detection and takeover", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -2900,15 +2900,15 @@ var _ = Describe("drift detection and takeover", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply some manifests (while preserving diffs in unmanaged fields)", func() { @@ -3095,7 +3095,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -3108,7 +3108,7 @@ var _ = Describe("drift detection and takeover", func() { Consistently(regularDeployNotRemovedActual, consistentlyDuration, consistentlyInterval).Should(Succeed(), "Failed to remove the deployment object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -3165,12 +3165,12 @@ var _ = Describe("drift detection and takeover", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") }) @@ -3373,7 +3373,7 @@ var _ = Describe("drift detection and takeover", func() { It("should update the AppliedWork object status", func() { // No object can be applied, hence no resource are bookkept in the AppliedWork object status. - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, nil) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, nil) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -3386,7 +3386,7 @@ var _ = Describe("drift detection and takeover", func() { Consistently(regularDeployNotRemovedActual, consistentlyDuration, consistentlyInterval).Should(Succeed(), "Failed to remove the deployment object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -3428,20 +3428,20 @@ var _ = Describe("drift detection and takeover", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -3555,7 +3555,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -3787,7 +3787,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -3801,10 +3801,10 @@ var _ = Describe("drift detection and takeover", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -3855,15 +3855,15 @@ var _ = Describe("drift detection and takeover", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should update the Work object status", func() { @@ -3938,7 +3938,7 @@ var _ = Describe("drift detection and takeover", func() { It("should apply all manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -3978,7 +3978,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -4188,7 +4188,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -4201,7 +4201,7 @@ var _ = Describe("drift detection and takeover", func() { Consistently(jobNotRemovedActual, consistentlyDuration, consistentlyInterval).Should(Succeed(), "Failed to remove the job object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -4238,20 +4238,20 @@ var _ = Describe("drift detection and takeover", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -4318,7 +4318,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -4430,7 +4430,7 @@ var _ = Describe("drift detection and takeover", func() { It("should update the AppliedWork object status", func() { // No object can be applied, hence no resource are bookkept in the AppliedWork object status. - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, nil) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, nil) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -4439,7 +4439,7 @@ var _ = Describe("drift detection and takeover", func() { deleteWorkObject(workName, memberReservedNSName1) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -4478,20 +4478,20 @@ var _ = Describe("drift detection and takeover", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -4558,7 +4558,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -4684,7 +4684,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -4694,10 +4694,10 @@ var _ = Describe("drift detection and takeover", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -4735,20 +4735,20 @@ var _ = Describe("drift detection and takeover", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -4815,7 +4815,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -4928,7 +4928,7 @@ var _ = Describe("drift detection and takeover", func() { It("should update the AppliedWork object status", func() { // No object can be applied, hence no resource are bookkept in the AppliedWork object status. - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, nil) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, nil) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -5045,7 +5045,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -5055,10 +5055,10 @@ var _ = Describe("drift detection and takeover", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -5096,20 +5096,20 @@ var _ = Describe("drift detection and takeover", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -5176,7 +5176,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -5333,10 +5333,10 @@ var _ = Describe("drift detection and takeover", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -5381,15 +5381,15 @@ var _ = Describe("drift detection and takeover", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests that haven not been created yet", func() { @@ -5505,7 +5505,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -5518,7 +5518,7 @@ var _ = Describe("drift detection and takeover", func() { Eventually(regularDeployRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the deployment object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -5567,26 +5567,26 @@ var _ = Describe("drift detection and takeover", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") // Ensure that the ConfigMap object has been applied as expected. - regularCMObjectAppliedActual := regularConfigMapObjectAppliedActual(nsName, configMapName, appliedWorkOwnerRef) + regularCMObjectAppliedActual := regularConfigMapObjectAppliedActual(memberClient1, nsName, configMapName, appliedWorkOwnerRef) Eventually(regularCMObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the configMap object") Expect(memberClient1.Get(ctx, client.ObjectKey{Namespace: nsName, Name: configMapName}, regularCM)).To(Succeed(), "Failed to retrieve the ConfigMap object") @@ -5733,7 +5733,7 @@ var _ = Describe("drift detection and takeover", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -6093,7 +6093,7 @@ var _ = Describe("drift detection and takeover", func() { deleteWorkObject(workName, memberReservedNSName1) // Ensure that the ConfigMap object has been removed. - regularCMRemovedActual := regularConfigMapRemovedActual(nsName, configMapName) + regularCMRemovedActual := regularConfigMapRemovedActual(memberClient1, nsName, configMapName) Eventually(regularCMRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the ConfigMap object") // Ensure that the secret object has been removed. @@ -6102,10 +6102,10 @@ var _ = Describe("drift detection and takeover", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -6141,15 +6141,15 @@ var _ = Describe("report diff", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should not apply the manifests", func() { @@ -6202,7 +6202,7 @@ var _ = Describe("report diff", func() { It("should update the AppliedWork object status", func() { // Prepare the status information. - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, nil) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, nil) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -6211,7 +6211,7 @@ var _ = Describe("report diff", func() { deleteWorkObject(workName, memberReservedNSName1) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -6260,15 +6260,15 @@ var _ = Describe("report diff", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should own the objects, but not apply any manifests", func() { @@ -6436,7 +6436,7 @@ var _ = Describe("report diff", func() { // Prepare the status information. var appliedResourceMeta []fleetv1beta1.AppliedResourceMeta - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -6526,7 +6526,7 @@ var _ = Describe("report diff", func() { // Prepare the status information. var appliedResourceMeta []fleetv1beta1.AppliedResourceMeta - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -6539,7 +6539,7 @@ var _ = Describe("report diff", func() { Consistently(regularDeployNotRemovedActual, consistentlyDuration, consistentlyInterval).Should(Succeed(), "Failed to remove the deployment object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -6588,12 +6588,12 @@ var _ = Describe("report diff", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") }) @@ -6741,7 +6741,7 @@ var _ = Describe("report diff", func() { // Prepare the status information. var appliedResourceMeta []fleetv1beta1.AppliedResourceMeta - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -6754,7 +6754,7 @@ var _ = Describe("report diff", func() { Eventually(regularDeployRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the deployment object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -6797,15 +6797,15 @@ var _ = Describe("report diff", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should not apply any manifest", func() { @@ -6885,7 +6885,7 @@ var _ = Describe("report diff", func() { It("should update the AppliedWork object status", func() { // Prepare the status information. - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, nil) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, nil) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -6894,7 +6894,7 @@ var _ = Describe("report diff", func() { deleteWorkObject(workName, memberReservedNSName1) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -6950,15 +6950,15 @@ var _ = Describe("report diff", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should update the Work object status", func() { @@ -7147,7 +7147,7 @@ var _ = Describe("report diff", func() { // Prepare the status information. var appliedResourceMeta []fleetv1beta1.AppliedResourceMeta - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -7160,7 +7160,7 @@ var _ = Describe("report diff", func() { Consistently(jobNotRemovedActual, consistentlyDuration, consistentlyInterval).Should(Succeed(), "Failed to remove the job object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -7216,12 +7216,12 @@ var _ = Describe("report diff", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") }) @@ -7331,7 +7331,7 @@ var _ = Describe("report diff", func() { It("should update the AppliedWork object status", func() { // Prepare the status information. - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, nil) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, nil) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -7609,7 +7609,7 @@ var _ = Describe("report diff", func() { deleteWorkObject(workName, memberReservedNSName1) // Ensure that the ConfigMap object has been removed. - regularCMRemovedActual := regularConfigMapRemovedActual(nsName, configMapName) + regularCMRemovedActual := regularConfigMapRemovedActual(memberClient1, nsName, configMapName) Eventually(regularCMRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the ConfigMap object") // Ensure that the secret object has been removed. @@ -7617,7 +7617,7 @@ var _ = Describe("report diff", func() { Eventually(regularSecretRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the Secret object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -7668,15 +7668,15 @@ var _ = Describe("handling different apply strategies", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should own the objects, but not apply any manifests", func() { @@ -7844,7 +7844,7 @@ var _ = Describe("handling different apply strategies", func() { // Prepare the status information. var appliedResourceMeta []fleetv1beta1.AppliedResourceMeta - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -7966,7 +7966,7 @@ var _ = Describe("handling different apply strategies", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -7980,10 +7980,10 @@ var _ = Describe("handling different apply strategies", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -8025,20 +8025,20 @@ var _ = Describe("handling different apply strategies", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -8078,7 +8078,7 @@ var _ = Describe("handling different apply strategies", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -8227,7 +8227,7 @@ var _ = Describe("handling different apply strategies", func() { // Prepare the status information. var appliedResourceMeta []fleetv1beta1.AppliedResourceMeta - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -8241,10 +8241,10 @@ var _ = Describe("handling different apply strategies", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -8294,15 +8294,15 @@ var _ = Describe("handling different apply strategies", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should not take over some objects", func() { @@ -8462,7 +8462,7 @@ var _ = Describe("handling different apply strategies", func() { It("should take over some objects", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -8612,7 +8612,7 @@ var _ = Describe("handling different apply strategies", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -8626,10 +8626,10 @@ var _ = Describe("handling different apply strategies", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -8693,20 +8693,20 @@ var _ = Describe("handling different apply strategies", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -8837,7 +8837,7 @@ var _ = Describe("handling different apply strategies", func() { deleteWorkObject(workName, memberReservedNSName1) // Ensure that all applied manifests have been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") Eventually(func() error { @@ -8901,26 +8901,26 @@ var _ = Describe("negative cases", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply some manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") // Ensure that the ConfigMap object has been applied as expected. - regularConfigMapAppliedActual := regularConfigMapObjectAppliedActual(nsName, configMapName, appliedWorkOwnerRef) + regularConfigMapAppliedActual := regularConfigMapObjectAppliedActual(memberClient1, nsName, configMapName, appliedWorkOwnerRef) Eventually(regularConfigMapAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the ConfigMap object") Expect(memberClient1.Get(ctx, client.ObjectKey{Namespace: nsName, Name: configMapName}, regularConfigMap)).To(Succeed(), "Failed to retrieve the ConfigMap object") @@ -9037,7 +9037,7 @@ var _ = Describe("negative cases", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") Consistently(appliedWorkStatusUpdatedActual, consistentlyDuration, consistentlyInterval).Should(Succeed(), "AppliedWork status changed unexpectedly") }) @@ -9047,15 +9047,15 @@ var _ = Describe("negative cases", func() { deleteWorkObject(workName, memberReservedNSName1) // Ensure applied manifest has been removed. - regularConfigMapRemovedActual := regularConfigMapRemovedActual(nsName, configMapName) + regularConfigMapRemovedActual := regularConfigMapRemovedActual(memberClient1, nsName, configMapName) Eventually(regularConfigMapRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the configMap object") // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -9094,20 +9094,20 @@ var _ = Describe("negative cases", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply some manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -9188,7 +9188,7 @@ var _ = Describe("negative cases", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") Consistently(appliedWorkStatusUpdatedActual, consistentlyDuration, consistentlyInterval).Should(Succeed(), "AppliedWork status changed unexpectedly") }) @@ -9199,10 +9199,10 @@ var _ = Describe("negative cases", func() { // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -9245,26 +9245,26 @@ var _ = Describe("negative cases", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply some manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") // Ensure that the ConfigMap object has been applied as expected. - regularConfigMapAppliedActual := regularConfigMapObjectAppliedActual(nsName, configMapName, appliedWorkOwnerRef) + regularConfigMapAppliedActual := regularConfigMapObjectAppliedActual(memberClient1, nsName, configMapName, appliedWorkOwnerRef) Eventually(regularConfigMapAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the ConfigMap object") Expect(memberClient1.Get(ctx, client.ObjectKey{Namespace: nsName, Name: configMapName}, regularConfigMap)).To(Succeed(), "Failed to retrieve the ConfigMap object") @@ -9382,7 +9382,7 @@ var _ = Describe("negative cases", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") Consistently(appliedWorkStatusUpdatedActual, consistentlyDuration, consistentlyInterval).Should(Succeed(), "AppliedWork status changed unexpectedly") }) @@ -9440,26 +9440,26 @@ var _ = Describe("negative cases", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("should apply some manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") // Ensure that the ConfigMap object has been applied as expected. - regularConfigMapAppliedActual := regularConfigMapObjectAppliedActual(nsName, configMapName, appliedWorkOwnerRef) + regularConfigMapAppliedActual := regularConfigMapObjectAppliedActual(memberClient1, nsName, configMapName, appliedWorkOwnerRef) Eventually(regularConfigMapAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the ConfigMap object") Expect(memberClient1.Get(ctx, client.ObjectKey{Namespace: nsName, Name: configMapName}, regularConfigMap)).To(Succeed(), "Failed to retrieve the ConfigMap object") @@ -9613,7 +9613,7 @@ var _ = Describe("negative cases", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") Consistently(appliedWorkStatusUpdatedActual, consistentlyDuration, consistentlyInterval).Should(Succeed(), "AppliedWork status changed unexpectedly") }) @@ -9623,15 +9623,15 @@ var _ = Describe("negative cases", func() { deleteWorkObject(workName, memberReservedNSName1) // Ensure applied manifest has been removed. - regularConfigMapRemovedActual := regularConfigMapRemovedActual(nsName, configMapName) + regularConfigMapRemovedActual := regularConfigMapRemovedActual(memberClient1, nsName, configMapName) Eventually(regularConfigMapRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the configMap object") // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -9727,15 +9727,15 @@ var _ = Describe("status back-reporting", func() { }) It("should add cleanup finalizer to the Work object", func() { - finalizerAddedActual := workFinalizerAddedActual(workName) + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName1, workName) Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") }) It("should prepare an AppliedWork object", func() { - appliedWorkCreatedActual := appliedWorkCreatedActual(workName) + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient1, memberReservedNSName1, workName) Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") - appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(workName) + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient1, memberReservedNSName1, workName) }) It("can mark the deployment as available", func() { @@ -9839,7 +9839,7 @@ var _ = Describe("status back-reporting", func() { It("should apply the manifests", func() { // Ensure that the NS object has been applied as expected. - regularNSObjectAppliedActual := regularNSObjectAppliedActual(nsName, appliedWorkOwnerRef) + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient1, nsName, appliedWorkOwnerRef) Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") Expect(memberClient1.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") @@ -9851,7 +9851,7 @@ var _ = Describe("status back-reporting", func() { Expect(memberClient1.Get(ctx, client.ObjectKey{Namespace: nsName, Name: deployName}, regularDeploy)).To(Succeed(), "Failed to retrieve the Deployment object") // Ensure that the ConfigMap object has been applied as expected. - regularCMObjectAppliedActual := regularConfigMapObjectAppliedActual(nsName, configMapName, appliedWorkOwnerRef) + regularCMObjectAppliedActual := regularConfigMapObjectAppliedActual(memberClient1, nsName, configMapName, appliedWorkOwnerRef) Eventually(regularCMObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the config map object") Expect(memberClient1.Get(ctx, client.ObjectKey{Namespace: nsName, Name: configMapName}, regularCM)).To(Succeed(), "Failed to retrieve the ConfigMap object") @@ -9986,7 +9986,7 @@ var _ = Describe("status back-reporting", func() { }, } - appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(workName, appliedResourceMeta) + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient1, workName, appliedResourceMeta) Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") }) @@ -9998,15 +9998,15 @@ var _ = Describe("status back-reporting", func() { regularDeployRemovedActual := regularDeployRemovedActual(nsName, deployName) Eventually(regularDeployRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the deployment object") - regularCMRemovedActual := regularConfigMapRemovedActual(nsName, configMapName) + regularCMRemovedActual := regularConfigMapRemovedActual(memberClient1, nsName, configMapName) Eventually(regularCMRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the configMap object") // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). - checkNSOwnerReferences(workName, nsName) + checkNSOwnerReferences(memberClient1, workName, nsName) // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) diff --git a/pkg/controllers/workapplier/status.go b/pkg/controllers/workapplier/status.go index dd8a428a1..2bbe4ee18 100644 --- a/pkg/controllers/workapplier/status.go +++ b/pkg/controllers/workapplier/status.go @@ -21,6 +21,7 @@ import ( "encoding/json" "fmt" + "k8s.io/apimachinery/pkg/api/equality" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -42,11 +43,13 @@ const ( // refreshWorkStatus refreshes the status of a Work object based on the processing results of its manifests. // // TO-DO (chenyu1): refactor this method a bit to reduce its complexity and enable parallelization. -func (r *Reconciler) refreshWorkStatus( +func (r *Reconciler) refreshWorkStatus( //nolint:gocyclo ctx context.Context, work *fleetv1beta1.Work, bundles []*manifestProcessingBundle, ) error { + originalStatus := work.Status.DeepCopy() + // Note (chenyu1): this method can run in parallel; however, for simplicity reasons, // considering that in most of the time the count of manifests would be low, currently // Fleet still does the status refresh sequentially. @@ -100,6 +103,7 @@ func (r *Reconciler) refreshWorkStatus( // Set the two flags here as they are per-work-object settings. isReportDiffModeOn := work.Spec.ApplyStrategy != nil && work.Spec.ApplyStrategy.Type == fleetv1beta1.ApplyStrategyTypeReportDiff isStatusBackReportingOn := work.Spec.ReportBackStrategy != nil && work.Spec.ReportBackStrategy.Type == fleetv1beta1.ReportBackStrategyTypeMirror + isDriftedOrDiffed := false for idx := range bundles { bundle := bundles[idx] @@ -128,6 +132,8 @@ func (r *Reconciler) refreshWorkStatus( // Reset the drift details (such details need no port-back). manifestCond.DriftDetails = nil if len(bundle.drifts) > 0 { + isDriftedOrDiffed = true + // Populate drift details if there are drifts found. var observedInMemberClusterGen int64 if bundle.inMemberClusterObj != nil { @@ -150,6 +156,8 @@ func (r *Reconciler) refreshWorkStatus( // Reset the diff details (such details need no port-back). manifestCond.DiffDetails = nil if len(bundle.diffs) > 0 { + isDriftedOrDiffed = true + // Populate diff details if there are diffs found. var observedInMemberClusterGen *int64 if bundle.inMemberClusterObj != nil { @@ -248,8 +256,14 @@ func (r *Reconciler) refreshWorkStatus( setWorkStatusTrimmedCondition(work, sizeDeltaBytes, resource.DefaultObjSizeLimitWithPaddingBytes) // Update the Work object status. - if err := r.hubClient.Status().Update(ctx, work); err != nil { - return controller.NewAPIServerError(false, err) + if shouldSkipStatusUpdate(isDriftedOrDiffed, isStatusBackReportingOn, originalStatus, &work.Status) { + // No status change found; skip the update. + klog.V(2).InfoS("No status change found for Work object; skip the status update", "work", klog.KObj(work)) + } else { + klog.V(2).InfoS("Refreshing work object status", "work", klog.KObj(work), "isDriftedOrDiffed", isDriftedOrDiffed, "isStatusBackReportingOn", isStatusBackReportingOn) + if err := r.hubClient.Status().Update(ctx, work); err != nil { + return controller.NewAPIServerError(false, err) + } } return nil } @@ -260,6 +274,8 @@ func (r *Reconciler) refreshAppliedWorkStatus( appliedWork *fleetv1beta1.AppliedWork, bundles []*manifestProcessingBundle, ) error { + originalStatus := appliedWork.Status.DeepCopy() + // Note (chenyu1): this method can run in parallel; however, for simplicity reasons, // considering that in most of the time the count of manifests would be low, currently // Fleet still does the status refresh sequentially. @@ -284,12 +300,18 @@ func (r *Reconciler) refreshAppliedWorkStatus( // Update the AppliedWork object status. appliedWork.Status.AppliedResources = appliedResources - if err := r.spokeClient.Status().Update(ctx, appliedWork); err != nil { - klog.ErrorS(err, "Failed to update AppliedWork status", - "appliedWork", klog.KObj(appliedWork)) - return controller.NewAPIServerError(false, err) + + // Skip the status update if no change found. + if equality.Semantic.DeepEqual(originalStatus, &appliedWork.Status) { + klog.V(2).InfoS("No status change found for AppliedWork object; skip the status update", "appliedWork", klog.KObj(appliedWork)) + } else { + klog.V(2).InfoS("Refreshing AppliedWork object status", "appliedWork", klog.KObj(appliedWork)) + if err := r.spokeClient.Status().Update(ctx, appliedWork); err != nil { + klog.ErrorS(err, "Failed to update AppliedWork status", + "appliedWork", klog.KObj(appliedWork)) + return controller.NewAPIServerError(false, err) + } } - klog.V(2).InfoS("Refreshed AppliedWork object status", "appliedWork", klog.KObj(appliedWork)) return nil } @@ -832,3 +854,15 @@ func setWorkStatusTrimmedCondition(work *fleetv1beta1.Work, sizeDeltaBytes, size ObservedGeneration: work.Generation, }) } + +func shouldSkipStatusUpdate(isDriftedOrDiffed, isStatusBackReportingOn bool, originalStatus, currentStatus *fleetv1beta1.WorkStatus) bool { + if isDriftedOrDiffed || isStatusBackReportingOn { + // Always proceed with status update if there are drifts/diffs detected or if status back-reporting is on. + // This is necessary as the drift/diff details and back-reported status data are timestamped and the timestamps are + // always refreshed per reconciliation loop. + return false + } + + // Skip status update if there is no change in the status. + return equality.Semantic.DeepEqual(originalStatus, currentStatus) +} diff --git a/pkg/controllers/workapplier/status_integration_test.go b/pkg/controllers/workapplier/status_integration_test.go new file mode 100644 index 000000000..66b98eb2b --- /dev/null +++ b/pkg/controllers/workapplier/status_integration_test.go @@ -0,0 +1,299 @@ +/* +Copyright 2025 The KubeFleet Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package workapplier + +import ( + "context" + "fmt" + "sync" + "time" + + crossplanetest "github.com/crossplane/crossplane-runtime/v2/pkg/test" + fleetv1beta1 "github.com/kubefleet-dev/kubefleet/apis/placement/v1beta1" + "github.com/kubefleet-dev/kubefleet/pkg/utils" + "github.com/kubefleet-dev/kubefleet/pkg/utils/condition" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +// Note (chenyu1): all test cases in this file use a separate test environment +// (same hub cluster, different fleet member reserved namespace, different +// work applier instance) from the other integration tests. This is needed +// as a client wrapper is used to verify the work applier behavior. + +type clientWrapperWithStatusUpdateCounter struct { + *crossplanetest.MockClient + + mu sync.Mutex + statusUpdateCount map[string]int +} + +func (c *clientWrapperWithStatusUpdateCounter) GetStatusUpdateCount(workNS, workName string) int { + c.mu.Lock() + defer c.mu.Unlock() + + return c.statusUpdateCount[fmt.Sprintf("%s/%s", workNS, workName)] +} + +func NewClientWrapperWithStatusUpdateCounter(realClient client.Client) client.Client { + wrapper := &clientWrapperWithStatusUpdateCounter{ + statusUpdateCount: make(map[string]int), + } + + wrapper.MockClient = &crossplanetest.MockClient{ + MockGet: func(ctx context.Context, key client.ObjectKey, obj client.Object) error { + return realClient.Get(ctx, key, obj) + }, + MockList: func(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error { + return realClient.List(ctx, list, opts...) + }, + MockCreate: func(ctx context.Context, obj client.Object, opts ...client.CreateOption) error { + return realClient.Create(ctx, obj, opts...) + }, + MockDelete: func(ctx context.Context, obj client.Object, opts ...client.DeleteOption) error { + return realClient.Delete(ctx, obj, opts...) + }, + MockDeleteAllOf: func(ctx context.Context, obj client.Object, opts ...client.DeleteAllOfOption) error { + return realClient.DeleteAllOf(ctx, obj, opts...) + }, + MockUpdate: func(ctx context.Context, obj client.Object, opts ...client.UpdateOption) error { + return realClient.Update(ctx, obj, opts...) + }, + MockPatch: func(ctx context.Context, obj client.Object, patch client.Patch, opts ...client.PatchOption) error { + return realClient.Patch(ctx, obj, patch, opts...) + }, + MockApply: func(ctx context.Context, config runtime.ApplyConfiguration, opts ...client.ApplyOption) error { + return realClient.Apply(ctx, config, opts...) + }, + MockStatusUpdate: func(ctx context.Context, obj client.Object, opts ...client.SubResourceUpdateOption) error { + wrapper.mu.Lock() + defer wrapper.mu.Unlock() + + objNS := obj.GetNamespace() + objName := obj.GetName() + key := fmt.Sprintf("%s/%s", objNS, objName) + wrapper.statusUpdateCount[key]++ + return realClient.Status().Update(ctx, obj, opts...) + }, + MockStatusPatch: func(ctx context.Context, obj client.Object, patch client.Patch, opts ...client.SubResourcePatchOption) error { + return realClient.Status().Patch(ctx, obj, patch, opts...) + }, + } + + return wrapper +} + +var _ = Describe("skipping status update", func() { + Context("apply new manifests", Ordered, func() { + workName := fmt.Sprintf(workNameTemplate, utils.RandStr()) + // The environment prepared by the envtest package does not support namespace + // deletion; each test case would use a new namespace. + nsName := fmt.Sprintf(nsNameTemplate, utils.RandStr()) + + var appliedWorkOwnerRef *metav1.OwnerReference + var regularNS *corev1.Namespace + var regularCM *corev1.ConfigMap + + BeforeAll(func() { + // Prepare a NS object. + regularNS = ns.DeepCopy() + regularNS.Name = nsName + regularNSJSON := marshalK8sObjJSON(regularNS) + + // Prepare a ConfigMap object. + regularCM = configMap.DeepCopy() + regularCM.Namespace = nsName + regularCM.Name = configMapName + regularCMJSON := marshalK8sObjJSON(regularCM) + + // Create a new Work object with all the manifest JSONs. + createWorkObject(workName, memberReservedNSName4, nil, nil, regularNSJSON, regularCMJSON) + }) + + It("should add cleanup finalizer to the Work object", func() { + finalizerAddedActual := workFinalizerAddedActual(memberReservedNSName4, workName) + Eventually(finalizerAddedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to add cleanup finalizer to the Work object") + }) + + It("should prepare an AppliedWork object", func() { + appliedWorkCreatedActual := appliedWorkCreatedActual(memberClient4, memberReservedNSName4, workName) + Eventually(appliedWorkCreatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to prepare an AppliedWork object") + + appliedWorkOwnerRef = prepareAppliedWorkOwnerRef(memberClient4, memberReservedNSName4, workName) + }) + + It("should apply the manifests", func() { + // Ensure that the NS object has been applied as expected. + regularNSObjectAppliedActual := regularNSObjectAppliedActual(memberClient4, nsName, appliedWorkOwnerRef) + Eventually(regularNSObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the namespace object") + + Expect(memberClient4.Get(ctx, client.ObjectKey{Name: nsName}, regularNS)).To(Succeed(), "Failed to retrieve the NS object") + + // Ensure that the ConfigMap object has been applied as expected. + regularConfigMapObjectAppliedActual := regularConfigMapObjectAppliedActual(memberClient4, nsName, configMapName, appliedWorkOwnerRef) + Eventually(regularConfigMapObjectAppliedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to apply the ConfigMap object") + + Expect(memberClient4.Get(ctx, client.ObjectKey{Namespace: nsName, Name: configMapName}, regularCM)).To(Succeed(), "Failed to retrieve the ConfigMap object") + }) + + It("should update the AppliedWork object status", func() { + // Prepare the status information. + appliedResourceMeta := []fleetv1beta1.AppliedResourceMeta{ + { + WorkResourceIdentifier: fleetv1beta1.WorkResourceIdentifier{ + Ordinal: 0, + Group: "", + Version: "v1", + Kind: "Namespace", + Resource: "namespaces", + Name: nsName, + }, + UID: regularNS.UID, + }, + { + WorkResourceIdentifier: fleetv1beta1.WorkResourceIdentifier{ + Ordinal: 1, + Group: "", + Version: "v1", + Kind: "ConfigMap", + Resource: "configmaps", + Name: configMapName, + Namespace: nsName, + }, + UID: regularCM.UID, + }, + } + + appliedWorkStatusUpdatedActual := appliedWorkStatusUpdated(memberClient4, workName, appliedResourceMeta) + Eventually(appliedWorkStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update appliedWork status") + }) + + It("should update the Work object status", func() { + // Prepare the status information. + workConds := []metav1.Condition{ + { + Type: fleetv1beta1.WorkConditionTypeApplied, + Status: metav1.ConditionTrue, + Reason: condition.WorkAllManifestsAppliedReason, + }, + { + Type: fleetv1beta1.WorkConditionTypeAvailable, + Status: metav1.ConditionTrue, + Reason: condition.WorkAllManifestsAvailableReason, + }, + } + manifestConds := []fleetv1beta1.ManifestCondition{ + { + Identifier: fleetv1beta1.WorkResourceIdentifier{ + Ordinal: 0, + Group: "", + Version: "v1", + Kind: "Namespace", + Resource: "namespaces", + Name: nsName, + }, + Conditions: []metav1.Condition{ + { + Type: fleetv1beta1.WorkConditionTypeApplied, + Status: metav1.ConditionTrue, + Reason: string(ApplyOrReportDiffResTypeApplied), + ObservedGeneration: 0, + }, + { + Type: fleetv1beta1.WorkConditionTypeAvailable, + Status: metav1.ConditionTrue, + Reason: string(AvailabilityResultTypeAvailable), + ObservedGeneration: 0, + }, + }, + }, + { + Identifier: fleetv1beta1.WorkResourceIdentifier{ + Ordinal: 1, + Group: "", + Version: "v1", + Kind: "ConfigMap", + Resource: "configmaps", + Name: configMapName, + Namespace: nsName, + }, + Conditions: []metav1.Condition{ + { + Type: fleetv1beta1.WorkConditionTypeApplied, + Status: metav1.ConditionTrue, + Reason: string(ApplyOrReportDiffResTypeApplied), + ObservedGeneration: 0, + }, + { + Type: fleetv1beta1.WorkConditionTypeAvailable, + Status: metav1.ConditionTrue, + Reason: string(AvailabilityResultTypeAvailable), + ObservedGeneration: 0, + }, + }, + }, + } + + workStatusUpdatedActual := workStatusUpdated(memberReservedNSName4, workName, workConds, manifestConds, nil, nil) + Eventually(workStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update work status") + // With the default backoff setup, this Consistently duration should allow 10-15 reconciliations. + Consistently(workStatusUpdatedActual, time.Minute*2, time.Second*10).Should(Succeed(), "Work status was updated unexpectedly") + }) + + It("should have skipped most status updates", func() { + memberClientStatusUpdateCount := memberClient4Wrapper.GetStatusUpdateCount("", workName) + // There should be 1 status update on the member cluster side in total: + // 1) one status update for populating the initial appliedWork status after all manifests have been applied. + wantMemberClientStatusUpdateCount := 1 + Expect(memberClientStatusUpdateCount).To(Equal(wantMemberClientStatusUpdateCount), "Unexpected number of status updates") + + hubClientStatusUpdateCount := hubClientWrapperForWorkApplier4.GetStatusUpdateCount(memberReservedNSName4, workName) + // There should be 2 status updates on the hub cluster side in total: + // 1) one status update for writing ahead the manifests to be applied; + // 2) one status update for populating the initial work status after all manifests have been applied. + wantHubClientStatusUpdateCount := 2 + Expect(hubClientStatusUpdateCount).To(Equal(wantHubClientStatusUpdateCount), "Unexpected number of status updates") + }) + + AfterAll(func() { + // Delete the Work object and related resources. + deleteWorkObject(workName, memberReservedNSName4) + + // Ensure applied manifest has been removed. + regularCMRemovedActual := regularConfigMapRemovedActual(memberClient4, nsName, configMapName) + Eventually(regularCMRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the ConfigMap object") + + // Kubebuilder suggests that in a testing environment like this, to check for the existence of the AppliedWork object + // OwnerReference in the Namespace object (https://book.kubebuilder.io/reference/envtest.html#testing-considerations). + checkNSOwnerReferences(memberClient4, workName, nsName) + + // Ensure that the AppliedWork object has been removed. + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) + Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") + + workRemovedActual := workRemovedActual(workName) + Eventually(workRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the Work object") + + // The environment prepared by the envtest package does not support namespace + // deletion; consequently this test suite would not attempt to verify its deletion. + }) + }) +}) diff --git a/pkg/controllers/workapplier/suite_test.go b/pkg/controllers/workapplier/suite_test.go index ecab1d12f..01787af13 100644 --- a/pkg/controllers/workapplier/suite_test.go +++ b/pkg/controllers/workapplier/suite_test.go @@ -80,6 +80,15 @@ var ( memberDynamicClient3 dynamic.Interface workApplier3 *Reconciler + memberCfg4 *rest.Config + memberEnv4 *envtest.Environment + hubMgr4 manager.Manager + memberClient4 client.Client + memberClient4Wrapper *clientWrapperWithStatusUpdateCounter + memberDynamicClient4 dynamic.Interface + workApplier4 *Reconciler + hubClientWrapperForWorkApplier4 *clientWrapperWithStatusUpdateCounter + ctx context.Context cancel context.CancelFunc wg sync.WaitGroup @@ -94,6 +103,7 @@ const ( memberReservedNSName1 = "fleet-member-experimental-1" memberReservedNSName2 = "fleet-member-experimental-2" memberReservedNSName3 = "fleet-member-experimental-3" + memberReservedNSName4 = "fleet-member-experimental-4" parallelizerFixedDelay = time.Second * 5 ) @@ -147,6 +157,13 @@ func setupResources() { }, } Expect(hubClient.Create(ctx, ns3)).To(Succeed()) + + ns4 := &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: memberReservedNSName4, + }, + } + Expect(hubClient.Create(ctx, ns4)).To(Succeed()) } var _ = BeforeSuite(func() { @@ -193,6 +210,14 @@ var _ = BeforeSuite(func() { filepath.Join("../../../", "test", "manifests"), }, } + // memberEnv4 is the test environment for verifying that work applier can skip status updates as + // expected. + memberEnv4 = &envtest.Environment{ + CRDDirectoryPaths: []string{ + filepath.Join("../../../", "config", "crd", "bases"), + filepath.Join("../../../", "test", "manifests"), + }, + } var err error hubCfg, err = hubEnv.Start() @@ -211,9 +236,9 @@ var _ = BeforeSuite(func() { Expect(err).ToNot(HaveOccurred()) Expect(memberCfg3).ToNot(BeNil()) - memberCfg2, err = memberEnv2.Start() + memberCfg4, err = memberEnv4.Start() Expect(err).ToNot(HaveOccurred()) - Expect(memberCfg2).ToNot(BeNil()) + Expect(memberCfg4).ToNot(BeNil()) err = batchv1.AddToScheme(scheme.Scheme) Expect(err).NotTo(HaveOccurred()) @@ -239,6 +264,10 @@ var _ = BeforeSuite(func() { Expect(err).ToNot(HaveOccurred()) Expect(memberClient3).ToNot(BeNil()) + memberClient4, err = client.New(memberCfg4, client.Options{Scheme: scheme.Scheme}) + Expect(err).ToNot(HaveOccurred()) + Expect(memberClient4).ToNot(BeNil()) + // This setup also requires a client-go dynamic client for the member cluster. memberDynamicClient1, err = dynamic.NewForConfig(memberCfg1) Expect(err).ToNot(HaveOccurred()) @@ -249,6 +278,9 @@ var _ = BeforeSuite(func() { memberDynamicClient3, err = dynamic.NewForConfig(memberCfg3) Expect(err).ToNot(HaveOccurred()) + memberDynamicClient4, err = dynamic.NewForConfig(memberCfg4) + Expect(err).ToNot(HaveOccurred()) + By("Setting up the resources") setupResources() @@ -331,7 +363,7 @@ var _ = BeforeSuite(func() { superLongExponentialBackoffRateLimiter, ) // Due to name conflicts, the second work applier must be set up manually. - err = ctrl.NewControllerManagedBy(hubMgr2).Named("work-applier-controller-duplicate"). + err = ctrl.NewControllerManagedBy(hubMgr2).Named("work-applier-controller-exponential-backoff"). WithOptions(ctrloption.Options{ MaxConcurrentReconciles: workApplier2.concurrentReconciles, }). @@ -383,8 +415,50 @@ var _ = BeforeSuite(func() { Complete(workApplier3) Expect(err).NotTo(HaveOccurred()) + By("Setting up the controller and the controller manager for member cluster 4") + hubMgr4, err = ctrl.NewManager(hubCfg, ctrl.Options{ + Scheme: scheme.Scheme, + Metrics: server.Options{ + BindAddress: "0", + }, + Cache: cache.Options{ + DefaultNamespaces: map[string]cache.Config{ + memberReservedNSName4: {}, + }, + }, + Logger: textlogger.NewLogger(textlogger.NewConfig(textlogger.Verbosity(4))), + }) + Expect(err).ToNot(HaveOccurred()) + + wrappedHubClient := NewClientWrapperWithStatusUpdateCounter(hubClient) + hubClientWrapperForWorkApplier4 = wrappedHubClient.(*clientWrapperWithStatusUpdateCounter) + wrappedMemberClient4 := NewClientWrapperWithStatusUpdateCounter(memberClient4) + memberClient4Wrapper = wrappedMemberClient4.(*clientWrapperWithStatusUpdateCounter) + workApplier4 = NewReconciler( + wrappedHubClient, + memberReservedNSName4, + memberDynamicClient4, + wrappedMemberClient4, + memberClient4.RESTMapper(), + hubMgr4.GetEventRecorderFor("work-applier"), + maxConcurrentReconciles, + parallelizer.NewParallelizer(workerCount), + 30*time.Second, + true, + 60, + nil, // Use the default backoff rate limiter. + ) + // Due to name conflicts, the third work applier must be set up manually. + err = ctrl.NewControllerManagedBy(hubMgr4).Named("work-applier-controller-skipping-status-update"). + WithOptions(ctrloption.Options{ + MaxConcurrentReconciles: workApplier4.concurrentReconciles, + }). + For(&fleetv1beta1.Work{}, builder.WithPredicates(predicate.GenerationChangedPredicate{})). + Complete(workApplier4) + Expect(err).NotTo(HaveOccurred()) + wg = sync.WaitGroup{} - wg.Add(3) + wg.Add(4) go func() { defer GinkgoRecover() defer wg.Done() @@ -405,6 +479,13 @@ var _ = BeforeSuite(func() { Expect(workApplier3.Join(ctx)).To(Succeed()) Expect(hubMgr3.Start(ctx)).To(Succeed()) }() + + go func() { + defer GinkgoRecover() + defer wg.Done() + Expect(workApplier4.Join(ctx)).To(Succeed()) + Expect(hubMgr4.Start(ctx)).To(Succeed()) + }() }) var _ = AfterSuite(func() { @@ -417,4 +498,5 @@ var _ = AfterSuite(func() { Expect(memberEnv1.Stop()).To(Succeed()) Expect(memberEnv2.Stop()).To(Succeed()) Expect(memberEnv3.Stop()).To(Succeed()) + Expect(memberEnv4.Stop()).To(Succeed()) }) diff --git a/pkg/controllers/workapplier/waves_integration_test.go b/pkg/controllers/workapplier/waves_integration_test.go index 9dd5a83bb..b5fe1f6c8 100644 --- a/pkg/controllers/workapplier/waves_integration_test.go +++ b/pkg/controllers/workapplier/waves_integration_test.go @@ -196,7 +196,7 @@ var _ = Describe("parallel processing with waves", func() { }, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the PriorityClass object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -325,11 +325,11 @@ var _ = Describe("parallel processing with waves", func() { deleteWorkObject(workName, memberReservedNSName3) // Remove the ConfigMap object if it still exists. - cmRemovedActual := regularConfigMapRemovedActual(nsName, configMapName) + cmRemovedActual := regularConfigMapRemovedActual(memberClient3, nsName, configMapName) Eventually(cmRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the ConfigMap object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -488,7 +488,7 @@ var _ = Describe("parallel processing with waves", func() { }, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the Role object") // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName) @@ -1257,7 +1257,7 @@ var _ = Describe("parallel processing with waves", func() { } // Ensure that the AppliedWork object has been removed. - appliedWorkRemovedActual := appliedWorkRemovedActual(workName, nsName) + appliedWorkRemovedActual := appliedWorkRemovedActual(workName) Eventually(appliedWorkRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove the AppliedWork object") workRemovedActual := workRemovedActual(workName)