Skip to content

Commit e145ba3

Browse files
authored
chore: dynamic elements break preset validation (#195)
Dynamic elements are not taken into account during preset validation. We should omit preset validation if it's not accurate This means preset validation only occurs during prebuilds, where all the inputs are known.
1 parent b3c9e72 commit e145ba3

5 files changed

Lines changed: 81 additions & 19 deletions

File tree

preset.go

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package preview
22

33
import (
44
"fmt"
5-
"slices"
65

76
"github.com/aquasecurity/trivy/pkg/iac/terraform"
87
"github.com/hashicorp/hcl/v2"
@@ -32,24 +31,6 @@ func presets(modules terraform.Modules, parameters []types.Parameter) []types.Pr
3231
defaultPreset = &preset
3332
}
3433

35-
for paramName, paramValue := range preset.Parameters {
36-
templateParamIndex := slices.IndexFunc(parameters, func(p types.Parameter) bool {
37-
return p.Name == paramName
38-
})
39-
if templateParamIndex == -1 {
40-
preset.Diagnostics = append(preset.Diagnostics, &hcl.Diagnostic{
41-
Severity: hcl.DiagError,
42-
Summary: "Undefined Parameter",
43-
Detail: fmt.Sprintf("Preset parameter %q is not defined by the template.", paramName),
44-
})
45-
continue
46-
}
47-
templateParam := parameters[templateParamIndex]
48-
for _, diag := range templateParam.Valid(types.StringLiteral(paramValue)) {
49-
preset.Diagnostics = append(preset.Diagnostics, diag)
50-
}
51-
}
52-
5334
foundPresets = append(foundPresets, preset)
5435
}
5536
}

preview.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"fmt"
77
"io/fs"
88
"log/slog"
9+
"slices"
910

1011
"github.com/aquasecurity/trivy/pkg/iac/scanners/terraform/parser"
1112
"github.com/hashicorp/hcl/v2"
@@ -106,6 +107,21 @@ func ValidatePrebuilds(ctx context.Context, input Input, preValid []types.Preset
106107
continue
107108
}
108109

110+
// Check all parameters in the preset are defined by the template.
111+
for paramName, _ := range pre.Parameters {
112+
templateParamIndex := slices.IndexFunc(output.Parameters, func(p types.Parameter) bool {
113+
return p.Name == paramName
114+
})
115+
if templateParamIndex == -1 {
116+
pre.Diagnostics = append(pre.Diagnostics, &hcl.Diagnostic{
117+
Severity: hcl.DiagError,
118+
Summary: "Undefined Parameter",
119+
Detail: fmt.Sprintf("Preset parameter %q is not defined by the template.", paramName),
120+
})
121+
continue
122+
}
123+
}
124+
109125
// If any parameter is invalid, then the preset is invalid.
110126
// A value must be specified for this failing parameter.
111127
for _, param := range output.Parameters {

preview_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,17 @@ func TestPresetValidation(t *testing.T) {
714714
"not_prebuild": aPre().noDiagnostics().prebuildCount(0),
715715
},
716716
},
717+
{
718+
name: "preset ok",
719+
dir: "presetok",
720+
input: preview.Input{},
721+
presetAssert: map[string]assertPreset{
722+
"valid_preset": aPre().
723+
value("use_custom_image", "true").
724+
value("custom_image_url", "docker.io/codercom/test:latest").
725+
noDiagnostics(),
726+
},
727+
},
717728
} {
718729
t.Run(tc.name, func(t *testing.T) {
719730
t.Parallel()

testdata/invalidpresets/main.tf

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,32 +18,48 @@ data "coder_parameter" "valid_parameter" {
1818

1919
data "coder_workspace_preset" "no_parameters" {
2020
name = "no_parameters"
21+
prebuilds {
22+
instances = 1
23+
}
2124
}
2225

2326
data "coder_workspace_preset" "empty_parameters" {
2427
name = "empty_parameters"
2528
parameters = {}
29+
prebuilds {
30+
instances = 1
31+
}
2632
}
2733

2834
data "coder_workspace_preset" "invalid_parameter_name" {
2935
name = "invalid_parameter_name"
3036
parameters = {
3137
"invalid_parameter_name" = "irrelevant_value"
3238
}
39+
prebuilds {
40+
instances = 1
41+
}
3342
}
3443

3544
data "coder_workspace_preset" "invalid_parameter_value" {
3645
name = "invalid_parameter_value"
3746
parameters = {
3847
"valid_parameter_name" = "invalid_value"
3948
}
49+
prebuilds {
50+
instances = 1
51+
}
4052
}
4153

4254
data "coder_workspace_preset" "valid_preset" {
4355
name = "valid_preset"
4456
parameters = {
4557
"valid_parameter_name" = "valid_option_value"
4658
}
59+
prebuilds {
60+
instances = 1
61+
}
62+
4763
}
4864

4965
data "coder_workspace_preset" "another_default_preset" {
@@ -52,6 +68,9 @@ data "coder_workspace_preset" "another_default_preset" {
5268
"valid_parameter_name" = "valid_option_value"
5369
}
5470
default = true
71+
prebuilds {
72+
instances = 1
73+
}
5574
}
5675

5776
data "coder_workspace_preset" "default_preset" {
@@ -60,5 +79,8 @@ data "coder_workspace_preset" "default_preset" {
6079
"valid_parameter_name" = "valid_option_value"
6180
}
6281
default = true
82+
prebuilds {
83+
instances = 1
84+
}
6385
}
6486

testdata/presetok/main.tf

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
terraform {
2+
required_providers {
3+
coder = {
4+
source = "coder/coder"
5+
version = "2.8.0"
6+
}
7+
}
8+
}
9+
10+
data "coder_parameter" "use_custom_image" {
11+
name = "use_custom_image"
12+
type = "bool"
13+
default = "false"
14+
}
15+
16+
data "coder_parameter" "custom_image_url" {
17+
count = data.coder_parameter.use_custom_image.value == "true" ? 1 : 0
18+
name = "custom_image_url"
19+
type = "string"
20+
# No default - required when shown
21+
}
22+
23+
data "coder_workspace_preset" "valid_preset" {
24+
name = "valid_preset"
25+
parameters = {
26+
"use_custom_image" = "true"
27+
"custom_image_url" = "docker.io/codercom/test:latest"
28+
}
29+
prebuilds {
30+
instances = 1
31+
}
32+
}

0 commit comments

Comments
 (0)