Skip to content

Commit 68a6c99

Browse files
committed
Merge branch 'main' into abhineetjain/create-workspace-errors
2 parents ce2b2f3 + bd785dd commit 68a6c99

32 files changed

+1500
-231
lines changed

cli/update.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ func update() *cobra.Command {
1818

1919
cmd := &cobra.Command{
2020
Annotations: workspaceCommand,
21-
Use: "update",
21+
Use: "update <workspace>",
22+
Args: cobra.ExactArgs(1),
2223
Short: "Update a workspace to the latest template version",
2324
RunE: func(cmd *cobra.Command, args []string) error {
2425
client, err := createClient(cmd)

cli/update_test.go

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package cli_test
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
11+
"github.com/coder/coder/cli/clitest"
12+
"github.com/coder/coder/coderd/coderdtest"
13+
"github.com/coder/coder/codersdk"
14+
"github.com/coder/coder/provisioner/echo"
15+
"github.com/coder/coder/pty/ptytest"
16+
)
17+
18+
func TestUpdate(t *testing.T) {
19+
t.Parallel()
20+
21+
// Test that the function does not panic on missing arg.
22+
t.Run("NoArgs", func(t *testing.T) {
23+
t.Parallel()
24+
25+
cmd, _ := clitest.New(t, "update")
26+
err := cmd.Execute()
27+
require.Error(t, err)
28+
})
29+
30+
t.Run("OK", func(t *testing.T) {
31+
t.Parallel()
32+
33+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
34+
user := coderdtest.CreateFirstUser(t, client)
35+
version1 := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
36+
37+
coderdtest.AwaitTemplateVersionJob(t, client, version1.ID)
38+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version1.ID)
39+
40+
cmd, root := clitest.New(t, "create",
41+
"my-workspace",
42+
"--template", template.Name,
43+
"-y",
44+
)
45+
clitest.SetupConfig(t, client, root)
46+
47+
err := cmd.Execute()
48+
require.NoError(t, err)
49+
50+
ws, err := client.WorkspaceByOwnerAndName(context.Background(), "testuser", "my-workspace", codersdk.WorkspaceOptions{})
51+
require.NoError(t, err)
52+
require.Equal(t, version1.ID.String(), ws.LatestBuild.TemplateVersionID.String())
53+
54+
version2 := coderdtest.UpdateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
55+
Parse: echo.ParseComplete,
56+
Provision: echo.ProvisionComplete,
57+
ProvisionDryRun: echo.ProvisionComplete,
58+
}, template.ID)
59+
_ = coderdtest.AwaitTemplateVersionJob(t, client, version2.ID)
60+
61+
err = client.UpdateActiveTemplateVersion(context.Background(), template.ID, codersdk.UpdateActiveTemplateVersion{
62+
ID: version2.ID,
63+
})
64+
require.NoError(t, err)
65+
66+
cmd, root = clitest.New(t, "update", ws.Name)
67+
clitest.SetupConfig(t, client, root)
68+
69+
err = cmd.Execute()
70+
require.NoError(t, err)
71+
72+
ws, err = client.WorkspaceByOwnerAndName(context.Background(), "testuser", "my-workspace", codersdk.WorkspaceOptions{})
73+
require.NoError(t, err)
74+
require.Equal(t, version2.ID.String(), ws.LatestBuild.TemplateVersionID.String())
75+
})
76+
77+
t.Run("WithParameter", func(t *testing.T) {
78+
t.Parallel()
79+
80+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
81+
user := coderdtest.CreateFirstUser(t, client)
82+
version1 := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil)
83+
84+
coderdtest.AwaitTemplateVersionJob(t, client, version1.ID)
85+
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version1.ID)
86+
87+
cmd, root := clitest.New(t, "create",
88+
"my-workspace",
89+
"--template", template.Name,
90+
"-y",
91+
)
92+
clitest.SetupConfig(t, client, root)
93+
94+
err := cmd.Execute()
95+
require.NoError(t, err)
96+
97+
ws, err := client.WorkspaceByOwnerAndName(context.Background(), "testuser", "my-workspace", codersdk.WorkspaceOptions{})
98+
require.NoError(t, err)
99+
require.Equal(t, version1.ID.String(), ws.LatestBuild.TemplateVersionID.String())
100+
101+
defaultValue := "something"
102+
version2 := coderdtest.UpdateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
103+
Parse: createTestParseResponseWithDefault(defaultValue),
104+
Provision: echo.ProvisionComplete,
105+
ProvisionDryRun: echo.ProvisionComplete,
106+
}, template.ID)
107+
coderdtest.AwaitTemplateVersionJob(t, client, version2.ID)
108+
109+
err = client.UpdateActiveTemplateVersion(context.Background(), template.ID, codersdk.UpdateActiveTemplateVersion{
110+
ID: version2.ID,
111+
})
112+
require.NoError(t, err)
113+
114+
cmd, root = clitest.New(t, "update", ws.Name)
115+
clitest.SetupConfig(t, client, root)
116+
117+
pty := ptytest.New(t)
118+
cmd.SetIn(pty.Input())
119+
cmd.SetOut(pty.Output())
120+
121+
doneChan := make(chan struct{})
122+
go func() {
123+
defer close(doneChan)
124+
err := cmd.Execute()
125+
assert.NoError(t, err)
126+
}()
127+
128+
matches := []string{
129+
fmt.Sprintf("Enter a value (default: %q):", defaultValue), "bingo",
130+
"Enter a value:", "boingo",
131+
}
132+
for i := 0; i < len(matches); i += 2 {
133+
match := matches[i]
134+
value := matches[i+1]
135+
pty.ExpectMatch(match)
136+
pty.WriteLine(value)
137+
}
138+
139+
<-doneChan
140+
})
141+
}

