NewClientWithSecrets is like NewClient but also injects user secrets into the agent's proto manifest. Separate from NewClient because agentsdk.Manifest intentionally does not carry secrets; see the Manifest doc comment in codersdk/agentsdk.
(t testing.TB, logger slog.Logger, agentID uuid.UUID, manifest agentsdk.Manifest, secrets []agentsdk.WorkspaceSecret, statsChan chan *agentproto.Stats, coordinator tailnet.Coordinator, )
| 49 | // because agentsdk.Manifest intentionally does not carry secrets; |
| 50 | // see the Manifest doc comment in codersdk/agentsdk. |
| 51 | func NewClientWithSecrets(t testing.TB, |
| 52 | logger slog.Logger, |
| 53 | agentID uuid.UUID, |
| 54 | manifest agentsdk.Manifest, |
| 55 | secrets []agentsdk.WorkspaceSecret, |
| 56 | statsChan chan *agentproto.Stats, |
| 57 | coordinator tailnet.Coordinator, |
| 58 | ) *Client { |
| 59 | if manifest.AgentID == uuid.Nil { |
| 60 | manifest.AgentID = agentID |
| 61 | } |
| 62 | coordPtr := atomic.Pointer[tailnet.Coordinator]{} |
| 63 | coordPtr.Store(&coordinator) |
| 64 | mux := drpcmux.New() |
| 65 | derpMapUpdates := make(chan *tailcfg.DERPMap) |
| 66 | drpcService := &tailnet.DRPCService{ |
| 67 | CoordPtr: &coordPtr, |
| 68 | Logger: logger.Named("tailnetsvc"), |
| 69 | DerpMapUpdateFrequency: time.Microsecond, |
| 70 | DerpMapFn: func() *tailcfg.DERPMap { return <-derpMapUpdates }, |
| 71 | } |
| 72 | err := proto.DRPCRegisterTailnet(mux, drpcService) |
| 73 | require.NoError(t, err) |
| 74 | mp, err := agentsdk.ProtoFromManifest(manifest) |
| 75 | require.NoError(t, err) |
| 76 | mp.Secrets = agentsdk.ProtoFromSecrets(secrets) |
| 77 | fakeAAPI := NewFakeAgentAPI(t, logger, mp, statsChan) |
| 78 | err = agentproto.DRPCRegisterAgent(mux, fakeAAPI) |
| 79 | require.NoError(t, err) |
| 80 | server := drpcserver.NewWithOptions(mux, drpcserver.Options{ |
| 81 | Manager: drpcsdk.DefaultDRPCOptions(nil), |
| 82 | Log: func(err error) { |
| 83 | if xerrors.Is(err, io.EOF) { |
| 84 | return |
| 85 | } |
| 86 | logger.Debug(context.Background(), "drpc server error", slog.Error(err)) |
| 87 | }, |
| 88 | }) |
| 89 | return &Client{ |
| 90 | t: t, |
| 91 | logger: logger.Named("client"), |
| 92 | agentID: agentID, |
| 93 | server: server, |
| 94 | fakeAgentAPI: fakeAAPI, |
| 95 | derpMapUpdates: derpMapUpdates, |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | type Client struct { |
| 100 | t testing.TB |