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 }