Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/dev/gpctl/cmd/clusters-register.go
3601 views
1
// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
2
// Licensed under the GNU Affero General Public License (AGPL).
3
// See License.AGPL.txt in the project root for license information.
4
5
package cmd
6
7
import (
8
"context"
9
"encoding/base64"
10
"encoding/json"
11
"fmt"
12
"io"
13
"io/ioutil"
14
"os"
15
"path"
16
"strings"
17
18
"github.com/spf13/cobra"
19
20
"github.com/gitpod-io/gitpod/common-go/log"
21
"github.com/gitpod-io/gitpod/ws-manager-bridge/api"
22
)
23
24
// clustersRegisterCmd represents the clustersRegisterCmd command
25
var clustersRegisterCmd = &cobra.Command{
26
Use: "register",
27
Short: "Register a cluster",
28
Run: func(cmd *cobra.Command, args []string) {
29
ctx, cancel := context.WithCancel(context.Background())
30
defer cancel()
31
32
conn, client, err := getClustersClient(ctx)
33
if err != nil {
34
log.WithError(err).Fatal("cannot connect")
35
}
36
defer conn.Close()
37
38
request := &api.RegisterRequest{}
39
40
file, err := cmd.Flags().GetString("from-file")
41
if err != nil {
42
log.Fatal(err)
43
}
44
45
if len(file) > 0 {
46
if file == "-" {
47
err := json.NewDecoder(os.Stdin).Decode(&request)
48
if err != nil {
49
log.Fatal(err)
50
}
51
} else {
52
content, err := ioutil.ReadFile(file)
53
if err != nil {
54
log.Fatal(err)
55
}
56
err = json.Unmarshal([]byte(content), &request)
57
if err != nil {
58
log.Fatal(err)
59
}
60
}
61
}
62
63
name, err := cmd.Flags().GetString("name")
64
if err != nil {
65
log.Fatal(err)
66
}
67
if len(name) < 1 && len(request.Name) < 1 {
68
log.Fatal("please set the cluster name with flag --name")
69
}
70
if len(name) > 0 {
71
request.Name = name
72
}
73
74
region, err := cmd.Flags().GetString("region")
75
if err != nil {
76
log.Fatal(err)
77
}
78
if len(region) > 0 {
79
request.Region = region
80
}
81
if strings.ToLower(region) != region {
82
log.Fatal("Region must be all lowercase.")
83
}
84
85
url, err := cmd.Flags().GetString("url")
86
if err != nil {
87
log.Fatal(err)
88
}
89
if len(url) < 1 && len(request.Url) < 1 {
90
log.Fatal("please set the cluster url with flag --url")
91
}
92
if len(url) > 0 {
93
request.Url = url
94
}
95
96
tlsPath, err := cmd.Flags().GetString("tls-path")
97
if err != nil {
98
log.Fatal(err)
99
}
100
if tlsPath != "" {
101
readFileToBase64Str := func(filename string) string {
102
filepath := path.Join(tlsPath, filename)
103
content, err := ioutil.ReadFile(filepath)
104
if err != nil {
105
log.WithError(err).Fatalf("unable to read from: '%s'", filepath)
106
}
107
return base64.StdEncoding.EncodeToString(content)
108
}
109
request.Tls = &api.TlsConfig{
110
Ca: readFileToBase64Str("ca.crt"),
111
Crt: readFileToBase64Str("tls.crt"),
112
Key: readFileToBase64Str("tls.key"),
113
}
114
}
115
116
if request.Hints == nil {
117
request.Hints = &api.RegistrationHints{}
118
}
119
120
cordoned, err := cmd.Flags().GetBool("hint-cordoned")
121
if err != nil {
122
log.Fatal(err)
123
}
124
if cmd.Flags().Changed("hint-cordoned") {
125
request.Hints.Cordoned = cordoned
126
}
127
128
preferability, err := cmd.Flags().GetString("hint-preferability")
129
if err != nil {
130
log.Fatal(err)
131
}
132
133
if cmd.Flags().Changed("hint-preferability") {
134
switch preferability {
135
case "none":
136
request.Hints.Perfereability = api.Preferability_None
137
case "prefer":
138
request.Hints.Perfereability = api.Preferability_Prefer
139
case "dontschedule":
140
request.Hints.Perfereability = api.Preferability_DontSchedule
141
default:
142
log.Fatal("--hint-preferability needs to be one of: 'none', 'prefer', 'dontschedule'")
143
}
144
}
145
146
_, err = client.Register(ctx, request)
147
if err != nil && err != io.EOF {
148
log.Fatal(err)
149
}
150
151
fmt.Printf("cluster registered: %v\n", request)
152
},
153
}
154
155
func init() {
156
clustersRegisterCmd.Flags().String("name", "", "cluster name")
157
clustersRegisterCmd.Flags().String("region", "", "region name - one of [europe, north-america] or empty, which allows cross-region workspaces")
158
clustersRegisterCmd.Flags().String("url", "", "cluster url")
159
clustersRegisterCmd.Flags().String("tls-path", "", "folder containing the ws cluster's ca.crt, tls.crt and tls.key")
160
clustersRegisterCmd.Flags().Bool("hint-cordoned", false, "sets hint cordoned")
161
clustersRegisterCmd.Flags().Bool("hint-govern", true, "DEPRECATED: sets hint govern")
162
clustersRegisterCmd.Flags().String("hint-preferability", "none", "sets hint preferability, one of: 'none', 'prefer', 'dontschedule'")
163
164
clustersRegisterCmd.Flags().String("from-file", "", "reads request from JSON file, '-' for stdin")
165
166
clustersCmd.AddCommand(clustersRegisterCmd)
167
}
168
169