Skip to content

Commit 5b3eda6

Browse files
authored
chore: persist template import terraform plan in postgres (coder#17012)
1 parent 445a059 commit 5b3eda6

26 files changed

+491
-257
lines changed

coderd/database/dbauthz/dbauthz.go

+7
Original file line numberDiff line numberDiff line change
@@ -3320,6 +3320,13 @@ func (q *querier) InsertTemplateVersionParameter(ctx context.Context, arg databa
33203320
return q.db.InsertTemplateVersionParameter(ctx, arg)
33213321
}
33223322

3323+
func (q *querier) InsertTemplateVersionTerraformValuesByJobID(ctx context.Context, arg database.InsertTemplateVersionTerraformValuesByJobIDParams) error {
3324+
if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {
3325+
return err
3326+
}
3327+
return q.db.InsertTemplateVersionTerraformValuesByJobID(ctx, arg)
3328+
}
3329+
33233330
func (q *querier) InsertTemplateVersionVariable(ctx context.Context, arg database.InsertTemplateVersionVariableParams) (database.TemplateVersionVariable, error) {
33243331
if err := q.authorizeContext(ctx, policy.ActionCreate, rbac.ResourceSystem); err != nil {
33253332
return database.TemplateVersionVariable{}, err

coderd/database/dbauthz/dbauthz_test.go

+17
Original file line numberDiff line numberDiff line change
@@ -1261,6 +1261,23 @@ func (s *MethodTestSuite) TestTemplate() {
12611261
OrganizationID: t1.OrganizationID,
12621262
}).Asserts(t1, policy.ActionRead, t1, policy.ActionCreate)
12631263
}))
1264+
s.Run("InsertTemplateVersionTerraformValuesByJobID", s.Subtest(func(db database.Store, check *expects) {
1265+
o := dbgen.Organization(s.T(), db, database.Organization{})
1266+
u := dbgen.User(s.T(), db, database.User{})
1267+
_ = dbgen.OrganizationMember(s.T(), db, database.OrganizationMember{OrganizationID: o.ID, UserID: u.ID})
1268+
t := dbgen.Template(s.T(), db, database.Template{OrganizationID: o.ID, CreatedBy: u.ID})
1269+
job := dbgen.ProvisionerJob(s.T(), db, nil, database.ProvisionerJob{OrganizationID: o.ID})
1270+
_ = dbgen.TemplateVersion(s.T(), db, database.TemplateVersion{
1271+
OrganizationID: o.ID,
1272+
CreatedBy: u.ID,
1273+
JobID: job.ID,
1274+
TemplateID: uuid.NullUUID{UUID: t.ID, Valid: true},
1275+
})
1276+
check.Args(database.InsertTemplateVersionTerraformValuesByJobIDParams{
1277+
JobID: job.ID,
1278+
CachedPlan: []byte("{}"),
1279+
}).Asserts(rbac.ResourceSystem, policy.ActionCreate)
1280+
}))
12641281
s.Run("SoftDeleteTemplateByID", s.Subtest(func(db database.Store, check *expects) {
12651282
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
12661283
t1 := dbgen.Template(s.T(), db, database.Template{})

coderd/database/dbmem/dbmem.go

+74-41
Original file line numberDiff line numberDiff line change
@@ -54,47 +54,48 @@ func New() database.Store {
5454
q := &FakeQuerier{
5555
mutex: &sync.RWMutex{},
5656
data: &data{
57-
apiKeys: make([]database.APIKey, 0),
58-
auditLogs: make([]database.AuditLog, 0),
59-
customRoles: make([]database.CustomRole, 0),
60-
dbcryptKeys: make([]database.DBCryptKey, 0),
61-
externalAuthLinks: make([]database.ExternalAuthLink, 0),
62-
files: make([]database.File, 0),
63-
gitSSHKey: make([]database.GitSSHKey, 0),
64-
groups: make([]database.Group, 0),
65-
groupMembers: make([]database.GroupMemberTable, 0),
66-
licenses: make([]database.License, 0),
67-
locks: map[int64]struct{}{},
68-
notificationMessages: make([]database.NotificationMessage, 0),
69-
notificationPreferences: make([]database.NotificationPreference, 0),
70-
organizationMembers: make([]database.OrganizationMember, 0),
71-
organizations: make([]database.Organization, 0),
72-
inboxNotifications: make([]database.InboxNotification, 0),
73-
parameterSchemas: make([]database.ParameterSchema, 0),
74-
presets: make([]database.TemplateVersionPreset, 0),
75-
presetParameters: make([]database.TemplateVersionPresetParameter, 0),
76-
provisionerDaemons: make([]database.ProvisionerDaemon, 0),
77-
provisionerJobs: make([]database.ProvisionerJob, 0),
78-
provisionerJobLogs: make([]database.ProvisionerJobLog, 0),
79-
provisionerKeys: make([]database.ProvisionerKey, 0),
80-
runtimeConfig: map[string]string{},
81-
telemetryItems: make([]database.TelemetryItem, 0),
82-
templateVersions: make([]database.TemplateVersionTable, 0),
83-
templates: make([]database.TemplateTable, 0),
84-
users: make([]database.User, 0),
85-
userConfigs: make([]database.UserConfig, 0),
86-
userStatusChanges: make([]database.UserStatusChange, 0),
87-
workspaceAgents: make([]database.WorkspaceAgent, 0),
88-
workspaceResources: make([]database.WorkspaceResource, 0),
89-
workspaceModules: make([]database.WorkspaceModule, 0),
90-
workspaceResourceMetadata: make([]database.WorkspaceResourceMetadatum, 0),
91-
workspaceAgentStats: make([]database.WorkspaceAgentStat, 0),
92-
workspaceAgentLogs: make([]database.WorkspaceAgentLog, 0),
93-
workspaceBuilds: make([]database.WorkspaceBuild, 0),
94-
workspaceApps: make([]database.WorkspaceApp, 0),
95-
workspaceAppAuditSessions: make([]database.WorkspaceAppAuditSession, 0),
96-
workspaces: make([]database.WorkspaceTable, 0),
97-
workspaceProxies: make([]database.WorkspaceProxy, 0),
57+
apiKeys: make([]database.APIKey, 0),
58+
auditLogs: make([]database.AuditLog, 0),
59+
customRoles: make([]database.CustomRole, 0),
60+
dbcryptKeys: make([]database.DBCryptKey, 0),
61+
externalAuthLinks: make([]database.ExternalAuthLink, 0),
62+
files: make([]database.File, 0),
63+
gitSSHKey: make([]database.GitSSHKey, 0),
64+
groups: make([]database.Group, 0),
65+
groupMembers: make([]database.GroupMemberTable, 0),
66+
licenses: make([]database.License, 0),
67+
locks: map[int64]struct{}{},
68+
notificationMessages: make([]database.NotificationMessage, 0),
69+
notificationPreferences: make([]database.NotificationPreference, 0),
70+
organizationMembers: make([]database.OrganizationMember, 0),
71+
organizations: make([]database.Organization, 0),
72+
inboxNotifications: make([]database.InboxNotification, 0),
73+
parameterSchemas: make([]database.ParameterSchema, 0),
74+
presets: make([]database.TemplateVersionPreset, 0),
75+
presetParameters: make([]database.TemplateVersionPresetParameter, 0),
76+
provisionerDaemons: make([]database.ProvisionerDaemon, 0),
77+
provisionerJobs: make([]database.ProvisionerJob, 0),
78+
provisionerJobLogs: make([]database.ProvisionerJobLog, 0),
79+
provisionerKeys: make([]database.ProvisionerKey, 0),
80+
runtimeConfig: map[string]string{},
81+
telemetryItems: make([]database.TelemetryItem, 0),
82+
templateVersions: make([]database.TemplateVersionTable, 0),
83+
templateVersionTerraformValues: make([]database.TemplateVersionTerraformValue, 0),
84+
templates: make([]database.TemplateTable, 0),
85+
users: make([]database.User, 0),
86+
userConfigs: make([]database.UserConfig, 0),
87+
userStatusChanges: make([]database.UserStatusChange, 0),
88+
workspaceAgents: make([]database.WorkspaceAgent, 0),
89+
workspaceResources: make([]database.WorkspaceResource, 0),
90+
workspaceModules: make([]database.WorkspaceModule, 0),
91+
workspaceResourceMetadata: make([]database.WorkspaceResourceMetadatum, 0),
92+
workspaceAgentStats: make([]database.WorkspaceAgentStat, 0),
93+
workspaceAgentLogs: make([]database.WorkspaceAgentLog, 0),
94+
workspaceBuilds: make([]database.WorkspaceBuild, 0),
95+
workspaceApps: make([]database.WorkspaceApp, 0),
96+
workspaceAppAuditSessions: make([]database.WorkspaceAppAuditSession, 0),
97+
workspaces: make([]database.WorkspaceTable, 0),
98+
workspaceProxies: make([]database.WorkspaceProxy, 0),
9899
},
99100
}
100101
// Always start with a default org. Matching migration 198.
@@ -222,6 +223,7 @@ type data struct {
222223
replicas []database.Replica
223224
templateVersions []database.TemplateVersionTable
224225
templateVersionParameters []database.TemplateVersionParameter
226+
templateVersionTerraformValues []database.TemplateVersionTerraformValue
225227
templateVersionVariables []database.TemplateVersionVariable
226228
templateVersionWorkspaceTags []database.TemplateVersionWorkspaceTag
227229
templates []database.TemplateTable
@@ -8828,6 +8830,37 @@ func (q *FakeQuerier) InsertTemplateVersionParameter(_ context.Context, arg data
88288830
return param, nil
88298831
}
88308832

8833+
func (q *FakeQuerier) InsertTemplateVersionTerraformValuesByJobID(_ context.Context, arg database.InsertTemplateVersionTerraformValuesByJobIDParams) error {
8834+
err := validateDatabaseType(arg)
8835+
if err != nil {
8836+
return err
8837+
}
8838+
8839+
q.mutex.Lock()
8840+
defer q.mutex.Unlock()
8841+
8842+
// Find the template version by the job_id
8843+
templateVersion, ok := slice.Find(q.templateVersions, func(v database.TemplateVersionTable) bool {
8844+
return v.JobID == arg.JobID
8845+
})
8846+
if !ok {
8847+
return sql.ErrNoRows
8848+
}
8849+
8850+
if !json.Valid(arg.CachedPlan) {
8851+
return xerrors.Errorf("cached plan must be valid json, received %q", string(arg.CachedPlan))
8852+
}
8853+
8854+
// Insert the new row
8855+
row := database.TemplateVersionTerraformValue{
8856+
TemplateVersionID: templateVersion.ID,
8857+
CachedPlan: arg.CachedPlan,
8858+
UpdatedAt: arg.UpdatedAt,
8859+
}
8860+
q.templateVersionTerraformValues = append(q.templateVersionTerraformValues, row)
8861+
return nil
8862+
}
8863+
88318864
func (q *FakeQuerier) InsertTemplateVersionVariable(_ context.Context, arg database.InsertTemplateVersionVariableParams) (database.TemplateVersionVariable, error) {
88328865
if err := validateDatabaseType(arg); err != nil {
88338866
return database.TemplateVersionVariable{}, err

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

+14
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.

coderd/database/foreign_key_constraint.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
drop table template_version_terraform_values;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
create table template_version_terraform_values (
2+
template_version_id uuid not null unique references template_versions(id) on delete cascade,
3+
updated_at timestamptz not null default now(),
4+
cached_plan jsonb not null
5+
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
insert into
2+
template_version_terraform_values (
3+
template_version_id,
4+
cached_plan,
5+
updated_at
6+
)
7+
select
8+
id,
9+
'{}',
10+
now()
11+
from
12+
template_versions;

coderd/database/models.go

+6
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.

coderd/database/queries.sql.go

+26
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-- name: InsertTemplateVersionTerraformValuesByJobID :exec
2+
INSERT INTO
3+
template_version_terraform_values (
4+
template_version_id,
5+
cached_plan,
6+
updated_at
7+
)
8+
VALUES
9+
(
10+
(select id from template_versions where job_id = @job_id),
11+
@cached_plan,
12+
@updated_at
13+
);

0 commit comments

Comments
 (0)