Skip to content

Commit 4b249d5

Browse files
committed
Merge branch 'main' into 9497-db-first
2 parents 27e97e9 + 85ab9c2 commit 4b249d5

File tree

77 files changed

+2733
-1411
lines changed

Some content is hidden

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

77 files changed

+2733
-1411
lines changed
Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Upload tests to Datadog
1+
name: Upload tests to datadog
22
if: always()
33
inputs:
44
api-key:
@@ -7,26 +7,8 @@ inputs:
77
runs:
88
using: "composite"
99
steps:
10-
- name: Set work dir
11-
shell: bash
12-
run: |
13-
WORK_DIR=${{ runner.temp }}/datadog-ci
14-
mkdir -p $WORK_DIR
15-
echo "WORK_DIR=$WORK_DIR" >> $GITHUB_ENV
16-
# The npm install was taking 30s to 1m, accounting for 20+% of the total
17-
# job time.
18-
- name: Cache datadog-ci
19-
uses: buildjet/cache@v3
20-
with:
21-
path: |
22-
${{ env.WORK_DIR }}
23-
key: datadog-ci-${{ runner.os }}
24-
restore-keys: |
25-
datadog-ci-${{ runner.os }}-
26-
datadog-ci-
2710
- shell: bash
2811
run: |
29-
cd ${{ env.WORK_DIR }}
3012
owner=${{ github.repository_owner }}
3113
echo "owner: $owner"
3214
if [[ $owner != "coder" ]]; then
@@ -38,8 +20,8 @@ runs:
3820
echo "No API key provided, skipping..."
3921
exit 0
4022
fi
41-
npm install @datadog/datadog-ci@2.10.0
42-
npm x -- datadog-ci junit upload --service coder ./gotests.xml \
23+
npm install -g @datadog/datadog-ci@2.10.0
24+
datadog-ci junit upload --service coder ./gotests.xml \
4325
--tags os:${{runner.os}} --tags runner_name:${{runner.name}}
4426
env:
4527
DATADOG_API_KEY: ${{ inputs.api-key }}

.github/workflows/pr-deploy.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,6 @@ permissions:
3737
packages: write
3838
pull-requests: write # needed for commenting on PRs
3939

40-
concurrency:
41-
group: ${{ github.workflow }}-${{ github.ref }}
42-
cancel-in-progress: true
43-
4440
jobs:
4541
check_pr:
4642
runs-on: ubuntu-latest
@@ -73,7 +69,7 @@ jobs:
7369
CODER_BASE_IMAGE_TAG: ${{ steps.set_tags.outputs.CODER_BASE_IMAGE_TAG }}
7470
CODER_IMAGE_TAG: ${{ steps.set_tags.outputs.CODER_IMAGE_TAG }}
7571
NEW: ${{ steps.check_deployment.outputs.NEW }}
76-
BUILD: ${{ steps.build_conditionals.outputs.first_or_force_build || steps.build_conditionals.outputs.automatic_rebuild }}
72+
BUILD: ${{ steps.build_conditionals.outputs.first_or_force_build == 'true' || steps.build_conditionals.outputs.automatic_rebuild == 'true' }}
7773

7874
runs-on: "ubuntu-latest"
7975
steps:
@@ -166,7 +162,7 @@ jobs:
166162
echo "automatic_rebuild=${{ steps.check_deployment.outputs.NEW == 'false' && steps.filter.outputs.all_count > steps.filter.outputs.ignored_count }}" >> $GITHUB_OUTPUT
167163
168164
comment-pr:
169-
needs: [check_pr, get_info]
165+
needs: get_info
170166
if: needs.get_info.outputs.BUILD == 'true' || github.event.inputs.deploy == 'true'
171167
runs-on: "ubuntu-latest"
172168
steps:
@@ -198,6 +194,10 @@ jobs:
198194
# Run build job only if there are changes in the files that we care about or if the workflow is manually triggered with --build flag
199195
if: needs.get_info.outputs.BUILD == 'true'
200196
runs-on: ${{ github.repository_owner == 'coder' && 'buildjet-8vcpu-ubuntu-2204' || 'ubuntu-latest' }}
197+
# This concurrency only cancels build jobs if a new build is triggred. It will avoid cancelling the current deployemtn in case of docs chnages.
198+
concurrency:
199+
group: build-${{ github.workflow }}-${{ github.ref }}-${{ needs.get_info.outputs.BUILD }}
200+
cancel-in-progress: true
201201
env:
202202
DOCKER_CLI_EXPERIMENTAL: "enabled"
203203
CODER_IMAGE_TAG: ${{ needs.get_info.outputs.CODER_IMAGE_TAG }}

