diff --git a/pkg/client/client_test.go b/pkg/client/client_test.go index c775f28718..80eecb5b32 100644 --- a/pkg/client/client_test.go +++ b/pkg/client/client_test.go @@ -51,6 +51,7 @@ import ( "sigs.k8s.io/controller-runtime/examples/crd/pkg" "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) func deleteDeployment(ctx context.Context, dep *appsv1.Deployment, ns string) { @@ -1733,6 +1734,7 @@ U5wwSivyi7vmegHKmblOzNVKA5qPO8zWzqBC nodeName := node.Name err = cl.Delete(ctx, node) Expect(err).NotTo(HaveOccurred()) + Expect(node.ObjectMeta.DeletionTimestamp).To(BeNil()) By("validating the Node no longer exists") _, err = clientset.CoreV1().Nodes().Get(ctx, nodeName, metav1.GetOptions{}) @@ -1749,6 +1751,36 @@ U5wwSivyi7vmegHKmblOzNVKA5qPO8zWzqBC Expect(err).To(HaveOccurred()) }) + It("should update the resource when deleting if it receives a response", func(ctx SpecContext) { + cl, err := client.New(cfg, client.Options{}) + Expect(err).NotTo(HaveOccurred()) + Expect(cl).NotTo(BeNil()) + + By("initially creating a Node") + node, err := clientset.CoreV1().Nodes().Create(ctx, node, metav1.CreateOptions{}) + Expect(err).NotTo(HaveOccurred()) + + By("adding a finalizer we prevent the node from being deleted immediately") + controllerutil.AddFinalizer(node, "example.com/test") + node, err = clientset.CoreV1().Nodes().Update(ctx, node, metav1.UpdateOptions{}) + Expect(err).NotTo(HaveOccurred()) + + By("deleting the Node") + nodeName := node.Name + err = cl.Delete(ctx, node) + Expect(err).NotTo(HaveOccurred()) + Expect(node.ObjectMeta.DeletionTimestamp).NotTo(BeNil()) + + By("removing the finalizer") + controllerutil.RemoveFinalizer(node, "example.com/test") + _, err = clientset.CoreV1().Nodes().Update(ctx, node, metav1.UpdateOptions{}) + Expect(err).NotTo(HaveOccurred()) + + By("validating the Node no longer exists") + _, err = clientset.CoreV1().Nodes().Get(ctx, nodeName, metav1.GetOptions{}) + Expect(err).To(HaveOccurred()) + }) + PIt("should fail if the object doesn't have meta", func() { }) @@ -1908,7 +1940,48 @@ U5wwSivyi7vmegHKmblOzNVKA5qPO8zWzqBC _, err = clientset.AppsV1().Deployments(ns).Get(ctx, dep2Name, metav1.GetOptions{}) Expect(err).To(HaveOccurred()) }) + + It("should update the resource when deleting if it receives a response", func(ctx SpecContext) { + cl, err := client.New(cfg, client.Options{}) + Expect(err).NotTo(HaveOccurred()) + Expect(cl).NotTo(BeNil()) + + By("initially creating a Node") + node, err := clientset.CoreV1().Nodes().Create(ctx, node, metav1.CreateOptions{}) + Expect(err).NotTo(HaveOccurred()) + + By("adding a finalizer we prevent the node from being deleted immediately") + controllerutil.AddFinalizer(node, "example.com/test") + node, err = clientset.CoreV1().Nodes().Update(ctx, node, metav1.UpdateOptions{}) + Expect(err).NotTo(HaveOccurred()) + + By("deleting the Node") + nodeName := node.Name + u := &unstructured.Unstructured{} + Expect(scheme.Convert(node, u, nil)).To(Succeed()) + u.SetGroupVersionKind(schema.GroupVersionKind{ + Group: "", + Kind: "Node", + Version: "v1", + }) + err = cl.Delete(ctx, u) + Expect(err).NotTo(HaveOccurred()) + + accessor, err := meta.Accessor(u) + Expect(err).NotTo(HaveOccurred()) + Expect(accessor.GetDeletionTimestamp()).NotTo(BeNil()) + + By("removing the finalizer") + controllerutil.RemoveFinalizer(u, "example.com/test") + err = cl.Delete(ctx, u) + Expect(err).NotTo(HaveOccurred()) + + By("validating the Node no longer exists") + _, err = clientset.CoreV1().Nodes().Get(ctx, nodeName, metav1.GetOptions{}) + Expect(err).NotTo(HaveOccurred()) + }) }) + Context("with metadata objects", func() { It("should delete an existing object from a go struct", func(ctx SpecContext) { cl, err := client.New(cfg, client.Options{}) diff --git a/pkg/client/dryrun_test.go b/pkg/client/dryrun_test.go index 912a4a10dc..522f0aded7 100644 --- a/pkg/client/dryrun_test.go +++ b/pkg/client/dryrun_test.go @@ -180,7 +180,8 @@ var _ = Describe("DryRunClient", func() { }) It("should not delete objects", func(ctx SpecContext) { - Expect(getClient().Delete(ctx, dep)).NotTo(HaveOccurred()) + changedDep := dep.DeepCopy() + Expect(getClient().Delete(ctx, changedDep)).NotTo(HaveOccurred()) actual, err := clientset.AppsV1().Deployments(ns).Get(ctx, dep.Name, metav1.GetOptions{}) Expect(err).NotTo(HaveOccurred()) @@ -191,7 +192,8 @@ var _ = Describe("DryRunClient", func() { It("should not delete objects with opts", func(ctx SpecContext) { opts := &client.DeleteOptions{DryRun: []string{"Bye", "Pippa"}} - Expect(getClient().Delete(ctx, dep, opts)).NotTo(HaveOccurred()) + changedDep := dep.DeepCopy() + Expect(getClient().Delete(ctx, changedDep, opts)).NotTo(HaveOccurred()) actual, err := clientset.AppsV1().Deployments(ns).Get(ctx, dep.Name, metav1.GetOptions{}) Expect(err).NotTo(HaveOccurred()) diff --git a/pkg/client/typed_client.go b/pkg/client/typed_client.go index 3bd762a638..7b503ac666 100644 --- a/pkg/client/typed_client.go +++ b/pkg/client/typed_client.go @@ -87,7 +87,7 @@ func (c *typedClient) Delete(ctx context.Context, obj Object, opts ...DeleteOpti Name(o.name). Body(deleteOpts.AsDeleteOptions()). Do(ctx). - Error() + Into(obj) } // DeleteAllOf implements client.Client. diff --git a/pkg/client/unstructured_client.go b/pkg/client/unstructured_client.go index e636c3beef..803f0d1ff3 100644 --- a/pkg/client/unstructured_client.go +++ b/pkg/client/unstructured_client.go @@ -112,7 +112,7 @@ func (uc *unstructuredClient) Delete(ctx context.Context, obj Object, opts ...De Name(o.name). Body(deleteOpts.AsDeleteOptions()). Do(ctx). - Error() + Into(obj) } // DeleteAllOf implements client.Client.