Skip to content

Commit 5a74cf9

Browse files
committed
Merge branch 'main' into 10676-prune-inactive
2 parents f4b83ad + 7f62085 commit 5a74cf9

Some content is hidden

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

74 files changed

+3566
-948
lines changed

.github/workflows/ci.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ jobs:
3131
runs-on: ubuntu-latest
3232
outputs:
3333
docs-only: ${{ steps.filter.outputs.docs_count == steps.filter.outputs.all_count }}
34+
docs: ${{ steps.filter.outputs.docs }}
3435
go: ${{ steps.filter.outputs.go }}
3536
ts: ${{ steps.filter.outputs.ts }}
3637
k8s: ${{ steps.filter.outputs.k8s }}
@@ -647,7 +648,8 @@ jobs:
647648
name: offlinedocs
648649
needs: changes
649650
runs-on: ${{ github.repository_owner == 'coder' && 'buildjet-8vcpu-ubuntu-2204' || 'ubuntu-latest' }}
650-
if: needs.changes.outputs.offlinedocs == 'true' || needs.changes.outputs.ci == 'true'
651+
if: needs.changes.outputs.offlinedocs == 'true' || needs.changes.outputs.ci == 'true' || needs.changes.outputs.docs == 'true'
652+
651653
steps:
652654
- name: Checkout
653655
uses: actions/checkout@v4

.vscode/settings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"coderdenttest",
1919
"coderdtest",
2020
"codersdk",
21+
"contravariance",
2122
"cronstrue",
2223
"databasefake",
2324
"dbmem",