cli/portforward_test.go

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,20 @@ import (
77
"net"
88
"sync"
99
"testing"
10+
"time"
1011

1112
"github.com/google/uuid"
1213
"github.com/pion/udp"
1314
"github.com/stretchr/testify/assert"
1415
"github.com/stretchr/testify/require"
1516

17+
"cdr.dev/slog"
18+
"cdr.dev/slog/sloggers/slogtest"
19+
"github.com/coder/coder/v2/agent"
1620
"github.com/coder/coder/v2/cli/clitest"
1721
"github.com/coder/coder/v2/coderd/coderdtest"
1822
"github.com/coder/coder/v2/codersdk"
23+
"github.com/coder/coder/v2/codersdk/agentsdk"
1924
"github.com/coder/coder/v2/provisioner/echo"
2025
"github.com/coder/coder/v2/pty/ptytest"
2126
"github.com/coder/coder/v2/testutil"
@@ -312,24 +317,23 @@ func runAgent(t *testing.T, client *codersdk.Client, userID uuid.UUID) codersdk.
312317
workspace := coderdtest.CreateWorkspace(t, client, orgID, template.ID)
313318
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
314319

315-
// Start workspace agent in a goroutine
316-
inv, root := clitest.New(t, "agent", "--agent-token", agentToken, "--agent-url", client.URL.String())
317-
clitest.SetupConfig(t, client, root)
318-
pty := ptytest.New(t)
319-
inv.Stdin = pty.Input()
320-
inv.Stdout = pty.Output()
321-
inv.Stderr = pty.Output()
322-
errC := make(chan error)
323-
agentCtx, agentCancel := context.WithCancel(ctx)
320+
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug).Named("agent")
321+
agentClient := agentsdk.New(client.URL)
322+
agentClient.SDK.SetLogger(logger)
323+
agentClient.SDK.SetSessionToken(agentToken)
324+
agnt := agent.New(agent.Options{
325+
Client: agentClient,
326+
Logger: logger,
327+
LogDir: t.TempDir(),
328+
ExchangeToken: func(ctx context.Context) (string, error) {
329+
return agentToken, nil
330+
},
331+
SSHMaxTimeout: time.Second * 60,
332+
})
324333
t.Cleanup(func() {
325-
agentCancel()
326-
err := <-errC
327-
require.NoError(t, err)
334+
err := agnt.Close()
335+
assert.NoError(t, err)
328336
})
329-
go func() {
330-
errC <- inv.WithContext(agentCtx).Run()
331-
}()
332-
333337
coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
334338

335339
return workspace

cli/root_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ func TestDERPHeaders(t *testing.T) {
170170

171171
// Connect with the headers set as args.
172172
args := []string{
173+
"-v",
173174
"--no-feature-warning",
174175
"--no-version-warning",
175176
"ping", workspace.Name,

coderd/activitybump_test.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,11 @@ func TestWorkspaceActivityBump(t *testing.T) {
7777
dbBuild, err := db.GetWorkspaceBuildByID(ctx, workspace.LatestBuild.ID)
7878
require.NoError(t, err)
7979

80-
err = db.UpdateWorkspaceBuildByID(ctx, database.UpdateWorkspaceBuildByIDParams{
81-
ID: workspace.LatestBuild.ID,
82-
UpdatedAt: dbtime.Now(),
83-
ProvisionerState: dbBuild.ProvisionerState,
84-
Deadline: dbBuild.Deadline,
85-
MaxDeadline: dbtime.Now().Add(maxTTL),
80+
err = db.UpdateWorkspaceBuildDeadlineByID(ctx, database.UpdateWorkspaceBuildDeadlineByIDParams{
81+
ID: workspace.LatestBuild.ID,
82+
UpdatedAt: dbtime.Now(),
83+
Deadline: dbBuild.Deadline,
84+
MaxDeadline: dbtime.Now().Add(maxTTL),
8685
})
8786
require.NoError(t, err)
8887
}

coderd/coderdtest/coderdtest.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ func UpdateTemplateVersion(t *testing.T, client *codersdk.Client, organizationID
763763
func AwaitTemplateVersionJob(t *testing.T, client *codersdk.Client, version uuid.UUID) codersdk.TemplateVersion {
764764
t.Helper()
765765

766-
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitMedium)
766+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
767767
defer cancel()
768768

769769
t.Logf("waiting for template version job %s", version)
@@ -772,7 +772,7 @@ func AwaitTemplateVersionJob(t *testing.T, client *codersdk.Client, version uuid
772772
var err error
773773
templateVersion, err = client.TemplateVersion(ctx, version)
774774
return assert.NoError(t, err) && templateVersion.Job.CompletedAt != nil
775-
}, testutil.WaitMedium, testutil.IntervalFast)
775+
}, testutil.WaitLong, testutil.IntervalMedium)
776776
t.Logf("got template version job %s", version)
777777
return templateVersion
778778
}
@@ -790,7 +790,7 @@ func AwaitWorkspaceBuildJob(t *testing.T, client *codersdk.Client, build uuid.UU
790790
var err error
791791
workspaceBuild, err = client.WorkspaceBuild(ctx, build)
792792
return assert.NoError(t, err) && workspaceBuild.Job.CompletedAt != nil
793-
}, testutil.WaitShort, testutil.IntervalFast)
793+
}, testutil.WaitMedium, testutil.IntervalMedium)
794794
t.Logf("got workspace build job %s", build)
795795
return workspaceBuild
796796
}
@@ -838,7 +838,7 @@ func AwaitWorkspaceAgents(t *testing.T, client *codersdk.Client, workspaceID uui
838838
resources = workspace.LatestBuild.Resources
839839

840840
return true
841-
}, testutil.WaitLong, testutil.IntervalFast)
841+
}, testutil.WaitLong, testutil.IntervalMedium)
842842
t.Logf("got workspace agents (workspace %s)", workspaceID)
843843
return resources
844844
}

