8000 chore: add dynamic parameter error if missing metadata from provision… · coder/coder@789c4be · GitHub
[go: up one dir, main page]

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)
0