...
1 package cmd
2
3 import (
4 "errors"
5 "fmt"
6 "os"
7 "strings"
8
9 pkgCmd "github.com/linkerd/linkerd2/pkg/cmd"
10 "github.com/linkerd/linkerd2/pkg/k8s"
11 mc "github.com/linkerd/linkerd2/pkg/multicluster"
12 "github.com/spf13/cobra"
13
14 kerrors "k8s.io/apimachinery/pkg/api/errors"
15 "k8s.io/client-go/tools/clientcmd"
16 )
17
18 func newMulticlusterUninstallCommand() *cobra.Command {
19
20 cmd := &cobra.Command{
21 Use: "uninstall",
22 Short: "Output Kubernetes configs to uninstall the Linkerd multicluster add-on",
23 Args: cobra.NoArgs,
24 RunE: func(cmd *cobra.Command, args []string) error {
25
26 rules := clientcmd.NewDefaultClientConfigLoadingRules()
27 rules.ExplicitPath = kubeconfigPath
28 loader := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, &clientcmd.ConfigOverrides{})
29 config, err := loader.RawConfig()
30 if err != nil {
31 return err
32 }
33
34 if kubeContext != "" {
35 config.CurrentContext = kubeContext
36 }
37
38 k8sAPI, err := k8s.NewAPI(kubeconfigPath, config.CurrentContext, impersonate, impersonateGroup, 0)
39 if err != nil {
40 return err
41 }
42
43 links, err := mc.GetLinks(cmd.Context(), k8sAPI.DynamicClient)
44 if err != nil && !kerrors.IsNotFound(err) {
45 return err
46 }
47
48 if len(links) > 0 {
49 err := []string{"Please unlink the following clusters before uninstalling multicluster:"}
50 for _, link := range links {
51 err = append(err, fmt.Sprintf(" * %s", link.TargetClusterName))
52 }
53 return errors.New(strings.Join(err, "\n"))
54 }
55
56 selector, err := pkgCmd.GetLabelSelector(k8s.LinkerdExtensionLabel, MulticlusterExtensionName, MulticlusterLegacyExtension)
57 if err != nil {
58 return err
59 }
60
61 err = pkgCmd.Uninstall(cmd.Context(), k8sAPI, selector)
62 if err != nil {
63 fmt.Fprintln(os.Stderr, err)
64 os.Exit(1)
65 }
66 return nil
67 },
68 }
69
70 return cmd
71 }
72
View as plain text