Skip to content

Commit d17b7ab

Browse files
committed
Merge branch 'main' of github.com:coder/coder into cj/howto-add-rbac-frobulation
2 parents cd2bbae + d1db11a commit d17b7ab

File tree

92 files changed

+4626
-1633
lines changed

Some content is hidden

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

92 files changed

+4626
-1633
lines changed

agent/proto/agent.pb.go

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

agent/proto/agent.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ message WorkspaceApp {
4141
UNHEALTHY = 4;
4242
}
4343
Health health = 12;
44+
bool hidden = 13;
4445
}
4546

4647
message WorkspaceAgentScript {

cli/server.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import (
5656
"cdr.dev/slog"
5757
"cdr.dev/slog/sloggers/sloghuman"
5858
"github.com/coder/coder/v2/coderd/entitlements"
59+
"github.com/coder/coder/v2/coderd/runtimeconfig"
5960
"github.com/coder/pretty"
6061
"github.com/coder/quartz"
6162
"github.com/coder/retry"
@@ -820,6 +821,8 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
820821
return err
821822
}
822823

824+
options.RuntimeConfig = runtimeconfig.NewManager()
825+
823826
// This should be output before the logs start streaming.
824827
cliui.Infof(inv.Stdout, "\n==> Logs will stream in below (press ctrl+c to gracefully exit):")
825828

coderd/agentapi/manifest.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,5 +229,6 @@ func dbAppToProto(dbApp database.WorkspaceApp, agent database.WorkspaceAgent, ow
229229
Threshold: dbApp.HealthcheckThreshold,
230230
},
231231
Health: agentproto.WorkspaceApp_Health(healthRaw),
232+
Hidden: dbApp.Hidden,
232233
}, nil
233234
}

