Skip to content

Commit ef84feb

Browse files
committed
feat: Move workspaces under organizations
This removes split ownership for workspaces. They are now a resource of organizations and have a designated owner, which is a user. This enables simple administration for commands like: - `coder stop ben/dev` - `coder build logs colin/arch` or if we decide to allow administrators to access workspaces, they could even SSH using this syntax: `coder ssh colin/dev`.
1 parent da36812 commit ef84feb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+856
-641
lines changed

cli/agent_test.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88

99
"github.com/coder/coder/cli/clitest"
1010
"github.com/coder/coder/coderd/coderdtest"
11-
"github.com/coder/coder/codersdk"
1211
"github.com/coder/coder/provisioner/echo"
1312
"github.com/coder/coder/provisionersdk/proto"
1413
)
@@ -44,7 +43,7 @@ func TestWorkspaceAgent(t *testing.T) {
4443
})
4544
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
4645
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
47-
workspace := coderdtest.CreateWorkspace(t, client, codersdk.Me, template.ID)
46+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
4847
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
4948

5049
cmd, _ := clitest.New(t, "agent", "--auth", "azure-instance-identity", "--url", client.URL.String())
@@ -98,7 +97,7 @@ func TestWorkspaceAgent(t *testing.T) {
9897
})
9998
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
10099
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
101-
workspace := coderdtest.CreateWorkspace(t, client, codersdk.Me, template.ID)
100+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
102101
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
103102

104103
cmd, _ := clitest.New(t, "agent", "--auth", "aws-instance-identity", "--url", client.URL.String())
@@ -152,7 +151,7 @@ func TestWorkspaceAgent(t *testing.T) {
152151
})
153152
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
154153
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
155-
workspace := coderdtest.CreateWorkspace(t, client, codersdk.Me, template.ID)
154+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
156155
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
157156

158157
cmd, _ := clitest.New(t, "agent", "--auth", "google-instance-identity", "--url", client.URL.String())

cli/configssh.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ func configSSH() *cobra.Command {
4242
if err != nil {
4343
return err
4444
}
45+
organization, err := currentOrganization(cmd, client)
46+
if err != nil {
47+
return err
48+
}
4549
if strings.HasPrefix(sshConfigFile, "~/") {
4650
dirname, _ := os.UserHomeDir()
4751
sshConfigFile = filepath.Join(dirname, sshConfigFile[2:])
@@ -55,7 +59,7 @@ func configSSH() *cobra.Command {
5559
sshConfigContent = sshConfigContent[:startIndex-1] + sshConfigContent[endIndex+len(sshEndToken):]
5660
}
5761

58-
workspaces, err := client.WorkspacesByUser(cmd.Context(), codersdk.Me)
62+
workspaces, err := client.WorkspacesByOwner(cmd.Context(), organization.ID, codersdk.Me)
5963
if err != nil {
6064
return err
6165
}

cli/configssh_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ func TestConfigSSH(t *testing.T) {
6767
})
6868
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
6969
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
70-
workspace := coderdtest.CreateWorkspace(t, client, codersdk.Me, template.ID)
70+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
7171
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
7272
agentClient := codersdk.New(client.URL)
7373
agentClient.SessionToken = authToken

cli/gitssh_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func TestGitSSH(t *testing.T) {
5757
})
5858
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
5959
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
60-
workspace := coderdtest.CreateWorkspace(t, client, codersdk.Me, template.ID)
60+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
6161
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
6262

6363
// start workspace agent

cli/parameters.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ func parseScopeAndID(ctx context.Context, client *codersdk.Client, organization
5353
}
5454
scopeID = user.ID
5555
case codersdk.ParameterWorkspace:
56-
workspace, err := client.WorkspaceByName(ctx, codersdk.Me, name)
56+
workspace, err := client.WorkspaceByOwnerAndName(ctx, organization.ID, codersdk.Me, name)
5757
if err != nil {
5858
return scope, uuid.Nil, err
5959
}

