github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/client/cli/internal/apiimpl/client.go (about)

     1  package apiimpl
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"regexp"
     7  
     8  	"github.com/blang/semver/v4"
     9  
    10  	"github.com/telepresenceio/telepresence/v2/pkg/client"
    11  	"github.com/telepresenceio/telepresence/v2/pkg/client/cli/api"
    12  	"github.com/telepresenceio/telepresence/v2/pkg/client/cli/connect"
    13  	"github.com/telepresenceio/telepresence/v2/pkg/client/cli/daemon"
    14  	"github.com/telepresenceio/telepresence/v2/pkg/client/cli/helm"
    15  	"github.com/telepresenceio/telepresence/v2/pkg/client/docker"
    16  	"github.com/telepresenceio/telepresence/v2/pkg/client/logging"
    17  	"github.com/telepresenceio/telepresence/v2/pkg/dos"
    18  	"github.com/telepresenceio/telepresence/v2/pkg/version"
    19  )
    20  
    21  type impl struct {
    22  	context.Context
    23  }
    24  
    25  func (c *impl) Connect(cr api.ConnectRequest) (api.Connection, error) {
    26  	dcr := toDaemonRequest(&cr)
    27  	ctx, err := dcr.Commit(c)
    28  	if err != nil {
    29  		return nil, err
    30  	}
    31  	if cr.Stdout != nil {
    32  		ctx = dos.WithStdout(ctx, cr.Stdout)
    33  	}
    34  	ctx, err = connect.Initializer(ctx)
    35  	if err != nil {
    36  		return nil, err
    37  	}
    38  	if cr.Docker {
    39  		ctx = docker.EnableClient(ctx)
    40  	}
    41  	return withSession(ctx)
    42  }
    43  
    44  func (c *impl) QuitAllDaemons() {
    45  	connect.Quit(c)
    46  }
    47  
    48  func (c *impl) Connections() ([]*daemon.Info, error) {
    49  	return daemon.LoadInfos(c)
    50  }
    51  
    52  func (c *impl) Connection(name string) (api.Connection, error) {
    53  	ci, err := daemon.LoadMatchingInfo(c, regexp.MustCompile(fmt.Sprintf(`\A%s\z`, regexp.QuoteMeta(name))))
    54  	if err != nil {
    55  		return nil, err
    56  	}
    57  	ud, err := connect.ExistingDaemon(c, ci)
    58  	if err != nil {
    59  		return nil, err
    60  	}
    61  	ctx := daemon.WithUserClient(c, ud)
    62  	cr := daemon.NewDefaultRequest()
    63  	cr.Implicit = true
    64  	cr.Docker = ud.Containerized()
    65  	if cr.Docker {
    66  		ctx = docker.EnableClient(ctx)
    67  	}
    68  	return withSession(daemon.WithRequest(ctx, cr))
    69  }
    70  
    71  func withSession(ctx context.Context) (api.Connection, error) {
    72  	ctx, err := connect.EnsureSession(ctx, "", true)
    73  	if err != nil {
    74  		return nil, err
    75  	}
    76  	return &connection{Context: ctx}, nil
    77  }
    78  
    79  func (c *impl) Helm(hr *helm.Request, cr api.ConnectRequest) error {
    80  	dcr := toDaemonRequest(&cr)
    81  	return hr.Run(c, &dcr.ConnectRequest)
    82  }
    83  
    84  func (c *impl) Version() semver.Version {
    85  	return version.Structured
    86  }
    87  
    88  func NewClient(ctx context.Context) api.Client {
    89  	env, err := client.LoadEnv()
    90  	if err != nil {
    91  		panic(err)
    92  	}
    93  	cfg, err := client.LoadConfig(ctx)
    94  	if err != nil {
    95  		panic(fmt.Errorf("failed to load config: %w", err))
    96  	}
    97  	ctx = client.WithConfig(ctx, cfg)
    98  	if ctx, err = logging.InitContext(ctx, "cli", logging.RotateDaily, false); err != nil {
    99  		panic(err)
   100  	}
   101  	return &impl{Context: client.WithEnv(ctx, env)}
   102  }