8000 add system user with special uuid · coder/coder@f79a138 · GitHub
[go: up one dir, main page]

Skip to content

Commit f79a138

Browse files
committed
add system user with special uuid
1 parent 93b1425 commit f79a138

File tree

12 files changed

+127
-36
lines changed

12 files changed

+127
-36
lines changed

coderd/autobuild/executor/lifecycle_executor.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,11 +209,17 @@ func build(ctx context.Context, store database.Store, workspace database.Workspa
209209
}
210210
provisionerJobID := uuid.New()
211211
now := database.Now()
212+
213+
systemUser, err := store.GetUserByID(ctx, database.SystemUserID)
214+
if err != nil {
215+
return xerrors.Errorf("get system user: %w", err)
216+
}
217+
212218
newProvisionerJob, err := store.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{
213219
ID: provisionerJobID,
214220
CreatedAt: now,
215221
UpdatedAt: now,
216-
InitiatorID: workspace.OwnerID,
222+
InitiatorID: systemUser.ID,
217223
OrganizationID: template.OrganizationID,
218224
Provisioner: template.Provisioner,
219225
Type: database.ProvisionerJobTypeWorkspaceBuild,
@@ -233,7 +239,7 @@ func build(ctx context.Context, store database.Store, workspace database.Workspa
233239
BuildNumber: priorBuildNumber + 1,
234240
Name: namesgenerator.GetRandomName(1),
235241
ProvisionerState: priorHistory.ProvisionerState,
236-
InitiatorID: workspace.OwnerID,
242+
InitiatorID: systemUser.ID,
237243
Transition: trans,
238244
JobID: newProvisionerJob.ID,
239245
})

coderd/autobuild/executor/lifecycle_executor_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package executor_test
22

33
import (
44
"context"
5-
"os"
65
"testing"
76
"time"
87

@@ -483,7 +482,7 @@ func TestExecutorWorkspaceAutostopNoWaitChangedMyMind(t *testing.T) {
483482
}
484483

485484
func TestExecutorAutostartMultipleOK(t *testing.T) {
486-
if os.Getenv("DB") == "" {
485+
if !coderdtest.UseSQL() {
487486
t.Skip(`This test only really works when using a "real" database, similar to a HA setup`)
488487
}
489488

coderd/coderdtest/coderdtest.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ func New(t *testing.T, options *Options) *codersdk.Client {
7979
return client
8080
}
8181

82+
func UseSQL() bool {
83+
return os.Getenv("DB") != ""
84+
}
85+
8286
// NewWithAPI constructs a codersdk client connected to the returned in-memory API instance.
8387
func NewWithAPI(t *testing.T, options *Options) (*codersdk.Client, *coderd.API) {
8488
if options == nil {
@@ -105,7 +109,7 @@ func NewWithAPI(t *testing.T, options *Options) (*codersdk.Client, *coderd.API)
105109
// This can be hotswapped for a live database instance.
106110
db := databasefake.New()
107111
pubsub := database.NewPubsubInMemory()
108-
if os.Getenv("DB") != "" {
112+
if UseSQL() {
109113
connectionURL, closePg, err := postgres.Open()
110114
require.NoError(t, err)
111115
t.Cleanup(closePg)

coderd/database/databasefake/databasefake.go

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,20 @@ import (
1616

1717
// New returns an in-memory fake of the database.
1818
func New() database.Store {
19+
systemUser := database.User{
20+
ID: database.SystemUserID,
21+
Email: "system@coder.com",
22+
Username: "system",
23+
HashedPassword: make([]byte, 0),
24+
CreatedAt: database.Now(),
25+
UpdatedAt: database.Now(),
26+
RBACRoles: make([]string, 0),
27+
}
1928
return &fakeQuerier{
2029
apiKeys: make([]database.APIKey, 0),
2130
organizationMembers: make([]database.OrganizationMember, 0),
2231
organizations: make([]database.Organization, 0),
23-
users: make([]database.User, 0),
32+
users: []database.User{systemUser},
2433

2534
auditLogs: make([]database.AuditLog, 0),
2635
files: make([]database.File, 0),
@@ -179,11 +188,18 @@ func (q *fakeQuerier) GetUserByID(_ context.Context, id uuid.UUID) (database.Use
179188
return database.User{}, sql.ErrNoRows
180189
}
181190

182-
func (q *fakeQuerier) GetUserCount(_ context.Context) (int64, error) {
191+
func (q *fakeQuerier) GetActualUserCount(_ context.Context) (int64, error) {
183192
q.mutex.RLock()
184193
defer q.mutex.RUnlock()
185194

186-
return int64(len(q.users)), nil
195+
var count int64
196+
for _, user := range q.users {
197+
if user.ID != database.SystemUserID {
198+
count++
199+
}
200+
}
201+
202+
return count, nil
187203
}
188204

189205
func (q *fakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams) ([]database.User, error) {
@@ -233,6 +249,16 @@ func (q *fakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams
233249
users = tmp
234250
}
235251

252+
if !params.IncludeSystemUser {
253+
tmp := make([]database.User, 0, len(users))
254+
for i, user := range users {
255+
if user.ID != database.SystemUserID {
256+
tmp = append(tmp, users[i])
257+
}
258+
}
259+
users = tmp
260+
}
261+
236262
if len(params.Status) == 0 {
237263
params.Status = []database.UserStatus{database.UserStatusActive}
238264
}

coderd/database/db.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@ import (
1313
"database/sql"
1414
"errors"
1515

16+
"github.com/google/uuid"
1617
"golang.org/x/xerrors"
1718
)
1819

20+
var SystemUserID uuid.UUID = uuid.MustParse("11111111-1111-1111-1111-111111111111")
21+
1922
// Store contains all queryable database functions.
2023
// It extends the generated interface to add transaction support.
2124
type Store interface {
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
2+
3+
DELETE FROM
4+
users
5+
WHERE
6+
id = '11111111-1111-1111-1111-111111111111';
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
INSERT INTO
2+
users (
3+
id,
4+
email,
5+
username,
6+
hashed_password,
7+
created_at,
8+
updated_at,
9+
rbac_roles
10+
)
11+
VALUES
12+
('11111111-1111-1111-1111-111111111111', 'system@coder.com', 'system', '{}', NOW(), NOW(), '{}');

coderd/database/querier.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

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

coderd/database/queries/users.sql

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ WHERE
2222
LIMIT
2323
1;
2424

25-
-- name: GetUserCount :one
25+
-- name: GetActualUserCount :one
2626
SELECT
2727
COUNT(*)
2828
FROM
29-
users;
29+
users
30+
WHERE
31+
id != '11111111-1111-1111-1111-111111111111';
3032

3133
-- name: InsertUser :one
3234
INSERT INTO
@@ -104,6 +106,13 @@ WHERE
104106
)
105107
ELSE true
106108
END
109+
-- Filter out system user
110+
AND CASE
111+
WHEN @include_system_user :: boolean THEN true
112+
ELSE (
113+
id != '11111111-1111-1111-1111-111111111111'
114+
)
115+
END
107116
-- Filter by status
108117
AND CASE
109118
-- @status needs to be a text because it can be empty, If it was

0 commit comments

Comments
 (0)
0