blob: 5d465f528a8098ccc143219c7cdecde2734a1fe1 [file] [log] [blame]
Mateusz Zalegae15fee12022-08-12 18:48:40 +02001package main
2
3import (
4 "context"
5 "log"
Tim Windelschmidtb765f242024-05-08 01:40:02 +02006 "os"
7 "os/signal"
Mateusz Zalegae15fee12022-08-12 18:48:40 +02008 "strings"
9
10 "github.com/spf13/cobra"
11
Mateusz Zalegae15fee12022-08-12 18:48:40 +020012 "source.monogon.dev/metropolis/proto/api"
13)
14
15var addCmd = &cobra.Command{
16 Short: "Updates node configuration.",
17 Use: "add",
18}
19
20var removeCmd = &cobra.Command{
21 Short: "Updates node configuration.",
22 Use: "remove",
23}
24
25var addRoleCmd = &cobra.Command{
26 Short: "Updates node roles.",
Serge Bazanski15f7f632023-03-14 17:17:20 +010027 Use: "role <KubernetesController|KubernetesWorker|ConsensusMember> [NodeID, ...]",
Mateusz Zalegae15fee12022-08-12 18:48:40 +020028 Example: "metroctl node add role KubernetesWorker metropolis-25fa5f5e9349381d4a5e9e59de0215e3",
29 Args: cobra.ArbitraryArgs,
30 Run: doAdd,
31}
32
33var removeRoleCmd = &cobra.Command{
34 Short: "Updates node roles.",
Serge Bazanski15f7f632023-03-14 17:17:20 +010035 Use: "role <KubernetesController|KubernetesWorker|ConsensusMember> [NodeID, ...]",
Mateusz Zalegae15fee12022-08-12 18:48:40 +020036 Example: "metroctl node remove role KubernetesWorker metropolis-25fa5f5e9349381d4a5e9e59de0215e3",
37 Args: cobra.ArbitraryArgs,
38 Run: doRemove,
39}
40
41func init() {
42 addCmd.AddCommand(addRoleCmd)
43 nodeCmd.AddCommand(addCmd)
44
45 removeCmd.AddCommand(removeRoleCmd)
46 nodeCmd.AddCommand(removeCmd)
47}
48
49func doAdd(cmd *cobra.Command, args []string) {
Tim Windelschmidtb765f242024-05-08 01:40:02 +020050 ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt)
Mateusz Zalegae15fee12022-08-12 18:48:40 +020051 cc := dialAuthenticated(ctx)
52 mgmt := api.NewManagementClient(cc)
53
54 if len(args) < 2 {
55 log.Fatal("Provide the role parameter together with at least one node ID.")
56 }
57
58 role := strings.ToLower(args[0])
59 nodes := args[1:]
60
61 opt := func(v bool) *bool { return &v }
62 for _, node := range nodes {
63 req := &api.UpdateNodeRolesRequest{
64 Node: &api.UpdateNodeRolesRequest_Id{
65 Id: node,
66 },
67 }
68 switch role {
Serge Bazanski15f7f632023-03-14 17:17:20 +010069 case "kubernetescontroller", "kc":
70 req.KubernetesController = opt(true)
Mateusz Zalegae15fee12022-08-12 18:48:40 +020071 case "kubernetesworker", "kw":
72 req.KubernetesWorker = opt(true)
73 case "consensusmember", "cm":
74 req.ConsensusMember = opt(true)
75 default:
76 log.Fatalf("Unknown role: %s", role)
77 }
78
79 _, err := mgmt.UpdateNodeRoles(ctx, req)
80 if err != nil {
81 log.Printf("Couldn't update node \"%s\": %v", node, err)
82 }
Serge Bazanski15f7f632023-03-14 17:17:20 +010083 log.Printf("Updated node %s.", node)
Mateusz Zalegae15fee12022-08-12 18:48:40 +020084 }
85}
86
87func doRemove(cmd *cobra.Command, args []string) {
Tim Windelschmidtb765f242024-05-08 01:40:02 +020088 ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt)
Mateusz Zalegae15fee12022-08-12 18:48:40 +020089 cc := dialAuthenticated(ctx)
90 mgmt := api.NewManagementClient(cc)
91
92 if len(args) < 2 {
93 log.Fatal("Provide the role parameter together with at least one node ID.")
94 }
95
96 role := strings.ToLower(args[0])
97 nodes := args[1:]
98
99 opt := func(v bool) *bool { return &v }
100 for _, node := range nodes {
101 req := &api.UpdateNodeRolesRequest{
102 Node: &api.UpdateNodeRolesRequest_Id{
103 Id: node,
104 },
105 }
106 switch role {
Serge Bazanski15f7f632023-03-14 17:17:20 +0100107 case "kubernetescontroller", "kc":
108 req.KubernetesController = opt(false)
Mateusz Zalegae15fee12022-08-12 18:48:40 +0200109 case "kubernetesworker", "kw":
110 req.KubernetesWorker = opt(false)
111 case "consensusmember", "cm":
112 req.ConsensusMember = opt(false)
113 default:
114 log.Fatalf("Unknown role: %s. Must be one of: KubernetesWorker, ConsensusMember.", role)
115 }
116
117 _, err := mgmt.UpdateNodeRoles(ctx, req)
118 if err != nil {
119 log.Printf("Couldn't update node \"%s\": %v", node, err)
120 }
121 log.Printf("Updated node %s.", node)
122 }
123}