...
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
50
51 if err := pkgCmd.Uninstall(ctx, k8sAPI, selector); err != nil {
52 return err
53 }
54
55
56
57
58
59
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