github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/client/k8sclient/connect.go (about) 1 package k8sclient 2 3 import ( 4 "context" 5 "fmt" 6 "net" 7 8 "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc" 9 "google.golang.org/grpc" 10 "google.golang.org/grpc/credentials/insecure" 11 empty "google.golang.org/protobuf/types/known/emptypb" 12 13 "github.com/datawire/dlib/dlog" 14 "github.com/telepresenceio/telepresence/rpc/v2/agent" 15 "github.com/telepresenceio/telepresence/rpc/v2/manager" 16 "github.com/telepresenceio/telepresence/v2/pkg/client" 17 "github.com/telepresenceio/telepresence/v2/pkg/dnet" 18 ) 19 20 func ConnectToManager(ctx context.Context, namespace string, grpcDialer dnet.DialerFunc) (*grpc.ClientConn, manager.ManagerClient, *manager.VersionInfo2, error) { 21 grpcAddr := net.JoinHostPort("svc/traffic-manager."+namespace, "api") 22 conn, err := dialClusterGRPC(ctx, grpcAddr, grpcDialer) 23 if err != nil { 24 return nil, nil, nil, client.CheckTimeout(ctx, fmt.Errorf("dial manager: %w", err)) 25 } 26 mClient := manager.NewManagerClient(conn) 27 vi, err := getVersion(ctx, mClient) 28 if err != nil { 29 conn.Close() 30 } 31 return conn, mClient, vi, nil 32 } 33 34 type versionAPI interface { 35 Version(context.Context, *empty.Empty, ...grpc.CallOption) (*manager.VersionInfo2, error) 36 } 37 38 func ConnectToAgent( 39 ctx context.Context, 40 grpcDialer dnet.DialerFunc, 41 podName, namespace string, 42 port uint16, 43 ) (*grpc.ClientConn, agent.AgentClient, *manager.VersionInfo2, error) { 44 grpcAddr := fmt.Sprintf("pod/%s.%s:%d", podName, namespace, port) 45 conn, err := dialClusterGRPC(ctx, grpcAddr, grpcDialer) 46 if err != nil { 47 return nil, nil, nil, client.CheckTimeout(ctx, fmt.Errorf("dial agent: %w", err)) 48 } 49 mClient := agent.NewAgentClient(conn) 50 vi, err := getVersion(ctx, mClient) 51 if err != nil { 52 conn.Close() 53 } 54 return conn, mClient, vi, nil 55 } 56 57 func dialClusterGRPC(ctx context.Context, address string, grpcDialer dnet.DialerFunc) (*grpc.ClientConn, error) { 58 return grpc.DialContext(ctx, address, grpc.WithContextDialer(grpcDialer), 59 grpc.WithTransportCredentials(insecure.NewCredentials()), 60 grpc.WithNoProxy(), 61 grpc.WithBlock(), 62 grpc.WithReturnConnectionError(), 63 grpc.WithStatsHandler(otelgrpc.NewClientHandler())) 64 } 65 66 func getVersion(ctx context.Context, gc versionAPI) (*manager.VersionInfo2, error) { 67 // At this point, we are connected to the traffic-manager. We use the shorter API timeout 68 tos := client.GetConfig(ctx).Timeouts() 69 ctx, cancelAPI := tos.TimeoutContext(ctx, client.TimeoutTrafficManagerAPI) 70 defer cancelAPI() 71 72 vi, err := gc.Version(ctx, &empty.Empty{}) 73 if err != nil { 74 err = client.CheckTimeout(ctx, fmt.Errorf("get version: %w", err)) 75 } else { 76 dlog.Infof(ctx, "Connected to %s %s", vi.Name, vi.Version) 77 } 78 return vi, err 79 }