diff --git a/preset.go b/preset.go index 0e5ca74..c9ee1ae 100644 --- a/preset.go +++ b/preset.go @@ -2,7 +2,6 @@ package preview import ( "fmt" - "slices" "github.com/aquasecurity/trivy/pkg/iac/terraform" "github.com/hashicorp/hcl/v2" @@ -32,24 +31,6 @@ func presets(modules terraform.Modules, parameters []types.Parameter) []types.Pr defaultPreset = &preset } - for paramName, paramValue := range preset.Parameters { - templateParamIndex := slices.IndexFunc(parameters, func(p types.Parameter) bool { - return p.Name == paramName - }) - if templateParamIndex == -1 { - preset.Diagnostics = append(preset.Diagnostics, &hcl.Diagnostic{ - Severity: hcl.DiagError, - Summary: "Undefined Parameter", - Detail: fmt.Sprintf("Preset parameter %q is not defined by the template.", paramName), - }) - continue - } - templateParam := parameters[templateParamIndex] - for _, diag := range templateParam.Valid(types.StringLiteral(paramValue)) { - preset.Diagnostics = append(preset.Diagnostics, diag) - } - } - foundPresets = append(foundPresets, preset) } } diff --git a/preview.go b/preview.go index aae478c..f157509 100644 --- a/preview.go +++ b/preview.go @@ -6,6 +6,7 @@ import ( "fmt" "io/fs" "log/slog" + "slices" "github.com/aquasecurity/trivy/pkg/iac/scanners/terraform/parser" "github.com/hashicorp/hcl/v2" @@ -106,6 +107,21 @@ func ValidatePrebuilds(ctx context.Context, input Input, preValid []types.Preset continue } + // Check all parameters in the preset are defined by the template. + for paramName, _ := range pre.Parameters { + templateParamIndex := slices.IndexFunc(output.Parameters, func(p types.Parameter) bool { + return p.Name == paramName + }) + if templateParamIndex == -1 { + pre.Diagnostics = append(pre.Diagnostics, &hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Undefined Parameter", + Detail: fmt.Sprintf("Preset parameter %q is not defined by the template.", paramName), + }) + continue + } + } + // If any parameter is invalid, then the preset is invalid. // A value must be specified for this failing parameter. for _, param := range output.Parameters { diff --git a/preview_test.go b/preview_test.go index 0c2e0da..5bd4821 100644 --- a/preview_test.go +++ b/preview_test.go @@ -714,6 +714,17 @@ func TestPresetValidation(t *testing.T) { "not_prebuild": aPre().noDiagnostics().prebuildCount(0), }, }, + { + name: "preset ok", + dir: "presetok", + input: preview.Input{}, + presetAssert: map[string]assertPreset{ + "valid_preset": aPre(). + value("use_custom_image", "true"). + value("custom_image_url", "docker.io/codercom/test:latest"). + noDiagnostics(), + }, + }, } { t.Run(tc.name, func(t *testing.T) { t.Parallel() diff --git a/testdata/invalidpresets/main.tf b/testdata/invalidpresets/main.tf index a7afc28..854d68c 100644 --- a/testdata/invalidpresets/main.tf +++ b/testdata/invalidpresets/main.tf @@ -18,11 +18,17 @@ data "coder_parameter" "valid_parameter" { data "coder_workspace_preset" "no_parameters" { name = "no_parameters" + prebuilds { + instances = 1 + } } data "coder_workspace_preset" "empty_parameters" { name = "empty_parameters" parameters = {} + prebuilds { + instances = 1 + } } data "coder_workspace_preset" "invalid_parameter_name" { @@ -30,6 +36,9 @@ data "coder_workspace_preset" "invalid_parameter_name" { parameters = { "invalid_parameter_name" = "irrelevant_value" } + prebuilds { + instances = 1 + } } data "coder_workspace_preset" "invalid_parameter_value" { @@ -37,6 +46,9 @@ data "coder_workspace_preset" "invalid_parameter_value" { parameters = { "valid_parameter_name" = "invalid_value" } + prebuilds { + instances = 1 + } } data "coder_workspace_preset" "valid_preset" { @@ -44,6 +56,10 @@ data "coder_workspace_preset" "valid_preset" { parameters = { "valid_parameter_name" = "valid_option_value" } + prebuilds { + instances = 1 + } + } data "coder_workspace_preset" "another_default_preset" { @@ -52,6 +68,9 @@ data "coder_workspace_preset" "another_default_preset" { "valid_parameter_name" = "valid_option_value" } default = true + prebuilds { + instances = 1 + } } data "coder_workspace_preset" "default_preset" { @@ -60,5 +79,8 @@ data "coder_workspace_preset" "default_preset" { "valid_parameter_name" = "valid_option_value" } default = true + prebuilds { + instances = 1 + } } diff --git a/testdata/presetok/main.tf b/testdata/presetok/main.tf new file mode 100644 index 0000000..2ada518 --- /dev/null +++ b/testdata/presetok/main.tf @@ -0,0 +1,32 @@ +terraform { + required_providers { + coder = { + source = "coder/coder" + version = "2.8.0" + } + } +} + +data "coder_parameter" "use_custom_image" { + name = "use_custom_image" + type = "bool" + default = "false" +} + +data "coder_parameter" "custom_image_url" { + count = data.coder_parameter.use_custom_image.value == "true" ? 1 : 0 + name = "custom_image_url" + type = "string" + # No default - required when shown +} + +data "coder_workspace_preset" "valid_preset" { + name = "valid_preset" + parameters = { + "use_custom_image" = "true" + "custom_image_url" = "docker.io/codercom/test:latest" + } + prebuilds { + instances = 1 + } +} \ No newline at end of file