blob: 164e2ee4fb8a15eb48800771b0422726dba844a4 [file] [log] [blame]
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +02001package main
2
3import (
4 "context"
Serge Bazanski925ec3d2024-02-05 14:38:20 +01005 "crypto/tls"
Serge Bazanskib91938f2023-03-29 14:31:22 +02006 "crypto/x509"
Mateusz Zalegab2cac082022-07-14 14:55:43 +02007 "log"
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +02008
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +02009 "google.golang.org/grpc"
10
Mateusz Zalega18a67b02022-08-02 13:37:50 +020011 "source.monogon.dev/metropolis/cli/metroctl/core"
Serge Bazanski925ec3d2024-02-05 14:38:20 +010012 "source.monogon.dev/metropolis/node/core/rpc"
13 "source.monogon.dev/metropolis/node/core/rpc/resolver"
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +020014)
15
Mateusz Zalegadb75e212022-08-04 17:31:34 +020016func dialAuthenticated(ctx context.Context) *grpc.ClientConn {
Mateusz Zalega18a67b02022-08-02 13:37:50 +020017 // Collect credentials, validate command parameters, and try dialing the
18 // cluster.
Serge Bazanskicf23ebc2023-03-14 17:02:04 +010019 ocert, opkey, err := core.GetOwnerCredentials(flags.configPath)
20 if err == core.NoCredentialsError {
Mateusz Zalega18a67b02022-08-02 13:37:50 +020021 log.Fatalf("You have to take ownership of the cluster first: %v", err)
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +020022 }
Mateusz Zalegadb75e212022-08-04 17:31:34 +020023 if len(flags.clusterEndpoints) == 0 {
24 log.Fatal("Please provide at least one cluster endpoint using the --endpoint parameter.")
25 }
Serge Bazanski7eeef0f2024-02-05 14:40:15 +010026
27 ca, err := core.GetClusterCAWithTOFU(ctx, connectOptions())
28 if err != nil {
29 log.Fatalf("Failed to get cluster CA: %v", err)
30 }
31
Serge Bazanski925ec3d2024-02-05 14:38:20 +010032 tlsc := tls.Certificate{
33 Certificate: [][]byte{ocert.Raw},
34 PrivateKey: opkey,
35 }
Serge Bazanski7eeef0f2024-02-05 14:40:15 +010036 creds := rpc.NewAuthenticatedCredentials(tlsc, rpc.WantRemoteCluster(ca))
Serge Bazanski925ec3d2024-02-05 14:38:20 +010037 opts, err := core.DialOpts(ctx, connectOptions())
38 if err != nil {
39 log.Fatalf("While configuring dial options: %v", err)
40 }
41 opts = append(opts, grpc.WithTransportCredentials(creds))
42
43 cc, err := grpc.Dial(resolver.MetropolisControlAddress, opts...)
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +020044 if err != nil {
Serge Bazanski7eeef0f2024-02-05 14:40:15 +010045 log.Fatalf("While dialing cluster: %v", err)
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +020046 }
Mateusz Zalega18a67b02022-08-02 13:37:50 +020047 return cc
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +020048}
Serge Bazanskib91938f2023-03-29 14:31:22 +020049
50func dialAuthenticatedNode(ctx context.Context, id, address string, cacert *x509.Certificate) *grpc.ClientConn {
51 // Collect credentials, validate command parameters, and try dialing the
52 // cluster.
53 ocert, opkey, err := core.GetOwnerCredentials(flags.configPath)
54 if err == core.NoCredentialsError {
55 log.Fatalf("You have to take ownership of the cluster first: %v", err)
56 }
57 cc, err := core.DialNode(ctx, opkey, ocert, cacert, flags.proxyAddr, id, address)
58 if err != nil {
59 log.Fatalf("While dialing node: %v", err)
60 }
61 return cc
62}