Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0b2b643

Browse files
SasSwartdannykoppingevgeniy-scherbina
authored
feat: persist prebuild definitions on template import (#16951)
This PR allows provisioners to recognise and report prebuild definitions to the coder control plane. It also allows the coder control plane to then persist these to its store. closes coder/internal#507 --------- Signed-off-by: Danny Kopping <[email protected]> Co-authored-by: Danny Kopping <[email protected]> Co-authored-by: evgeniy-scherbina <[email protected]>
1 parent 074ec28 commit 0b2b643

File tree

25 files changed

+1205
-841
lines changed

25 files changed

+1205
-841
lines changed

coderd/database/dbauthz/dbauthz.go

+13-3
Original file line numberDiff line numberDiff line change
@@ -2187,14 +2187,24 @@ func (q *querier) GetPresetByWorkspaceBuildID(ctx context.Context, workspaceID u
21872187
return q.db.GetPresetByWorkspaceBuildID(ctx, workspaceID)
21882188
}
21892189

2190-
func (q *querier) GetPresetParametersByTemplateVersionID(ctx context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionPresetParameter, error) {
2190+
func (q *querier) GetPresetParametersByPresetID(ctx context.Context, presetID uuid.UUID) ([]database.TemplateVersionPresetParameter, error) {
21912191
// An actor can read template version presets if they can read the related template version.
2192-
_, err := q.GetTemplateVersionByID(ctx, templateVersionID)
2192+
_, err := q.GetPresetByID(ctx, presetID)
2193+
if err != nil {
2194+
return nil, err
2195+
}
2196+
2197+
return q.db.GetPresetParametersByPresetID(ctx, presetID)
2198+
}
2199+
2200+
func (q *querier) GetPresetParametersByTemplateVersionID(ctx context.Context, args uuid.UUID) ([]database.TemplateVersionPresetParameter, error) {
2201+
// An actor can read template version presets if they can read the related template version.
2202+
_, err := q.GetTemplateVersionByID(ctx, args)
21932203
if err != nil {
21942204
return nil, err
21952205
}
21962206

2197-
return q.db.GetPresetParametersByTemplateVersionID(ctx, templateVersionID)
2207+
return q.db.GetPresetParametersByTemplateVersionID(ctx, args)
21982208
}
21992209

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

coderd/database/dbauthz/dbauthz_test.go

+124-96
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,6 @@ func TestDBAuthzRecursive(t *testing.T) {
182182
method.Name == "PGLocks" {
183183
continue
184184
}
185-
// Log the name of the last method, so if there is a panic, it is
186185
// easy to know which method failed.
187186
// t.Log(method.Name)
188187
// Call the function. Any infinite recursion will stack overflow.
@@ -969,8 +968,7 @@ func (s *MethodTestSuite) TestOrganization() {
969968
TemplateVersionID: workspaceBuild.TemplateVersionID,
970969
Name: "test",
971970
}
972-
preset, err := db.InsertPreset(context.Background(), insertPresetParams)
973-
require.NoError(s.T(), err)
971+
preset := dbgen.Preset(s.T(), db, insertPresetParams)
974972
insertPresetParametersParams := database.InsertPresetParametersParams{
975973
TemplateVersionPresetID: preset.ID,
976974
Names: []string{"test"},
@@ -1027,8 +1025,8 @@ func (s *MethodTestSuite) TestOrganization() {
10271025
})
10281026

10291027
check.Args(database.OrganizationMembersParams{
1030-
OrganizationID: uuid.UUID{},
1031-
UserID: uuid.UUID{},
1028+
OrganizationID: o.ID,
1029+
UserID: u.ID,
10321030
}).Asserts(
10331031
mem, policy.ActionRead,
10341032
)
@@ -3906,96 +3904,6 @@ func (s *MethodTestSuite) TestSystemFunctions() {
39063904
ErrorsWithInMemDB(sql.ErrNoRows).
39073905
Returns([]database.ParameterSchema{})
39083906
}))
3909-
s.Run("GetPresetByWorkspaceBuildID", s.Subtest(func(db database.Store, check *expects) {
3910-
org := dbgen.Organization(s.T(), db, database.Organization{})
3911-
user := dbgen.User(s.T(), db, database.User{})
3912-
template := dbgen.Template(s.T(), db, database.Template{
3913-
CreatedBy: user.ID,
3914-
OrganizationID: org.ID,
3915-
})
3916-
templateVersion := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
3917-
TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true},
3918-
OrganizationID: org.ID,
3919-
CreatedBy: user.ID,
3920-
})
3921-
preset, err := db.InsertPreset(context.Background(), database.InsertPresetParams{
3922-
TemplateVersionID: templateVersion.ID,
3923-
Name: "test",
3924-
})
3925-
require.NoError(s.T(), err)
3926-
workspace := dbgen.Workspace(s.T(), db, database.WorkspaceTable{
3927-
OrganizationID: org.ID,
3928-
OwnerID: user.ID,
3929-
TemplateID: template.ID,
3930-
})
3931-
job := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{
3932-
OrganizationID: org.ID,
3933-
})
3934-
workspaceBuild := dbgen.WorkspaceBuild(s.T(), db, database.WorkspaceBuild{
3935-
WorkspaceID: workspace.ID,
3936-
TemplateVersionID: templateVersion.ID,
3937-
TemplateVersionPresetID: uuid.NullUUID{UUID: preset.ID, Valid: true},
3938-
InitiatorID: user.ID,
3939-
JobID: job.ID,
3940-
})
3941-
_, err = db.GetPresetByWorkspaceBuildID(context.Background(), workspaceBuild.ID)
3942-
require.NoError(s.T(), err)
3943-
check.Args(workspaceBuild.ID).Asserts(rbac.ResourceTemplate, policy.ActionRead)
3944-
}))
3945-
s.Run("GetPresetParametersByTemplateVersionID", s.Subtest(func(db database.Store, check *expects) {
3946-
ctx := context.Background()
3947-
org := dbgen.Organization(s.T(), db, database.Organization{})
3948-
user := dbgen.User(s.T(), db, database.User{})
3949-
template := dbgen.Template(s.T(), db, database.Template{
3950-
CreatedBy: user.ID,
3951-
OrganizationID: org.ID,
3952-
})
3953-
templateVersion := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
3954-
TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true},
3955-
OrganizationID: org.ID,
3956-
CreatedBy: user.ID,
3957-
})
3958-
preset, err := db.InsertPreset(ctx, database.InsertPresetParams{
3959-
TemplateVersionID: templateVersion.ID,
3960-
Name: "test",
3961-
})
3962-
require.NoError(s.T(), err)
3963-
_, err = db.InsertPresetParameters(ctx, database.InsertPresetParametersParams{
3964-
TemplateVersionPresetID: preset.ID,
3965-
Names: []string{"test"},
3966-
Values: []string{"test"},
3967-
})
3968-
require.NoError(s.T(), err)
3969-
presetParameters, err := db.GetPresetParametersByTemplateVersionID(ctx, templateVersion.ID)
3970-
require.NoError(s.T(), err)
3971-
3972-
check.Args(templateVersion.ID).Asserts(template.RBACObject(), policy.ActionRead).Returns(presetParameters)
3973-
}))
3974-
s.Run("GetPresetsByTemplateVersionID", s.Subtest(func(db database.Store, check *expects) {
3975-
ctx := context.Background()
3976-
org := dbgen.Organization(s.T(), db, database.Organization{})
3977-
user := dbgen.User(s.T(), db, database.User{})
3978-
template := dbgen.Template(s.T(), db, database.Template{
3979-
CreatedBy: user.ID,
3980-
OrganizationID: org.ID,
3981-
})
3982-
templateVersion := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
3983-
TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true},
3984-
OrganizationID: org.ID,
3985-
CreatedBy: user.ID,
3986-
})
3987-
3988-
_, err := db.InsertPreset(ctx, database.InsertPresetParams{
3989-
TemplateVersionID: templateVersion.ID,
3990-
Name: "test",
3991-
})
3992-
require.NoError(s.T(), err)
3993-
3994-
presets, err := db.GetPresetsByTemplateVersionID(ctx, templateVersion.ID)
3995-
require.NoError(s.T(), err)
3996-
3997-
check.Args(templateVersion.ID).Asserts(template.RBACObject(), policy.ActionRead).Returns(presets)
3998-
}))
39993907
s.Run("GetWorkspaceAppsByAgentIDs", s.Subtest(func(db database.Store, check *expects) {
40003908
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
40013909
aWs := dbgen.Workspace(s.T(), db, database.WorkspaceTable{})
@@ -4839,6 +4747,125 @@ func (s *MethodTestSuite) TestNotifications() {
48394747
}
48404748

48414749
func (s *MethodTestSuite) TestPrebuilds() {
4750+
s.Run("GetPresetByWorkspaceBuildID", s.Subtest(func(db database.Store, check *expects) {
4751+
org := dbgen.Organization(s.T(), db, database.Organization{})
4752+
user := dbgen.User(s.T(), db, database.User{})
4753+
template := dbgen.Template(s.T(), db, database.Template{
4754+
CreatedBy: user.ID,
4755+
OrganizationID: org.ID,
4756+
})
4757+
templateVersion := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
4758+
TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true},
4759+
OrganizationID: org.ID,
4760+
CreatedBy: user.ID,
4761+
})
4762+
preset, err := db.InsertPreset(context.Background(), database.InsertPresetParams{
4763+
TemplateVersionID: templateVersion.ID,
4764+
Name: "test",
4765+
})
4766+
require.NoError(s.T(), err)
4767+
workspace := dbgen.Workspace(s.T(), db, database.WorkspaceTable{
4768+
OrganizationID: org.ID,
4769+
OwnerID: user.ID,
4770+
TemplateID: template.ID,
4771+
})
4772+
job := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{
4773+
OrganizationID: org.ID,
4774+
})
4775+
workspaceBuild := dbgen.WorkspaceBuild(s.T(), db, database.WorkspaceBuild{
4776+
WorkspaceID: workspace.ID,
4777+
TemplateVersionID: templateVersion.ID,
4778+
TemplateVersionPresetID: uuid.NullUUID{UUID: preset.ID, Valid: true},
4779+
InitiatorID: user.ID,
4780+
JobID: job.ID,
4781+
})
4782+
_, err = db.GetPresetByWorkspaceBuildID(context.Background(), workspaceBuild.ID)
4783+
require.NoError(s.T(), err)
4784+
check.Args(workspaceBuild.ID).Asserts(rbac.ResourceTemplate, policy.ActionRead)
4785+
}))
4786+
s.Run("GetPresetParametersByTemplateVersionID", s.Subtest(func(db database.Store, check *expects) {
4787+
ctx := context.Background()
4788+
org := dbgen.Organization(s.T(), db, database.Organization{})
4789+
user := dbgen.User(s.T(), db, database.User{})
4790+
template := dbgen.Template(s.T(), db, database.Template{
4791+
CreatedBy: user.ID,
4792+
OrganizationID: org.ID,
4793+
})
4794+
templateVersion := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
4795+
TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true},
4796+
OrganizationID: org.ID,
4797+
CreatedBy: user.ID,
4798+
})
4799+
preset, err := db.InsertPreset(ctx, database.InsertPresetParams{
4800+
TemplateVersionID: templateVersion.ID,
4801+
Name: "test",
4802+
})
4803+
require.NoError(s.T(), err)
4804+
insertedParameters, err := db.InsertPresetParameters(ctx, database.InsertPresetParametersParams{
4805+
TemplateVersionPresetID: preset.ID,
4806+
Names: []string{"test"},
4807+
Values: []string{"test"},
4808+
})
4809+
require.NoError(s.T(), err)
4810+
check.
4811+
Args(templateVersion.ID).
4812+
Asserts(template.RBACObject(), policy.ActionRead).
4813+
Returns(insertedParameters)
4814+
}))
4815+
s.Run("GetPresetParametersByPresetID", s.Subtest(func(db database.Store, check *expects) {
4816+
ctx := context.Background()
4817+
org := dbgen.Organization(s.T(), db, database.Organization{})
4818+
user := dbgen.User(s.T(), db, database.User{})
4819+
template := dbgen.Template(s.T(), db, database.Template{
4820+
CreatedBy: user.ID,
4821+
OrganizationID: org.ID,
4822+
})
4823+
templateVersion := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
4824+
TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true},
4825+
OrganizationID: org.ID,
4826+
CreatedBy: user.ID,
4827+
})
4828+
preset, err := db.InsertPreset(ctx, database.InsertPresetParams{
4829+
TemplateVersionID: templateVersion.ID,
4830+
Name: "test",
4831+
})
4832+
require.NoError(s.T(), err)
4833+
insertedParameters, err := db.InsertPresetParameters(ctx, database.InsertPresetParametersParams{
4834+
TemplateVersionPresetID: preset.ID,
4835+
Names: []string{"test"},
4836+
Values: []string{"test"},
4837+
})
4838+
require.NoError(s.T(), err)
4839+
check.
4840+
Args(preset.ID).
4841+
Asserts(template.RBACObject(), policy.ActionRead).
4842+
Returns(insertedParameters)
4843+
}))
4844+
s.Run("GetPresetsByTemplateVersionID", s.Subtest(func(db database.Store, check *expects) {
4845+
ctx := context.Background()
4846+
org := dbgen.Organization(s.T(), db, database.Organization{})
4847+
user := dbgen.User(s.T(), db, database.User{})
4848+
template := dbgen.Template(s.T(), db, database.Template{
4849+
CreatedBy: user.ID,
4850+
OrganizationID: org.ID,
4851+
})
4852+
templateVersion := dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
4853+
TemplateID: uuid.NullUUID{UUID: template.ID, Valid: true},
4854+
OrganizationID: org.ID,
4855+
CreatedBy: user.ID,
4856+
})
4857+
4858+
_, err := db.InsertPreset(ctx, database.InsertPresetParams{
4859+
TemplateVersionID: templateVersion.ID,
4860+
Name: "test",
4861+
})
4862+
require.NoError(s.T(), err)
4863+
4864+
presets, err := db.GetPresetsByTemplateVersionID(ctx, templateVersion.ID)
4865+
require.NoError(s.T(), err)
4866+
4867+
check.Args(templateVersion.ID).Asserts(template.RBACObject(), policy.ActionRead).Returns(presets)
4868+
}))
48424869
s.Run("ClaimPrebuiltWorkspace", s.Subtest(func(db database.Store, check *expects) {
48434870
org := dbgen.Organization(s.T(), db, database.Organization{})
48444871
user := dbgen.User(s.T(), db, database.User{})
@@ -4923,7 +4950,8 @@ func (s *MethodTestSuite) TestPrebuilds() {
49234950
UUID: template.ID,
49244951
Valid: true,
49254952
},
4926-
OrganizationID: org.ID,
4953+
InvalidateAfterSecs: preset.InvalidateAfterSecs,
4954+
OrganizationID: org.ID,
49274955
})
49284956
}))
49294957
}

