blob: 06008e30dc6028f6d203e1cd8e3902e0d0f1e3cc [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"
Tim Windelschmidtd5f851b2024-04-23 14:59:37 +02007 "errors"
Mateusz Zalegab2cac082022-07-14 14:55:43 +02008 "log"
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +02009
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +020010 "google.golang.org/grpc"
11
Mateusz Zalega18a67b02022-08-02 13:37:50 +020012 "source.monogon.dev/metropolis/cli/metroctl/core"
Serge Bazanski925ec3d2024-02-05 14:38:20 +010013 "source.monogon.dev/metropolis/node/core/rpc"
14 "source.monogon.dev/metropolis/node/core/rpc/resolver"
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +020015)
16
Mateusz Zalegadb75e212022-08-04 17:31:34 +020017func dialAuthenticated(ctx context.Context) *grpc.ClientConn {
Mateusz Zalega18a67b02022-08-02 13:37:50 +020018 // Collect credentials, validate command parameters, and try dialing the
19 // cluster.
Serge Bazanskicf23ebc2023-03-14 17:02:04 +010020 ocert, opkey, err := core.GetOwnerCredentials(flags.configPath)
Tim Windelschmidtd5f851b2024-04-23 14:59:37 +020021 if errors.Is(err, core.NoCredentialsError) {
Mateusz Zalega18a67b02022-08-02 13:37:50 +020022 log.Fatalf("You have to take ownership of the cluster first: %v", err)
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +020023 }
Mateusz Zalegadb75e212022-08-04 17:31:34 +020024 if len(flags.clusterEndpoints) == 0 {
25 log.Fatal("Please provide at least one cluster endpoint using the --endpoint parameter.")
26 }
Serge Bazanski7eeef0f2024-02-05 14:40:15 +010027
28 ca, err := core.GetClusterCAWithTOFU(ctx, connectOptions())
29 if err != nil {
30 log.Fatalf("Failed to get cluster CA: %v", err)
31 }
32
Serge Bazanski925ec3d2024-02-05 14:38:20 +010033 tlsc := tls.Certificate{
34 Certificate: [][]byte{ocert.Raw},
35 PrivateKey: opkey,
36 }
Serge Bazanski7eeef0f2024-02-05 14:40:15 +010037 creds := rpc.NewAuthenticatedCredentials(tlsc, rpc.WantRemoteCluster(ca))
Serge Bazanski925ec3d2024-02-05 14:38:20 +010038 opts, err := core.DialOpts(ctx, connectOptions())
39 if err != nil {
40 log.Fatalf("While configuring dial options: %v", err)
41 }
42 opts = append(opts, grpc.WithTransportCredentials(creds))
43
44 cc, err := grpc.Dial(resolver.MetropolisControlAddress, opts...)
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +020045 if err != nil {
Serge Bazanski7eeef0f2024-02-05 14:40:15 +010046 log.Fatalf("While dialing cluster: %v", err)
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +020047 }
Mateusz Zalega18a67b02022-08-02 13:37:50 +020048 return cc
Mateusz Zalegad5f2f7a2022-07-05 18:48:56 +020049}
Serge Bazanskib91938f2023-03-29 14:31:22 +020050
51func dialAuthenticatedNode(ctx context.Context, id, address string, cacert *x509.Certificate) *grpc.ClientConn {
52 // Collect credentials, validate command parameters, and try dialing the
53 // cluster.
54 ocert, opkey, err := core.GetOwnerCredentials(flags.configPath)
Tim Windelschmidtd5f851b2024-04-23 14:59:37 +020055 if errors.Is(err, core.NoCredentialsError) {
Serge Bazanskib91938f2023-03-29 14:31:22 +020056 log.Fatalf("You have to take ownership of the cluster first: %v", err)
57 }
58 cc, err := core.DialNode(ctx, opkey, ocert, cacert, flags.proxyAddr, id, address)
59 if err != nil {
60 log.Fatalf("While dialing node: %v", err)
61 }
62 return cc
63}