Skip to content

Commit 184c1f0

Browse files
authored
chore: add db queries for dynamic parameters (#17137)
1 parent fd24116 commit 184c1f0

File tree

10 files changed

+215
-0
lines changed

10 files changed

+215
-0
lines changed

coderd/database/dbauthz/dbauthz.go

+28
Original file line numberDiff line numberDiff line change
@@ -1741,6 +1741,22 @@ func (q *querier) GetFileByID(ctx context.Context, id uuid.UUID) (database.File,
17411741
return file, nil
17421742
}
17431743

1744+
func (q *querier) GetFileIDByTemplateVersionID(ctx context.Context, templateVersionID uuid.UUID) (uuid.UUID, error) {
1745+
fileID, err := q.db.GetFileIDByTemplateVersionID(ctx, templateVersionID)
1746+
if err != nil {
1747+
return uuid.Nil, err
1748+
}
1749+
// This is a kind of weird check, because users will almost never have this
1750+
// permission. Since this query is not currently used to provide data in a
1751+
// user facing way, it's expected that this query is run as some system
1752+
// subject in order to be authorized.
1753+
err = q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceFile.WithID(fileID))
1754+
if err != nil {
1755+
return uuid.Nil, err
1756+
}
1757+
return fileID, nil
1758+
}
1759+
17441760
func (q *querier) GetFileTemplates(ctx context.Context, fileID uuid.UUID) ([]database.GetFileTemplatesRow, error) {
17451761
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil {
17461762
return nil, err
@@ -2453,6 +2469,18 @@ func (q *querier) GetTemplateVersionParameters(ctx context.Context, templateVers
24532469
return q.db.GetTemplateVersionParameters(ctx, templateVersionID)
24542470
}
24552471

2472+
func (q *querier) GetTemplateVersionTerraformValues(ctx context.Context, templateVersionID uuid.UUID) (database.TemplateVersionTerraformValue, error) {
2473+
// The template_version_terraform_values table should follow the same access
2474+
// control as the template_version table. Rather than reimplement the checks,
2475+
// we just defer to existing implementation. (plus we'd need to use this query
2476+
// to reimplement the proper checks anyway)
2477+
_, err := q.GetTemplateVersionByID(ctx, templateVersionID)
2478+
if err != nil {
2479+
return database.TemplateVersionTerraformValue{}, err
2480+
}
2481+
return q.db.GetTemplateVersionTerraformValues(ctx, templateVersionID)
2482+
}
2483+
24562484
func (q *querier) GetTemplateVersionVariables(ctx context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionVariable, error) {
24572485
tv, err := q.db.GetTemplateVersionByID(ctx, templateVersionID)
24582486
if err != nil {

coderd/database/dbauthz/dbauthz_test.go

+26
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,15 @@ func (s *MethodTestSuite) TestFile() {
342342
f := dbgen.File(s.T(), db, database.File{})
343343
check.Args(f.ID).Asserts(f, policy.ActionRead).Returns(f)
344344
}))
345+
s.Run("GetFileIDByTemplateVersionID", s.Subtest(func(db database.Store, check *expects) {
346+
o := dbgen.Organization(s.T(), db, database.Organization{})
347+
u := dbgen.User(s.T(), db, database.User{})
348+
_ = dbgen.OrganizationMember(s.T(), db, database.OrganizationMember{OrganizationID: o.ID, UserID: u.ID})
349+
f := dbgen.File(s.T(), db, database.File{CreatedBy: u.ID})
350+
j := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{StorageMethod: database.ProvisionerStorageMethodFile, FileID: f.ID})
351+
tv := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{OrganizationID: o.ID, JobID: j.ID, CreatedBy: u.ID})
352+
check.Args(tv.ID).Asserts(rbac.ResourceFile.WithID(f.ID), policy.ActionRead).Returns(f.ID)
353+
}))
345354
s.Run("InsertFile", s.Subtest(func(db database.Store, check *expects) {
346355
u := dbgen.User(s.T(), db, database.User{})
347356
check.Args(database.InsertFileParams{
@@ -1196,6 +1205,23 @@ func (s *MethodTestSuite) TestTemplate() {
11961205
})
11971206
check.Args(tv.ID).Asserts(t1, policy.ActionRead).Returns([]database.TemplateVersionParameter{})
11981207
}))
1208+
s.Run("GetTemplateVersionTerraformValues", s.Subtest(func(db database.Store, check *expects) {
1209+
o := dbgen.Organization(s.T(), db, database.Organization{})
1210+
u := dbgen.User(s.T(), db, database.User{})
1211+
_ = dbgen.OrganizationMember(s.T(), db, database.OrganizationMember{OrganizationID: o.ID, UserID: u.ID})
1212+
t := dbgen.Template(s.T(), db, database.Template{OrganizationID: o.ID, CreatedBy: u.ID})
1213+
job := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{OrganizationID: o.ID})
1214+
tv := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
1215+
OrganizationID: o.ID,
1216+
CreatedBy: u.ID,
1217+
JobID: job.ID,
1218+
TemplateID: uuid.NullUUID{UUID: t.ID, Valid: true},
1219+
})
1220+
dbgen.TemplateVersionTerraformValues(s.T(), db, database.InsertTemplateVersionTerraformValuesByJobIDParams{
1221+
JobID: job.ID,
1222+
})
1223+
check.Args(tv.ID).Asserts(t, policy.ActionRead)
1224+
}))
11991225
s.Run("GetTemplateVersionVariables", s.Subtest(func(db database.Store, check *expects) {
12001226
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
12011227
t1 := dbgen.Template(s.T(), db, database.Template{})

coderd/database/dbgen/dbgen.go

+13
Original file line numberDiff line numberDiff line change
@@ -971,6 +971,19 @@ func TemplateVersionParameter(t testing.TB, db database.Store, orig database.Tem
971971
return version
972972
}
973973

974+
func TemplateVersionTerraformValues(t testing.TB, db database.Store, orig database.InsertTemplateVersionTerraformValuesByJobIDParams) {
975+
t.Helper()
976+
977+
params := database.InsertTemplateVersionTerraformValuesByJobIDParams{
978+
JobID: takeFirst(orig.JobID, uuid.New()),
979+
CachedPlan: takeFirstSlice(orig.CachedPlan, []byte("{}")),
980+
UpdatedAt: takeFirst(orig.UpdatedAt, dbtime.Now()),
981+
}
982+
983+
err := db.InsertTemplateVersionTerraformValuesByJobID(genCtx, params)
984+
require.NoError(t, err, "insert template version parameter")
985+
}
986+
974987
func WorkspaceAgentStat(t testing.TB, db database.Store, orig database.WorkspaceAgentStat) database.WorkspaceAgentStat {
975988
if orig.ConnectionsByProto == nil {
976989
orig.ConnectionsByProto = json.RawMessage([]byte("{}"))

coderd/database/dbmem/dbmem.go

+37
Original file line numberDiff line numberDiff line change
@@ -3327,6 +3327,30 @@ func (q *FakeQuerier) GetFileByID(_ context.Context, id uuid.UUID) (database.Fil
33273327
return database.File{}, sql.ErrNoRows
33283328
}
33293329

3330+
func (q *FakeQuerier) GetFileIDByTemplateVersionID(ctx context.Context, templateVersionID uuid.UUID) (uuid.UUID, error) {
3331+
q.mutex.RLock()
3332+
defer q.mutex.RUnlock()
3333+
3334+
for _, v := range q.templateVersions {
3335+
if v.ID == templateVersionID {
3336+
jobID := v.JobID
3337+
for _, j := range q.provisionerJobs {
3338+
if j.ID == jobID {
3339+
if j.StorageMethod == database.ProvisionerStorageMethodFile {
3340+
return j.FileID, nil
3341+
}
3342+
// We found the right job id but it wasn't a proper match.
3343+
break
3344+
}
3345+
}
3346+
// We found the right template version but it wasn't a proper match.
3347+
break
3348+
}
3349+
}
3350+
3351+
return uuid.Nil, sql.ErrNoRows
3352+
}
3353+
33303354
func (q *FakeQuerier) GetFileTemplates(_ context.Context, id uuid.UUID) ([]database.GetFileTemplatesRow, error) {
33313355
q.mutex.RLock()
33323356
defer q.mutex.RUnlock()
@@ -6020,6 +6044,19 @@ func (q *FakeQuerier) GetTemplateVersionParameters(_ context.Context, templateVe
60206044
return parameters, nil
60216045
}
60226046

6047+
func (q *FakeQuerier) GetTemplateVersionTerraformValues(ctx context.Context, templateVersionID uuid.UUID) (database.TemplateVersionTerraformValue, error) {
6048+
q.mutex.RLock()
6049+
defer q.mutex.RUnlock()
6050+
6051+
for _, tvtv := range q.templateVersionTerraformValues {
6052+
if tvtv.TemplateVersionID == templateVersionID {
6053+
return tvtv, nil
6054+
}
6055+
}
6056+
6057+
return database.TemplateVersionTerraformValue{}, sql.ErrNoRows
6058+
}
6059+
60236060
func (q *FakeQuerier) GetTemplateVersionVariables(_ context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionVariable, error) {
60246061
q.mutex.RLock()
60256062
defer q.mutex.RUnlock()

coderd/database/dbmetrics/querymetrics.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/querier.go

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

coderd/database/queries.sql.go

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

coderd/database/queries/files.sql

+17
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,23 @@ WHERE
88
LIMIT
99
1;
1010

11+
-- name: GetFileIDByTemplateVersionID :one
12+
SELECT
13+
files.id
14+
FROM
15+
files
16+
JOIN
17+
provisioner_jobs ON
18+
provisioner_jobs.storage_method = 'file'
19+
AND provisioner_jobs.file_id = files.id
20+
JOIN
21+
template_versions ON template_versions.job_id = provisioner_jobs.id
22+
WHERE
23+
template_versions.id = @template_version_id
24+
LIMIT
25+
1;
26+
27+
1128
-- name: GetFileByHashAndCreator :one
1229
SELECT
1330
*

coderd/database/queries/templateversionterraformvalues.sql

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
-- name: GetTemplateVersionTerraformValues :one
2+
SELECT
3+
template_version_terraform_values.*
4+
FROM
5+
template_version_terraform_values
6+
WHERE
7+
template_version_terraform_values.template_version_id = @template_version_id;
8+
19
-- name: InsertTemplateVersionTerraformValuesByJobID :exec
210
INSERT INTO
311
template_version_terraform_values (

0 commit comments

Comments
 (0)