coderd/database/dbmem/dbmem.go

+20-1
Original file line numberDiff line numberDiff line change
@@ -4275,6 +4275,21 @@ func (q *FakeQuerier) GetPresetByWorkspaceBuildID(_ context.Context, workspaceBu
42754275
return database.TemplateVersionPreset{}, sql.ErrNoRows
42764276
}
42774277

4278+
func (q *FakeQuerier) GetPresetParametersByPresetID(_ context.Context, presetID uuid.UUID) ([]database.TemplateVersionPresetParameter, error) {
4279+
q.mutex.RLock()
4280+
defer q.mutex.RUnlock()
4281+
4282+
parameters := make([]database.TemplateVersionPresetParameter, 0)
4283+
for _, parameter := range q.presetParameters {
4284+
if parameter.TemplateVersionPresetID != presetID {
4285+
continue
4286+
}
4287+
parameters = append(parameters, parameter)
4288+
}
4289+
4290+
return parameters, nil
4291+
}
4292+
42784293
func (q *FakeQuerier) GetPresetParametersByTemplateVersionID(_ context.Context, templateVersionID uuid.UUID) ([]database.TemplateVersionPresetParameter, error) {
42794294
q.mutex.RLock()
42804295
defer q.mutex.RUnlock()
@@ -4293,7 +4308,6 @@ func (q *FakeQuerier) GetPresetParametersByTemplateVersionID(_ context.Context,
42934308
continue
42944309
}
42954310
parameters = append(parameters, parameter)
4296-
break
42974311
}
42984312
}
42994313

@@ -8854,6 +8868,11 @@ func (q *FakeQuerier) InsertPreset(_ context.Context, arg database.InsertPresetP
88548868
TemplateVersionID: arg.TemplateVersionID,
88558869
Name: arg.Name,
88568870
CreatedAt: arg.CreatedAt,
8871+
DesiredInstances: arg.DesiredInstances,
8872+
InvalidateAfterSecs: sql.NullInt32{
8873+
Int32: 0,
8874+
Valid: true,
8875+
},
88578876
}
88588877
q.presets = append(q.presets, preset)
88598878
return preset, nil

coderd/database/dbmetrics/querymetrics.go

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

coderd/database/dbmock/dbmock.go

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

coderd/database/querier.go

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

0 commit comments

Comments
 (0)