blob: 677a4257591298e0483ec0a6a3bbf5aa85d62248 [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
2// SPDX-License-Identifier: Apache-2.0
3
Mateusz Zalegae15fee12022-08-12 18:48:40 +02004package main
5
6import (
7 "context"
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +02008 "fmt"
Mateusz Zalegae15fee12022-08-12 18:48:40 +02009 "log"
Tim Windelschmidtb765f242024-05-08 01:40:02 +020010 "os"
11 "os/signal"
Mateusz Zalegae15fee12022-08-12 18:48:40 +020012 "strings"
13
14 "github.com/spf13/cobra"
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +010015 "k8s.io/utils/ptr"
Mateusz Zalegae15fee12022-08-12 18:48:40 +020016
Mateusz Zalegae15fee12022-08-12 18:48:40 +020017 "source.monogon.dev/metropolis/proto/api"
18)
19
20var addCmd = &cobra.Command{
21 Short: "Updates node configuration.",
22 Use: "add",
23}
24
25var removeCmd = &cobra.Command{
26 Short: "Updates node configuration.",
27 Use: "remove",
28}
29
30var addRoleCmd = &cobra.Command{
31 Short: "Updates node roles.",
Serge Bazanski15f7f632023-03-14 17:17:20 +010032 Use: "role <KubernetesController|KubernetesWorker|ConsensusMember> [NodeID, ...]",
Mateusz Zalegae15fee12022-08-12 18:48:40 +020033 Example: "metroctl node add role KubernetesWorker metropolis-25fa5f5e9349381d4a5e9e59de0215e3",
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020034 Args: PrintUsageOnWrongArgs(cobra.MinimumNArgs(2)),
35 RunE: func(cmd *cobra.Command, args []string) error {
36 ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt)
37 cc, err := dialAuthenticated(ctx)
38 if err != nil {
39 return fmt.Errorf("while dialing node: %w", err)
40 }
41 mgmt := api.NewManagementClient(cc)
42
43 role := strings.ToLower(args[0])
44 nodes := args[1:]
45
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020046 for _, node := range nodes {
47 req := &api.UpdateNodeRolesRequest{
48 Node: &api.UpdateNodeRolesRequest_Id{
49 Id: node,
50 },
51 }
52 switch role {
53 case "kubernetescontroller", "kc":
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +010054 req.KubernetesController = ptr.To(true)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020055 case "kubernetesworker", "kw":
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +010056 req.KubernetesWorker = ptr.To(true)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020057 case "consensusmember", "cm":
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +010058 req.ConsensusMember = ptr.To(true)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020059 default:
60 return fmt.Errorf("unknown role: %s", role)
61 }
62
63 _, err := mgmt.UpdateNodeRoles(ctx, req)
64 if err != nil {
65 log.Printf("Couldn't update node \"%s\": %v", node, err)
66 } else {
67 log.Printf("Updated node %s.", node)
68 }
69 }
70 return nil
71 },
Mateusz Zalegae15fee12022-08-12 18:48:40 +020072}
73
74var removeRoleCmd = &cobra.Command{
75 Short: "Updates node roles.",
Serge Bazanski15f7f632023-03-14 17:17:20 +010076 Use: "role <KubernetesController|KubernetesWorker|ConsensusMember> [NodeID, ...]",
Mateusz Zalegae15fee12022-08-12 18:48:40 +020077 Example: "metroctl node remove role KubernetesWorker metropolis-25fa5f5e9349381d4a5e9e59de0215e3",
Tim Windelschmidtfc6e1cf2024-09-18 17:34:07 +020078 Args: PrintUsageOnWrongArgs(cobra.ArbitraryArgs),
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020079 RunE: func(cmd *cobra.Command, args []string) error {
80 ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt)
81 cc, err := dialAuthenticated(ctx)
82 if err != nil {
83 return fmt.Errorf("while dialing node: %w", err)
84 }
85 mgmt := api.NewManagementClient(cc)
86
87 role := strings.ToLower(args[0])
88 nodes := args[1:]
89
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +020090 for _, node := range nodes {
91 req := &api.UpdateNodeRolesRequest{
92 Node: &api.UpdateNodeRolesRequest_Id{
93 Id: node,
94 },
95 }
96
97 switch role {
98 case "kubernetescontroller", "kc":
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +010099 req.KubernetesController = ptr.To(false)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +0200100 case "kubernetesworker", "kw":
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +0100101 req.KubernetesWorker = ptr.To(false)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +0200102 case "consensusmember", "cm":
Tim Windelschmidtd77e26e2024-12-02 18:23:10 +0100103 req.ConsensusMember = ptr.To(false)
Tim Windelschmidt0b4fb8c2024-09-18 17:34:23 +0200104 default:
105 return fmt.Errorf("unknown role: %s. Must be one of: KubernetesController, KubernetesWorker, ConsensusMember", role)
106 }
107
108 _, err := mgmt.UpdateNodeRoles(ctx, req)
109 if err != nil {
110 log.Printf("Couldn't update node \"%s\": %v", node, err)
111 } else {
112 log.Printf("Updated node %s.", node)
113 }
114 }
115 return nil
116 },
Mateusz Zalegae15fee12022-08-12 18:48:40 +0200117}
118
119func init() {
120 addCmd.AddCommand(addRoleCmd)
121 nodeCmd.AddCommand(addCmd)
122
123 removeCmd.AddCommand(removeRoleCmd)
124 nodeCmd.AddCommand(removeCmd)
125}