Skip to content

Commit 4540a55

Browse files
committed
add tests for prebuilds in the provisionerdserver
1 parent e8b1502 commit 4540a55

15 files changed

+117
-48
lines changed

coderd/database/dbauthz/dbauthz.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -2131,14 +2131,14 @@ func (q *querier) GetPresetByWorkspaceBuildID(ctx context.Context, workspaceID u
21312131
return q.db.GetPresetByWorkspaceBuildID(ctx, workspaceID)
21322132
}
21332133

2134-
func (q *querier) GetPresetParametersByTemplateVersionID(ctx context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionPresetParameter, error) {
2134+
func (q *querier) GetPresetParametersByTemplateVersionID(ctx context.Context, args database.GetPresetParametersByTemplateVersionIDParams) ([]database.TemplateVersionPresetParameter, error) {
21352135
// An actor can read template version presets if they can read the related template version.
2136-
_, err := q.GetTemplateVersionByID(ctx, templateVersionID)
2136+
_, err := q.GetTemplateVersionByID(ctx, args.TemplateVersionID)
21372137
if err != nil {
21382138
return nil, err
21392139
}
21402140

2141-
return q.db.GetPresetParametersByTemplateVersionID(ctx, templateVersionID)
2141+
return q.db.GetPresetParametersByTemplateVersionID(ctx, args)
21422142
}
21432143

21442144
func (q *querier) GetPresetsBackoff(ctx context.Context, lookback time.Time) ([]database.GetPresetsBackoffRow, error) {

coderd/database/dbauthz/dbauthz_test.go

+17-13
Original file line numberDiff line numberDiff line change
@@ -1748,7 +1748,7 @@ func (s *MethodTestSuite) TestUser() {
17481748
check.Args(database.DeleteCustomRoleParams{
17491749
Name: customRole.Name,
17501750
}).Asserts(
1751-
// fails immediately, missing organization id
1751+
// fails immediately, missing organization id
17521752
).Errors(dbauthz.NotAuthorizedError{Err: xerrors.New("custom roles must belong to an organization")})
17531753
}))
17541754
s.Run("Blank/UpdateCustomRole", s.Subtest(func(db database.Store, check *expects) {
@@ -1779,7 +1779,7 @@ func (s *MethodTestSuite) TestUser() {
17791779
codersdk.ResourceWorkspace: {codersdk.ActionRead},
17801780
}), convertSDKPerm),
17811781
}).Asserts(
1782-
// fails immediately, missing organization id
1782+
// fails immediately, missing organization id
17831783
).Errors(dbauthz.NotAuthorizedError{Err: xerrors.New("custom roles must belong to an organization")})
17841784
}))
17851785
s.Run("OrgPermissions/UpdateCustomRole", s.Subtest(func(db database.Store, check *expects) {
@@ -1832,7 +1832,7 @@ func (s *MethodTestSuite) TestUser() {
18321832
codersdk.ResourceWorkspace: {codersdk.ActionRead},
18331833
}), convertSDKPerm),
18341834
}).Asserts(
1835-
// fails immediately, missing organization id
1835+
// fails immediately, missing organization id
18361836
).Errors(dbauthz.NotAuthorizedError{Err: xerrors.New("custom roles must belong to an organization")})
18371837
}))
18381838
s.Run("OrgPermissions/InsertCustomRole", s.Subtest(func(db database.Store, check *expects) {
@@ -3843,7 +3843,7 @@ func (s *MethodTestSuite) TestSystemFunctions() {
38433843
s.Run("GetProvisionerJobsCreatedAfter", s.Subtest(func(db database.Store, check *expects) {
38443844
// TODO: add provisioner job resource type
38453845
_ = dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{CreatedAt: time.Now().Add(-time.Hour)})
3846-
check.Args(time.Now()).Asserts( /*rbac.ResourceSystem, policy.ActionRead*/)
3846+
check.Args(time.Now()).Asserts( /*rbac.ResourceSystem, policy.ActionRead*/ )
38473847
}))
38483848
s.Run("GetTemplateVersionsByIDs", s.Subtest(func(db database.Store, check *expects) {
38493849
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
@@ -3934,10 +3934,14 @@ func (s *MethodTestSuite) TestSystemFunctions() {
39343934
Values: []string{"test"},
39353935
})
39363936
require.NoError(s.T(), err)
3937-
presetParameters, err := db.GetPresetParametersByTemplateVersionID(ctx, templateVersion.ID)
3937+
presetParameters, err := db.GetPresetParametersByTemplateVersionID(ctx, database.GetPresetParametersByTemplateVersionIDParams{
3938+
TemplateVersionID: templateVersion.ID,
3939+
})
39383940
require.NoError(s.T(), err)
39393941

3940-
check.Args(templateVersion.ID).Asserts(template.RBACObject(), policy.ActionRead).Returns(presetParameters)
3942+
check.Args(database.GetPresetParametersByTemplateVersionIDParams{
3943+
TemplateVersionID: templateVersion.ID,
3944+
}).Asserts(template.RBACObject(), policy.ActionRead).Returns(presetParameters)
39413945
}))
39423946
s.Run("GetPresetsByTemplateVersionID", s.Subtest(func(db database.Store, check *expects) {
39433947
ctx := context.Background()
@@ -4020,7 +4024,7 @@ func (s *MethodTestSuite) TestSystemFunctions() {
40204024
a := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{})
40214025
b := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{})
40224026
check.Args([]uuid.UUID{a.ID, b.ID}).
4023-
Asserts( /*rbac.ResourceSystem, policy.ActionRead*/).
4027+
Asserts( /*rbac.ResourceSystem, policy.ActionRead*/ ).
40244028
Returns(slice.New(a, b))
40254029
}))
40264030
s.Run("InsertWorkspaceAgent", s.Subtest(func(db database.Store, check *expects) {
@@ -4065,22 +4069,22 @@ func (s *MethodTestSuite) TestSystemFunctions() {
40654069
OrganizationID: j.OrganizationID,
40664070
Types: []database.ProvisionerType{j.Provisioner},
40674071
ProvisionerTags: must(json.Marshal(j.Tags)),
4068-
}).Asserts( /*rbac.ResourceSystem, policy.ActionUpdate*/)
4072+
}).Asserts( /*rbac.ResourceSystem, policy.ActionUpdate*/ )
40694073
}))
40704074
s.Run("UpdateProvisionerJobWithCompleteByID", s.Subtest(func(db database.Store, check *expects) {
40714075
// TODO: we need to create a ProvisionerJob resource
40724076
j := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{})
40734077
check.Args(database.UpdateProvisionerJobWithCompleteByIDParams{
40744078
ID: j.ID,
4075-
}).Asserts( /*rbac.ResourceSystem, policy.ActionUpdate*/)
4079+
}).Asserts( /*rbac.ResourceSystem, policy.ActionUpdate*/ )
40764080
}))
40774081
s.Run("UpdateProvisionerJobByID", s.Subtest(func(db database.Store, check *expects) {
40784082
// TODO: we need to create a ProvisionerJob resource
40794083
j := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{})
40804084
check.Args(database.UpdateProvisionerJobByIDParams{
40814085
ID: j.ID,
40824086
UpdatedAt: time.Now(),
4083-
}).Asserts( /*rbac.ResourceSystem, policy.ActionUpdate*/)
4087+
}).Asserts( /*rbac.ResourceSystem, policy.ActionUpdate*/ )
40844088
}))
40854089
s.Run("InsertProvisionerJob", s.Subtest(func(db database.Store, check *expects) {
40864090
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
@@ -4091,21 +4095,21 @@ func (s *MethodTestSuite) TestSystemFunctions() {
40914095
StorageMethod: database.ProvisionerStorageMethodFile,
40924096
Type: database.ProvisionerJobTypeWorkspaceBuild,
40934097
Input: json.RawMessage("{}"),
4094-
}).Asserts( /*rbac.ResourceSystem, policy.ActionCreate*/)
4098+
}).Asserts( /*rbac.ResourceSystem, policy.ActionCreate*/ )
40954099
}))
40964100
s.Run("InsertProvisionerJobLogs", s.Subtest(func(db database.Store, check *expects) {
40974101
// TODO: we need to create a ProvisionerJob resource
40984102
j := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{})
40994103
check.Args(database.InsertProvisionerJobLogsParams{
41004104
JobID: j.ID,
4101-
}).Asserts( /*rbac.ResourceSystem, policy.ActionCreate*/)
4105+
}).Asserts( /*rbac.ResourceSystem, policy.ActionCreate*/ )
41024106
}))
41034107
s.Run("InsertProvisionerJobTimings", s.Subtest(func(db database.Store, check *expects) {
41044108
// TODO: we need to create a ProvisionerJob resource
41054109
j := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{})
41064110
check.Args(database.InsertProvisionerJobTimingsParams{
41074111
JobID: j.ID,
4108-
}).Asserts( /*rbac.ResourceSystem, policy.ActionCreate*/)
4112+
}).Asserts( /*rbac.ResourceSystem, policy.ActionCreate*/ )
41094113
}))
41104114
s.Run("UpsertProvisionerDaemon", s.Subtest(func(db database.Store, check *expects) {
41114115
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)

coderd/database/dbmem/dbmem.go

+7-2
Original file line numberDiff line numberDiff line change
@@ -4188,14 +4188,14 @@ func (q *FakeQuerier) GetPresetByWorkspaceBuildID(_ context.Context, workspaceBu
41884188
return database.TemplateVersionPreset{}, sql.ErrNoRows
41894189
}
41904190

4191-
func (q *FakeQuerier) GetPresetParametersByTemplateVersionID(_ context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionPresetParameter, error) {
4191+
func (q *FakeQuerier) GetPresetParametersByTemplateVersionID(_ context.Context, args database.GetPresetParametersByTemplateVersionIDParams) ([]database.TemplateVersionPresetParameter, error) {
41924192
q.mutex.RLock()
41934193
defer q.mutex.RUnlock()
41944194

41954195
presets := make([]database.TemplateVersionPreset, 0)
41964196
parameters := make([]database.TemplateVersionPresetParameter, 0)
41974197
for _, preset := range q.presets {
4198-
if preset.TemplateVersionID != templateVersionID {
4198+
if preset.TemplateVersionID != args.TemplateVersionID {
41994199
continue
42004200
}
42014201
presets = append(presets, preset)
@@ -8739,6 +8739,11 @@ func (q *FakeQuerier) InsertPreset(_ context.Context, arg database.InsertPresetP
87398739
TemplateVersionID: arg.TemplateVersionID,
87408740
Name: arg.Name,
87418741
CreatedAt: arg.CreatedAt,
8742+
DesiredInstances: arg.DesiredInstances,
8743+
InvalidateAfterSecs: sql.NullInt32{
8744+
Int32: 0,
8745+
Valid: true,
8746+
},
87428747
}
87438748
q.presets = append(q.presets, preset)
87448749
return preset, nil

coderd/database/dbmetrics/querymetrics.go

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

coderd/database/dbmock/dbmock.go

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

coderd/database/querier.go

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

coderd/database/queries.sql.go

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

coderd/database/queries/presets.sql

+2-1
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,5 @@ FROM
4747
template_version_preset_parameters
4848
INNER JOIN template_version_presets ON template_version_preset_parameters.template_version_preset_id = template_version_presets.id
4949
WHERE
50-
template_version_presets.template_version_id = @template_version_id;
50+
template_version_presets.template_version_id = @template_version_id
51+
AND (sqlc.narg('preset_id')::uuid IS NULL OR template_version_presets.id = sqlc.narg('preset_id'));

coderd/presets.go

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package coderd
33
import (
44
"net/http"
55

6+
"github.com/coder/coder/v2/coderd/database"
67
"github.com/coder/coder/v2/coderd/httpapi"
78
"github.com/coder/coder/v2/coderd/httpmw"
89
"github.com/coder/coder/v2/codersdk"
@@ -29,7 +30,9 @@ func (api *API) templateVersionPresets(rw http.ResponseWriter, r *http.Request)
2930
return
3031
}
3132

32-
presetParams, err := api.Database.GetPresetParametersByTemplateVersionID(ctx, templateVersion.ID)
33+
presetParams, err := api.Database.GetPresetParametersByTemplateVersionID(ctx, database.GetPresetParametersByTemplateVersionIDParams{
34+
TemplateVersionID: templateVersion.ID,
35+
})
3336
if err != nil {
3437
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
3538
Message: "Internal error fetching template version presets.",

coderd/provisionerdserver/provisionerdserver_test.go

+70-20
Original file line numberDiff line numberDiff line change
@@ -1733,6 +1733,34 @@ func TestInsertWorkspacePresetsAndParameters(t *testing.T) {
17331733
},
17341734
},
17351735
},
1736+
{
1737+
name: "one preset, no parameters, requesting prebuilds",
1738+
givenPresets: []*sdkproto.Preset{
1739+
{
1740+
Name: "preset1",
1741+
Prebuild: &sdkproto.Prebuild{
1742+
Instances: 1,
1743+
},
1744+
},
1745+
},
1746+
},
1747+
{
1748+
name: "one preset with multiple parameters, requesting 0 prebuilds",
1749+
givenPresets: []*sdkproto.Preset{
1750+
{
1751+
Name: "preset1",
1752+
Parameters: []*sdkproto.PresetParameter{
1753+
{
1754+
Name: "param1",
1755+
Value: "value1",
1756+
},
1757+
},
1758+
Prebuild: &sdkproto.Prebuild{
1759+
Instances: 0,
1760+
},
1761+
},
1762+
},
1763+
},
17361764
{
17371765
name: "one preset with multiple parameters",
17381766
givenPresets: []*sdkproto.Preset{
@@ -1751,6 +1779,27 @@ func TestInsertWorkspacePresetsAndParameters(t *testing.T) {
17511779
},
17521780
},
17531781
},
1782+
{
1783+
name: "one preset, multiple parameters, requesting prebuilds",
1784+
givenPresets: []*sdkproto.Preset{
1785+
{
1786+
Name: "preset1",
1787+
Parameters: []*sdkproto.PresetParameter{
1788+
{
1789+
Name: "param1",
1790+
Value: "value1",
1791+
},
1792+
{
1793+
Name: "param2",
1794+
Value: "value2",
1795+
},
1796+
},
1797+
Prebuild: &sdkproto.Prebuild{
1798+
Instances: 1,
1799+
},
1800+
},
1801+
},
1802+
},
17541803
{
17551804
name: "multiple presets with parameters",
17561805
givenPresets: []*sdkproto.Preset{
@@ -1766,6 +1815,9 @@ func TestInsertWorkspacePresetsAndParameters(t *testing.T) {
17661815
Value: "value2",
17671816
},
17681817
},
1818+
Prebuild: &sdkproto.Prebuild{
1819+
Instances: 1,
1820+
},
17691821
},
17701822
{
17711823
Name: "preset2",
@@ -1820,42 +1872,40 @@ func TestInsertWorkspacePresetsAndParameters(t *testing.T) {
18201872
require.Len(t, gotPresets, len(c.givenPresets))
18211873

18221874
for _, givenPreset := range c.givenPresets {
1823-
foundMatch := false
1875+
var foundPreset *database.TemplateVersionPreset = nil
18241876
for _, gotPreset := range gotPresets {
18251877
if givenPreset.Name == gotPreset.Name {
1826-
foundMatch = true
1878+
foundPreset = &gotPreset
18271879
break
18281880
}
18291881
}
1830-
require.True(t, foundMatch, "preset %s not found in parameters", givenPreset.Name)
1831-
}
1882+
require.NotNil(t, foundPreset, "preset %s not found in parameters", givenPreset.Name)
18321883

1833-
gotPresetParameters, err := db.GetPresetParametersByTemplateVersionID(ctx, templateVersion.ID)
1834-
require.NoError(t, err)
1884+
gotPresetParameters, err := db.GetPresetParametersByTemplateVersionID(ctx, database.GetPresetParametersByTemplateVersionIDParams{
1885+
TemplateVersionID: templateVersion.ID,
1886+
PresetID: uuid.NullUUID{UUID: foundPreset.ID, Valid: true},
1887+
})
1888+
require.NoError(t, err)
1889+
require.Len(t, gotPresetParameters, len(givenPreset.Parameters))
18351890

1836-
for _, givenPreset := range c.givenPresets {
18371891
for _, givenParameter := range givenPreset.Parameters {
18381892
foundMatch := false
18391893
for _, gotParameter := range gotPresetParameters {
18401894
nameMatches := givenParameter.Name == gotParameter.Name
18411895
valueMatches := givenParameter.Value == gotParameter.Value
1842-
1843-
// ensure that preset parameters are matched to the correct preset:
1844-
var gotPreset database.TemplateVersionPreset
1845-
for _, preset := range gotPresets {
1846-
if preset.ID == gotParameter.TemplateVersionPresetID {
1847-
gotPreset = preset
1848-
break
1849-
}
1850-
}
1851-
presetMatches := gotPreset.Name == givenPreset.Name
1852-
1853-
if nameMatches && valueMatches && presetMatches {
1896+
if nameMatches && valueMatches {
18541897
foundMatch = true
18551898
break
18561899
}
18571900
}
1858-
require.True(t, foundMatch, "preset parameter %s not found in presets", givenParameter.Name)
1901+
require.True(t, foundMatch, "preset parameter %s not found in parameters", givenParameter.Name)
1902+
}
1903+
if givenPreset.Prebuild == nil {
1904+
require.False(t, foundPreset.DesiredInstances.Valid)
1905+
}
1906+
if givenPreset.Prebuild != nil {
1907+
require.True(t, foundPreset.DesiredInstances.Valid)
1908+
require.Equal(t, givenPreset.Prebuild.Instances, foundPreset.DesiredInstances.Int32)
18591909
}
18601910
}
18611911
})

0 commit comments

Comments
 (0)