From ffed6534e64bd790195cd335e289f80f434efb81 Mon Sep 17 00:00:00 2001 From: Thomas Eckert Date: Fri, 14 Oct 2022 20:26:12 -0400 Subject: [PATCH] WIP: testing CR deletion --- cli/cmd/uninstall/uninstall.go | 29 +++--------- cli/cmd/uninstall/uninstall_test.go | 70 +++++++++++++++++++++++++++-- 2 files changed, 73 insertions(+), 26 deletions(-) diff --git a/cli/cmd/uninstall/uninstall.go b/cli/cmd/uninstall/uninstall.go index 4049d34bfe..d36fc978a5 100644 --- a/cli/cmd/uninstall/uninstall.go +++ b/cli/cmd/uninstall/uninstall.go @@ -21,7 +21,6 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes" - "k8s.io/client-go/rest" "sigs.k8s.io/controller-runtime/pkg/client" ) @@ -50,7 +49,6 @@ type Command struct { helmActionsRunner helm.HelmActionsRunner // Configuration for interacting with Kubernetes. - restConfig *rest.Config kubernetes kubernetes.Interface client client.Client @@ -356,20 +354,13 @@ func (c *Command) initKubernetes(settings *helmCLI.EnvSettings) error { settings.KubeContext = c.flagKubeContext } - if c.restConfig == nil { - if c.restConfig, err = settings.RESTClientGetter().ToRESTConfig(); err != nil { - return fmt.Errorf("error creating Kubernetes REST config %v", err) - } + restConfig, err := settings.RESTClientGetter().ToRESTConfig() + if err != nil { + return fmt.Errorf("error creating Kubernetes REST config %v", err) } if c.kubernetes == nil { - if c.kubernetes, err = kubernetes.NewForConfig(c.restConfig); err != nil { - return fmt.Errorf("error creating Kubernetes client %v", err) - } - } - - if c.client == nil { - if c.client, err = client.New(c.restConfig, client.Options{}); err != nil { + if c.kubernetes, err = kubernetes.NewForConfig(restConfig); err != nil { return fmt.Errorf("error creating Kubernetes client %v", err) } } @@ -406,7 +397,8 @@ func (c *Command) promptDeletion(releaseType, releaseName, releaseNamespace stri return true, nil } -// crds is used to deserialize JSON returned from the `/apis/apiextensions.k8s.io/v1/customresourcedefinitions` endpoint. +// crds is used to deserialize JSON returned from the +// `/apis/apiextensions.k8s.io/v1/customresourcedefinitions` endpoint. type crds struct { Items []struct { Metadata struct { @@ -443,11 +435,11 @@ func (c *Command) deleteCustomResources() error { return err } + cr := &unstructured.Unstructured{} for _, crd := range crds.Items { if crd.Spec.Group == "consul.hashicorp.com" { for _, version := range crd.Spec.Versions { for _, namespace := range namespaces.Items { - cr := &unstructured.Unstructured{} cr.SetGroupVersionKind(schema.GroupVersionKind{ Group: "consul.hashicorp.com", Kind: crd.Spec.Names.Kind, @@ -510,31 +502,24 @@ func (c *Command) wipeData(foundReleaseName, foundReleaseNamespace string) error if err := c.deletePVCs(foundReleaseName, foundReleaseNamespace); err != nil { return err } - if err := c.deleteSecrets(foundReleaseNamespace); err != nil { return err } - if err := c.deleteServiceAccounts(foundReleaseName, foundReleaseNamespace); err != nil { return err } - if err := c.deleteRoles(foundReleaseName, foundReleaseNamespace); err != nil { return err } - if err := c.deleteRoleBindings(foundReleaseName, foundReleaseNamespace); err != nil { return err } - if err := c.deleteJobs(foundReleaseName, foundReleaseNamespace); err != nil { return err } - if err := c.deleteClusterRoles(foundReleaseName); err != nil { return err } - if err := c.deleteClusterRoleBindings(foundReleaseName); err != nil { return err } diff --git a/cli/cmd/uninstall/uninstall_test.go b/cli/cmd/uninstall/uninstall_test.go index 9dfc21e8a0..32a571ff85 100644 --- a/cli/cmd/uninstall/uninstall_test.go +++ b/cli/cmd/uninstall/uninstall_test.go @@ -10,6 +10,8 @@ import ( "os" "testing" + clientFake "sigs.k8s.io/controller-runtime/pkg/client/fake" + "github.com/hashicorp/consul-k8s/cli/common" cmnFlag "github.com/hashicorp/consul-k8s/cli/common/flag" "github.com/hashicorp/consul-k8s/cli/common/terminal" @@ -24,7 +26,6 @@ import ( v1 "k8s.io/api/core/v1" rbacv1 "k8s.io/api/rbac/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/fake" ) @@ -358,6 +359,67 @@ func TestDeleteClusterRoleBindings(t *testing.T) { require.Equal(t, clusterrolebindings.Items[0].Name, clusterrolebinding3.Name) } +func TestDeleteCustomResources(t *testing.T) { + cases := map[string]struct { + crs interface{} + crds crds + expected string + }{ + "Without CRDs or CRs": {}, + "Without CRs": {}, + "With CRs": {}, + } + + for name, tc := range cases { + t.Run(name, func(t *testing.T) { + buf := new(bytes.Buffer) + c := getInitializedCommand(t, buf) + c.kubernetes = fake.NewSimpleClientset() + c.client = clientFake.NewClientBuilder().Build() + + err := c.deleteCustomResources() + require.NoError(t, err) + + actual := buf.String() + require.Equal(t, tc.expected, actual) + + // Check to ensure no CRs exist anymore. + }) + } +} + +func TestCheckCustomResourceDefinitions(t *testing.T) { + cases := map[string]struct { + crds crds + expected string + }{ + "Without CRDs": { + crds: crds{}, + expected: "", + }, + "With CRDs": { + crds: crds{}, + expected: "", + }, + } + + for name, tc := range cases { + t.Run(name, func(t *testing.T) { + buf := new(bytes.Buffer) + c := getInitializedCommand(t, buf) + c.kubernetes = fake.NewSimpleClientset() + c.client = clientFake.NewClientBuilder().Build() + + err := c.checkCustomResourceDefinitions() + require.NoError(t, err) + + actual := buf.String() + require.Equal(t, tc.expected, actual) + }) + } + +} + func TestTaskCreateCommand_AutocompleteFlags(t *testing.T) { t.Parallel() cmd := getInitializedCommand(t, nil) @@ -389,7 +451,6 @@ func TestTaskCreateCommand_AutocompleteArgs(t *testing.T) { } func TestUninstall(t *testing.T) { - var k8s kubernetes.Interface cases := map[string]struct { input []string messages []string @@ -549,8 +610,9 @@ func TestUninstall(t *testing.T) { t.Run(name, func(t *testing.T) { buf := new(bytes.Buffer) c := getInitializedCommand(t, buf) - k8s = fake.NewSimpleClientset() - c.kubernetes = k8s + c.kubernetes = fake.NewSimpleClientset() + c.client = clientFake.NewClientBuilder().Build() + mock := tc.helmActionsRunner c.helmActionsRunner = mock if tc.preProcessingFunc != nil {