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

Skip to content

Commit 1375aba

Browse files
johnstcnstirby
authored andcommitted
fix(provisioner/terraform/tfparse): evaluate coder_parameter defaults with variables (#15800)
- adds support for dynamic default values in coder_parameter data source (cherry picked from commit 7dc3ad9)
1 parent 4097ec3 commit 1375aba

File tree

2 files changed

+84
-3
lines changed

2 files changed

+84
-3
lines changed

provisioner/terraform/tfparse/tfparse.go

+17-3
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

+67
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)