Skip to content

Commit f3ceb6b

Browse files
authored
[ws-manager-bridge] add update cluster tls config (#19975)
1 parent 07182a1 commit f3ceb6b

File tree

8 files changed

+252
-80
lines changed

8 files changed

+252
-80
lines changed

components/ws-manager-bridge-api/cluster-service.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ message UpdateRequest {
108108

109109
// DEPRECATED
110110
// ModifyAdmissionPreference admission_preference = 6;
111+
112+
TlsConfig tls = 7;
111113
}
112114
}
113115

components/ws-manager-bridge-api/go/cluster-service.pb.go

Lines changed: 92 additions & 73 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/ws-manager-bridge-api/go/cluster-service_grpc.pb.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/ws-manager-bridge-api/typescript/src/cluster-service_grpc_pb.d.ts

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/ws-manager-bridge-api/typescript/src/cluster-service_pb.d.ts

Lines changed: 8 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/ws-manager-bridge-api/typescript/src/cluster-service_pb.js

Lines changed: 56 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/ws-manager-bridge/src/cluster-service-server.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,46 @@ export class ClusterService implements IClusterServiceServer {
235235
}
236236
}
237237
}
238+
if (call.request.hasTls()) {
239+
const tls = req.tls;
240+
if (!tls?.ca || !tls?.crt || !tls?.key) {
241+
throw new GRPCError(grpc.status.INVALID_ARGUMENT, "missing required TLS config");
242+
}
243+
if (tls.ca === cluster.tls?.ca && tls.crt === cluster.tls?.crt && tls.key === cluster.tls?.key) {
244+
callback(null, new UpdateResponse());
245+
return;
246+
}
247+
248+
const newCluster: WorkspaceCluster = {
249+
name: req.name,
250+
url: cluster.url,
251+
region: cluster.region,
252+
state: cluster.state,
253+
score: cluster.score,
254+
maxScore: 100,
255+
govern: cluster.govern,
256+
tls: tls,
257+
admissionConstraints: cluster.admissionConstraints,
258+
};
259+
260+
// try to connect to validate the config. Throws an exception if it fails.
261+
await new Promise<DescribeClusterResponse>((resolve, reject) => {
262+
const c = this.clientProvider.createConnection(WorkspaceManagerClient, newCluster);
263+
c.describeCluster(new DescribeClusterRequest(), (err: any, resp: DescribeClusterResponse) => {
264+
if (err) {
265+
reject(
266+
new GRPCError(
267+
grpc.status.FAILED_PRECONDITION,
268+
`cannot reach ${cluster.url}: ${err.message}`,
269+
),
270+
);
271+
} else {
272+
resolve(resp);
273+
}
274+
});
275+
});
276+
cluster.tls = tls;
277+
}
238278
await this.clusterDB.save(cluster);
239279
log.info({}, "cluster updated", { cluster: req.name });
240280
this.triggerReconcile("update", req.name);

dev/gpctl/cmd/clusters-update.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ package cmd
66

77
import (
88
"context"
9+
"encoding/base64"
910
"fmt"
1011
"io"
12+
"io/ioutil"
13+
"path"
1114
"strconv"
1215
"strings"
1316

@@ -148,9 +151,58 @@ var clustersUpdateAdmissionConstraintCmd = &cobra.Command{
148151
},
149152
}
150153

154+
var clustersUpdateTLSConfigCmd = &cobra.Command{
155+
Use: "tls",
156+
Short: "Updates a cluster's TLS configuration",
157+
Args: cobra.ExactArgs(0),
158+
Run: func(cmd *cobra.Command, args []string) {
159+
name := getClusterName()
160+
161+
ctx, cancel := context.WithCancel(context.Background())
162+
defer cancel()
163+
164+
conn, client, err := getClustersClient(ctx)
165+
if err != nil {
166+
log.WithError(err).Fatal("cannot connect")
167+
}
168+
defer conn.Close()
169+
170+
tlsPath, err := cmd.Flags().GetString("tls-path")
171+
if err != nil {
172+
log.Fatal(err)
173+
}
174+
if tlsPath == "" {
175+
log.Fatal("tls-path is required")
176+
}
177+
178+
readFileToBase64Str := func(filename string) string {
179+
filepath := path.Join(tlsPath, filename)
180+
content, err := ioutil.ReadFile(filepath)
181+
if err != nil {
182+
log.WithError(err).Fatalf("unable to read from: '%s'", filepath)
183+
}
184+
return base64.StdEncoding.EncodeToString(content)
185+
}
186+
request := &api.UpdateRequest{Name: name, Property: &api.UpdateRequest_Tls{Tls: &api.TlsConfig{
187+
Ca: readFileToBase64Str("ca.crt"),
188+
Crt: readFileToBase64Str("tls.crt"),
189+
Key: readFileToBase64Str("tls.key"),
190+
}}}
191+
192+
_, err = client.Update(ctx, request)
193+
if err != nil && err != io.EOF {
194+
log.Fatal(err)
195+
}
196+
197+
fmt.Printf("cluster '%s' tls config updated\n", name)
198+
},
199+
}
200+
151201
func init() {
152202
clustersCmd.AddCommand(clustersUpdateCmd)
153203
clustersUpdateCmd.AddCommand(clustersUpdateScoreCmd)
154204
clustersUpdateCmd.AddCommand(clustersUpdateMaxScoreCmd)
155205
clustersUpdateCmd.AddCommand(clustersUpdateAdmissionConstraintCmd)
206+
clustersUpdateTLSConfigCmd.Flags().String("tls-path", "", "folder containing the ws cluster's ca.crt, tls.crt and tls.key")
207+
clustersUpdateCmd.AddCommand(clustersUpdateTLSConfigCmd)
156208
}

0 commit comments

Comments
 (0)