coder.service

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[Unit]
22
Description="Coder - Self-hosted developer workspaces on your infra"
3-
Documentation=https://coder.com/docs/
3+
Documentation=https://coder.com/docs/coder-oss
44
Requires=network-online.target
55
After=network-online.target
66
ConditionFileNotEmpty=/etc/coder.d/coder.env

coderd/database/databasefake/databasefake.go

Lines changed: 75 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,22 @@ func New() database.Store {
2626
organizations: make([]database.Organization, 0),
2727
users: make([]database.User, 0),
2828

29-
auditLogs: make([]database.AuditLog, 0),
30-
files: make([]database.File, 0),
31-
gitSSHKey: make([]database.GitSSHKey, 0),
32-
parameterSchemas: make([]database.ParameterSchema, 0),
33-
parameterValues: make([]database.ParameterValue, 0),
34-
provisionerDaemons: make([]database.ProvisionerDaemon, 0),
35-
provisionerJobAgents: make([]database.WorkspaceAgent, 0),
36-
provisionerJobLogs: make([]database.ProvisionerJobLog, 0),
37-
provisionerJobResources: make([]database.WorkspaceResource, 0),
38-
provisionerJobs: make([]database.ProvisionerJob, 0),
39-
templateVersions: make([]database.TemplateVersion, 0),
40-
templates: make([]database.Template, 0),
41-
workspaceBuilds: make([]database.WorkspaceBuild, 0),
42-
workspaceApps: make([]database.WorkspaceApp, 0),
43-
workspaces: make([]database.Workspace, 0),
29+
auditLogs: make([]database.AuditLog, 0),
30+
files: make([]database.File, 0),
31+
gitSSHKey: make([]database.GitSSHKey, 0),
32+
parameterSchemas: make([]database.ParameterSchema, 0),
33+
parameterValues: make([]database.ParameterValue, 0),
34+
provisionerDaemons: make([]database.ProvisionerDaemon, 0),
35+
provisionerJobAgents: make([]database.WorkspaceAgent, 0),
36+
provisionerJobLogs: make([]database.ProvisionerJobLog, 0),
37+
provisionerJobResources: make([]database.WorkspaceResource, 0),
38+
provisionerJobResourceMetadata: make([]database.WorkspaceResourceMetadatum, 0),
39+
provisionerJobs: make([]database.ProvisionerJob, 0),
40+
templateVersions: make([]database.TemplateVersion, 0),
41+
templates: make([]database.Template, 0),
42+
workspaceBuilds: make([]database.WorkspaceBuild, 0),
43+
workspaceApps: make([]database.WorkspaceApp, 0),
44+
workspaces: make([]database.Workspace, 0),
4445
},
4546
}
4647
}
@@ -74,21 +75,22 @@ type data struct {
7475
users []database.User
7576

7677
// New tables
77-
auditLogs []database.AuditLog
78-
files []database.File
79-
gitSSHKey []database.GitSSHKey
80-
parameterSchemas []database.ParameterSchema
81-
parameterValues []database.ParameterValue
82-
provisionerDaemons []database.ProvisionerDaemon
83-
provisionerJobAgents []database.WorkspaceAgent
84-
provisionerJobLogs []database.ProvisionerJobLog
85-
provisionerJobResources []database.WorkspaceResource
86-
provisionerJobs []database.ProvisionerJob
87-
templateVersions []database.TemplateVersion
88-
templates []database.Template
89-
workspaceBuilds []database.WorkspaceBuild
90-
workspaceApps []database.WorkspaceApp
91-
workspaces []database.Workspace
78+
auditLogs []database.AuditLog
79+
files []database.File
80+
gitSSHKey []database.GitSSHKey
81+
parameterSchemas []database.ParameterSchema
82+
parameterValues []database.ParameterValue
83+
provisionerDaemons []database.ProvisionerDaemon
84+
provisionerJobAgents []database.WorkspaceAgent
85+
provisionerJobLogs []database.ProvisionerJobLog
86+
provisionerJobResources []database.WorkspaceResource
87+
provisionerJobResourceMetadata []database.WorkspaceResourceMetadatum
88+
provisionerJobs []database.ProvisionerJob
89+
templateVersions []database.TemplateVersion
90+
templates []database.Template
91+
workspaceBuilds []database.WorkspaceBuild
92+
workspaceApps []database.WorkspaceApp
93+
workspaces []database.Workspace
9294

9395
deploymentID string
9496
}
@@ -1331,6 +1333,34 @@ func (q *fakeQuerier) GetWorkspaceResourcesCreatedAfter(_ context.Context, after
13311333
return resources, nil
13321334
}
13331335

