(t *testing.T)
| 21 | ) |
| 22 | |
| 23 | func TestProvisionerDaemons(t *testing.T) { |
| 24 | t.Parallel() |
| 25 | |
| 26 | db, ps := dbtestutil.NewDB(t, |
| 27 | dbtestutil.WithDumpOnFailure(), |
| 28 | //nolint:gocritic // Use UTC for consistent timestamp length in golden files. |
| 29 | dbtestutil.WithTimezone("UTC"), |
| 30 | ) |
| 31 | client, _, coderdAPI := coderdtest.NewWithAPI(t, &coderdtest.Options{ |
| 32 | IncludeProvisionerDaemon: false, |
| 33 | Database: db, |
| 34 | Pubsub: ps, |
| 35 | }) |
| 36 | owner := coderdtest.CreateFirstUser(t, client) |
| 37 | templateAdminClient, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID, rbac.ScopedRoleOrgTemplateAdmin(owner.OrganizationID)) |
| 38 | memberClient, member := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) |
| 39 | |
| 40 | // Create initial resources with a running provisioner. |
| 41 | firstProvisioner := coderdtest.NewTaggedProvisionerDaemon(t, coderdAPI, "default-provisioner", map[string]string{"owner": "", "scope": "organization"}) |
| 42 | t.Cleanup(func() { _ = firstProvisioner.Close() }) |
| 43 | version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil) |
| 44 | coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) |
| 45 | template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) |
| 46 | |
| 47 | workspace := coderdtest.CreateWorkspace(t, client, template.ID) |
| 48 | coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) |
| 49 | |
| 50 | // Stop the provisioner so it doesn't grab any more jobs. |
| 51 | firstProvisioner.Close() |
| 52 | |
| 53 | // Create a provisioner that's working on a job. |
| 54 | pd1 := dbgen.ProvisionerDaemon(t, coderdAPI.Database, database.ProvisionerDaemon{ |
| 55 | Name: "provisioner-1", |
| 56 | CreatedAt: dbtime.Now().Add(1 * time.Second), |
| 57 | LastSeenAt: sql.NullTime{Time: coderdAPI.Clock.Now().Add(time.Hour), Valid: true}, // Stale interval can't be adjusted, keep online. |
| 58 | KeyID: codersdk.ProvisionerKeyUUIDBuiltIn, |
| 59 | Tags: database.StringMap{"owner": "", "scope": "organization", "foo": "bar"}, |
| 60 | }) |
| 61 | w1 := dbgen.Workspace(t, coderdAPI.Database, database.WorkspaceTable{ |
| 62 | OwnerID: member.ID, |
| 63 | TemplateID: template.ID, |
| 64 | }) |
| 65 | wb1ID := uuid.MustParse("00000000-0000-0000-dddd-000000000001") |
| 66 | job1 := dbgen.ProvisionerJob(t, db, coderdAPI.Pubsub, database.ProvisionerJob{ |
| 67 | WorkerID: uuid.NullUUID{UUID: pd1.ID, Valid: true}, |
| 68 | Input: json.RawMessage(`{"workspace_build_id":"` + wb1ID.String() + `"}`), |
| 69 | CreatedAt: dbtime.Now().Add(2 * time.Second), |
| 70 | StartedAt: sql.NullTime{Time: coderdAPI.Clock.Now(), Valid: true}, |
| 71 | Tags: database.StringMap{"owner": "", "scope": "organization", "foo": "bar"}, |
| 72 | }) |
| 73 | dbgen.WorkspaceBuild(t, coderdAPI.Database, database.WorkspaceBuild{ |
| 74 | ID: wb1ID, |
| 75 | JobID: job1.ID, |
| 76 | WorkspaceID: w1.ID, |
| 77 | TemplateVersionID: version.ID, |
| 78 | }) |
| 79 | |
| 80 | // Create a provisioner that completed a job previously and is offline. |
nothing calls this directly
no test coverage detected