blob: 4211acad8eb1f12bb87541bc1a0863e285862816 [file] [log] [blame]
Mateusz Zalegae15fee12022-08-12 18:48:40 +02001package main
2
3import (
4 "context"
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +02005 "fmt"
Mateusz Zalegae15fee12022-08-12 18:48:40 +02006 "log"
Tim Windelschmidtb765f242024-05-08 01:40:02 +02007 "os"
8 "os/signal"
Mateusz Zalegae15fee12022-08-12 18:48:40 +02009 "strings"
10
11 "github.com/spf13/cobra"
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +010012 "k8s.io/utils/ptr"
Mateusz Zalegae15fee12022-08-12 18:48:40 +020013
Mateusz Zalegae15fee12022-08-12 18:48:40 +020014 "source.monogon.dev/metropolis/proto/api"
15)
16
17var addCmd = &cobra.Command{
18 Short: "Updates node configuration.",
19 Use: "add",
20}
21
22var removeCmd = &cobra.Command{
23 Short: "Updates node configuration.",
24 Use: "remove",
25}
26
27var addRoleCmd = &cobra.Command{
28 Short: "Updates node roles.",
Serge Bazanski15f7f632023-03-14 17:17:20 +010029 Use: "role <KubernetesController|KubernetesWorker|ConsensusMember> [NodeID, ...]",
Mateusz Zalegae15fee12022-08-12 18:48:40 +020030 Example: "metroctl node add role KubernetesWorker metropolis-25fa5f5e9349381d4a5e9e59de0215e3",
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020031 Args: PrintUsageOnWrongArgs(cobra.MinimumNArgs(2)),
32 RunE: func(cmd *cobra.Command, args []string) error {
33 ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt)
34 cc, err := dialAuthenticated(ctx)
35 if err != nil {
36 return fmt.Errorf("while dialing node: %w", err)
37 }
38 mgmt := api.NewManagementClient(cc)
39
40 role := strings.ToLower(args[0])
41 nodes := args[1:]
42
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020043 for _, node := range nodes {
44 req := &api.UpdateNodeRolesRequest{
45 Node: &api.UpdateNodeRolesRequest_Id{
46 Id: node,
47 },
48 }
49 switch role {
50 case "kubernetescontroller", "kc":
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +010051 req.KubernetesController = ptr.To(true)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020052 case "kubernetesworker", "kw":
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +010053 req.KubernetesWorker = ptr.To(true)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020054 case "consensusmember", "cm":
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +010055 req.ConsensusMember = ptr.To(true)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020056 default:
57 return fmt.Errorf("unknown role: %s", role)
58 }
59
60 _, err := mgmt.UpdateNodeRoles(ctx, req)
61 if err != nil {
62 log.Printf("Couldn't update node \"%s\": %v", node, err)
63 } else {
64 log.Printf("Updated node %s.", node)
65 }
66 }
67 return nil
68 },
Mateusz Zalegae15fee12022-08-12 18:48:40 +020069}
70
71var removeRoleCmd = &cobra.Command{
72 Short: "Updates node roles.",
Serge Bazanski15f7f632023-03-14 17:17:20 +010073 Use: "role <KubernetesController|KubernetesWorker|ConsensusMember> [NodeID, ...]",
Mateusz Zalegae15fee12022-08-12 18:48:40 +020074 Example: "metroctl node remove role KubernetesWorker metropolis-25fa5f5e9349381d4a5e9e59de0215e3",
Tim Windelschmidtfc6e1cf2024-09-18 17:34:07 +020075 Args: PrintUsageOnWrongArgs(cobra.ArbitraryArgs),
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020076 RunE: func(cmd *cobra.Command, args []string) error {
77 ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt)
78 cc, err := dialAuthenticated(ctx)
79 if err != nil {
80 return fmt.Errorf("while dialing node: %w", err)
81 }
82 mgmt := api.NewManagementClient(cc)
83
84 role := strings.ToLower(args[0])
85 nodes := args[1:]
86
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020087 for _, node := range nodes {
88 req := &api.UpdateNodeRolesRequest{
89 Node: &api.UpdateNodeRolesRequest_Id{
90 Id: node,
91 },
92 }
93
94 switch role {
95 case "kubernetescontroller", "kc":
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +010096 req.KubernetesController = ptr.To(false)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020097 case "kubernetesworker", "kw":
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +010098 req.KubernetesWorker = ptr.To(false)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020099 case "consensusmember", "cm":
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +0100100 req.ConsensusMember = ptr.To(false)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +0200101 default:
102 return fmt.Errorf("unknown role: %s. Must be one of: KubernetesController, KubernetesWorker, ConsensusMember", role)
103 }
104
105 _, err := mgmt.UpdateNodeRoles(ctx, req)
106 if err != nil {
107 log.Printf("Couldn't update node \"%s\": %v", node, err)
108 } else {
109 log.Printf("Updated node %s.", node)
110 }
111 }
112 return nil
113 },
Mateusz Zalegae15fee12022-08-12 18:48:40 +0200114}
115
116func init() {
117 addCmd.AddCommand(addRoleCmd)
118 nodeCmd.AddCommand(addCmd)
119
120 removeCmd.AddCommand(removeRoleCmd)
121 nodeCmd.AddCommand(removeCmd)
122}