Skip to content

Commit 9af65b1

Browse files
committed
fix index references
1 parent 537e33f commit 9af65b1

File tree

8 files changed

+283
-29
lines changed

8 files changed

+283
-29
lines changed

extract/parameter.go

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/aquasecurity/trivy/pkg/iac/terraform"
88
"github.com/hashicorp/hcl/v2"
9+
"github.com/hashicorp/hcl/v2/hclsyntax"
910
"github.com/zclconf/go-cty/cty"
1011

1112
"github.com/coder/preview/hclext"
@@ -315,16 +316,41 @@ func required(block *terraform.Block, keys ...string) hcl.Diagnostics {
315316

316317
func richParameterValue(block *terraform.Block) types.HCLString {
317318
// Find the value of the parameter from the context.
318-
paramPath := append([]string{"data"}, block.Labels()...)
319-
path := strings.Join(paramPath, ".")
319+
ref := block.Reference()
320+
travs := []hcl.Traverser{
321+
hcl.TraverseRoot{
322+
Name: "data",
323+
},
324+
hcl.TraverseAttr{
325+
Name: ref.TypeLabel(),
326+
},
327+
hcl.TraverseAttr{
328+
Name: ref.NameLabel(),
329+
},
330+
}
320331

321-
valueRef := hclext.ScopeTraversalExpr(append(paramPath, "value")...)
322-
val, diags := valueRef.Value(block.Context().Inner())
332+
raw := ref.RawKey()
333+
if !raw.IsNull() {
334+
travs = append(travs, hcl.TraverseIndex{
335+
Key: raw,
336+
SrcRange: hcl.Range{},
337+
})
338+
}
339+
340+
travs = append(travs, hcl.TraverseAttr{
341+
Name: "value",
342+
})
343+
344+
valRef := hclsyntax.ScopeTraversalExpr{
345+
Traversal: travs,
346+
}
347+
val, diags := valRef.Value(block.Context().Inner())
348+
source := ref.String()
323349
return types.HCLString{
324350
Value: val,
325351
ValueDiags: diags,
326-
ValueExpr: &valueRef,
327-
Source: &path,
352+
ValueExpr: &valRef,
353+
Source: &source,
328354
}
329355
}
330356

hclext/references.go

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,8 @@ import (
55
"strings"
66

77
"github.com/hashicorp/hcl/v2"
8-
"github.com/hashicorp/hcl/v2/hclsyntax"
98
)
109

11-
func ScopeTraversalExpr(parts ...string) hclsyntax.ScopeTraversalExpr {
12-
if len(parts) == 0 {
13-
return hclsyntax.ScopeTraversalExpr{}
14-
}
15-
16-
v := hclsyntax.ScopeTraversalExpr{
17-
Traversal: []hcl.Traverser{
18-
hcl.TraverseRoot{
19-
Name: parts[0],
20-
},
21-
},
22-
}
23-
for _, part := range parts[1:] {
24-
v.Traversal = append(v.Traversal, hcl.TraverseAttr{
25-
Name: part,
26-
})
27-
}
28-
return v
29-
}
30-
3110
func ReferenceNames(exp hcl.Expression) []string {
3211
allVars := exp.Variables()
3312
vars := make([]string, 0, len(allVars))

preview.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,12 @@ func Preview(ctx context.Context, input Input, dir fs.FS) (*Output, hcl.Diagnost
6868

6969
// moduleSource is "" for a local module
7070
p := parser.New(dir, "",
71-
parser.OptionStopOnHCLError(true),
71+
parser.OptionStopOnHCLError(false),
7272
parser.OptionWithDownloads(false),
7373
parser.OptionWithTFVarsPaths(varFiles...),
7474
parser.OptionWithEvalHook(planHook),
75-
parser.OptionWithEvalHook(ParameterContextsEvalHook(input)),
7675
parser.OptionWithEvalHook(ownerHook),
76+
parser.OptionWithEvalHook(ParameterContextsEvalHook(input)),
7777
parser.OptionWithSkipCachedModules(true),
7878
)
7979

preview_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,37 @@ func Test_Extract(t *testing.T) {
245245
expUnknowns: []string{},
246246
params: map[string]func(t *testing.T, parameter types.Parameter){},
247247
},
248+
{
249+
name: "demo",
250+
dir: "demo",
251+
expTags: map[string]string{
252+
"cluster": "confidential",
253+
},
254+
input: preview.Input{
255+
PlanJSONPath: "",
256+
ParameterValues: map[string]string{},
257+
Owner: types.WorkspaceOwner{
258+
Groups: []string{"admin"},
259+
},
260+
},
261+
expUnknowns: []string{},
262+
params: map[string]func(t *testing.T, parameter types.Parameter){},
263+
},
264+
{
265+
name: "defexpression",
266+
dir: "defexpression",
267+
expTags: map[string]string{},
268+
input: preview.Input{
269+
PlanJSONPath: "plan.json",
270+
ParameterValues: map[string]string{},
271+
Owner: types.WorkspaceOwner{},
272+
},
273+
expUnknowns: []string{},
274+
params: map[string]func(t *testing.T, parameter types.Parameter){
275+
//"hash": ap[cty.Value]().value(cty.StringVal("hash")).
276+
// f(),
277+
},
278+
},
248279
} {
249280
t.Run(tc.name, func(t *testing.T) {
250281
t.Parallel()

testdata/countsub/main.tf

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
terraform {
2+
required_providers {
3+
coder = {
4+
source = "coder/coder"
5+
}
6+
}
7+
}
8+
9+
module "sub" {
10+
source = "./submodule"
11+
}
12+
13+
data "coder_workspace_tags" "test" {
14+
tags = {
15+
"test" = tostring(module.sub.static == "static")
16+
}
17+
}
18+
19+
data "coder_parameter" "region" {
20+
count = module.sub.static == "static" ? 1 : 0
21+
name = "Region"
22+
description = "Which region would you like to deploy to?"
23+
type = "string"
24+
default = upper(module.sub.static)
25+
}

testdata/countsub/plan.json

Lines changed: 165 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,165 @@
1+
{
2+
"format_version": "1.2",
3+
"terraform_version": "1.11.0-dev",
4+
"planned_values": {
5+
"root_module": {}
6+
},
7+
"prior_state": {
8+
"format_version": "1.0",
9+
"terraform_version": "1.11.0",
10+
"values": {
11+
"root_module": {
12+
"resources": [
13+
{
14+
"address": "data.coder_parameter.region",
15+
"mode": "data",
16+
"type": "coder_parameter",
17+
"name": "region",
18+
"provider_name": "registry.terraform.io/coder/coder",
19+
"schema_version": 0,
20+
"values": {
21+
"default": "STATIC",
22+
"description": "Which region would you like to deploy to?",
23+
"display_name": null,
24+
"ephemeral": false,
25+
"icon": null,
26+
"id": "ba3edc1c-0c58-4be6-9d19-b12ff883fa2a",
27+
"mutable": false,
28+
"name": "Region",
29+
"option": null,
30+
"optional": true,
31+
"order": null,
32+
"type": "string",
33+
"validation": [],
34+
"value": "STATIC"
35+
},
36+
"sensitive_values": {
37+
"validation": []
38+
}
39+
},
40+
{
41+
"address": "data.coder_workspace_tags.test",
42+
"mode": "data",
43+
"type": "coder_workspace_tags",
44+
"name": "test",
45+
"provider_name": "registry.terraform.io/coder/coder",
46+
"schema_version": 0,
47+
"values": {
48+
"id": "56f64bcd-dee3-4db3-b254-97a44b0fb8e5",
49+
"tags": {
50+
"test": "true"
51+
}
52+
},
53+
"sensitive_values": {
54+
"tags": {}
55+
}
56+
},
57+
{
58+
"address": "data.docker_registry_image.coder",
59+
"mode": "data",
60+
"type": "docker_registry_image",
61+
"name": "coder",
62+
"provider_name": "registry.terraform.io/kreuzwerker/docker",
63+
"schema_version": 0,
64+
"values": {
65+
"id": "sha256:141d112217ea44f85a0319822be6499e03f37aa9f8ea2f04b21e6a2dcb5b859b",
66+
"insecure_skip_verify": false,
67+
"name": "ghcr.io/coder/coder:latest",
68+
"sha256_digest": "sha256:141d112217ea44f85a0319822be6499e03f37aa9f8ea2f04b21e6a2dcb5b859b"
69+
},
70+
"sensitive_values": {}
71+
}
72+
]
73+
}
74+
}
75+
},
76+
"configuration": {
77+
"provider_config": {
78+
"coder": {
79+
"name": "coder",
80+
"full_name": "registry.terraform.io/coder/coder"
81+
},
82+
"docker": {
83+
"name": "docker",
84+
"full_name": "registry.terraform.io/kreuzwerker/docker",
85+
"version_constraint": "3.0.2"
86+
}
87+
},
88+
"root_module": {
89+
"resources": [
90+
{
91+
"address": "data.coder_parameter.region",
92+
"mode": "data",
93+
"type": "coder_parameter",
94+
"name": "region",
95+
"provider_config_key": "coder",
96+
"expressions": {
97+
"default": {
98+
"references": [
99+
"module.sub.static",
100+
"module.sub"
101+
]
102+
},
103+
"description": {
104+
"constant_value": "Which region would you like to deploy to?"
105+
},
106+
"name": {
107+
"constant_value": "Region"
108+
},
109+
"type": {
110+
"constant_value": "string"
111+
}
112+
},
113+
"schema_version": 0
114+
},
115+
{
116+
"address": "data.coder_workspace_tags.test",
117+
"mode": "data",
118+
"type": "coder_workspace_tags",
119+
"name": "test",
120+
"provider_config_key": "coder",
121+
"expressions": {
122+
"tags": {
123+
"references": [
124+
"module.sub.static",
125+
"module.sub"
126+
]
127+
}
128+
},
129+
"schema_version": 0
130+
},
131+
{
132+
"address": "data.docker_registry_image.coder",
133+
"mode": "data",
134+
"type": "docker_registry_image",
135+
"name": "coder",
136+
"provider_config_key": "docker",
137+
"expressions": {
138+
"name": {
139+
"constant_value": "ghcr.io/coder/coder:latest"
140+
}
141+
},
142+
"schema_version": 0
143+
}
144+
],
145+
"module_calls": {
146+
"sub": {
147+
"source": "./submodule",
148+
"module": {
149+
"outputs": {
150+
"static": {
151+
"expression": {
152+
"constant_value": "static"
153+
}
154+
}
155+
}
156+
}
157+
}
158+
}
159+
}
160+
},
161+
"timestamp": "2025-03-04T17:01:06Z",
162+
"applyable": false,
163+
"complete": true,
164+
"errored": false
165+
}

testdata/countsub/submodule/main.tf

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
output "static" {
2+
value = "static"
3+
}

testdata/defexpression/main.tf

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
terraform {
2+
required_providers {
3+
coder = {
4+
source = "coder/coder"
5+
}
6+
docker = {
7+
source = "kreuzwerker/docker"
8+
version = "3.0.2"
9+
}
10+
}
11+
}
12+
13+
14+
data "coder_parameter" "hash" {
15+
# count = 1
16+
name = "hash"
17+
display_name = "Hash"
18+
description = "The hash of the image"
19+
type = "string"
20+
default = trimprefix(data.docker_registry_image.coder.sha256_digest, "sha256:")
21+
}
22+
23+
data "docker_registry_image" "coder" {
24+
name = "ghcr.io/coder/coder:latest"
25+
}

0 commit comments

Comments
 (0)