Skip to content
This repository was archived by the owner on Mar 4, 2024. It is now read-only.

Commit

Permalink
EVEREST-838 fix uninstall stuck deleting OLM namespace
Browse files Browse the repository at this point in the history
  • Loading branch information
recharte committed Feb 14, 2024
1 parent 9f73593 commit f656beb
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 1 deletion.
13 changes: 13 additions & 0 deletions pkg/kubernetes/client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -1375,6 +1375,19 @@ func (c *Client) ListClusterServiceVersion(
return operatorClient.OperatorsV1alpha1().ClusterServiceVersions(namespace).List(ctx, metav1.ListOptions{})
}

// DeleteClusterServiceVersion deletes a CSV by namespaced name.
func (c *Client) DeleteClusterServiceVersion(
ctx context.Context,
key types.NamespacedName,
) error {
operatorClient, err := versioned.NewForConfig(c.restConfig)
if err != nil {
return errors.Join(err, errors.New("cannot create an operator client instance"))
}

return operatorClient.OperatorsV1alpha1().ClusterServiceVersions(key.Namespace).Delete(ctx, key.Name, metav1.DeleteOptions{})
}

// DeleteFile accepts manifest file contents parses into []runtime.Object
// and deletes them from the cluster.
func (c *Client) DeleteFile(fileBytes []byte) error {
Expand Down
2 changes: 2 additions & 0 deletions pkg/kubernetes/client/kubeclient_interface.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 18 additions & 0 deletions pkg/kubernetes/client/mock_kube_client_connector.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions pkg/kubernetes/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -840,6 +840,14 @@ func (k *Kubernetes) ListClusterServiceVersion(
return k.client.ListClusterServiceVersion(ctx, namespace)
}

// DeleteClusterServiceVersion deletes a ClusterServiceVersion.
func (k *Kubernetes) DeleteClusterServiceVersion(
ctx context.Context,
key types.NamespacedName,
) error {
return k.client.DeleteClusterServiceVersion(ctx, key)
}

// DeleteObject deletes an object.
func (k *Kubernetes) DeleteObject(obj runtime.Object) error {
return k.client.DeleteObject(obj)
Expand Down
33 changes: 32 additions & 1 deletion pkg/uninstall/uninstall.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
everestv1alpha1 "github.com/percona/everest-operator/api/v1alpha1"
"go.uber.org/zap"
k8serrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/wait"

"github.com/percona/percona-everest-cli/pkg/install"
Expand Down Expand Up @@ -138,10 +139,11 @@ This will uninstall Everest and all its components from the cluster.`

// There are no resources with finalizers in the monitoring namespace, so
// we can delete it directly
if err := u.deleteNamespaces(ctx, []string{kubernetes.OLMNamespace}); err != nil {
if err := u.deleteOLM(ctx); err != nil {
return err
}

u.l.Info("Everest has been uninstalled successfully")
return nil
}

Expand Down Expand Up @@ -326,3 +328,32 @@ func (u *Uninstall) deleteMonitoringConfigs(ctx context.Context) error {
return true, nil
})
}

func (u *Uninstall) deleteOLM(ctx context.Context) error {
packageServerName := types.NamespacedName{Name: "packageserver", Namespace: kubernetes.OLMNamespace}
if err := u.kubeClient.DeleteClusterServiceVersion(ctx, packageServerName); err != nil {
return err
}

// Wait for the packageserver CSV to be deleted, or timeout after 5 minutes.
u.l.Infof("Waiting for packageserver CSV to be deleted")
err := wait.PollUntilContextTimeout(ctx, 5*time.Second, 5*time.Minute, false, func(ctx context.Context) (bool, error) {
_, err := u.kubeClient.GetClusterServiceVersion(ctx, packageServerName)
if err != nil && !k8serrors.IsNotFound(err) {
return false, err
}

if err == nil {
return false, nil
}

u.l.Info("Packageserver CSV has been deleted")

return true, nil
})
if err != nil {
return err
}

return u.deleteNamespaces(ctx, []string{kubernetes.OLMNamespace})
}

0 comments on commit f656beb

Please sign in to comment.