diff --git a/cli/agent_test.go b/cli/agent_test.go index dd2266ec14394..a1f519cf4dada 100644 --- a/cli/agent_test.go +++ b/cli/agent_test.go @@ -16,8 +16,9 @@ import ( "github.com/coder/coder/v2/agent" "github.com/coder/coder/v2/cli/clitest" "github.com/coder/coder/v2/coderd/coderdtest" + "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/coderd/database/dbfake" "github.com/coder/coder/v2/codersdk" - "github.com/coder/coder/v2/provisioner/echo" "github.com/coder/coder/v2/provisionersdk/proto" "github.com/coder/coder/v2/pty/ptytest" ) @@ -28,20 +29,12 @@ func TestWorkspaceAgent(t *testing.T) { t.Run("LogDirectory", func(t *testing.T) { t.Parallel() - authToken := uuid.NewString() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionApply: echo.ProvisionApplyWithAgent(authToken), + ws, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - logDir := t.TempDir() inv, _ := clitest.New(t, "agent", @@ -57,7 +50,7 @@ func TestWorkspaceAgent(t *testing.T) { ctx := inv.Context() pty.ExpectMatchContext(ctx, "agent is starting now") - coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) info, err := os.Stat(filepath.Join(logDir, "coder-agent.log")) require.NoError(t, err) @@ -68,33 +61,23 @@ func TestWorkspaceAgent(t *testing.T) { t.Parallel() instanceID := "instanceidentifier" certificates, metadataClient := coderdtest.NewAzureInstanceIdentity(t, instanceID) - client := coderdtest.New(t, &coderdtest.Options{ - AzureCertificates: certificates, - IncludeProvisionerDaemon: true, + client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{ + AzureCertificates: certificates, }) user := coderdtest.CreateFirstUser(t, client) - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "somename", - Type: "someinstance", - Agents: []*proto.Agent{{ - Auth: &proto.Agent_InstanceId{ - InstanceId: instanceID, - }, - }}, - }}, - }, + ws := dbfake.Workspace(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, + }) + dbfake.WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, &proto.Resource{ + Name: "somename", + Type: "someinstance", + Agents: []*proto.Agent{{ + Auth: &proto.Agent_InstanceId{ + InstanceId: instanceID, }, }}, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) inv, _ := clitest.New(t, "agent", "--auth", "azure-instance-identity", "--agent-url", client.URL.String()) inv = inv.WithContext( @@ -103,8 +86,8 @@ func TestWorkspaceAgent(t *testing.T) { ) ctx := inv.Context() clitest.Start(t, inv) - coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) - workspace, err := client.Workspace(ctx, workspace.ID) + coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) + workspace, err := client.Workspace(ctx, ws.ID) require.NoError(t, err) resources := workspace.LatestBuild.Resources if assert.NotEmpty(t, workspace.LatestBuild.Resources) && assert.NotEmpty(t, resources[0].Agents) { @@ -120,33 +103,23 @@ func TestWorkspaceAgent(t *testing.T) { t.Parallel() instanceID := "instanceidentifier" certificates, metadataClient := coderdtest.NewAWSInstanceIdentity(t, instanceID) - client := coderdtest.New(t, &coderdtest.Options{ - AWSCertificates: certificates, - IncludeProvisionerDaemon: true, + client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{ + AWSCertificates: certificates, }) user := coderdtest.CreateFirstUser(t, client) - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "somename", - Type: "someinstance", - Agents: []*proto.Agent{{ - Auth: &proto.Agent_InstanceId{ - InstanceId: instanceID, - }, - }}, - }}, - }, + ws := dbfake.Workspace(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, + }) + dbfake.WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, &proto.Resource{ + Name: "somename", + Type: "someinstance", + Agents: []*proto.Agent{{ + Auth: &proto.Agent_InstanceId{ + InstanceId: instanceID, }, }}, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) inv, _ := clitest.New(t, "agent", "--auth", "aws-instance-identity", "--agent-url", client.URL.String()) inv = inv.WithContext( @@ -155,8 +128,8 @@ func TestWorkspaceAgent(t *testing.T) { ) clitest.Start(t, inv) ctx := inv.Context() - coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) - workspace, err := client.Workspace(ctx, workspace.ID) + coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) + workspace, err := client.Workspace(ctx, ws.ID) require.NoError(t, err) resources := workspace.LatestBuild.Resources if assert.NotEmpty(t, resources) && assert.NotEmpty(t, resources[0].Agents) { @@ -172,35 +145,24 @@ func TestWorkspaceAgent(t *testing.T) { t.Parallel() instanceID := "instanceidentifier" validator, metadataClient := coderdtest.NewGoogleInstanceIdentity(t, instanceID, false) - client := coderdtest.New(t, &coderdtest.Options{ - GoogleTokenValidator: validator, - IncludeProvisionerDaemon: true, + client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{ + GoogleTokenValidator: validator, }) owner := coderdtest.CreateFirstUser(t, client) - member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) - version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "somename", - Type: "someinstance", - Agents: []*proto.Agent{{ - Auth: &proto.Agent_InstanceId{ - InstanceId: instanceID, - }, - }}, - }}, - }, + member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID) + ws := dbfake.Workspace(t, db, database.Workspace{ + OrganizationID: owner.OrganizationID, + OwnerID: memberUser.ID, + }) + dbfake.WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, &proto.Resource{ + Name: "somename", + Type: "someinstance", + Agents: []*proto.Agent{{ + Auth: &proto.Agent_InstanceId{ + InstanceId: instanceID, }, }}, }) - template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, member, owner.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - inv, cfg := clitest.New(t, "agent", "--auth", "google-instance-identity", "--agent-url", client.URL.String()) ptytest.New(t).Attach(inv) clitest.SetupConfig(t, member, cfg) @@ -212,9 +174,8 @@ func TestWorkspaceAgent(t *testing.T) { ) ctx := inv.Context() - - coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) - workspace, err := client.Workspace(ctx, workspace.ID) + coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) + workspace, err := client.Workspace(ctx, ws.ID) require.NoError(t, err) resources := workspace.LatestBuild.Resources if assert.NotEmpty(t, resources) && assert.NotEmpty(t, resources[0].Agents) { @@ -244,19 +205,12 @@ func TestWorkspaceAgent(t *testing.T) { t.Run("PostStartup", func(t *testing.T) { t.Parallel() - authToken := uuid.NewString() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionApply: echo.ProvisionApplyWithAgent(authToken), + ws, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) logDir := t.TempDir() inv, _ := clitest.New(t, @@ -274,7 +228,7 @@ func TestWorkspaceAgent(t *testing.T) { clitest.Start(t, inv) pty.ExpectMatchContext(inv.Context(), "agent is starting now") - resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + resources := coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) require.Len(t, resources, 1) require.Len(t, resources[0].Agents, 1) require.Len(t, resources[0].Agents[0].Subsystems, 2) diff --git a/coderd/coderdtest/coderdtest.go b/coderd/coderdtest/coderdtest.go index 85ceeba1be349..2722f0b346fd9 100644 --- a/coderd/coderdtest/coderdtest.go +++ b/coderd/coderdtest/coderdtest.go @@ -151,6 +151,13 @@ func New(t testing.TB, options *Options) *codersdk.Client { return client } +// NewWithDatabase constructs a codersdk client connected to an in-memory API instance. +// The database is returned to provide direct data manipulation for tests. +func NewWithDatabase(t testing.TB, options *Options) (*codersdk.Client, database.Store) { + client, _, api := NewWithAPI(t, options) + return client, api.Database +} + // NewWithProvisionerCloser returns a client as well as a handle to close // the provisioner. This is a temporary function while work is done to // standardize how provisioners are registered with coderd. The option diff --git a/coderd/database/dbfake/dbfake.go b/coderd/database/dbfake/dbfake.go new file mode 100644 index 0000000000000..442361de36834 --- /dev/null +++ b/coderd/database/dbfake/dbfake.go @@ -0,0 +1,146 @@ +package dbfake + +import ( + "context" + "database/sql" + "encoding/json" + "testing" + + "github.com/google/uuid" + "github.com/sqlc-dev/pqtype" + "github.com/stretchr/testify/require" + + "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/coderd/database/dbauthz" + "github.com/coder/coder/v2/coderd/database/dbgen" + "github.com/coder/coder/v2/coderd/database/dbtime" + "github.com/coder/coder/v2/coderd/provisionerdserver" + "github.com/coder/coder/v2/coderd/telemetry" + sdkproto "github.com/coder/coder/v2/provisionersdk/proto" +) + +// Workspace inserts a workspace into the database. +func Workspace(t testing.TB, db database.Store, seed database.Workspace) database.Workspace { + t.Helper() + + // This intentionally fulfills the minimum requirements of the schema. + // Tests can provide a custom template ID if necessary. + if seed.TemplateID == uuid.Nil { + template := dbgen.Template(t, db, database.Template{ + OrganizationID: seed.OrganizationID, + CreatedBy: seed.OwnerID, + }) + seed.TemplateID = template.ID + seed.OwnerID = template.CreatedBy + seed.OrganizationID = template.OrganizationID + } + return dbgen.Workspace(t, db, seed) +} + +// WorkspaceWithAgent is a helper that generates a workspace with a single resource +// that has an agent attached to it. The agent token is returned. +func WorkspaceWithAgent(t testing.TB, db database.Store, seed database.Workspace) (database.Workspace, string) { + t.Helper() + authToken := uuid.NewString() + ws := Workspace(t, db, seed) + WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, &sdkproto.Resource{ + Name: "example", + Type: "aws_instance", + Agents: []*sdkproto.Agent{{ + Id: uuid.NewString(), + Auth: &sdkproto.Agent_Token{ + Token: authToken, + }, + }}, + }) + return ws, authToken +} + +// WorkspaceBuild inserts a build and a successful job into the database. +func WorkspaceBuild(t testing.TB, db database.Store, ws database.Workspace, seed database.WorkspaceBuild, resources ...*sdkproto.Resource) database.WorkspaceBuild { + t.Helper() + jobID := uuid.New() + seed.ID = uuid.New() + seed.JobID = jobID + seed.WorkspaceID = ws.ID + + // Create a provisioner job for the build! + payload, err := json.Marshal(provisionerdserver.WorkspaceProvisionJob{ + WorkspaceBuildID: seed.ID, + }) + require.NoError(t, err) + //nolint:gocritic // This is only used by tests. + ctx := dbauthz.AsSystemRestricted(context.Background()) + job, err := db.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{ + ID: jobID, + CreatedAt: dbtime.Now(), + UpdatedAt: dbtime.Now(), + OrganizationID: ws.OrganizationID, + InitiatorID: ws.OwnerID, + Provisioner: database.ProvisionerTypeEcho, + StorageMethod: database.ProvisionerStorageMethodFile, + FileID: uuid.New(), + Type: database.ProvisionerJobTypeWorkspaceBuild, + Input: payload, + Tags: nil, + TraceMetadata: pqtype.NullRawMessage{}, + }) + require.NoError(t, err, "insert job") + err = db.UpdateProvisionerJobWithCompleteByID(ctx, database.UpdateProvisionerJobWithCompleteByIDParams{ + ID: job.ID, + UpdatedAt: dbtime.Now(), + Error: sql.NullString{}, + ErrorCode: sql.NullString{}, + CompletedAt: sql.NullTime{ + Time: dbtime.Now(), + Valid: true, + }, + }) + require.NoError(t, err, "complete job") + + // This intentionally fulfills the minimum requirements of the schema. + // Tests can provide a custom version ID if necessary. + if seed.TemplateVersionID == uuid.Nil { + jobID := uuid.New() + templateVersion := dbgen.TemplateVersion(t, db, database.TemplateVersion{ + JobID: jobID, + OrganizationID: ws.OrganizationID, + CreatedBy: ws.OwnerID, + TemplateID: uuid.NullUUID{ + UUID: ws.TemplateID, + Valid: true, + }, + }) + payload, _ := json.Marshal(provisionerdserver.TemplateVersionImportJob{ + TemplateVersionID: templateVersion.ID, + }) + dbgen.ProvisionerJob(t, db, nil, database.ProvisionerJob{ + ID: jobID, + OrganizationID: ws.OrganizationID, + Input: payload, + Type: database.ProvisionerJobTypeTemplateVersionImport, + CompletedAt: sql.NullTime{ + Time: dbtime.Now(), + Valid: true, + }, + }) + seed.TemplateVersionID = templateVersion.ID + } + build := dbgen.WorkspaceBuild(t, db, seed) + ProvisionerJobResources(t, db, job.ID, seed.Transition, resources...) + return build +} + +// ProvisionerJobResources inserts a series of resources into a provisioner job. +func ProvisionerJobResources(t testing.TB, db database.Store, job uuid.UUID, transition database.WorkspaceTransition, resources ...*sdkproto.Resource) { + t.Helper() + if transition == "" { + // Default to start! + transition = database.WorkspaceTransitionStart + } + for _, resource := range resources { + //nolint:gocritic // This is only used by tests. + err := provisionerdserver.InsertWorkspaceResource(dbauthz.AsSystemRestricted(context.Background()), db, job, transition, resource, &telemetry.Snapshot{}) + require.NoError(t, err) + } +} diff --git a/coderd/database/dbgen/dbgen.go b/coderd/database/dbgen/dbgen.go index b1146b4f49d81..970709fec9087 100644 --- a/coderd/database/dbgen/dbgen.go +++ b/coderd/database/dbgen/dbgen.go @@ -66,6 +66,12 @@ func AuditLog(t testing.TB, db database.Store, seed database.AuditLog) database. func Template(t testing.TB, db database.Store, seed database.Template) database.Template { id := takeFirst(seed.ID, uuid.New()) + if seed.GroupACL == nil { + // By default, all users in the organization can read the template. + seed.GroupACL = database.TemplateACL{ + seed.OrganizationID.String(): []rbac.Action{rbac.ActionRead}, + } + } err := db.InsertTemplate(genCtx, database.InsertTemplateParams{ ID: id, CreatedAt: takeFirst(seed.CreatedAt, dbtime.Now()), @@ -84,7 +90,7 @@ func Template(t testing.TB, db database.Store, seed database.Template) database. }) require.NoError(t, err, "insert template") - template, err := db.GetTemplateByID(context.Background(), id) + template, err := db.GetTemplateByID(genCtx, id) require.NoError(t, err, "get template") return template } diff --git a/coderd/workspaceagents_test.go b/coderd/workspaceagents_test.go index 10028f91fa3f3..b420f4a267284 100644 --- a/coderd/workspaceagents_test.go +++ b/coderd/workspaceagents_test.go @@ -23,6 +23,7 @@ import ( "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/coderd/coderdtest" "github.com/coder/coder/v2/coderd/database" + "github.com/coder/coder/v2/coderd/database/dbfake" "github.com/coder/coder/v2/coderd/database/dbtime" "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/codersdk/agentsdk" @@ -36,44 +37,25 @@ func TestWorkspaceAgent(t *testing.T) { t.Parallel() t.Run("Connect", func(t *testing.T) { t.Parallel() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() tmpDir := t.TempDir() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - Agents: []*proto.Agent{{ - Id: uuid.NewString(), - Directory: tmpDir, - Auth: &proto.Agent_Token{ - Token: authToken, - }, - }}, - }}, - }, - }, + anotherClient, anotherUser := coderdtest.CreateAnotherUser(t, client, user.OrganizationID) + + ws := dbfake.Workspace(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: anotherUser.ID, + }) + dbfake.WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, &proto.Resource{ + Name: "aws_instance", + Agents: []*proto.Agent{{ + Id: uuid.NewString(), + Directory: tmpDir, }}, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - - anotherClient, _ := coderdtest.CreateAnotherUser(t, client, user.OrganizationID) - workspace := coderdtest.CreateWorkspace(t, anotherClient, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, anotherClient, workspace.LatestBuild.ID) - ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() - - workspace, err := anotherClient.Workspace(ctx, workspace.ID) + workspace, err := anotherClient.Workspace(ctx, ws.ID) require.NoError(t, err) require.Equal(t, tmpDir, workspace.LatestBuild.Resources[0].Agents[0].Directory) _, err = anotherClient.WorkspaceAgent(ctx, workspace.LatestBuild.Resources[0].Agents[0].ID) @@ -82,42 +64,25 @@ func TestWorkspaceAgent(t *testing.T) { }) t.Run("HasFallbackTroubleshootingURL", func(t *testing.T) { t.Parallel() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() tmpDir := t.TempDir() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - Agents: []*proto.Agent{{ - Id: uuid.NewString(), - Directory: tmpDir, - Auth: &proto.Agent_Token{ - Token: authToken, - }, - }}, - }}, - }, - }, + ws := dbfake.Workspace(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, + }) + dbfake.WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, &proto.Resource{ + Name: "aws_instance", + Agents: []*proto.Agent{{ + Id: uuid.NewString(), + Directory: tmpDir, }}, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitMedium) defer cancel() - workspace, err := client.Workspace(ctx, workspace.ID) + workspace, err := client.Workspace(ctx, ws.ID) require.NoError(t, err) require.NotEmpty(t, workspace.LatestBuild.Resources[0].Agents[0].TroubleshootingURL) t.Log(workspace.LatestBuild.Resources[0].Agents[0].TroubleshootingURL) @@ -126,50 +91,39 @@ func TestWorkspaceAgent(t *testing.T) { t.Parallel() // timeouts can cause error logs to be dropped on shutdown logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}).Leveled(slog.LevelDebug) - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - Logger: &logger, + client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{ + Logger: &logger, }) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() tmpDir := t.TempDir() wantTroubleshootingURL := "https://example.com/troubleshoot" - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - Agents: []*proto.Agent{{ - Id: uuid.NewString(), - Directory: tmpDir, - Auth: &proto.Agent_Token{ - Token: authToken, - }, - ConnectionTimeoutSeconds: 1, - TroubleshootingUrl: wantTroubleshootingURL, - }}, - }}, - }, + ws := dbfake.Workspace(t, db, database.Workspace{ + OwnerID: user.UserID, + OrganizationID: user.OrganizationID, + }) + dbfake.WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, &proto.Resource{ + Name: "example", + Type: "aws_instance", + Agents: []*proto.Agent{{ + Id: uuid.NewString(), + Directory: tmpDir, + Auth: &proto.Agent_Token{ + Token: uuid.NewString(), }, + ConnectionTimeoutSeconds: 1, + TroubleshootingUrl: wantTroubleshootingURL, }}, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitMedium) defer cancel() var err error + var workspace codersdk.Workspace testutil.Eventually(ctx, t, func(ctx context.Context) (done bool) { - workspace, err = client.Workspace(ctx, workspace.ID) + workspace, err = client.Workspace(ctx, ws.ID) if !assert.NoError(t, err) { return false } @@ -183,10 +137,12 @@ func TestWorkspaceAgent(t *testing.T) { t.Run("DisplayApps", func(t *testing.T) { t.Parallel() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) + ws := dbfake.Workspace(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, + }) authToken := uuid.NewString() tmpDir := t.TempDir() apps := &proto.DisplayApps{ @@ -196,44 +152,22 @@ func TestWorkspaceAgent(t *testing.T) { PortForwardingHelper: true, SshHelper: true, } - - echoResp := &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{ - { - Name: "example", - Type: "aws_instance", - Agents: []*proto.Agent{ - { - Id: uuid.NewString(), - Directory: tmpDir, - Auth: &proto.Agent_Token{ - Token: authToken, - }, - DisplayApps: apps, - }, - }, - }, - }, + dbfake.WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, &proto.Resource{ + Agents: []*proto.Agent{ + { + Directory: tmpDir, + Auth: &proto.Agent_Token{ + Token: authToken, }, + DisplayApps: apps, }, - }}, - } - - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, echoResp) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) + }, + }) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() - workspace, err := client.Workspace(ctx, workspace.ID) + workspace, err := client.Workspace(ctx, ws.ID) require.NoError(t, err) agent, err := client.WorkspaceAgent(ctx, workspace.LatestBuild.Resources[0].Agents[0].ID) require.NoError(t, err) @@ -253,21 +187,26 @@ func TestWorkspaceAgent(t *testing.T) { apps.SshHelper = false apps.WebTerminal = false - version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, echoResp, - func(req *codersdk.CreateTemplateVersionRequest) { - req.TemplateID = template.ID - }) - - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - err = client.UpdateActiveTemplateVersion(ctx, template.ID, codersdk.UpdateActiveTemplateVersion{ - ID: version.ID, + // Creating another workspace is easier + ws = dbfake.Workspace(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) + dbfake.WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, &proto.Resource{ + Agents: []*proto.Agent{ + { + Directory: tmpDir, + Auth: &proto.Agent_Token{ + Token: authToken, + }, + DisplayApps: apps, + }, + }, + }) + workspace, err = client.Workspace(ctx, ws.ID) require.NoError(t, err) - // Creating another workspace is just easier. - workspace = coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - build := coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - require.NoError(t, err) - agent, err = client.WorkspaceAgent(ctx, build.Resources[0].Agents[0].ID) + + agent, err = client.WorkspaceAgent(ctx, workspace.LatestBuild.Resources[0].Agents[0].ID) require.NoError(t, err) require.Len(t, agent.DisplayApps, 0) }) @@ -278,35 +217,12 @@ func TestWorkspaceAgentLogs(t *testing.T) { t.Run("Success", func(t *testing.T) { t.Parallel() ctx := testutil.Context(t, testutil.WaitMedium) - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - Agents: []*proto.Agent{{ - Id: uuid.NewString(), - Auth: &proto.Agent_Token{ - Token: authToken, - }, - }}, - }}, - }, - }, - }}, + ws, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - build := coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) agentClient := agentsdk.New(client.URL) agentClient.SetSessionToken(authToken) @@ -323,8 +239,9 @@ func TestWorkspaceAgentLogs(t *testing.T) { }, }) require.NoError(t, err) - - logs, closer, err := client.WorkspaceAgentLogsAfter(ctx, build.Resources[0].Agents[0].ID, 0, true) + workspace, err := client.Workspace(ctx, ws.ID) + require.NoError(t, err) + logs, closer, err := client.WorkspaceAgentLogsAfter(ctx, workspace.LatestBuild.Resources[0].Agents[0].ID, 0, true) require.NoError(t, err) defer func() { _ = closer.Close() @@ -342,36 +259,12 @@ func TestWorkspaceAgentLogs(t *testing.T) { t.Run("Close logs on outdated build", func(t *testing.T) { t.Parallel() ctx := testutil.Context(t, testutil.WaitMedium) - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - Agents: []*proto.Agent{{ - Id: uuid.NewString(), - Auth: &proto.Agent_Token{ - Token: authToken, - }, - }}, - }}, - }, - }, - }}, + ws, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - build := coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) agentClient.SetSessionToken(authToken) err := agentClient.PatchLogs(ctx, agentsdk.PatchLogs{ @@ -383,8 +276,9 @@ func TestWorkspaceAgentLogs(t *testing.T) { }, }) require.NoError(t, err) - - logs, closer, err := client.WorkspaceAgentLogsAfter(ctx, build.Resources[0].Agents[0].ID, 0, true) + workspace, err := client.Workspace(ctx, ws.ID) + require.NoError(t, err) + logs, closer, err := client.WorkspaceAgentLogsAfter(ctx, workspace.LatestBuild.Resources[0].Agents[0].ID, 0, true) require.NoError(t, err) defer func() { _ = closer.Close() @@ -407,37 +301,13 @@ func TestWorkspaceAgentLogs(t *testing.T) { t.Run("PublishesOnOverflow", func(t *testing.T) { t.Parallel() ctx := testutil.Context(t, testutil.WaitMedium) - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - Agents: []*proto.Agent{{ - Id: uuid.NewString(), - Auth: &proto.Agent_Token{ - Token: authToken, - }, - }}, - }}, - }, - }, - }}, + ws, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - - updates, err := client.WatchWorkspace(ctx, workspace.ID) + updates, err := client.WatchWorkspace(ctx, ws.ID) require.NoError(t, err) agentClient := agentsdk.New(client.URL) @@ -474,23 +344,14 @@ func TestWorkspaceAgentListen(t *testing.T) { t.Run("Connect", func(t *testing.T) { t.Parallel() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: echo.ProvisionApplyWithAgent(authToken), + ws, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - _ = agenttest.New(t, client.URL, authToken) - resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + resources := coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() @@ -568,22 +429,16 @@ func TestWorkspaceAgentListen(t *testing.T) { func TestWorkspaceAgentTailnet(t *testing.T) { t.Parallel() - client, daemonCloser := coderdtest.NewWithProvisionerCloser(t, nil) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: echo.ProvisionApplyWithAgent(authToken), + + ws, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - daemonCloser.Close() _ = agenttest.New(t, client.URL, authToken) - resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + resources := coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) ctx, cancelFunc := context.WithCancel(context.Background()) defer cancelFunc() @@ -612,22 +467,14 @@ func TestWorkspaceAgentTailnetDirectDisabled(t *testing.T) { require.NoError(t, err) require.True(t, dv.DERP.Config.BlockDirect.Value()) - client, daemonCloser := coderdtest.NewWithProvisionerCloser(t, &coderdtest.Options{ + client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{ DeploymentValues: dv, }) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: echo.ProvisionApplyWithAgent(authToken), + ws, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - daemonCloser.Close() - ctx := testutil.Context(t, testutil.WaitLong) // Verify that the manifest has DisableDirectConnections set to true. @@ -638,7 +485,7 @@ func TestWorkspaceAgentTailnetDirectDisabled(t *testing.T) { require.True(t, manifest.DisableDirectConnections) _ = agenttest.New(t, client.URL, authToken) - resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + resources := coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) agentID := resources[0].Agents[0].ID // Verify that the connection data has no STUN ports and @@ -682,42 +529,26 @@ func TestWorkspaceAgentListeningPorts(t *testing.T) { setup := func(t *testing.T, apps []*proto.App) (*codersdk.Client, uint16, uuid.UUID) { t.Helper() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) coderdPort, err := strconv.Atoi(client.URL.Port()) require.NoError(t, err) user := coderdtest.CreateFirstUser(t, client) + ws := dbfake.Workspace(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, + }) authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - Agents: []*proto.Agent{{ - Id: uuid.NewString(), - Auth: &proto.Agent_Token{ - Token: authToken, - }, - Apps: apps, - }}, - }}, - }, + dbfake.WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, &proto.Resource{ + Agents: []*proto.Agent{{ + Apps: apps, + Auth: &proto.Agent_Token{ + Token: authToken, }, }}, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - _ = agenttest.New(t, client.URL, authToken) - resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + resources := coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) return client, uint16(coderdPort), resources[0].Agents[0].ID } @@ -914,9 +745,7 @@ func TestWorkspaceAgentListeningPorts(t *testing.T) { func TestWorkspaceAgentAppHealth(t *testing.T) { t.Parallel() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) authToken := uuid.NewString() apps := []*proto.App{ @@ -939,30 +768,21 @@ func TestWorkspaceAgentAppHealth(t *testing.T) { }, }, } - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - Agents: []*proto.Agent{{ - Id: uuid.NewString(), - Auth: &proto.Agent_Token{ - Token: authToken, - }, - Apps: apps, - }}, - }}, - }, + ws := dbfake.Workspace(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, + }) + dbfake.WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, &proto.Resource{ + Name: "example", + Type: "aws_instance", + Agents: []*proto.Agent{{ + Id: uuid.NewString(), + Auth: &proto.Agent_Token{ + Token: authToken, }, + Apps: apps, }}, }) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) defer cancel() @@ -1021,20 +841,12 @@ func TestWorkspaceAgentReportStats(t *testing.T) { t.Run("OK", func(t *testing.T) { t.Parallel() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: echo.ProvisionApplyWithAgent(authToken), + ws, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) agentClient := agentsdk.New(client.URL) agentClient.SetSessionToken(authToken) @@ -1054,12 +866,12 @@ func TestWorkspaceAgentReportStats(t *testing.T) { }) require.NoError(t, err) - newWorkspace, err := client.Workspace(context.Background(), workspace.ID) + newWorkspace, err := client.Workspace(context.Background(), ws.ID) require.NoError(t, err) assert.True(t, - newWorkspace.LastUsedAt.After(workspace.LastUsedAt), - "%s is not after %s", newWorkspace.LastUsedAt, workspace.LastUsedAt, + newWorkspace.LastUsedAt.After(ws.LastUsedAt), + "%s is not after %s", newWorkspace.LastUsedAt, ws.LastUsedAt, ) }) } @@ -1070,21 +882,14 @@ func TestWorkspaceAgent_LifecycleState(t *testing.T) { t.Run("Set", func(t *testing.T) { t.Parallel() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: echo.ProvisionApplyWithAgent(authToken), + ws, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - + workspace, err := client.Workspace(context.Background(), ws.ID) + require.NoError(t, err) for _, res := range workspace.LatestBuild.Resources { for _, a := range res.Agents { require.Equal(t, codersdk.WorkspaceAgentLifecycleCreated, a.LifecycleState) @@ -1142,59 +947,48 @@ func TestWorkspaceAgent_LifecycleState(t *testing.T) { func TestWorkspaceAgent_Metadata(t *testing.T) { t.Parallel() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: []*proto.Response{{ - Type: &proto.Response_Apply{ - Apply: &proto.ApplyComplete{ - Resources: []*proto.Resource{{ - Name: "example", - Type: "aws_instance", - Agents: []*proto.Agent{{ - Metadata: []*proto.Agent_Metadata{ - { - DisplayName: "First Meta", - Key: "foo1", - Script: "echo hi", - Interval: 10, - Timeout: 3, - }, - { - DisplayName: "Second Meta", - Key: "foo2", - Script: "echo howdy", - Interval: 10, - Timeout: 3, - }, - { - DisplayName: "TooLong", - Key: "foo3", - Script: "echo howdy", - Interval: 10, - Timeout: 3, - }, - }, - Id: uuid.NewString(), - Auth: &proto.Agent_Token{ - Token: authToken, - }, - }}, - }}, + ws := dbfake.Workspace(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, + }) + dbfake.WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, &proto.Resource{ + Name: "example", + Type: "aws_instance", + Agents: []*proto.Agent{{ + Metadata: []*proto.Agent_Metadata{ + { + DisplayName: "First Meta", + Key: "foo1", + Script: "echo hi", + Interval: 10, + Timeout: 3, + }, + { + DisplayName: "Second Meta", + Key: "foo2", + Script: "echo howdy", + Interval: 10, + Timeout: 3, + }, + { + DisplayName: "TooLong", + Key: "foo3", + Script: "echo howdy", + Interval: 10, + Timeout: 3, }, }, + Id: uuid.NewString(), + Auth: &proto.Agent_Token{ + Token: authToken, + }, }}, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - + workspace, err := client.Workspace(context.Background(), ws.ID) + require.NoError(t, err) for _, res := range workspace.LatestBuild.Resources { for _, a := range res.Agents { require.Equal(t, codersdk.WorkspaceAgentLifecycleCreated, a.LifecycleState) @@ -1318,21 +1112,12 @@ func TestWorkspaceAgent_Startup(t *testing.T) { t.Run("OK", func(t *testing.T) { t.Parallel() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: echo.ProvisionApplyWithAgent(authToken), + ws, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) - agentClient := agentsdk.New(client.URL) agentClient.SetSessionToken(authToken) @@ -1358,7 +1143,7 @@ func TestWorkspaceAgent_Startup(t *testing.T) { }) require.NoError(t, err) - workspace, err = client.Workspace(ctx, workspace.ID) + workspace, err := client.Workspace(ctx, ws.ID) require.NoError(t, err) wsagent, err := client.WorkspaceAgent(ctx, workspace.LatestBuild.Resources[0].Agents[0].ID) @@ -1372,20 +1157,12 @@ func TestWorkspaceAgent_Startup(t *testing.T) { t.Run("InvalidSemver", func(t *testing.T) { t.Parallel() - client := coderdtest.New(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - }) + client, db := coderdtest.NewWithDatabase(t, nil) user := coderdtest.CreateFirstUser(t, client) - authToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: echo.ProvisionApplyWithAgent(authToken), + _, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) agentClient := agentsdk.New(client.URL) agentClient.SetSessionToken(authToken) @@ -1415,8 +1192,7 @@ func TestWorkspaceAgent_UpdatedDERP(t *testing.T) { require.NoError(t, err) client, closer, api := coderdtest.NewWithAPI(t, &coderdtest.Options{ - IncludeProvisionerDaemon: true, - DeploymentValues: dv, + DeploymentValues: dv, }) defer closer.Close() user := coderdtest.CreateFirstUser(t, client) @@ -1431,19 +1207,13 @@ func TestWorkspaceAgent_UpdatedDERP(t *testing.T) { api.DERPMapper.Store(&derpMapFn) // Start workspace a workspace agent. - agentToken := uuid.NewString() - version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - ProvisionPlan: echo.PlanComplete, - ProvisionApply: echo.ProvisionApplyWithAgent(agentToken), + ws, agentToken := dbfake.WorkspaceWithAgent(t, api.Database, database.Workspace{ + OrganizationID: user.OrganizationID, + OwnerID: user.UserID, }) - template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) - coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) - workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID) - coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) agentCloser := agenttest.New(t, client.URL, agentToken) - resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID) + resources := coderdtest.AwaitWorkspaceAgents(t, client, ws.ID) agentID := resources[0].Agents[0].ID // Connect from a client.