cli/ssh.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,13 @@ func ssh() *cobra.Command {
3333
if err != nil {
3434
return err
3535
}
36+
organization, err := currentOrganization(cmd, client)
37+
if err != nil {
38+
return err
39+
}
3640

3741
workspaceParts := strings.Split(args[0], ".")
38-
workspace, err := client.WorkspaceByName(cmd.Context(), codersdk.Me, workspaceParts[0])
42+
workspace, err := client.WorkspaceByOwnerAndName(cmd.Context(), organization.ID, codersdk.Me, workspaceParts[0])
3943
if err != nil {
4044
return err
4145
}

cli/ssh_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func TestSSH(t *testing.T) {
5252
})
5353
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
5454
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
55-
workspace := coderdtest.CreateWorkspace(t, client, codersdk.Me, template.ID)
55+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
5656
cmd, root := clitest.New(t, "ssh", workspace.Name)
5757
clitest.SetupConfig(t, client, root)
5858
doneChan := make(chan struct{})
@@ -105,7 +105,7 @@ func TestSSH(t *testing.T) {
105105
})
106106
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
107107
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
108-
workspace := coderdtest.CreateWorkspace(t, client, codersdk.Me, template.ID)
108+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
109109
go func() {
110110
// Run this async so the SSH command has to wait for
111111
// the build and agent to connect!

cli/start.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,11 @@ func start() *cobra.Command {
303303
_, _ = fmt.Fprintln(cmd.OutOrStdout(), "\n\n"+cliui.Styles.Bold.Render("Interrupt caught. Gracefully exiting..."))
304304

305305
if dev {
306-
workspaces, err := client.WorkspacesByUser(cmd.Context(), codersdk.Me)
306+
organizations, err := client.OrganizationsByUser(cmd.Context(), codersdk.Me)
307+
if err != nil {
308+
return xerrors.Errorf("get organizations: %w", err)
309+
}
310+
workspaces, err := client.WorkspacesByOwner(cmd.Context(), organizations[0].ID, codersdk.Me)
307311
if err != nil {
308312
return xerrors.Errorf("get workspaces: %w", err)
309313
}

cli/start_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ func TestStart(t *testing.T) {
190190
version := coderdtest.CreateTemplateVersion(t, client, orgs[0].ID, nil)
191191
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
192192
template := coderdtest.CreateTemplate(t, client, orgs[0].ID, version.ID)
193-
workspace := coderdtest.CreateWorkspace(t, client, codersdk.Me, template.ID)
193+
workspace := coderdtest.CreateWorkspace(t, client, orgs[0].ID, template.ID)
194194
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
195195

196196
require.NoError(t, err)

cli/workspaceautostart.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,18 @@ func workspaceAutostartEnable() *cobra.Command {
4646
if err != nil {
4747
return err
4848
}
49+
organization, err := currentOrganization(cmd, client)
50+
if err != nil {
51+
return err
52+
}
4953

5054
spec := fmt.Sprintf("CRON_TZ=%s %s %s * * %s", autostartTimezone, autostartMinute, autostartHour, autostartDayOfWeek)
5155
validSchedule, err := schedule.Weekly(spec)
5256
if err != nil {
5357
return err
5458
}
5559

56-
workspace, err := client.WorkspaceByName(cmd.Context(), codersdk.Me, args[0])
60+
workspace, err := client.WorkspaceByOwnerAndName(cmd.Context(), organization.ID, codersdk.Me, args[0])
5761
if err != nil {
5862
return err
5963
}
@@ -92,8 +96,12 @@ func workspaceAutostartDisable() *cobra.Command {
9296
if err != nil {
9397
return err
9498
}
99+
organization, err := currentOrganization(cmd, client)
100+
if err != nil {
101+
return err
102+
}
95103

96-
workspace, err := client.WorkspaceByName(cmd.Context(), codersdk.Me, args[0])
104+
workspace, err := client.WorkspaceByOwnerAndName(cmd.Context(), organization.ID, codersdk.Me, args[0])
97105
if err != nil {
98106
return err
99107
}

0 commit comments

Comments
 (0)