...

Source file src/github.com/linkerd/linkerd2/viz/cmd/uninstall.go

Documentation: github.com/linkerd/linkerd2/viz/cmd

     1  package cmd
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  
     8  	pkgCmd "github.com/linkerd/linkerd2/pkg/cmd"
     9  	"github.com/linkerd/linkerd2/pkg/k8s"
    10  	"github.com/linkerd/linkerd2/pkg/k8s/resource"
    11  	"github.com/spf13/cobra"
    12  	v1 "k8s.io/api/core/v1"
    13  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    14  )
    15  
    16  func newCmdUninstall() *cobra.Command {
    17  	cmd := &cobra.Command{
    18  		Use:   "uninstall",
    19  		Args:  cobra.NoArgs,
    20  		Short: "Output Kubernetes resources to uninstall the linkerd-viz extension",
    21  		Long: `Output Kubernetes resources to uninstall the linkerd-viz extension.
    22  
    23  This command provides all Kubernetes namespace-scoped and cluster-scoped resources (e.g services, deployments, RBACs, etc.) necessary to uninstall the Linkerd-viz extension.`,
    24  		Example: `linkerd viz uninstall | kubectl delete -f -`,
    25  		RunE: func(cmd *cobra.Command, args []string) error {
    26  			err := uninstallRunE(cmd.Context())
    27  			if err != nil {
    28  				fmt.Fprintln(os.Stderr, err)
    29  				os.Exit(1)
    30  			}
    31  			return nil
    32  		},
    33  	}
    34  
    35  	return cmd
    36  }
    37  
    38  func uninstallRunE(ctx context.Context) error {
    39  	k8sAPI, err := k8s.NewAPI(kubeconfigPath, kubeContext, impersonate, impersonateGroup, 0)
    40  	if err != nil {
    41  		return err
    42  	}
    43  
    44  	selector, err := pkgCmd.GetLabelSelector(k8s.LinkerdExtensionLabel, ExtensionName, LegacyExtensionName)
    45  	if err != nil {
    46  		return err
    47  	}
    48  
    49  	// / `Uninstall` deletes cluster-scoped resources created by the extension
    50  	// (including the extension's namespace).
    51  	if err := pkgCmd.Uninstall(ctx, k8sAPI, selector); err != nil {
    52  		return err
    53  	}
    54  
    55  	// delete any HTTPRoute, AuthorizationPolicy, and Server resources created
    56  	// by the viz extension in any namespace.
    57  	//
    58  	// note that these are not deleted by the `Uninstall` call above, because
    59  	// they are namespaced resources.
    60  	policy := k8sAPI.L5dCrdClient.PolicyV1alpha1()
    61  	authzs, err := policy.AuthorizationPolicies(v1.NamespaceAll).List(ctx, metav1.ListOptions{LabelSelector: selector})
    62  	if err != nil {
    63  		return err
    64  	}
    65  
    66  	for _, authz := range authzs.Items {
    67  		if err := deleteResource(authz.TypeMeta, authz.ObjectMeta); err != nil {
    68  			return err
    69  		}
    70  	}
    71  
    72  	rts, err := policy.HTTPRoutes(v1.NamespaceAll).List(ctx, metav1.ListOptions{LabelSelector: selector})
    73  	if err != nil {
    74  		return err
    75  	}
    76  
    77  	for _, rt := range rts.Items {
    78  		if err := deleteResource(rt.TypeMeta, rt.ObjectMeta); err != nil {
    79  			return err
    80  		}
    81  	}
    82  
    83  	srvs, err := k8sAPI.L5dCrdClient.ServerV1beta2().Servers(v1.NamespaceAll).List(ctx, metav1.ListOptions{LabelSelector: selector})
    84  	if err != nil {
    85  		return err
    86  	}
    87  
    88  	for _, srv := range srvs.Items {
    89  		if err := deleteResource(srv.TypeMeta, srv.ObjectMeta); err != nil {
    90  			return err
    91  		}
    92  	}
    93  
    94  	return nil
    95  }
    96  
    97  func deleteResource(ty metav1.TypeMeta, meta metav1.ObjectMeta) error {
    98  	r := resource.NewNamespaced(ty.APIVersion, ty.Kind, meta.Name, meta.Namespace)
    99  	if err := r.RenderResource(os.Stdout); err != nil {
   100  		return fmt.Errorf("error rendering Kubernetes resource: %w", err)
   101  	}
   102  	return nil
   103  }
   104  

View as plain text