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  }