Skip to content

Commit 795bba2

Browse files
authored
feat: Add dry run for provisioners (#178)
* refactor: Rename ProjectParameter to ProjectVersionParameter This was confusing with ParameterValue before. It still is a bit, but this should help distinguish scope. * Add project version resources table * Allow project parameters to optionally have user and workspace * Add dry run for provisioners * Add resource detection on project import
1 parent 427fdc6 commit 795bba2

20 files changed

+756
-317
lines changed

coderd/coderdtest/coderdtest_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func TestNew(t *testing.T) {
2828
workspace := coderdtest.CreateWorkspace(t, client, "me", project.ID)
2929
history, err := client.CreateWorkspaceHistory(context.Background(), "me", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
3030
ProjectVersionID: version.ID,
31-
Transition: database.WorkspaceTransitionCreate,
31+
Transition: database.WorkspaceTransitionStart,
3232
})
3333
require.NoError(t, err)
3434
coderdtest.AwaitWorkspaceHistoryProvisioned(t, client, "me", workspace.Name, history.Name)

coderd/projectparameter/projectparameter.go

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,11 @@ import (
1515

1616
// Scope targets identifiers to pull parameters from.
1717
type Scope struct {
18-
OrganizationID string
19-
ProjectID uuid.UUID
20-
ProjectVersionID uuid.UUID
21-
UserID string
22-
WorkspaceID uuid.UUID
23-
WorkspaceHistoryID uuid.UUID
18+
OrganizationID string
19+
ProjectID uuid.UUID
20+
ProjectVersionID uuid.UUID
21+
UserID sql.NullString
22+
WorkspaceID uuid.NullUUID
2423
}
2524

2625
// Value represents a computed parameter.
@@ -106,22 +105,26 @@ func Compute(ctx context.Context, db database.Store, scope Scope) ([]Value, erro
106105
return nil, err
107106
}
108107

109-
// User parameters come fourth!
110-
err = compute.inject(ctx, database.GetParameterValuesByScopeParams{
111-
Scope: database.ParameterScopeUser,
112-
ScopeID: scope.UserID,
113-
})
114-
if err != nil {
115-
return nil, err
108+
if scope.UserID.Valid {
109+
// User parameters come fourth!
110+
err = compute.inject(ctx, database.GetParameterValuesByScopeParams{
111+
Scope: database.ParameterScopeUser,
112+
ScopeID: scope.UserID.String,
113+
})
114+
if err != nil {
115+
return nil, err
116+
}
116117
}
117118

118-
// Workspace parameters come last!
119-
err = compute.inject(ctx, database.GetParameterValuesByScopeParams{
120-
Scope: database.ParameterScopeWorkspace,
121-
ScopeID: scope.WorkspaceID.String(),
122-
})
123-
if err != nil {
124-
return nil, err
119+
if scope.WorkspaceID.Valid {
120+
// Workspace parameters come last!
121+
err = compute.inject(ctx, database.GetParameterValuesByScopeParams{
122+
Scope: database.ParameterScopeWorkspace,
123+
ScopeID: scope.WorkspaceID.UUID.String(),
124+
})
125+
if err != nil {
126+
return nil, err
127+
}
125128
}
126129

127130
for _, projectVersionParameter := range compute.projectVersionParametersByName {

coderd/projectparameter/projectparameter_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,14 @@ func TestCompute(t *testing.T) {
2222
OrganizationID: uuid.New().String(),
2323
ProjectID: uuid.New(),
2424
ProjectVersionID: uuid.New(),
25-
UserID: uuid.NewString(),
25+
WorkspaceID: uuid.NullUUID{
26+
UUID: uuid.New(),
27+
Valid: true,
28+
},
29+
UserID: sql.NullString{
30+
String: uuid.NewString(),
31+
Valid: true,
32+
},
2633
}
2734
}
2835
type projectParameterOptions struct {
@@ -163,7 +170,7 @@ func TestCompute(t *testing.T) {
163170
ID: uuid.New(),
164171
Name: parameter.Name,
165172
Scope: database.ParameterScopeWorkspace,
166-
ScopeID: scope.WorkspaceID.String(),
173+
ScopeID: scope.WorkspaceID.UUID.String(),
167174
SourceScheme: database.ParameterSourceSchemeData,
168175
SourceValue: "nop",
169176
DestinationScheme: database.ParameterDestinationSchemeEnvironmentVariable,
@@ -189,7 +196,7 @@ func TestCompute(t *testing.T) {
189196
ID: uuid.New(),
190197
Name: parameter.Name,
191198
Scope: database.ParameterScopeWorkspace,
192-
ScopeID: scope.WorkspaceID.String(),
199+
ScopeID: scope.WorkspaceID.UUID.String(),
193200
SourceScheme: database.ParameterSourceSchemeData,
194201
SourceValue: "nop",
195202
DestinationScheme: database.ParameterDestinationSchemeEnvironmentVariable,

coderd/projectversion_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ func TestProjectVersionParametersByOrganizationAndName(t *testing.T) {
120120
},
121121
},
122122
}},
123+
Provision: echo.ProvisionComplete,
123124
})
124125
coderdtest.AwaitProjectVersionImported(t, client, user.Organization, project.Name, version.Name)
125126
params, err := client.ProjectVersionParameters(context.Background(), user.Organization, project.Name, version.Name)

coderd/provisionerdaemons.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,17 @@ func (server *provisionerdServer) AcquireJob(ctx context.Context, _ *proto.Empty
207207

208208
// Compute parameters for the workspace to consume.
209209
parameters, err := projectparameter.Compute(ctx, server.Database, projectparameter.Scope{
210-
OrganizationID: organization.ID,
211-
ProjectID: project.ID,
212-
ProjectVersionID: projectVersion.ID,
213-
UserID: user.ID,
214-
WorkspaceID: workspace.ID,
215-
WorkspaceHistoryID: workspaceHistory.ID,
210+
OrganizationID: organization.ID,
211+
ProjectID: project.ID,
212+
ProjectVersionID: projectVersion.ID,
213+
UserID: sql.NullString{
214+
String: user.ID,
215+
Valid: true,
216+
},
217+
WorkspaceID: uuid.NullUUID{
218+
UUID: workspace.ID,
219+
Valid: true,
220+
},
216221
})
217222
if err != nil {
218223
return nil, failJob(fmt.Sprintf("compute parameters: %s", err))

coderd/provisionerjoblogs_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func TestProvisionerJobLogsByName(t *testing.T) {
4141
workspace := coderdtest.CreateWorkspace(t, client, "me", project.ID)
4242
history, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
4343
ProjectVersionID: version.ID,
44-
Transition: database.WorkspaceTransitionCreate,
44+
Transition: database.WorkspaceTransitionStart,
4545
})
4646
require.NoError(t, err)
4747
coderdtest.AwaitWorkspaceHistoryProvisioned(t, client, "", workspace.Name, history.Name)
@@ -79,7 +79,7 @@ func TestProvisionerJobLogsByName(t *testing.T) {
7979
before := time.Now().UTC()
8080
history, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
8181
ProjectVersionID: version.ID,
82-
Transition: database.WorkspaceTransitionCreate,
82+
Transition: database.WorkspaceTransitionStart,
8383
})
8484
require.NoError(t, err)
8585
coderdtest.AwaitWorkspaceHistoryProvisioned(t, client, "", workspace.Name, history.Name)
@@ -120,7 +120,7 @@ func TestProvisionerJobLogsByName(t *testing.T) {
120120
before := database.Now()
121121
history, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
122122
ProjectVersionID: version.ID,
123-
Transition: database.WorkspaceTransitionCreate,
123+
Transition: database.WorkspaceTransitionStart,
124124
})
125125
require.NoError(t, err)
126126
logs, err := client.FollowProvisionerJobLogsAfter(context.Background(), history.Provision.ID, before)

coderd/workspacehistory_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func TestPostWorkspaceHistoryByUser(t *testing.T) {
2626
workspace := coderdtest.CreateWorkspace(t, client, "me", project.ID)
2727
_, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
2828
ProjectVersionID: uuid.New(),
29-
Transition: database.WorkspaceTransitionCreate,
29+
Transition: database.WorkspaceTransitionStart,
3030
})
3131
require.Error(t, err)
3232
var apiErr *codersdk.Error
@@ -47,7 +47,7 @@ func TestPostWorkspaceHistoryByUser(t *testing.T) {
4747
workspace := coderdtest.CreateWorkspace(t, client, "me", project.ID)
4848
_, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
4949
ProjectVersionID: version.ID,
50-
Transition: database.WorkspaceTransitionCreate,
50+
Transition: database.WorkspaceTransitionStart,
5151
})
5252
require.Error(t, err)
5353
var apiErr *codersdk.Error
@@ -68,12 +68,12 @@ func TestPostWorkspaceHistoryByUser(t *testing.T) {
6868
workspace := coderdtest.CreateWorkspace(t, client, "me", project.ID)
6969
_, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
7070
ProjectVersionID: version.ID,
71-
Transition: database.WorkspaceTransitionCreate,
71+
Transition: database.WorkspaceTransitionStart,
7272
})
7373
require.NoError(t, err)
7474
_, err = client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
7575
ProjectVersionID: version.ID,
76-
Transition: database.WorkspaceTransitionCreate,
76+
Transition: database.WorkspaceTransitionStart,
7777
})
7878
require.Error(t, err)
7979
var apiErr *codersdk.Error
@@ -92,13 +92,13 @@ func TestPostWorkspaceHistoryByUser(t *testing.T) {
9292
workspace := coderdtest.CreateWorkspace(t, client, "me", project.ID)
9393
firstHistory, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
9494
ProjectVersionID: version.ID,
95-
Transition: database.WorkspaceTransitionCreate,
95+
Transition: database.WorkspaceTransitionStart,
9696
})
9797
require.NoError(t, err)
9898
coderdtest.AwaitWorkspaceHistoryProvisioned(t, client, "me", workspace.Name, firstHistory.Name)
9999
secondHistory, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
100100
ProjectVersionID: version.ID,
101-
Transition: database.WorkspaceTransitionCreate,
101+
Transition: database.WorkspaceTransitionStart,
102102
})
103103
require.NoError(t, err)
104104
require.Equal(t, firstHistory.ID.String(), secondHistory.BeforeID.String())
@@ -135,7 +135,7 @@ func TestWorkspaceHistoryByUser(t *testing.T) {
135135
workspace := coderdtest.CreateWorkspace(t, client, "me", project.ID)
136136
_, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
137137
ProjectVersionID: version.ID,
138-
Transition: database.WorkspaceTransitionCreate,
138+
Transition: database.WorkspaceTransitionStart,
139139
})
140140
require.NoError(t, err)
141141
history, err := client.ListWorkspaceHistory(context.Background(), "me", workspace.Name)
@@ -156,7 +156,7 @@ func TestWorkspaceHistoryByName(t *testing.T) {
156156
workspace := coderdtest.CreateWorkspace(t, client, "me", project.ID)
157157
history, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
158158
ProjectVersionID: version.ID,
159-
Transition: database.WorkspaceTransitionCreate,
159+
Transition: database.WorkspaceTransitionStart,
160160
})
161161
require.NoError(t, err)
162162
_, err = client.WorkspaceHistory(context.Background(), "me", workspace.Name, history.Name)

