Skip to content

Commit 789c4be

Browse files
authored
chore: add dynamic parameter error if missing metadata from provisioner (#17809)
1 parent f3bcac2 commit 789c4be

14 files changed

+163
-25
lines changed

coderd/coderd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,6 +1774,7 @@ func (api *API) CreateInMemoryTaggedProvisionerDaemon(dialCtx context.Context, n
17741774
logger := api.Logger.Named(fmt.Sprintf("inmem-provisionerd-%s", name))
17751775
srv, err := provisionerdserver.NewServer(
17761776
api.ctx, // use the same ctx as the API
1777+
daemon.APIVersion,
17771778
api.AccessURL,
17781779
daemon.ID,
17791780
defaultOrg.ID,

coderd/database/dbgen/dbgen.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"github.com/coder/coder/v2/coderd/rbac"
3030
"github.com/coder/coder/v2/codersdk"
3131
"github.com/coder/coder/v2/cryptorand"
32+
"github.com/coder/coder/v2/provisionerd/proto"
3233
"github.com/coder/coder/v2/testutil"
3334
)
3435

@@ -1000,10 +1001,11 @@ func TemplateVersionTerraformValues(t testing.TB, db database.Store, orig databa
10001001
t.Helper()
10011002

10021003
params := database.InsertTemplateVersionTerraformValuesByJobIDParams{
1003-
JobID: takeFirst(orig.JobID, uuid.New()),
1004-
CachedPlan: takeFirstSlice(orig.CachedPlan, []byte("{}")),
1005-
CachedModuleFiles: orig.CachedModuleFiles,
1006-
UpdatedAt: takeFirst(orig.UpdatedAt, dbtime.Now()),
1004+
JobID: takeFirst(orig.JobID, uuid.New()),
1005+
CachedPlan: takeFirstSlice(orig.CachedPlan, []byte("{}")),
1006+
CachedModuleFiles: orig.CachedModuleFiles,
1007+
UpdatedAt: takeFirst(orig.UpdatedAt, dbtime.Now()),
1008+
ProvisionerdVersion: takeFirst(orig.ProvisionerdVersion, proto.CurrentVersion.String()),
10071009
}
10081010

10091011
err := db.InsertTemplateVersionTerraformValuesByJobID(genCtx, params)

coderd/database/dbmem/dbmem.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9343,10 +9343,11 @@ func (q *FakeQuerier) InsertTemplateVersionTerraformValuesByJobID(_ context.Cont
93439343

93449344
// Insert the new row
93459345
row := database.TemplateVersionTerraformValue{
9346-
TemplateVersionID: templateVersion.ID,
9347-
CachedPlan: arg.CachedPlan,
9348-
CachedModuleFiles: arg.CachedModuleFiles,
9349-
UpdatedAt: arg.UpdatedAt,
9346+
TemplateVersionID: templateVersion.ID,
9347+
UpdatedAt: arg.UpdatedAt,
9348+
CachedPlan: arg.CachedPlan,
9349+
CachedModuleFiles: arg.CachedModuleFiles,
9350+
ProvisionerdVersion: arg.ProvisionerdVersion,
93509351
}
93519352
q.templateVersionTerraformValues = append(q.templateVersionTerraformValues, row)
93529353
return nil

coderd/database/dump.sql

Lines changed: 4 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE template_version_terraform_values DROP COLUMN provisionerd_version;
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
ALTER TABLE template_version_terraform_values ADD COLUMN IF NOT EXISTS provisionerd_version TEXT NOT NULL DEFAULT '';
2+
3+
COMMENT ON COLUMN template_version_terraform_values.provisionerd_version IS
4+
'What version of the provisioning engine was used to generate the cached plan and module files.';

coderd/database/models.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

Lines changed: 12 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/templateversionterraformvalues.sql

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ INSERT INTO
1212
template_version_id,
1313
cached_plan,
1414
cached_module_files,
15-
updated_at
15+
updated_at,
16+
provisionerd_version
1617
)
1718
VALUES
1819
(
1920
(select id from template_versions where job_id = @job_id),
2021
@cached_plan,
2122
@cached_module_files,
22-
@updated_at
23+
@updated_at,
24+
@provisionerd_version
2325
);

coderd/parameters.go

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import (
88
"time"
99

1010
"github.com/google/uuid"
11+
"github.com/hashicorp/hcl/v2"
1112
"golang.org/x/sync/errgroup"
1213
"golang.org/x/xerrors"
1314

15+
"github.com/coder/coder/v2/apiversion"
1416
"github.com/coder/coder/v2/coderd/database"
1517
"github.com/coder/coder/v2/coderd/database/dbauthz"
1618
"github.com/coder/coder/v2/coderd/files"
@@ -107,6 +109,9 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
107109
return
108110
}
109111

112+
// If the err is sql.ErrNoRows, an empty terraform values struct is correct.
113+
staticDiagnostics := parameterProvisionerVersionDiagnostic(tf)
114+
110115
owner, err := api.getWorkspaceOwnerData(ctx, user, templateVersion.OrganizationID)
111116
if err != nil {
112117
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
@@ -141,7 +146,7 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
141146
result, diagnostics := preview.Preview(ctx, input, templateFS)
142147
response := codersdk.DynamicParametersResponse{
143148
ID: -1,
144-
Diagnostics: previewtypes.Diagnostics(diagnostics),
149+
Diagnostics: previewtypes.Diagnostics(diagnostics.Extend(staticDiagnostics)),
145150
}
146151
if result != nil {
147152
response.Parameters = result.Parameters
@@ -169,7 +174,7 @@ func (api *API) templateVersionDynamicParameters(rw http.ResponseWriter, r *http
169174
result, diagnostics := preview.Preview(ctx, input, templateFS)
170175
response := codersdk.DynamicParametersResponse{
171176
ID: update.ID,
172-
Diagnostics: previewtypes.Diagnostics(diagnostics),
177+
Diagnostics: previewtypes.Diagnostics(diagnostics.Extend(staticDiagnostics)),
173178
}
174179
if result != nil {
175180
response.Parameters = result.Parameters
@@ -262,3 +267,31 @@ func (api *API) getWorkspaceOwnerData(
262267
Groups: groupNames,
263268
}, nil
264269
}
270+
271+
// parameterProvisionerVersionDiagnostic checks the version of the provisioner
272+
// used to create the template version. If the version is less than 1.5, it
273+
// returns a warning diagnostic. Only versions 1.5+ return the module & plan data
274+
// required.
275+
func parameterProvisionerVersionDiagnostic(tf database.TemplateVersionTerraformValue) hcl.Diagnostics {
276+
missingMetadata := hcl.Diagnostic{
277+
Severity: hcl.DiagError,
278+
Summary: "This template version is missing required metadata to support dynamic parameters. Go back to the classic creation flow.",
279+
Detail: "To restore full functionality, please re-import the terraform as a new template version.",
280+
}
281+
282+
if tf.ProvisionerdVersion == "" {
283+
return hcl.Diagnostics{&missingMetadata}
284+
}
285+
286+
major, minor, err := apiversion.Parse(tf.ProvisionerdVersion)
287+
if err != nil || tf.ProvisionerdVersion == "" {
288+
return hcl.Diagnostics{&missingMetadata}
289+
} else if major < 1 || (major == 1 && minor < 5) {
290+
missingMetadata.Detail = "This template version does not support dynamic parameters. " +
291+
"Some options may be missing or incorrect. " +
292+
"Please contact an administrator to update the provisioner and re-import the template version."
293+
return hcl.Diagnostics{&missingMetadata}
294+
}
295+
296+
return nil
297+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy