Skip to content

Commit 3b4afcc

Browse files
committed
Merge branch 'main' of https://github.com/coder/coder into bq/replace-create-user-machine
2 parents 056bfa2 + 9216725 commit 3b4afcc

Some content is hidden

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

56 files changed

+2490
-793
lines changed

.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 }}

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/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
}
@@ -2661,7 +2675,15 @@ func (q *querier) UpdateWorkspaceAutostart(ctx context.Context, arg database.Upd
26612675
return update(q.log, q.auth, fetch, q.db.UpdateWorkspaceAutostart)(ctx, arg)
26622676
}
26632677

2664-
func (q *querier) UpdateWorkspaceBuildByID(ctx context.Context, arg database.UpdateWorkspaceBuildByIDParams) error {
2678+
// UpdateWorkspaceBuildCostByID is used by the provisioning system to update the cost of a workspace build.
2679+
func (q *querier) UpdateWorkspaceBuildCostByID(ctx context.Context, arg database.UpdateWorkspaceBuildCostByIDParams) error {
2680+
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceSystem); err != nil {
2681+
return err
2682+
}
2683+
return q.db.UpdateWorkspaceBuildCostByID(ctx, arg)
2684+
}
2685+
2686+
func (q *querier) UpdateWorkspaceBuildDeadlineByID(ctx context.Context, arg database.UpdateWorkspaceBuildDeadlineByIDParams) error {
26652687
build, err := q.db.GetWorkspaceBuildByID(ctx, arg.ID)
26662688
if err != nil {
26672689
return err
@@ -2671,20 +2693,19 @@ func (q *querier) UpdateWorkspaceBuildByID(ctx context.Context, arg database.Upd
26712693
if err != nil {
26722694
return err
26732695
}
2696+
26742697
err = q.authorizeContext(ctx, rbac.ActionUpdate, workspace.RBACObject())
26752698
if err != nil {
26762699
return err
26772700
}
2678-
2679-
return q.db.UpdateWorkspaceBuildByID(ctx, arg)
2701+
return q.db.UpdateWorkspaceBuildDeadlineByID(ctx, arg)
26802702
}
26812703

2682-
// UpdateWorkspaceBuildCostByID is used by the provisioning system to update the cost of a workspace build.
2683-
func (q *querier) UpdateWorkspaceBuildCostByID(ctx context.Context, arg database.UpdateWorkspaceBuildCostByIDParams) error {
2704+
func (q *querier) UpdateWorkspaceBuildProvisionerStateByID(ctx context.Context, arg database.UpdateWorkspaceBuildProvisionerStateByIDParams) error {
26842705
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceSystem); err != nil {
26852706
return err
26862707
}
2687-
return q.db.UpdateWorkspaceBuildCostByID(ctx, arg)
2708+
return q.db.UpdateWorkspaceBuildProvisionerStateByID(ctx, arg)
26882709
}
26892710

26902711
// Deprecated: Use SoftDeleteWorkspaceByID
@@ -2794,6 +2815,13 @@ func (q *querier) UpsertTailnetClient(ctx context.Context, arg database.UpsertTa
27942815
return q.db.UpsertTailnetClient(ctx, arg)
27952816
}
27962817

2818+
func (q *querier) UpsertTailnetClientSubscription(ctx context.Context, arg database.UpsertTailnetClientSubscriptionParams) error {
2819+
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil {
2820+
return err
2821+
}
2822+
return q.db.UpsertTailnetClientSubscription(ctx, arg)
2823+
}
2824+
27972825
func (q *querier) UpsertTailnetCoordinator(ctx context.Context, id uuid.UUID) (database.TailnetCoordinator, error) {
27982826
if err := q.authorizeContext(ctx, rbac.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil {
27992827
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
}))

coderd/database/dbfake/dbfake.go

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,15 @@ func (q *FakeQuerier) DeleteAPIKeysByUserID(_ context.Context, userID uuid.UUID)
854854
return nil
855855
}
856856

857+
func (*FakeQuerier) DeleteAllTailnetClientSubscriptions(_ context.Context, arg database.DeleteAllTailnetClientSubscriptionsParams) error {
858+
err := validateDatabaseType(arg)
859+
if err != nil {
860+
return err
861+
}
862+
863+
return ErrUnimplemented
864+
}
865+
857866
func (q *FakeQuerier) DeleteApplicationConnectAPIKeysByUserID(_ context.Context, userID uuid.UUID) error {
858867
q.mutex.Lock()
859868
defer q.mutex.Unlock()
@@ -987,6 +996,10 @@ func (*FakeQuerier) DeleteTailnetClient(context.Context, database.DeleteTailnetC
987996
return database.DeleteTailnetClientRow{}, ErrUnimplemented
988997
}
989998

999+
func (*FakeQuerier) DeleteTailnetClientSubscription(context.Context, database.DeleteTailnetClientSubscriptionParams) error {
1000+
return ErrUnimplemented
1001+
}
1002+
9901003
func (q *FakeQuerier) GetAPIKeyByID(_ context.Context, id string) (database.APIKey, error) {
9911004
q.mutex.RLock()
9921005
defer q.mutex.RUnlock()
@@ -1102,7 +1115,7 @@ func (*FakeQuerier) GetAllTailnetAgents(_ context.Context) ([]database.TailnetAg
11021115
return nil, ErrUnimplemented
11031116
}
11041117

1105-
func (*FakeQuerier) GetAllTailnetClients(_ context.Context) ([]database.TailnetClient, error) {
1118+
func (*FakeQuerier) GetAllTailnetClients(_ context.Context) ([]database.GetAllTailnetClientsRow, error) {
11061119
return nil, ErrUnimplemented
11071120
}
11081121

@@ -5841,7 +5854,7 @@ func (q *FakeQuerier) UpdateWorkspaceAutostart(_ context.Context, arg database.U
58415854
return sql.ErrNoRows
58425855
}
58435856

5844-
func (q *FakeQuerier) UpdateWorkspaceBuildByID(_ context.Context, arg database.UpdateWorkspaceBuildByIDParams) error {
5857+
func (q *FakeQuerier) UpdateWorkspaceBuildCostByID(_ context.Context, arg database.UpdateWorkspaceBuildCostByIDParams) error {
58455858
if err := validateDatabaseType(arg); err != nil {
58465859
return err
58475860
}
@@ -5853,32 +5866,55 @@ func (q *FakeQuerier) UpdateWorkspaceBuildByID(_ context.Context, arg database.U
58535866
if workspaceBuild.ID != arg.ID {
58545867
continue
58555868
}
5856-
workspaceBuild.UpdatedAt = arg.UpdatedAt
5857-
workspaceBuild.ProvisionerState = arg.ProvisionerState
5858-
workspaceBuild.Deadline = arg.Deadline
5859-
workspaceBuild.MaxDeadline = arg.MaxDeadline
5869+
workspaceBuild.DailyCost = arg.DailyCost
58605870
q.workspaceBuilds[index] = workspaceBuild
58615871
return nil
58625872
}
58635873
return sql.ErrNoRows
58645874
}
58655875

5866-
func (q *FakeQuerier) UpdateWorkspaceBuildCostByID(_ context.Context, arg database.UpdateWorkspaceBuildCostByIDParams) error {
5867-
if err := validateDatabaseType(arg); err != nil {
5876+
func (q *FakeQuerier) UpdateWorkspaceBuildDeadlineByID(_ context.Context, arg database.UpdateWorkspaceBuildDeadlineByIDParams) error {
5877+
err := validateDatabaseType(arg)
5878+
if err != nil {
58685879
return err
58695880
}
58705881

58715882
q.mutex.Lock()
58725883
defer q.mutex.Unlock()
58735884

5874-
for index, workspaceBuild := range q.workspaceBuilds {
5875-
if workspaceBuild.ID != arg.ID {
5885+
for idx, build := range q.workspaceBuilds {
5886+
if build.ID != arg.ID {
58765887
continue
58775888
}
5878-
workspaceBuild.DailyCost = arg.DailyCost
5879-
q.workspaceBuilds[index] = workspaceBuild
5889+
build.Deadline = arg.Deadline
5890+
build.MaxDeadline = arg.MaxDeadline
5891+
build.UpdatedAt = arg.UpdatedAt
5892+
q.workspaceBuilds[idx] = build
58805893
return nil
58815894
}
5895+
5896+
return sql.ErrNoRows
5897+
}
5898+
5899+
func (q *FakeQuerier) UpdateWorkspaceBuildProvisionerStateByID(_ context.Context, arg database.UpdateWorkspaceBuildProvisionerStateByIDParams) error {
5900+
err := validateDatabaseType(arg)
5901+
if err != nil {
5902+
return err
5903+
}
5904+
5905+
q.mutex.Lock()
5906+
defer q.mutex.Unlock()
5907+
5908+
for idx, build := range q.workspaceBuilds {
5909+
if build.ID != arg.ID {
5910+
continue
5911+
}
5912+
build.ProvisionerState = arg.ProvisionerState
5913+
build.UpdatedAt = arg.UpdatedAt
5914+
q.workspaceBuilds[idx] = build
5915+
return nil
5916+
}
5917+
58825918
return sql.ErrNoRows
58835919
}
58845920

@@ -6112,6 +6148,10 @@ func (*FakeQuerier) UpsertTailnetClient(context.Context, database.UpsertTailnetC
61126148
return database.TailnetClient{}, ErrUnimplemented
61136149
}
61146150

6151+
func (*FakeQuerier) UpsertTailnetClientSubscription(context.Context, database.UpsertTailnetClientSubscriptionParams) error {
6152+
return ErrUnimplemented
6153+
}
6154+
61156155
func (*FakeQuerier) UpsertTailnetCoordinator(context.Context, uuid.UUID) (database.TailnetCoordinator, error) {
61166156
return database.TailnetCoordinator{}, ErrUnimplemented
61176157
}

coderd/database/dbmetrics/dbmetrics.go

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

0 commit comments

Comments
 (0)