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

     1  package userd
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/blang/semver/v4"
     7  	"google.golang.org/grpc"
     8  	core "k8s.io/api/core/v1"
     9  	typed "k8s.io/client-go/kubernetes/typed/core/v1"
    10  	"k8s.io/client-go/rest"
    11  
    12  	"github.com/datawire/dlib/dgroup"
    13  	"github.com/telepresenceio/telepresence/rpc/v2/common"
    14  	"github.com/telepresenceio/telepresence/rpc/v2/connector"
    15  	rpc "github.com/telepresenceio/telepresence/rpc/v2/connector"
    16  	rootdRpc "github.com/telepresenceio/telepresence/rpc/v2/daemon"
    17  	"github.com/telepresenceio/telepresence/rpc/v2/manager"
    18  	"github.com/telepresenceio/telepresence/v2/pkg/agentconfig"
    19  	"github.com/telepresenceio/telepresence/v2/pkg/client"
    20  	"github.com/telepresenceio/telepresence/v2/pkg/restapi"
    21  )
    22  
    23  type WatchWorkloadsStream interface {
    24  	Send(*rpc.WorkloadInfoSnapshot) error
    25  	Context() context.Context
    26  }
    27  
    28  type InterceptInfo interface {
    29  	InterceptResult() *rpc.InterceptResult
    30  	PreparedIntercept() *manager.PreparedIntercept
    31  	PortIdentifier() (agentconfig.PortIdentifier, error)
    32  }
    33  
    34  type KubeConfig interface {
    35  	GetContext() string
    36  	GetRestConfig() *rest.Config
    37  	GetManagerNamespace() string
    38  }
    39  
    40  type NamespaceListener func(context.Context)
    41  
    42  type Session interface {
    43  	restapi.AgentState
    44  	KubeConfig
    45  
    46  	AddIntercept(context.Context, *rpc.CreateInterceptRequest) *rpc.InterceptResult
    47  	CanIntercept(context.Context, *rpc.CreateInterceptRequest) (InterceptInfo, *rpc.InterceptResult)
    48  	InterceptProlog(context.Context, *manager.CreateInterceptRequest) *rpc.InterceptResult
    49  	InterceptEpilog(context.Context, *rpc.CreateInterceptRequest, *rpc.InterceptResult) *rpc.InterceptResult
    50  	RemoveIntercept(context.Context, string) error
    51  	NewCreateInterceptRequest(*manager.InterceptSpec) *manager.CreateInterceptRequest
    52  
    53  	AddInterceptor(string, *rpc.Interceptor) error
    54  	RemoveInterceptor(string) error
    55  	ClearIntercepts(context.Context) error
    56  
    57  	GetInterceptInfo(string) *manager.InterceptInfo
    58  	GetInterceptSpec(string) *manager.InterceptSpec
    59  	InterceptsForWorkload(string, string) []*manager.InterceptSpec
    60  
    61  	ManagerClient() manager.ManagerClient
    62  	ManagerConn() *grpc.ClientConn
    63  	ManagerName() string
    64  	ManagerVersion() semver.Version
    65  	NewRemainRequest() *manager.RemainRequest
    66  
    67  	Status(context.Context) *rpc.ConnectInfo
    68  	UpdateStatus(context.Context, *rpc.ConnectRequest) *rpc.ConnectInfo
    69  
    70  	Uninstall(context.Context, *rpc.UninstallRequest) (*common.Result, error)
    71  
    72  	WatchWorkloads(context.Context, *rpc.WatchWorkloadsRequest, WatchWorkloadsStream) error
    73  	WorkloadInfoSnapshot(context.Context, []string, rpc.ListRequest_Filter) (*rpc.WorkloadInfoSnapshot, error)
    74  
    75  	GetCurrentNamespaces(forClientAccess bool) []string
    76  	ActualNamespace(string) string
    77  	AddNamespaceListener(context.Context, NamespaceListener)
    78  
    79  	WithK8sInterface(context.Context) context.Context
    80  	ForeachAgentPod(ctx context.Context, fn func(context.Context, typed.PodInterface, *core.Pod), filter func(*core.Pod) bool) error
    81  
    82  	GatherLogs(context.Context, *connector.LogsRequest) (*connector.LogsResponse, error)
    83  	GatherTraces(ctx context.Context, tr *connector.TracesRequest) *common.Result
    84  
    85  	SessionInfo() *manager.SessionInfo
    86  	RootDaemon() rootdRpc.DaemonClient
    87  
    88  	ApplyConfig(context.Context) error
    89  	GetConfig(context.Context) (*client.SessionConfig, error)
    90  	RunSession(c context.Context) error
    91  	StartServices(g *dgroup.Group)
    92  	Remain(ctx context.Context) error
    93  	Epilog(ctx context.Context)
    94  	Done() <-chan struct{}
    95  }
    96  
    97  type NewSessionFunc func(context.Context, *rpc.ConnectRequest, *client.Kubeconfig) (context.Context, Session, *connector.ConnectInfo)
    98  
    99  type newSessionKey struct{}
   100  
   101  func WithNewSessionFunc(ctx context.Context, f NewSessionFunc) context.Context {
   102  	return context.WithValue(ctx, newSessionKey{}, f)
   103  }
   104  
   105  func GetNewSessionFunc(ctx context.Context) NewSessionFunc {
   106  	if f, ok := ctx.Value(newSessionKey{}).(NewSessionFunc); ok {
   107  		return f
   108  	}
   109  	panic("No User daemon Session creator has been registered")
   110  }