| 759 | } |
| 760 | |
| 761 | func NewTaggedProvisionerDaemon(t testing.TB, coderAPI *coderd.API, name string, provisionerTags map[string]string, opts ...coderd.MemoryProvisionerDaemonOption) io.Closer { |
| 762 | t.Helper() |
| 763 | |
| 764 | // t.Cleanup runs in last added, first called order. t.TempDir() will delete |
| 765 | // the directory on cleanup, so we want to make sure the echoServer is closed |
| 766 | // before we go ahead an attempt to delete it's work directory. |
| 767 | // seems t.TempDir() is not safe to call from a different goroutine |
| 768 | workDir := t.TempDir() |
| 769 | |
| 770 | echoClient, echoServer := drpcsdk.MemTransportPipe() |
| 771 | ctx, cancelFunc := context.WithCancel(context.Background()) |
| 772 | t.Cleanup(func() { |
| 773 | _ = echoClient.Close() |
| 774 | _ = echoServer.Close() |
| 775 | cancelFunc() |
| 776 | }) |
| 777 | |
| 778 | go func() { |
| 779 | err := echo.Serve(ctx, &provisionersdk.ServeOptions{ |
| 780 | Listener: echoServer, |
| 781 | WorkDirectory: workDir, |
| 782 | Logger: coderAPI.Logger.Named("echo").Leveled(slog.LevelDebug), |
| 783 | }) |
| 784 | assert.NoError(t, err) |
| 785 | }() |
| 786 | |
| 787 | connectedCh := make(chan struct{}) |
| 788 | daemon := provisionerd.New(func(dialCtx context.Context) (provisionerdproto.DRPCProvisionerDaemonClient, error) { |
| 789 | return coderAPI.CreateInMemoryTaggedProvisionerDaemon(dialCtx, name, []codersdk.ProvisionerType{codersdk.ProvisionerTypeEcho}, provisionerTags, opts...) |
| 790 | }, &provisionerd.Options{ |
| 791 | Logger: coderAPI.Logger.Named("provisionerd").Leveled(slog.LevelDebug), |
| 792 | UpdateInterval: 250 * time.Millisecond, |
| 793 | ForceCancelInterval: 5 * time.Second, |
| 794 | Connector: provisionerd.LocalProvisioners{ |
| 795 | string(database.ProvisionerTypeEcho): sdkproto.NewDRPCProvisionerClient(echoClient), |
| 796 | }, |
| 797 | InitConnectionCh: connectedCh, |
| 798 | }) |
| 799 | // Wait for the provisioner daemon to connect before continuing. |
| 800 | // Users of this function tend to assume that the provisioner is connected |
| 801 | // and ready to use when that may not strictly be the case. |
| 802 | <-connectedCh |
| 803 | closer := NewProvisionerDaemonCloser(daemon) |
| 804 | t.Cleanup(func() { |
| 805 | _ = closer.Close() |
| 806 | }) |
| 807 | return closer |
| 808 | } |
| 809 | |
| 810 | var FirstUserParams = codersdk.CreateFirstUserRequest{ |
| 811 | Email: "testuser@coder.com", |