codersdk/provisioners_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func TestProvisionerJobLogs(t *testing.T) {
7070
workspace := coderdtest.CreateWorkspace(t, client, "", project.ID)
7171
history, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
7272
ProjectVersionID: version.ID,
73-
Transition: database.WorkspaceTransitionCreate,
73+
Transition: database.WorkspaceTransitionStart,
7474
})
7575
require.NoError(t, err)
7676
_, err = client.ProvisionerJobLogs(context.Background(), history.Provision.ID)
@@ -112,7 +112,7 @@ func TestFollowProvisionerJobLogsAfter(t *testing.T) {
112112
after := database.Now()
113113
history, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
114114
ProjectVersionID: version.ID,
115-
Transition: database.WorkspaceTransitionCreate,
115+
Transition: database.WorkspaceTransitionStart,
116116
})
117117
require.NoError(t, err)
118118
logs, err := client.FollowProvisionerJobLogsAfter(context.Background(), history.Provision.ID, after)

codersdk/workspaces_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ func TestWorkspaceHistory(t *testing.T) {
108108
workspace := coderdtest.CreateWorkspace(t, client, "", project.ID)
109109
_, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
110110
ProjectVersionID: version.ID,
111-
Transition: database.WorkspaceTransitionCreate,
111+
Transition: database.WorkspaceTransitionStart,
112112
})
113113
require.NoError(t, err)
114114
})
@@ -152,7 +152,7 @@ func TestCreateWorkspaceHistory(t *testing.T) {
152152
workspace := coderdtest.CreateWorkspace(t, client, "", project.ID)
153153
_, err := client.CreateWorkspaceHistory(context.Background(), "", workspace.Name, coderd.CreateWorkspaceHistoryRequest{
154154
ProjectVersionID: version.ID,
155-
Transition: database.WorkspaceTransitionCreate,
155+
Transition: database.WorkspaceTransitionStart,
156156
})
157157
require.NoError(t, err)
158158
})

database/dump.sql

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

database/migrations/000003_workspaces.up.sql

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ CREATE TABLE workspace (
99
);
1010

1111
CREATE TYPE workspace_transition AS ENUM (
12-
'create',
1312
'start',
1413
'stop',
1514
'delete'
@@ -50,8 +49,7 @@ CREATE TABLE workspace_resource (
5049
-- If an agent has been conencted for this resource,
5150
-- the agent table is not null.
5251
workspace_agent_id uuid,
53-
54-
UNIQUE(workspace_history_id, name)
52+
UNIQUE(workspace_history_id, type, name)
5553
);
5654

5755
CREATE TABLE workspace_agent (

database/models.go

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)