Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 0 additions & 19 deletions preset.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package preview

import (
"fmt"
"slices"

"github.com/aquasecurity/trivy/pkg/iac/terraform"
"github.com/hashicorp/hcl/v2"
Expand Down Expand Up @@ -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)
}
}
Expand Down
16 changes: 16 additions & 0 deletions preview.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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 {
Expand Down
11 changes: 11 additions & 0 deletions preview_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
22 changes: 22 additions & 0 deletions testdata/invalidpresets/main.tf
Original file line number Diff line number Diff line change
Expand Up @@ -18,32 +18,48 @@ 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" {
name = "invalid_parameter_name"
parameters = {
"invalid_parameter_name" = "irrelevant_value"
}
prebuilds {
instances = 1
}
}

data "coder_workspace_preset" "invalid_parameter_value" {
name = "invalid_parameter_value"
parameters = {
"valid_parameter_name" = "invalid_value"
}
prebuilds {
instances = 1
}
}

data "coder_workspace_preset" "valid_preset" {
name = "valid_preset"
parameters = {
"valid_parameter_name" = "valid_option_value"
}
prebuilds {
instances = 1
}

}

data "coder_workspace_preset" "another_default_preset" {
Expand All @@ -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" {
Expand All @@ -60,5 +79,8 @@ data "coder_workspace_preset" "default_preset" {
"valid_parameter_name" = "valid_option_value"
}
default = true
prebuilds {
instances = 1
}
}

32 changes: 32 additions & 0 deletions testdata/presetok/main.tf
Original file line number Diff line number Diff line change
@@ -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
}
}
Loading