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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy