Skip to content

Commit 9689ae6

Browse files
committed
chore(coderd/coderdtest): wait for provisioner daemons to be connected
1 parent 63572d9 commit 9689ae6

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

coderd/coderdtest/coderdtest.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,8 @@ func NewWithAPI(t testing.TB, options *Options) (*codersdk.Client, io.Closer, *c
559559
var provisionerCloser io.Closer = nopcloser{}
560560
if options.IncludeProvisionerDaemon {
561561
provisionerCloser = NewTaggedProvisionerDaemon(t, coderAPI, "test", options.ProvisionerDaemonTags)
562+
// Wait for the provisioner daemon to be ready before continuing.
563+
AwaitProvisionerDaemonsConnected(t, coderAPI)
562564
}
563565
client := codersdk.New(serverURL)
564566
t.Cleanup(func() {
@@ -570,6 +572,36 @@ func NewWithAPI(t testing.TB, options *Options) (*codersdk.Client, io.Closer, *c
570572
return client, provisionerCloser, coderAPI
571573
}
572574

575+
// AwaitProvisionerDaemonsConnected waits for the provisioner daemon to connect.
576+
func AwaitProvisionerDaemonsConnected(t testing.TB, api *coderd.API) {
577+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
578+
defer cancel()
579+
for {
580+
select {
581+
case <-ctx.Done():
582+
t.Fatal("provisioner daemon did not connect in time")
583+
case <-time.After(testutil.IntervalFast):
584+
// nolint:gocritic // used for testing only
585+
daemons, err := api.Database.GetProvisionerDaemons(dbauthz.AsSystemReadProvisionerDaemons(ctx))
586+
if err != nil {
587+
if errors.Is(err, sql.ErrNoRows) {
588+
t.Logf("no provisioner daemons found yet")
589+
continue
590+
}
591+
require.NoError(t, err)
592+
}
593+
if len(daemons) == 0 {
594+
t.Logf("no provisioner daemons found yet")
595+
continue
596+
}
597+
for _, daemon := range daemons {
598+
t.Logf("found provisioner daemon %q", daemon.Name)
599+
}
600+
return
601+
}
602+
}
603+
}
604+
573605
// ProvisionerdCloser wraps a provisioner daemon as an io.Closer that can be called multiple times
574606
type ProvisionerdCloser struct {
575607
mu sync.Mutex

coderd/templateversions_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,8 @@ func TestPostTemplateVersionsByOrganization(t *testing.T) {
172172
require.Equal(t, provisionersdk.ScopeOrganization, version.Job.Tags[provisionersdk.TagScope])
173173
if assert.Equal(t, version.Job.Status, codersdk.ProvisionerJobPending) {
174174
assert.NotNil(t, version.MatchedProvisioners)
175-
assert.Equal(t, version.MatchedProvisioners.Available, 1)
176-
assert.Equal(t, version.MatchedProvisioners.Count, 1)
175+
assert.Equal(t, 1, version.MatchedProvisioners.Available)
176+
assert.Equal(t, 1, version.MatchedProvisioners.Count)
177177
assert.True(t, version.MatchedProvisioners.MostRecentlySeen.Valid)
178178
}
179179

enterprise/coderd/coderdenttest/coderdenttest.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ func NewWithAPI(t *testing.T, options *Options) (
121121
var provisionerCloser io.Closer = nopcloser{}
122122
if options.IncludeProvisionerDaemon {
123123
provisionerCloser = coderdtest.NewProvisionerDaemon(t, coderAPI.AGPL)
124+
// Wait for provisioner daemons to be connected befroe continuing
125+
coderdtest.AwaitProvisionerDaemonsConnected(t, coderAPI.AGPL)
124126
}
125127

126128
t.Cleanup(func() {

0 commit comments

Comments
 (0)