blob: 949f262e1a9f587964aea556a87de7a319437ced [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 }
Tim Windelschmidt5b075f72024-08-18 23:51:23 +0200106
Mateusz Zalegae15fee12022-08-12 18:48:40 +0200107 switch role {
Serge Bazanski15f7f632023-03-14 17:17:20 +0100108 case "kubernetescontroller", "kc":
109 req.KubernetesController = opt(false)
Mateusz Zalegae15fee12022-08-12 18:48:40 +0200110 case "kubernetesworker", "kw":
111 req.KubernetesWorker = opt(false)
112 case "consensusmember", "cm":
113 req.ConsensusMember = opt(false)
114 default:
Tim Windelschmidt5b075f72024-08-18 23:51:23 +0200115 log.Fatalf("Unknown role: %s. Must be one of: KubernetesController, KubernetesWorker, ConsensusMember.", role)
Mateusz Zalegae15fee12022-08-12 18:48:40 +0200116 }
117
118 _, err := mgmt.UpdateNodeRoles(ctx, req)
119 if err != nil {
120 log.Printf("Couldn't update node \"%s\": %v", node, err)
121 }
122 log.Printf("Updated node %s.", node)
123 }
124}