coderd/agentapi/manifest_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ func TestGetManifest(t *testing.T) {
8787
Subdomain: false,
8888
SharingLevel: database.AppSharingLevelPublic,
8989
Health: database.WorkspaceAppHealthDisabled,
90+
Hidden: false,
9091
},
9192
{
9293
ID: uuid.New(),
@@ -102,6 +103,7 @@ func TestGetManifest(t *testing.T) {
102103
HealthcheckUrl: "http://localhost:4321/health",
103104
HealthcheckInterval: 20,
104105
HealthcheckThreshold: 5,
106+
Hidden: true,
105107
},
106108
}
107109
scripts = []database.WorkspaceAgentScript{
@@ -182,6 +184,7 @@ func TestGetManifest(t *testing.T) {
182184
Threshold: apps[0].HealthcheckThreshold,
183185
},
184186
Health: agentproto.WorkspaceApp_HEALTHY,
187+
Hidden: false,
185188
},
186189
{
187190
Id: apps[1].ID[:],
@@ -200,6 +203,7 @@ func TestGetManifest(t *testing.T) {
200203
Threshold: 0,
201204
},
202205
Health: agentproto.WorkspaceApp_DISABLED,
206+
Hidden: false,
203207
},
204208
{
205209
Id: apps[2].ID[:],
@@ -218,6 +222,7 @@ func TestGetManifest(t *testing.T) {
218222
Threshold: apps[2].HealthcheckThreshold,
219223
},
220224
Health: agentproto.WorkspaceApp_UNHEALTHY,
225+
Hidden: true,
221226
},
222227
}
223228
protoScripts = []*agentproto.WorkspaceAgentScript{

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/coderd.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import (
4242

4343
"github.com/coder/coder/v2/coderd/entitlements"
4444
"github.com/coder/coder/v2/coderd/idpsync"
45+
"github.com/coder/coder/v2/coderd/runtimeconfig"
4546

4647
agentproto "github.com/coder/coder/v2/agent/proto"
4748
"github.com/coder/coder/v2/buildinfo"
@@ -136,6 +137,7 @@ type Options struct {
136137
Logger slog.Logger
137138
Database database.Store
138139
Pubsub pubsub.Pubsub
140+
RuntimeConfig *runtimeconfig.Manager
139141

140142
// CacheDir is used for caching files served by the API.
141143
CacheDir string

coderd/coderdtest/coderdtest.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ import (
6767
"github.com/coder/coder/v2/coderd/notifications"
6868
"github.com/coder/coder/v2/coderd/rbac"
6969
"github.com/coder/coder/v2/coderd/rbac/policy"
70+
"github.com/coder/coder/v2/coderd/runtimeconfig"
7071
"github.com/coder/coder/v2/coderd/schedule"
7172
"github.com/coder/coder/v2/coderd/telemetry"
7273
"github.com/coder/coder/v2/coderd/unhanger"
@@ -254,6 +255,7 @@ func NewOptions(t testing.TB, options *Options) (func(http.Handler), context.Can
254255
var acs dbauthz.AccessControlStore = dbauthz.AGPLTemplateAccessControlStore{}
255256
accessControlStore.Store(&acs)
256257

258+
runtimeManager := runtimeconfig.NewManager()
257259
options.Database = dbauthz.New(options.Database, options.Authorizer, *options.Logger, accessControlStore)
258260

259261
// Some routes expect a deployment ID, so just make sure one exists.
@@ -482,6 +484,7 @@ func NewOptions(t testing.TB, options *Options) (func(http.Handler), context.Can
482484
AppHostnameRegex: appHostnameRegex,
483485
Logger: *options.Logger,
484486
CacheDir: t.TempDir(),
487+
RuntimeConfig: runtimeManager,
485488
Database: options.Database,
486489
Pubsub: options.Pubsub,
487490
ExternalAuthConfigs: options.ExternalAuthConfigs,

coderd/database/db2sdk/db2sdk.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ func Apps(dbApps []database.WorkspaceApp, agent database.WorkspaceAgent, ownerNa
517517
Threshold: dbApp.HealthcheckThreshold,
518518
},
519519
Health: codersdk.WorkspaceAppHealth(dbApp.Health),
520+
Hidden: dbApp.Hidden,
520521
})
521522
}
522523
return apps

coderd/database/dbauthz/dbauthz.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,6 +1190,13 @@ func (q *querier) DeleteReplicasUpdatedBefore(ctx context.Context, updatedAt tim
11901190
return q.db.DeleteReplicasUpdatedBefore(ctx, updatedAt)
11911191
}
11921192

1193+
func (q *querier) DeleteRuntimeConfig(ctx context.Context, key string) error {
1194+
if err := q.authorizeContext(ctx, policy.ActionDelete, rbac.ResourceSystem); err != nil {
1195+
return err
1196+
}
1197+
return q.db.DeleteRuntimeConfig(ctx, key)
1198+
}
1199+
11931200
func (q *querier) DeleteTailnetAgent(ctx context.Context, arg database.DeleteTailnetAgentParams) (database.DeleteTailnetAgentRow, error) {
11941201
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil {
11951202
return database.DeleteTailnetAgentRow{}, err
@@ -1870,6 +1877,13 @@ func (q *querier) GetReplicasUpdatedAfter(ctx context.Context, updatedAt time.Ti
18701877
return q.db.GetReplicasUpdatedAfter(ctx, updatedAt)
18711878
}
18721879

1880+
func (q *querier) GetRuntimeConfig(ctx context.Context, key string) (string, error) {
1881+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil {
1882+
return "", err
1883+
}
1884+
return q.db.GetRuntimeConfig(ctx, key)
1885+
}
1886+
18731887
func (q *querier) GetTailnetAgents(ctx context.Context, id uuid.UUID) ([]database.TailnetAgent, error) {
18741888
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceTailnetCoordinator); err != nil {
18751889
return nil, err
@@ -3928,6 +3942,13 @@ func (q *querier) UpsertProvisionerDaemon(ctx context.Context, arg database.Upse
39283942
return q.db.UpsertProvisionerDaemon(ctx, arg)
39293943
}
39303944

3945+
func (q *querier) UpsertRuntimeConfig(ctx context.Context, arg database.UpsertRuntimeConfigParams) error {
3946+
if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {
3947+
return err
3948+
}
3949+
return q.db.UpsertRuntimeConfig(ctx, arg)
3950+
}
3951+
39313952
func (q *querier) UpsertTailnetAgent(ctx context.Context, arg database.UpsertTailnetAgentParams) (database.TailnetAgent, error) {
39323953
if err := q.authorizeContext(ctx, policy.ActionUpdate, rbac.ResourceTailnetCoordinator); err != nil {
39333954
return database.TailnetAgent{}, err

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2696,6 +2696,22 @@ func (s *MethodTestSuite) TestSystemFunctions() {
26962696
AgentID: uuid.New(),
26972697
}).Asserts(tpl, policy.ActionCreate)
26982698
}))
2699+
s.Run("DeleteRuntimeConfig", s.Subtest(func(db database.Store, check *expects) {
2700+
check.Args("test").Asserts(rbac.ResourceSystem, policy.ActionDelete)
2701+
}))
2702+
s.Run("GetRuntimeConfig", s.Subtest(func(db database.Store, check *expects) {
2703+
_ = db.UpsertRuntimeConfig(context.Background(), database.UpsertRuntimeConfigParams{
2704+
Key: "test",
2705+
Value: "value",
2706+
})
2707+
check.Args("test").Asserts(rbac.ResourceSystem, policy.ActionRead)
2708+
}))
2709+
s.Run("UpsertRuntimeConfig", s.Subtest(func(db database.Store, check *expects) {
2710+
check.Args(database.UpsertRuntimeConfigParams{
2711+
Key: "test",
2712+
Value: "value",
2713+
}).Asserts(rbac.ResourceSystem, policy.ActionCreate)
2714+
}))
26992715
}
27002716

27012717
func (s *MethodTestSuite) TestNotifications() {

coderd/database/dbgen/dbgen.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,7 @@ func WorkspaceApp(t testing.TB, db database.Store, orig database.WorkspaceApp) d
547547
HealthcheckThreshold: takeFirst(orig.HealthcheckThreshold, 60),
548548
Health: takeFirst(orig.Health, database.WorkspaceAppHealthHealthy),
549549
DisplayOrder: takeFirst(orig.DisplayOrder, 1),
550+
Hidden: orig.Hidden,
550551
})
551552
require.NoError(t, err, "insert app")
552553
return resource

coderd/database/dbmem/dbmem.go

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ func New() database.Store {
8585
workspaceProxies: make([]database.WorkspaceProxy, 0),
8686
customRoles: make([]database.CustomRole, 0),
8787
locks: map[int64]struct{}{},
88+
runtimeConfig: map[string]string{},
8889
},
8990
}
9091
// Always start with a default org. Matching migration 198.
@@ -195,6 +196,7 @@ type data struct {
195196
workspaces []database.Workspace
196197
workspaceProxies []database.WorkspaceProxy
197198
customRoles []database.CustomRole
199+
runtimeConfig map[string]string
198200
frobulators []database.Frobulator
199201
// Locks is a map of lock names. Any keys within the map are currently
200202
// locked.
@@ -1944,6 +1946,14 @@ func (q *FakeQuerier) DeleteReplicasUpdatedBefore(_ context.Context, before time
19441946
return nil
19451947
}
19461948

1949+
func (q *FakeQuerier) DeleteRuntimeConfig(_ context.Context, key string) error {
1950+
q.mutex.Lock()
1951+
defer q.mutex.Unlock()
1952+
1953+
delete(q.runtimeConfig, key)
1954+
return nil
1955+
}
1956+
19471957
func (*FakeQuerier) DeleteTailnetAgent(context.Context, database.DeleteTailnetAgentParams) (database.DeleteTailnetAgentRow, error) {
19481958
return database.DeleteTailnetAgentRow{}, ErrUnimplemented
19491959
}
@@ -2690,14 +2700,14 @@ func (q *FakeQuerier) GetGroupMembersByGroupID(ctx context.Context, id uuid.UUID
26902700

26912701
var groupMembers []database.GroupMember
26922702
for _, member := range q.groupMembers {
2693-
groupMember, err := q.getGroupMemberNoLock(ctx, member.UserID, member.GroupID)
2694-
if errors.Is(err, errUserDeleted) {
2695-
continue
2696-
}
2697-
if err != nil {
2698-
return nil, err
2699-
}
27002703
if member.GroupID == id {
2704+
groupMember, err := q.getGroupMemberNoLock(ctx, member.UserID, member.GroupID)
2705+
if errors.Is(err, errUserDeleted) {
2706+
continue
2707+
}
2708+
if err != nil {
2709+
return nil, err
2710+
}
27012711
groupMembers = append(groupMembers, groupMember)
27022712
}
27032713
}
@@ -3542,6 +3552,18 @@ func (q *FakeQuerier) GetReplicasUpdatedAfter(_ context.Context, updatedAt time.
35423552
return replicas, nil
35433553
}
35443554

3555+
func (q *FakeQuerier) GetRuntimeConfig(_ context.Context, key string) (string, error) {
3556+
q.mutex.Lock()
3557+
defer q.mutex.Unlock()
3558+
3559+
val, ok := q.runtimeConfig[key]
3560+
if !ok {
3561+
return "", sql.ErrNoRows
3562+
}
3563+
3564+
return val, nil
3565+
}
3566+
35453567
func (*FakeQuerier) GetTailnetAgents(context.Context, uuid.UUID) ([]database.TailnetAgent, error) {
35463568
return nil, ErrUnimplemented
35473569
}
@@ -7349,6 +7371,7 @@ func (q *FakeQuerier) InsertWorkspaceApp(_ context.Context, arg database.InsertW
73497371
HealthcheckInterval: arg.HealthcheckInterval,
73507372
HealthcheckThreshold: arg.HealthcheckThreshold,
73517373
Health: arg.Health,
7374+
Hidden: arg.Hidden,
73527375
DisplayOrder: arg.DisplayOrder,
73537376
}
73547377
q.workspaceApps = append(q.workspaceApps, workspaceApp)
@@ -9244,6 +9267,19 @@ func (q *FakeQuerier) UpsertProvisionerDaemon(_ context.Context, arg database.Up
92449267
return d, nil
92459268
}
92469269

9270+
func (q *FakeQuerier) UpsertRuntimeConfig(_ context.Context, arg database.UpsertRuntimeConfigParams) error {
9271+
err := validateDatabaseType(arg)
9272+
if err != nil {
9273+
return err
9274+
}
9275+
9276+
q.mutex.Lock()
9277+
defer q.mutex.Unlock()
9278+
9279+
q.runtimeConfig[arg.Key] = arg.Value
9280+
return nil
9281+
}
9282+
92479283
func (*FakeQuerier) UpsertTailnetAgent(context.Context, database.UpsertTailnetAgentParams) (database.TailnetAgent, error) {
92489284
return database.TailnetAgent{}, ErrUnimplemented
92499285
}

coderd/database/dbmetrics/dbmetrics.go

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

0 commit comments

Comments
 (0)