cli/agent_test.go

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,10 @@ func TestWorkspaceAgent(t *testing.T) {
3131

3232
client, db := coderdtest.NewWithDatabase(t, nil)
3333
user := coderdtest.CreateFirstUser(t, client)
34-
r := dbfake.Workspace(t, db).
35-
Seed(database.Workspace{
36-
OrganizationID: user.OrganizationID,
37-
OwnerID: user.UserID,
38-
}).
34+
r := dbfake.WorkspaceBuild(t, db, database.Workspace{
35+
OrganizationID: user.OrganizationID,
36+
OwnerID: user.UserID,
37+
}).
3938
WithAgent().
4039
Do()
4140
logDir := t.TempDir()
@@ -68,7 +67,7 @@ func TestWorkspaceAgent(t *testing.T) {
6867
AzureCertificates: certificates,
6968
})
7069
user := coderdtest.CreateFirstUser(t, client)
71-
r := dbfake.Workspace(t, db).Seed(database.Workspace{
70+
r := dbfake.WorkspaceBuild(t, db, database.Workspace{
7271
OrganizationID: user.OrganizationID,
7372
OwnerID: user.UserID,
7473
}).WithAgent(func(agents []*proto.Agent) []*proto.Agent {
@@ -105,7 +104,7 @@ func TestWorkspaceAgent(t *testing.T) {
105104
AWSCertificates: certificates,
106105
})
107106
user := coderdtest.CreateFirstUser(t, client)
108-
r := dbfake.Workspace(t, db).Seed(database.Workspace{
107+
r := dbfake.WorkspaceBuild(t, db, database.Workspace{
109108
OrganizationID: user.OrganizationID,
110109
OwnerID: user.UserID,
111110
}).WithAgent(func(agents []*proto.Agent) []*proto.Agent {
@@ -143,7 +142,7 @@ func TestWorkspaceAgent(t *testing.T) {
143142
})
144143
owner := coderdtest.CreateFirstUser(t, client)
145144
member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
146-
r := dbfake.Workspace(t, db).Seed(database.Workspace{
145+
r := dbfake.WorkspaceBuild(t, db, database.Workspace{
147146
OrganizationID: owner.OrganizationID,
148147
OwnerID: memberUser.ID,
149148
}).WithAgent(func(agents []*proto.Agent) []*proto.Agent {
@@ -195,13 +194,10 @@ func TestWorkspaceAgent(t *testing.T) {
195194

196195
client, db := coderdtest.NewWithDatabase(t, nil)
197196
user := coderdtest.CreateFirstUser(t, client)
198-
r := dbfake.Workspace(t, db).
199-
Seed(database.Workspace{
200-
OrganizationID: user.OrganizationID,
201-
OwnerID: user.UserID,
202-
}).
203-
WithAgent().
204-
Do()
197+
r := dbfake.WorkspaceBuild(t, db, database.Workspace{
198+
OrganizationID: user.OrganizationID,
199+
OwnerID: user.UserID,
200+
}).WithAgent().Do()
205201

206202
logDir := t.TempDir()
207203
inv, _ := clitest.New(t,

cli/configssh_test.go

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,10 @@ func TestConfigSSH(t *testing.T) {
7777
})
7878
owner := coderdtest.CreateFirstUser(t, client)
7979
member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
80-
r := dbfake.Workspace(t, db).
81-
Seed(database.Workspace{
82-
OrganizationID: owner.OrganizationID,
83-
OwnerID: memberUser.ID,
84-
}).
85-
WithAgent().
86-
Do()
80+
r := dbfake.WorkspaceBuild(t, db, database.Workspace{
81+
OrganizationID: owner.OrganizationID,
82+
OwnerID: memberUser.ID,
83+
}).WithAgent().Do()
8784
_ = agenttest.New(t, client.URL, r.AgentToken)
8885
resources := coderdtest.AwaitWorkspaceAgents(t, client, r.Workspace.ID)
8986
agentConn, err := client.DialWorkspaceAgent(context.Background(), resources[0].Agents[0].ID, nil)
@@ -575,7 +572,7 @@ func TestConfigSSH_FileWriteAndOptionsFlow(t *testing.T) {
575572
client, db := coderdtest.NewWithDatabase(t, nil)
576573
user := coderdtest.CreateFirstUser(t, client)
577574
if tt.hasAgent {
578-
_ = dbfake.Workspace(t, db).Seed(database.Workspace{
575+
_ = dbfake.WorkspaceBuild(t, db, database.Workspace{
579576
OrganizationID: user.OrganizationID,
580577
OwnerID: user.UserID,
581578
}).WithAgent().Do()
@@ -695,11 +692,10 @@ func TestConfigSSH_Hostnames(t *testing.T) {
695692
owner := coderdtest.CreateFirstUser(t, client)
696693
member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
697694

698-
r := dbfake.Workspace(t, db).Seed(database.Workspace{
695+
r := dbfake.WorkspaceBuild(t, db, database.Workspace{
699696
OrganizationID: owner.OrganizationID,
700697
OwnerID: memberUser.ID,
701-
}).Do()
702-
dbfake.WorkspaceBuild(t, db, r.Workspace).Resource(resources...).Do()
698+
}).Resource(resources...).Do()
703699
sshConfigFile := sshConfigFileName(t)
704700

705701
inv, root := clitest.New(t, "config-ssh", "--ssh-config-file", sshConfigFile)

cli/exp_scaletest.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"math/rand"
1111
"net/http"
1212
"os"
13+
"os/signal"
1314
"strconv"
1415
"strings"
1516
"sync"
@@ -173,11 +174,12 @@ func (s *scaletestStrategyFlags) attach(opts *clibase.OptionSet) {
173174

174175
func (s *scaletestStrategyFlags) toStrategy() harness.ExecutionStrategy {
175176
var strategy harness.ExecutionStrategy
176-
if s.concurrency == 1 {
177+
switch s.concurrency {
178+
case 1:
177179
strategy = harness.LinearExecutionStrategy{}
178-
} else if s.concurrency == 0 {
180+
case 0:
179181
strategy = harness.ConcurrentExecutionStrategy{}
180-
} else {
182+
default:
181183
strategy = harness.ParallelExecutionStrategy{
182184
Limit: int(s.concurrency),
183185
}
@@ -244,7 +246,9 @@ func (o *scaleTestOutput) write(res harness.Results, stdout io.Writer) error {
244246
err := s.Sync()
245247
// On Linux, EINVAL is returned when calling fsync on /dev/stdout. We
246248
// can safely ignore this error.
247-
if err != nil && !xerrors.Is(err, syscall.EINVAL) {
249+
// On macOS, ENOTTY is returned when calling sync on /dev/stdout. We
250+
// can safely ignore this error.
251+
if err != nil && !xerrors.Is(err, syscall.EINVAL) && !xerrors.Is(err, syscall.ENOTTY) {
248252
return xerrors.Errorf("flush output file: %w", err)
249253
}
250254
}
@@ -871,9 +875,13 @@ func (r *RootCmd) scaletestWorkspaceTraffic() *clibase.Cmd {
871875
Middleware: clibase.Chain(
872876
r.InitClient(client),
873877
),
874-
Handler: func(inv *clibase.Invocation) error {
878+
Handler: func(inv *clibase.Invocation) (err error) {
875879
ctx := inv.Context()
876880

881+
notifyCtx, stop := signal.NotifyContext(ctx, InterruptSignals...) // Checked later.
882+
defer stop()
883+
ctx = notifyCtx
884+
877885
me, err := requireAdmin(ctx, client)
878886
if err != nil {
879887
return err
@@ -965,6 +973,7 @@ func (r *RootCmd) scaletestWorkspaceTraffic() *clibase.Cmd {
965973
ReadMetrics: metrics.ReadMetrics(ws.OwnerName, ws.Name, agentName),
966974
WriteMetrics: metrics.WriteMetrics(ws.OwnerName, ws.Name, agentName),
967975
SSH: ssh,
976+
Echo: ssh,
968977
}
969978

970979
if err := config.Validate(); err != nil {
@@ -990,6 +999,11 @@ func (r *RootCmd) scaletestWorkspaceTraffic() *clibase.Cmd {
990999
return xerrors.Errorf("run test harness (harness failure, not a test failure): %w", err)
9911000
}
9921001

1002+
// If the command was interrupted, skip stats.
1003+
if notifyCtx.Err() != nil {
1004+
return notifyCtx.Err()
1005+
}
1006+
9931007
res := th.Results()
9941008
for _, o := range outputs {
9951009
err = o.write(res, inv.Stdout)

cli/gitssh_test.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,11 @@ func prepareTestGitSSH(ctx context.Context, t *testing.T) (*agentsdk.Client, str
4848
require.NoError(t, err)
4949

5050
// setup template
51-
r := dbfake.Workspace(t, db).
52-
Seed(database.Workspace{
53-
OrganizationID: user.OrganizationID,
54-
OwnerID: user.UserID,
55-
}).
56-
WithAgent().
57-
Do()
51+
r := dbfake.WorkspaceBuild(t, db, database.Workspace{
52+
OrganizationID: user.OrganizationID,
53+
OwnerID: user.UserID,
54+
}).WithAgent().Do()
55+
5856
// start workspace agent
5957
agentClient := agentsdk.New(client.URL)
6058
agentClient.SetSessionToken(r.AgentToken)

cli/list_test.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,12 @@ func TestList(t *testing.T) {
2525
client, db := coderdtest.NewWithDatabase(t, nil)
2626
owner := coderdtest.CreateFirstUser(t, client)
2727
member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
28-
r := dbfake.Workspace(t, db).Seed(database.Workspace{
28+
// setup template
29+
r := dbfake.WorkspaceBuild(t, db, database.Workspace{
2930
OrganizationID: owner.OrganizationID,
3031
OwnerID: memberUser.ID,
3132
}).WithAgent().Do()
33+
3234
inv, root := clitest.New(t, "ls")
3335
clitest.SetupConfig(t, member, root)
3436
pty := ptytest.New(t).Attach(inv)
@@ -52,7 +54,7 @@ func TestList(t *testing.T) {
5254
client, db := coderdtest.NewWithDatabase(t, nil)
5355
owner := coderdtest.CreateFirstUser(t, client)
5456
member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
55-
dbfake.Workspace(t, db).Seed(database.Workspace{
57+
_ = dbfake.WorkspaceBuild(t, db, database.Workspace{
5658
OrganizationID: owner.OrganizationID,
5759
OwnerID: memberUser.ID,
5860
}).WithAgent().Do()

cli/portforward_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,10 +305,11 @@ func runAgent(t *testing.T, client *codersdk.Client, owner uuid.UUID, db databas
305305
require.NoError(t, err, "specified user does not exist")
306306
require.Greater(t, len(user.OrganizationIDs), 0, "user has no organizations")
307307
orgID := user.OrganizationIDs[0]
308-
r := dbfake.Workspace(t, db).Seed(database.Workspace{
308+
r := dbfake.WorkspaceBuild(t, db, database.Workspace{
309309
OrganizationID: orgID,
310310
OwnerID: owner,
311311
}).WithAgent().Do()
312+
312313
_ = agenttest.New(t, client.URL, r.AgentToken,
313314
func(o *agent.Options) {
314315
o.SSHMaxTimeout = 60 * time.Second

cli/schedule_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,26 +38,27 @@ func setupTestSchedule(t *testing.T, sched *cron.Schedule) (ownerClient, memberC
3838
memberClient, memberUser := coderdtest.CreateAnotherUserMutators(t, ownerClient, owner.OrganizationID, nil, func(r *codersdk.CreateUserRequest) {
3939
r.Username = "testuser2" // ensure deterministic ordering
4040
})
41-
_ = dbfake.Workspace(t, db).Seed(database.Workspace{
41+
_ = dbfake.WorkspaceBuild(t, db, database.Workspace{
4242
Name: "a-owner",
4343
OwnerID: owner.UserID,
4444
OrganizationID: owner.OrganizationID,
4545
AutostartSchedule: sql.NullString{String: sched.String(), Valid: true},
4646
Ttl: sql.NullInt64{Int64: 8 * time.Hour.Nanoseconds(), Valid: true},
4747
}).WithAgent().Do()
48-
_ = dbfake.Workspace(t, db).Seed(database.Workspace{
48+
49+
_ = dbfake.WorkspaceBuild(t, db, database.Workspace{
4950
Name: "b-owner",
5051
OwnerID: owner.UserID,
5152
OrganizationID: owner.OrganizationID,
5253
AutostartSchedule: sql.NullString{String: sched.String(), Valid: true},
5354
}).WithAgent().Do()
54-
_ = dbfake.Workspace(t, db).Seed(database.Workspace{
55+
_ = dbfake.WorkspaceBuild(t, db, database.Workspace{
5556
Name: "c-member",
5657
OwnerID: memberUser.ID,
5758
OrganizationID: owner.OrganizationID,
5859
Ttl: sql.NullInt64{Int64: 8 * time.Hour.Nanoseconds(), Valid: true},
5960
}).WithAgent().Do()
60-
_ = dbfake.Workspace(t, db).Seed(database.Workspace{
61+
_ = dbfake.WorkspaceBuild(t, db, database.Workspace{
6162
Name: "d-member",
6263
OwnerID: memberUser.ID,
6364
OrganizationID: owner.OrganizationID,

cli/ssh_test.go

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,10 @@ func setupWorkspaceForAgent(t *testing.T, mutations ...func([]*proto.Agent) []*p
5252
client.SetLogger(slogtest.Make(t, nil).Named("client").Leveled(slog.LevelDebug))
5353
first := coderdtest.CreateFirstUser(t, client)
5454
userClient, user := coderdtest.CreateAnotherUser(t, client, first.OrganizationID)
55-
r := dbfake.Workspace(t, store).
56-
Seed(database.Workspace{
57-
OrganizationID: first.OrganizationID,
58-
OwnerID: user.ID,
59-
}).
60-
WithAgent(mutations...).
61-
Do()
55+
r := dbfake.WorkspaceBuild(t, store, database.Workspace{
56+
OrganizationID: first.OrganizationID,
57+
OwnerID: user.ID,
58+
}).WithAgent(mutations...).Do()
6259

6360
return userClient, r.Workspace, r.AgentToken
6461
}
@@ -130,7 +127,7 @@ func TestSSH(t *testing.T) {
130127
client.SetLogger(slogtest.Make(t, nil).Named("client").Leveled(slog.LevelDebug))
131128
first := coderdtest.CreateFirstUser(t, client)
132129
userClient, user := coderdtest.CreateAnotherUser(t, client, first.OrganizationID)
133-
r := dbfake.Workspace(t, store).Seed(database.Workspace{
130+
r := dbfake.WorkspaceBuild(t, store, database.Workspace{
134131
OrganizationID: first.OrganizationID,
135132
OwnerID: user.ID,
136133
}).WithAgent().Do()
@@ -409,7 +406,9 @@ func TestSSH(t *testing.T) {
409406
//
410407
// To work around this, we attempt to send messages in a loop until one succeeds
411408
success := make(chan struct{})
409+
done := make(chan struct{})
412410
go func() {
411+
defer close(done)
413412
var (
414413
conn net.Conn
415414
err error
@@ -447,6 +446,8 @@ func TestSSH(t *testing.T) {
447446
fsn.Notify()
448447
<-cmdDone
449448
fsn.AssertStopped()
449+
// wait for dial goroutine to complete
450+
_ = testutil.RequireRecvCtx(ctx, t, done)
450451

451452
// wait for the remote socket to get cleaned up before retrying,
452453
// because cleaning up the socket happens asynchronously, and we
@@ -469,7 +470,7 @@ func TestSSH(t *testing.T) {
469470
client.SetLogger(slogtest.Make(t, nil).Named("client").Leveled(slog.LevelDebug))
470471
first := coderdtest.CreateFirstUser(t, client)
471472
userClient, user := coderdtest.CreateAnotherUser(t, client, first.OrganizationID)
472-
r := dbfake.Workspace(t, store).Seed(database.Workspace{
473+
r := dbfake.WorkspaceBuild(t, store, database.Workspace{
473474
OrganizationID: first.OrganizationID,
474475
OwnerID: user.ID,
475476
}).WithAgent().Do()

cli/state.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,11 @@ func (r *RootCmd) statePull() *clibase.Cmd {
4646
}
4747
build = workspace.LatestBuild
4848
} else {
49-
build, err = client.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber(inv.Context(), codersdk.Me, inv.Args[0], strconv.FormatInt(buildNumber, 10))
49+
owner, workspace, err := splitNamedWorkspace(inv.Args[0])
50+
if err != nil {
51+
return err
52+
}
53+
build, err = client.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber(inv.Context(), owner, workspace, strconv.FormatInt(buildNumber, 10))
5054
if err != nil {
5155
return err
5256
}

0 commit comments

Comments
 (0)