blob: 2d6eaf916cdc888ce5d884bc0ecbf0f30bbd45ae [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.",
26 Use: "role <KubernetesWorker|ConsensusMember> [NodeID, ...]",
27 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.",
34 Use: "role <KubernetesWorker|ConsensusMember> [NodeID, ...]",
35 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 {
68 case "kubernetesworker", "kw":
69 req.KubernetesWorker = opt(true)
70 case "consensusmember", "cm":
71 req.ConsensusMember = opt(true)
72 default:
73 log.Fatalf("Unknown role: %s", role)
74 }
75
76 _, err := mgmt.UpdateNodeRoles(ctx, req)
77 if err != nil {
78 log.Printf("Couldn't update node \"%s\": %v", node, err)
79 }
80 log.Printf("Updated node %s. Must be one of: KubernetesWorker, ConsensusMember.", node)
81 }
82}
83
84func doRemove(cmd *cobra.Command, args []string) {
85 ctx := clicontext.WithInterrupt(context.Background())
86 cc := dialAuthenticated(ctx)
87 mgmt := api.NewManagementClient(cc)
88
89 if len(args) < 2 {
90 log.Fatal("Provide the role parameter together with at least one node ID.")
91 }
92
93 role := strings.ToLower(args[0])
94 nodes := args[1:]
95
96 opt := func(v bool) *bool { return &v }
97 for _, node := range nodes {
98 req := &api.UpdateNodeRolesRequest{
99 Node: &api.UpdateNodeRolesRequest_Id{
100 Id: node,
101 },
102 }
103 switch role {
104 case "kubernetesworker", "kw":
105 req.KubernetesWorker = opt(false)
106 case "consensusmember", "cm":
107 req.ConsensusMember = opt(false)
108 default:
109 log.Fatalf("Unknown role: %s. Must be one of: KubernetesWorker, ConsensusMember.", role)
110 }
111
112 _, err := mgmt.UpdateNodeRoles(ctx, req)
113 if err != nil {
114 log.Printf("Couldn't update node \"%s\": %v", node, err)
115 }
116 log.Printf("Updated node %s.", node)
117 }
118}