coderd/database/dbauthz/dbauthz.go

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,13 @@ func (q *querier) DeleteAPIKeysByUserID(ctx context.Context, userID uuid.UUID) e
694694
return q.db.DeleteAPIKeysByUserID(ctx, userID)
695695
}
696696

697+
func (q *querier) DeleteAllTailnetClientSubscriptions(ctx context.Context, arg database.DeleteAllTailnetClientSubscriptionsParams) error {
698+
if err := q.authorizeContext(ctx, rbac.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil {
699+
return err
700+
}
701+
return q.db.DeleteAllTailnetClientSubscriptions(ctx, arg)
702+
}
703+
697704
func (q *querier) DeleteApplicationConnectAPIKeysByUserID(ctx context.Context, userID uuid.UUID) error {
698705
// TODO: This is not 100% correct because it omits apikey IDs.
699706
err := q.authorizeContext(ctx, rbac.ActionDelete,
@@ -783,6 +790,13 @@ func (q *querier) DeleteTailnetClient(ctx context.Context, arg database.DeleteTa
783790
return q.db.DeleteTailnetClient(ctx, arg)
784791
}
785792

793+
func (q *querier) DeleteTailnetClientSubscription(ctx context.Context, arg database.DeleteTailnetClientSubscriptionParams) error {
794+
if err := q.authorizeContext(ctx, rbac.ActionDelete, rbac.ResourceTailnetCoordinator); err != nil {
795+
return err
796+
}
797+
return q.db.DeleteTailnetClientSubscription(ctx, arg)
798+
}
799+
786800
func (q *querier) GetAPIKeyByID(ctx context.Context, id string) (database.APIKey, error) {
787801
return fetch(q.log, q.auth, q.db.GetAPIKeyByID)(ctx, id)
788802
}
@@ -825,9 +839,9 @@ func (q *querier) GetAllTailnetAgents(ctx context.Context) ([]database.TailnetAg
825839
return q.db.GetAllTailnetAgents(ctx)
826840
}
827841

828-
func (q *querier) GetAllTailnetClients(ctx context.Context) ([]database.TailnetClient, error) {
842+
func (q *querier) GetAllTailnetClients(ctx context.Context) ([]database.GetAllTailnetClientsRow, error) {
829843
if err := q.authorizeContext(ctx, rbac.ActionRead, rbac.ResourceTailnetCoordinator); err != nil {
830-
return []database.TailnetClient{}, err
844+
return []database.GetAllTailnetClientsRow{}, err
831845
}
832846
return q.db.GetAllTailnetClients(ctx)
833847
}
@@ -2680,7 +2694,15 @@ func (q *querier) UpdateWorkspaceAutostart(ctx context.Context, arg database.Upd
26802694
return update(q.log, q.auth, fetch, q.db.UpdateWorkspaceAutostart)(ctx, arg)
26812695
}
26822696

2683-
func (q *querier) UpdateWorkspaceBuildByID(ctx context.Context, arg database.UpdateWorkspaceBuildByIDParams) error {
2697+
// UpdateWorkspaceBuildCostByID is used by the provisioning system to update the cost of a workspace build.
2698+
func (q *querier) UpdateWorkspaceBuildCostByID(ctx context.Context, arg database.UpdateWorkspaceBuildCostByIDParams) error {
2699+
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceSystem); err != nil {
2700+
return err
2701+
}
2702+
return q.db.UpdateWorkspaceBuildCostByID(ctx, arg)
2703+
}
2704+
2705+
func (q *querier) UpdateWorkspaceBuildDeadlineByID(ctx context.Context, arg database.UpdateWorkspaceBuildDeadlineByIDParams) error {
26842706
build, err := q.db.GetWorkspaceBuildByID(ctx, arg.ID)
26852707
if err != nil {
26862708
return err
@@ -2690,20 +2712,19 @@ func (q *querier) UpdateWorkspaceBuildByID(ctx context.Context, arg database.Upd
26902712
if err != nil {
26912713
return err
26922714
}
2715+
26932716
err = q.authorizeContext(ctx, rbac.ActionUpdate, workspace.RBACObject())
26942717
if err != nil {
26952718
return err
26962719
}
2697-
2698-
return q.db.UpdateWorkspaceBuildByID(ctx, arg)
2720+
return q.db.UpdateWorkspaceBuildDeadlineByID(ctx, arg)
26992721
}
27002722

2701-
// UpdateWorkspaceBuildCostByID is used by the provisioning system to update the cost of a workspace build.
2702-
func (q *querier) UpdateWorkspaceBuildCostByID(ctx context.Context, arg database.UpdateWorkspaceBuildCostByIDParams) error {
2723+
func (q *querier) UpdateWorkspaceBuildProvisionerStateByID(ctx context.Context, arg database.UpdateWorkspaceBuildProvisionerStateByIDParams) error {
27032724
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceSystem); err != nil {
27042725
return err
27052726
}
2706-
return q.db.UpdateWorkspaceBuildCostByID(ctx, arg)
2727+
return q.db.UpdateWorkspaceBuildProvisionerStateByID(ctx, arg)
27072728
}
27082729

27092730
// Deprecated: Use SoftDeleteWorkspaceByID
@@ -2813,6 +2834,13 @@ func (q *querier) UpsertTailnetClient(ctx context.Context, arg database.UpsertTa
28132834
return q.db.UpsertTailnetClient(ctx, arg)
28142835
}
28152836

2837+
func (q *querier) UpsertTailnetClientSubscription(ctx context.Context, arg database.UpsertTailnetClientSubscriptionParams) error {
2838+
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil {
2839+
return err
2840+
}
2841+
return q.db.UpsertTailnetClientSubscription(ctx, arg)
2842+
}
2843+
28162844
func (q *querier) UpsertTailnetCoordinator(ctx context.Context, id uuid.UUID) (database.TailnetCoordinator, error) {
28172845
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil {
28182846
return database.TailnetCoordinator{}, err

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,14 +1232,13 @@ func (s *MethodTestSuite) TestWorkspace() {
12321232
ID: ws.ID,
12331233
}).Asserts(ws, rbac.ActionUpdate).Returns()
12341234
}))
1235-
s.Run("UpdateWorkspaceBuildByID", s.Subtest(func(db database.Store, check *expects) {
1235+
s.Run("UpdateWorkspaceBuildDeadlineByID", s.Subtest(func(db database.Store, check *expects) {
12361236
ws := dbgen.Workspace(s.T(), db, database.Workspace{})
12371237
build := dbgen.WorkspaceBuild(s.T(), db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
1238-
check.Args(database.UpdateWorkspaceBuildByIDParams{
1239-
ID: build.ID,
1240-
UpdatedAt: build.UpdatedAt,
1241-
Deadline: build.Deadline,
1242-
ProvisionerState: []byte{},
1238+
check.Args(database.UpdateWorkspaceBuildDeadlineByIDParams{
1239+
ID: build.ID,
1240+
UpdatedAt: build.UpdatedAt,
1241+
Deadline: build.Deadline,
12431242
}).Asserts(ws, rbac.ActionUpdate)
12441243
}))
12451244
s.Run("SoftDeleteWorkspaceByID", s.Subtest(func(db database.Store, check *expects) {
@@ -1378,6 +1377,14 @@ func (s *MethodTestSuite) TestSystemFunctions() {
13781377
DailyCost: 10,
13791378
}).Asserts(rbac.ResourceSystem, rbac.ActionUpdate)
13801379
}))
1380+
s.Run("UpdateWorkspaceBuildProvisionerStateByID", s.Subtest(func(db database.Store, check *expects) {
1381+
ws := dbgen.Workspace(s.T(), db, database.Workspace{})
1382+
build := dbgen.WorkspaceBuild(s.T(), db, database.WorkspaceBuild{WorkspaceID: ws.ID, JobID: uuid.New()})
1383+
check.Args(database.UpdateWorkspaceBuildProvisionerStateByIDParams{
1384+
ID: build.ID,
1385+
ProvisionerState: []byte("testing"),
1386+
}).Asserts(rbac.ResourceSystem, rbac.ActionUpdate)
1387+
}))
13811388
s.Run("UpsertLastUpdateCheck", s.Subtest(func(db database.Store, check *expects) {
13821389
check.Args("value").Asserts(rbac.ResourceSystem, rbac.ActionUpdate)
13831390
}))

0 commit comments

Comments
 (0)