feat: in-process provisionerd connection (#1568)

* in-process provisionerd connection

Signed-off-by: Spike Curtis <spike@coder.com>

* disable lint for server.go/newProvisionerDaemon

Signed-off-by: Spike Curtis <spike@coder.com>
This commit is contained in:
Spike Curtis
2022-05-19 15:47:45 -07:00
committed by GitHub
parent 376c6819e0
commit 1871b09697
32 changed files with 344 additions and 304 deletions

View File

@ -63,18 +63,21 @@ type Options struct {
SSHKeygenAlgorithm gitsshkey.Algorithm
APIRateLimit int
AutobuildTicker <-chan time.Time
// IncludeProvisionerD when true means to start an in-memory provisionerD
IncludeProvisionerD bool
}
// New constructs an in-memory coderd instance and returns
// the connected client.
func New(t *testing.T, options *Options) *codersdk.Client {
_, cli := NewWithServer(t, options)
_, cli, _ := NewWithServer(t, options)
return cli
}
// NewWithServer returns an in-memory coderd instance and
// the HTTP server it started with.
func NewWithServer(t *testing.T, options *Options) (*httptest.Server, *codersdk.Client) {
func NewWithServer(t *testing.T, options *Options) (*httptest.Server, *codersdk.Client, coderd.CoderD) {
if options == nil {
options = &Options{}
}
@ -130,7 +133,6 @@ func NewWithServer(t *testing.T, options *Options) (*httptest.Server, *codersdk.
srv.Start()
serverURL, err := url.Parse(srv.URL)
require.NoError(t, err)
var closeWait func()
// match default with cli default
if options.SSHKeygenAlgorithm == "" {
@ -141,7 +143,7 @@ func NewWithServer(t *testing.T, options *Options) (*httptest.Server, *codersdk.
require.NoError(t, err)
// We set the handler after server creation for the access URL.
srv.Config.Handler, closeWait = coderd.New(&coderd.Options{
coderDaemon := coderd.New(&coderd.Options{
AgentConnectionUpdateFrequency: 150 * time.Millisecond,
AccessURL: serverURL,
Logger: slogtest.Make(t, nil).Leveled(slog.LevelDebug),
@ -157,20 +159,24 @@ func NewWithServer(t *testing.T, options *Options) (*httptest.Server, *codersdk.
APIRateLimit: options.APIRateLimit,
Authorizer: options.Authorizer,
})
srv.Config.Handler = coderDaemon.Handler()
if options.IncludeProvisionerD {
_ = NewProvisionerDaemon(t, coderDaemon)
}
t.Cleanup(func() {
cancelFunc()
_ = turnServer.Close()
srv.Close()
closeWait()
coderDaemon.CloseWait()
})
return srv, codersdk.New(serverURL)
return srv, codersdk.New(serverURL), coderDaemon
}
// NewProvisionerDaemon launches a provisionerd instance configured to work
// well with coderd testing. It registers the "echo" provisioner for
// quick testing.
func NewProvisionerDaemon(t *testing.T, client *codersdk.Client) io.Closer {
func NewProvisionerDaemon(t *testing.T, coderDaemon coderd.CoderD) io.Closer {
echoClient, echoServer := provisionersdk.TransportPipe()
ctx, cancelFunc := context.WithCancel(context.Background())
t.Cleanup(func() {
@ -185,7 +191,7 @@ func NewProvisionerDaemon(t *testing.T, client *codersdk.Client) io.Closer {
require.NoError(t, err)
}()
closer := provisionerd.New(client.ListenProvisionerDaemon, &provisionerd.Options{
closer := provisionerd.New(coderDaemon.ListenProvisionerDaemon, &provisionerd.Options{
Logger: slogtest.Make(t, nil).Named("provisionerd").Leveled(slog.LevelDebug),
PollInterval: 50 * time.Millisecond,
UpdateInterval: 250 * time.Millisecond,

View File

@ -14,9 +14,9 @@ func TestMain(m *testing.M) {
func TestNew(t *testing.T) {
t.Parallel()
client := coderdtest.New(t, nil)
_, client, coderDaemon := coderdtest.NewWithServer(t, nil)
user := coderdtest.CreateFirstUser(t, client)
closer := coderdtest.NewProvisionerDaemon(t, client)
closer := coderdtest.NewProvisionerDaemon(t, coderDaemon)
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)