Skip to content

Commit b8b80fe

Browse files
authored
feat: store coder_workspace_tags in the database (#13294)
1 parent 45b45f1 commit b8b80fe

30 files changed

+1051
-396
lines changed

coderd/database/dbauthz/dbauthz.go

+30
Original file line numberDiff line numberDiff line change
@@ -1786,6 +1786,29 @@ func (q *querier) GetTemplateVersionVariables(ctx context.Context, templateVersi
17861786
return q.db.GetTemplateVersionVariables(ctx, templateVersionID)
17871787
}
17881788

1789+
func (q *querier) GetTemplateVersionWorkspaceTags(ctx context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionWorkspaceTag, error) {
1790+
tv, err := q.db.GetTemplateVersionByID(ctx, templateVersionID)
1791+
if err != nil {
1792+
return nil, err
1793+
}
1794+
1795+
var object rbac.Objecter
1796+
template, err := q.db.GetTemplateByID(ctx, tv.TemplateID.UUID)
1797+
if err != nil {
1798+
if !errors.Is(err, sql.ErrNoRows) {
1799+
return nil, err
1800+
}
1801+
object = rbac.ResourceTemplate.InOrg(tv.OrganizationID)
1802+
} else {
1803+
object = tv.RBACObject(template)
1804+
}
1805+
1806+
if err := q.authorizeContext(ctx, policy.ActionRead, object); err != nil {
1807+
return nil, err
1808+
}
1809+
return q.db.GetTemplateVersionWorkspaceTags(ctx, templateVersionID)
1810+
}
1811+
17891812
// GetTemplateVersionsByIDs is only used for workspace build data.
17901813
// The workspace is already fetched.
17911814
func (q *querier) GetTemplateVersionsByIDs(ctx context.Context, ids []uuid.UUID) ([]database.TemplateVersion, error) {
@@ -2507,6 +2530,13 @@ func (q *querier) InsertTemplateVersionVariable(ctx context.Context, arg databas
25072530
return q.db.InsertTemplateVersionVariable(ctx, arg)
25082531
}
25092532

2533+
func (q *querier) InsertTemplateVersionWorkspaceTag(ctx context.Context, arg database.InsertTemplateVersionWorkspaceTagParams) (database.TemplateVersionWorkspaceTag, error) {
2534+
if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {
2535+
return database.TemplateVersionWorkspaceTag{}, err
2536+
}
2537+
return q.db.InsertTemplateVersionWorkspaceTag(ctx, arg)
2538+
}
2539+
25102540
func (q *querier) InsertUser(ctx context.Context, arg database.InsertUserParams) (database.User, error) {
25112541
// Always check if the assigned roles can actually be assigned by this actor.
25122542
impliedRoles := append([]string{rbac.RoleMember()}, arg.RBACRoles...)

coderd/database/dbauthz/dbauthz_test.go

+13
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,16 @@ func (s *MethodTestSuite) TestTemplate() {
778778
})
779779
check.Args(tv.ID).Asserts(t1, policy.ActionRead).Returns([]database.TemplateVersionVariable{tvv1})
780780
}))
781+
s.Run("GetTemplateVersionWorkspaceTags", s.Subtest(func(db database.Store, check *expects) {
782+
t1 := dbgen.Template(s.T(), db, database.Template{})
783+
tv := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
784+
TemplateID: uuid.NullUUID{UUID: t1.ID, Valid: true},
785+
})
786+
wt1 := dbgen.TemplateVersionWorkspaceTag(s.T(), db, database.TemplateVersionWorkspaceTag{
787+
TemplateVersionID: tv.ID,
788+
})
789+
check.Args(tv.ID).Asserts(t1, policy.ActionRead).Returns([]database.TemplateVersionWorkspaceTag{wt1})
790+
}))
781791
s.Run("GetTemplateGroupRoles", s.Subtest(func(db database.Store, check *expects) {
782792
t1 := dbgen.Template(s.T(), db, database.Template{})
783793
check.Args(t1.ID).Asserts(t1, policy.ActionUpdate)
@@ -2339,6 +2349,9 @@ func (s *MethodTestSuite) TestSystemFunctions() {
23392349
s.Run("InsertTemplateVersionVariable", s.Subtest(func(db database.Store, check *expects) {
23402350
check.Args(database.InsertTemplateVersionVariableParams{}).Asserts(rbac.ResourceSystem, policy.ActionCreate)
23412351
}))
2352+
s.Run("InsertTemplateVersionWorkspaceTag", s.Subtest(func(db database.Store, check *expects) {
2353+
check.Args(database.InsertTemplateVersionWorkspaceTagParams{}).Asserts(rbac.ResourceSystem, policy.ActionCreate)
2354+
}))
23422355
s.Run("UpdateInactiveUsersToDormant", s.Subtest(func(db database.Store, check *expects) {
23432356
check.Args(database.UpdateInactiveUsersToDormantParams{}).Asserts(rbac.ResourceSystem, policy.ActionCreate).Errors(sql.ErrNoRows)
23442357
}))

coderd/database/dbgen/dbgen.go

+10
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,16 @@ func TemplateVersionVariable(t testing.TB, db database.Store, orig database.Temp
678678
return version
679679
}
680680

681+
func TemplateVersionWorkspaceTag(t testing.TB, db database.Store, orig database.TemplateVersionWorkspaceTag) database.TemplateVersionWorkspaceTag {
682+
workspaceTag, err := db.InsertTemplateVersionWorkspaceTag(genCtx, database.InsertTemplateVersionWorkspaceTagParams{
683+
TemplateVersionID: takeFirst(orig.TemplateVersionID, uuid.New()),
684+
Key: takeFirst(orig.Key, namesgenerator.GetRandomName(1)),
685+
Value: takeFirst(orig.Value, namesgenerator.GetRandomName(1)),
686+
})
687+
require.NoError(t, err, "insert template version workspace tag")
688+
return workspaceTag
689+
}
690+
681691
func TemplateVersionParameter(t testing.TB, db database.Store, orig database.TemplateVersionParameter) database.TemplateVersionParameter {
682692
t.Helper()
683693

coderd/database/dbmem/dbmem.go

+38
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ type data struct {
163163
templateVersions []database.TemplateVersionTable
164164
templateVersionParameters []database.TemplateVersionParameter
165165
templateVersionVariables []database.TemplateVersionVariable
166+
templateVersionWorkspaceTags []database.TemplateVersionWorkspaceTag
166167
templates []database.TemplateTable
167168
templateUsageStats []database.TemplateUsageStat
168169
workspaceAgents []database.WorkspaceAgent
@@ -4177,6 +4178,24 @@ func (q *FakeQuerier) GetTemplateVersionVariables(_ context.Context, templateVer
41774178
return variables, nil
41784179
}
41794180

4181+
func (q *FakeQuerier) GetTemplateVersionWorkspaceTags(_ context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionWorkspaceTag, error) {
4182+
q.mutex.RLock()
4183+
defer q.mutex.RUnlock()
4184+
4185+
workspaceTags := make([]database.TemplateVersionWorkspaceTag, 0)
4186+
for _, workspaceTag := range q.templateVersionWorkspaceTags {
4187+
if workspaceTag.TemplateVersionID != templateVersionID {
4188+
continue
4189+
}
4190+
workspaceTags = append(workspaceTags, workspaceTag)
4191+
}
4192+
4193+
sort.Slice(workspaceTags, func(i, j int) bool {
4194+
return workspaceTags[i].Key < workspaceTags[j].Key
4195+
})
4196+
return workspaceTags, nil
4197+
}
4198+
41804199
func (q *FakeQuerier) GetTemplateVersionsByIDs(_ context.Context, ids []uuid.UUID) ([]database.TemplateVersion, error) {
41814200
q.mutex.RLock()
41824201
defer q.mutex.RUnlock()
@@ -6352,6 +6371,25 @@ func (q *FakeQuerier) InsertTemplateVersionVariable(_ context.Context, arg datab
63526371
return variable, nil
63536372
}
63546373

6374+
func (q *FakeQuerier) InsertTemplateVersionWorkspaceTag(_ context.Context, arg database.InsertTemplateVersionWorkspaceTagParams) (database.TemplateVersionWorkspaceTag, error) {
6375+
err := validateDatabaseType(arg)
6376+
if err != nil {
6377+
return database.TemplateVersionWorkspaceTag{}, err
6378+
}
6379+
6380+
q.mutex.Lock()
6381+
defer q.mutex.Unlock()
6382+
6383+
//nolint:gosimple
6384+
workspaceTag := database.TemplateVersionWorkspaceTag{
6385+
TemplateVersionID: arg.TemplateVersionID,
6386+
Key: arg.Key,
6387+
Value: arg.Value,
6388+
}
6389+
q.templateVersionWorkspaceTags = append(q.templateVersionWorkspaceTags, workspaceTag)
6390+
return workspaceTag, nil
6391+
}
6392+
63556393
func (q *FakeQuerier) InsertUser(_ context.Context, arg database.InsertUserParams) (database.User, error) {
63566394
if err := validateDatabaseType(arg); err != nil {
63576395
return database.User{}, err

coderd/database/dbmetrics/dbmetrics.go

+14
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbmock/dbmock.go

+30
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dump.sql

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)