blob: b0bfaf5e114c638b34de242bc64c437d8263c600 [file] [log] [blame]
Mateusz Zalegae15fee12022-08-12 18:48:40 +02001package main
2
3import (
4 "context"
5 "log"
6 "strings"
7
8 "github.com/spf13/cobra"
9
10 clicontext "source.monogon.dev/metropolis/cli/pkg/context"
11 "source.monogon.dev/metropolis/proto/api"
12)
13
14var addCmd = &cobra.Command{
15 Short: "Updates node configuration.",
16 Use: "add",
17}
18
19var removeCmd = &cobra.Command{
20 Short: "Updates node configuration.",
21 Use: "remove",
22}
23
24var addRoleCmd = &cobra.Command{
25 Short: "Updates node roles.",
Serge Bazanski15f7f632023-03-14 17:17:20 +010026 Use: "role <KubernetesController|KubernetesWorker|ConsensusMember> [NodeID, ...]",
Mateusz Zalegae15fee12022-08-12 18:48:40 +020027 Example: "metroctl node add role KubernetesWorker metropolis-25fa5f5e9349381d4a5e9e59de0215e3",
28 Args: cobra.ArbitraryArgs,
29 Run: doAdd,
30}
31
32var removeRoleCmd = &cobra.Command{
33 Short: "Updates node roles.",
Serge Bazanski15f7f632023-03-14 17:17:20 +010034 Use: "role <KubernetesController|KubernetesWorker|ConsensusMember> [NodeID, ...]",
Mateusz Zalegae15fee12022-08-12 18:48:40 +020035 Example: "metroctl node remove role KubernetesWorker metropolis-25fa5f5e9349381d4a5e9e59de0215e3",
36 Args: cobra.ArbitraryArgs,
37 Run: doRemove,
38}
39
40func init() {
41 addCmd.AddCommand(addRoleCmd)
42 nodeCmd.AddCommand(addCmd)
43
44 removeCmd.AddCommand(removeRoleCmd)
45 nodeCmd.AddCommand(removeCmd)
46}
47
48func doAdd(cmd *cobra.Command, args []string) {
49 ctx := clicontext.WithInterrupt(context.Background())
50 cc := dialAuthenticated(ctx)
51 mgmt := api.NewManagementClient(cc)
52
53 if len(args) < 2 {
54 log.Fatal("Provide the role parameter together with at least one node ID.")
55 }
56
57 role := strings.ToLower(args[0])
58 nodes := args[1:]
59
60 opt := func(v bool) *bool { return &v }
61 for _, node := range nodes {
62 req := &api.UpdateNodeRolesRequest{
63 Node: &api.UpdateNodeRolesRequest_Id{
64 Id: node,
65 },
66 }
67 switch role {
Serge Bazanski15f7f632023-03-14 17:17:20 +010068 case "kubernetescontroller", "kc":
69 req.KubernetesController = opt(true)
Mateusz Zalegae15fee12022-08-12 18:48:40 +020070 case "kubernetesworker", "kw":
71 req.KubernetesWorker = opt(true)
72 case "consensusmember", "cm":
73 req.ConsensusMember = opt(true)
74 default:
75 log.Fatalf("Unknown role: %s", role)
76 }
77
78 _, err := mgmt.UpdateNodeRoles(ctx, req)
79 if err != nil {
80 log.Printf("Couldn't update node \"%s\": %v", node, err)
81 }
Serge Bazanski15f7f632023-03-14 17:17:20 +010082 log.Printf("Updated node %s.", node)
Mateusz Zalegae15fee12022-08-12 18:48:40 +020083 }
84}
85
86func doRemove(cmd *cobra.Command, args []string) {
87 ctx := clicontext.WithInterrupt(context.Background())
88 cc := dialAuthenticated(ctx)
89 mgmt := api.NewManagementClient(cc)
90
91 if len(args) < 2 {
92 log.Fatal("Provide the role parameter together with at least one node ID.")
93 }
94
95 role := strings.ToLower(args[0])
96 nodes := args[1:]
97
98 opt := func(v bool) *bool { return &v }
99 for _, node := range nodes {
100 req := &api.UpdateNodeRolesRequest{
101 Node: &api.UpdateNodeRolesRequest_Id{
102 Id: node,
103 },
104 }
105 switch role {
Serge Bazanski15f7f632023-03-14 17:17:20 +0100106 case "kubernetescontroller", "kc":
107 req.KubernetesController = opt(false)
Mateusz Zalegae15fee12022-08-12 18:48:40 +0200108 case "kubernetesworker", "kw":
109 req.KubernetesWorker = opt(false)
110 case "consensusmember", "cm":
111 req.ConsensusMember = opt(false)
112 default:
113 log.Fatalf("Unknown role: %s. Must be one of: KubernetesWorker, ConsensusMember.", role)
114 }
115
116 _, err := mgmt.UpdateNodeRoles(ctx, req)
117 if err != nil {
118 log.Printf("Couldn't update node \"%s\": %v", node, err)
119 }
120 log.Printf("Updated node %s.", node)
121 }
122}