Skip to content

Commit 5d59c23

Browse files
johnstcnaslilac
authored andcommitted
fix(provisioner/terraform/tfparse): evaluate coder_parameter defaults with variables (#15800)
- adds support for dynamic default values in coder_parameter data source
1 parent f0f4a06 commit 5d59c23

File tree

2 files changed

+84
-3
lines changed

2 files changed

+84
-3
lines changed

provisioner/terraform/tfparse/tfparse.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ func (p *Parser) WorkspaceTagDefaults(ctx context.Context) (map[string]string, e
172172
if err != nil {
173173
return nil, xerrors.Errorf("load variable defaults: %w", err)
174174
}
175-
paramsDefaults, err := p.CoderParameterDefaults(ctx)
175+
paramsDefaults, err := p.CoderParameterDefaults(ctx, varsDefaults)
176176
if err != nil {
177177
return nil, xerrors.Errorf("load parameter defaults: %w", err)
178178
}
@@ -268,7 +268,7 @@ func (p *Parser) VariableDefaults(ctx context.Context) (map[string]string, error
268268

269269
// CoderParameterDefaults returns the default values of all coder_parameter data sources
270270
// in the parsed module.
271-
func (p *Parser) CoderParameterDefaults(ctx context.Context) (map[string]string, error) {
271+
func (p *Parser) CoderParameterDefaults(ctx context.Context, varsDefaults map[string]string) (map[string]string, error) {
272272
defaultsM := make(map[string]string)
273273
var (
274274
skipped []string
@@ -316,14 +316,28 @@ func (p *Parser) CoderParameterDefaults(ctx context.Context) (map[string]string,
316316
}
317317

318318
if _, ok := resContent.Attributes["default"]; !ok {
319+
p.logger.Warn(ctx, "coder_parameter data source does not have a default value", slog.F("name", dataResource.Name))
319320
defaultsM[dataResource.Name] = ""
320321
} else {
321322
expr := resContent.Attributes["default"].Expr
322323
value, err := previewFileContent(expr.Range())
323324
if err != nil {
324325
return nil, xerrors.Errorf("can't preview the resource file: %v", err)
325326
}
326-
defaultsM[dataResource.Name] = strings.Trim(value, `"`)
327+
// Issue #15795: the "default" value could also be an expression we need
328+
// to evaluate.
329+
// TODO: should we support coder_parameter default values that reference other coder_parameter data sources?
330+
evalCtx := buildEvalContext(varsDefaults, nil)
331+
val, diags := expr.Value(evalCtx)
332+
if diags.HasErrors() {
333+
return nil, xerrors.Errorf("failed to evaluate coder_parameter %q default value %q: %s", dataResource.Name, value, diags.Error())
334+
}
335+
// Do not use "val.AsString()" as it can panic
336+
strVal, err := ctyValueString(val)
337+
if err != nil {
338+
return nil, xerrors.Errorf("failed to marshal coder_parameter %q default value %q as string: %s", dataResource.Name, value, err)
339+
}
340+
defaultsM[dataResource.Name] = strings.Trim(strVal, `"`)
327341
}
328342
}
329343
}

provisioner/terraform/tfparse/tfparse_test.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,73 @@ func Test_WorkspaceTagDefaultsFromFile(t *testing.T) {
114114
expectTags: map[string]string{"platform": "kubernetes", "cluster": "developers", "region": "us", "az": "a"},
115115
expectError: "",
116116
},
117+
{
118+
name: "main.tf with parameter that has default value from dynamic value",
119+
files: map[string]string{
120+
"main.tf": `
121+
provider "foo" {}
122+
resource "foo_bar" "baz" {}
123+
variable "region" {
124+
type = string
125+
default = "us"
126+
}
127+
variable "az" {
128+
type = string
129+
default = "${""}${"a"}"
130+
}
131+
data "base" "ours" {
132+
all = true
133+
}
134+
data "coder_parameter" "az" {
135+
name = "az"
136+
type = "string"
137+
default = var.az
138+
}
139+
data "coder_workspace_tags" "tags" {
140+
tags = {
141+
"platform" = "kubernetes",
142+
"cluster" = "${"devel"}${"opers"}"
143+
"region" = var.region
144+
"az" = data.coder_parameter.az.value
145+
}
146+
}`,
147+
},
148+
expectTags: map[string]string{"platform": "kubernetes", "cluster": "developers", "region": "us", "az": "a"},
149+
expectError: "",
150+
},
151+
{
152+
name: "main.tf with parameter that has default value from another parameter",
153+
files: map[string]string{
154+
"main.tf": `
155+
provider "foo" {}
156+
resource "foo_bar" "baz" {}
157+
variable "region" {
158+
type = string
159+
default = "us"
160+
}
161+
data "base" "ours" {
162+
all = true
163+
}
164+
data "coder_parameter" "az" {
165+
type = string
166+
default = "${""}${"a"}"
167+
}
168+
data "coder_parameter" "az2" {
169+
name = "az"
170+
type = "string"
171+
default = data.coder_parameter.az.value
172+
}
173+
data "coder_workspace_tags" "tags" {
174+
tags = {
175+
"platform" = "kubernetes",
176+
"cluster" = "${"devel"}${"opers"}"
177+
"region" = var.region
178+
"az" = data.coder_parameter.az2.value
179+
}
180+
}`,
181+
},
182+
expectError: "Unknown variable; There is no variable named \"data\".",
183+
},
117184
{
118185
name: "main.tf with multiple valid workspace tags",
119186
files: map[string]string{

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