1336+
func (q *fakeQuerier) GetWorkspaceResourceMetadataByResourceID(_ context.Context, id uuid.UUID) ([]database.WorkspaceResourceMetadatum, error) {
1337+
q.mutex.RLock()
1338+
defer q.mutex.RUnlock()
1339+
1340+
metadata := make([]database.WorkspaceResourceMetadatum, 0)
1341+
for _, metadatum := range q.provisionerJobResourceMetadata {
1342+
if metadatum.WorkspaceResourceID.String() == id.String() {
1343+
metadata = append(metadata, metadatum)
1344+
}
1345+
}
1346+
return metadata, nil
1347+
}
1348+
1349+
func (q *fakeQuerier) GetWorkspaceResourceMetadataByResourceIDs(_ context.Context, ids []uuid.UUID) ([]database.WorkspaceResourceMetadatum, error) {
1350+
q.mutex.RLock()
1351+
defer q.mutex.RUnlock()
1352+
1353+
metadata := make([]database.WorkspaceResourceMetadatum, 0)
1354+
for _, metadatum := range q.provisionerJobResourceMetadata {
1355+
for _, id := range ids {
1356+
if metadatum.WorkspaceResourceID.String() == id.String() {
1357+
metadata = append(metadata, metadatum)
1358+
}
1359+
}
1360+
}
1361+
return metadata, nil
1362+
}
1363+
13341364
func (q *fakeQuerier) GetProvisionerJobsByIDs(_ context.Context, ids []uuid.UUID) ([]database.ProvisionerJob, error) {
13351365
q.mutex.RLock()
13361366
defer q.mutex.RUnlock()
@@ -1659,6 +1689,21 @@ func (q *fakeQuerier) InsertWorkspaceResource(_ context.Context, arg database.In
16591689
return resource, nil
16601690
}
16611691

1692+
func (q *fakeQuerier) InsertWorkspaceResourceMetadata(_ context.Context, arg database.InsertWorkspaceResourceMetadataParams) (database.WorkspaceResourceMetadatum, error) {
1693+
q.mutex.Lock()
1694+
defer q.mutex.Unlock()
1695+
1696+
//nolint:gosimple
1697+
metadatum := database.WorkspaceResourceMetadatum{
1698+
WorkspaceResourceID: arg.WorkspaceResourceID,
1699+
Key: arg.Key,
1700+
Value: arg.Value,
1701+
Sensitive: arg.Sensitive,
1702+
}
1703+
q.provisionerJobResourceMetadata = append(q.provisionerJobResourceMetadata, metadatum)
1704+
return metadatum, nil
1705+
}
1706+
16621707
func (q *fakeQuerier) InsertUser(_ context.Context, arg database.InsertUserParams) (database.User, error) {
16631708
q.mutex.Lock()
16641709
defer q.mutex.Unlock()

coderd/database/dump.sql

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP TABLE IF EXISTS workspace_resource_metadata;
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CREATE TABLE IF NOT EXISTS workspace_resource_metadata (
2+
workspace_resource_id uuid NOT NULL,
3+
key varchar(1024) NOT NULL,
4+
value varchar(65536),
5+
sensitive boolean NOT NULL,
6+
PRIMARY KEY (workspace_resource_id, key),
7+
FOREIGN KEY (workspace_resource_id) REFERENCES workspace_resources (id) ON DELETE CASCADE
8+
);

coderd/database/models.go

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

coderd/database/querier.go

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

0 commit comments

Comments
 (0)