Skip to content

Commit b4f14cc

Browse files
authored
feat: include coder_parameters from external modules (#8195)
1 parent 0a6e644 commit b4f14cc

File tree

9 files changed

+526
-30
lines changed

9 files changed

+526
-30
lines changed

provisioner/terraform/resources.go

+24-14
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package terraform
22

33
import (
44
"fmt"
5+
"sort"
56
"strings"
67

78
"github.com/awalterschulze/gographviz"
@@ -723,29 +724,38 @@ func orderedRichParametersResources(tfResourcesRichParameters []*tfjson.StateRes
723724
return tfResourcesRichParameters
724725
}
725726

726-
ordered := make([]*tfjson.StateResource, len(orderedNames))
727-
for i, name := range orderedNames {
727+
var ordered []*tfjson.StateResource
728+
for _, name := range orderedNames {
728729
for _, resource := range tfResourcesRichParameters {
729730
if resource.Name == name {
730-
ordered[i] = resource
731+
ordered = append(ordered, resource)
731732
}
732733
}
733734
}
734735

735-
// There's an edge case possible for us to have a parameter name that isn't
736-
// present in the state, since the ordered names come statically from
737-
// parsing the Terraform file. We need to filter out the nil values if there
738-
// are any present.
739-
if len(tfResourcesRichParameters) != len(orderedNames) {
740-
nonNil := make([]*tfjson.StateResource, 0, len(ordered))
741-
for _, resource := range ordered {
742-
if resource != nil {
743-
nonNil = append(nonNil, resource)
736+
// Edge case: a parameter is present in an external module (Git repository, static files, etc.),
737+
// which can't be easily parsed to check the parameter order.
738+
// Those parameters will be prepended to the "ordered" list.
739+
var external []*tfjson.StateResource
740+
for _, resource := range tfResourcesRichParameters {
741+
isExternal := true
742+
for _, o := range ordered {
743+
if resource.Name == o.Name {
744+
isExternal = false
745+
break
744746
}
745747
}
746-
747-
ordered = nonNil
748+
if isExternal {
749+
external = append(external, resource)
750+
}
748751
}
749752

753+
if len(external) > 0 {
754+
sort.Slice(external, func(i, j int) bool {
755+
return external[i].Name < external[j].Name
756+
})
757+
758+
ordered = append(external, ordered...)
759+
}
750760
return ordered
751761
}

provisioner/terraform/resources_test.go

+24
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,30 @@ func TestConvertResources(t *testing.T) {
318318
}},
319319
}},
320320
parameters: []*proto.RichParameter{{
321+
Name: "First parameter from child module",
322+
Type: "string",
323+
Description: "First parameter from child module",
324+
Mutable: true,
325+
DefaultValue: "abcdef",
326+
}, {
327+
Name: "Second parameter from child module",
328+
Type: "string",
329+
Description: "Second parameter from child module",
330+
Mutable: true,
331+
DefaultValue: "ghijkl",
332+
}, {
333+
Name: "First parameter from module",
334+
Type: "string",
335+
Description: "First parameter from module",
336+
Mutable: true,
337+
DefaultValue: "abcdef",
338+
}, {
339+
Name: "Second parameter from module",
340+
Type: "string",
341+
Description: "Second parameter from module",
342+
Mutable: true,
343+
DefaultValue: "ghijkl",
344+
}, {
321345
Name: "Example",
322346
Type: "string",
323347
Options: []*proto.RichParameterOption{{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
terraform {
2+
required_providers {
3+
coder = {
4+
source = "coder/coder"
5+
version = "0.7.0"
6+
}
7+
docker = {
8+
source = "kreuzwerker/docker"
9+
version = "~> 2.22"
10+
}
11+
}
12+
}
13+
14+
data "coder_parameter" "child_first_parameter_from_module" {
15+
name = "First parameter from child module"
16+
mutable = true
17+
type = "string"
18+
description = "First parameter from child module"
19+
default = "abcdef"
20+
}
21+
22+
data "coder_parameter" "child_second_parameter_from_module" {
23+
name = "Second parameter from child module"
24+
mutable = true
25+
type = "string"
26+
description = "Second parameter from child module"
27+
default = "ghijkl"
28+
}
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 = "0.7.0"
6+
}
7+
docker = {
8+
source = "kreuzwerker/docker"
9+
version = "~> 2.22"
10+
}
11+
}
12+
}
13+
14+
module "this_is_external_child_module" {
15+
source = "./child-external-module"
16+
}
17+
18+
data "coder_parameter" "first_parameter_from_module" {
19+
name = "First parameter from module"
20+
mutable = true
21+
type = "string"
22+
description = "First parameter from module"
23+
default = "abcdef"
24+
}
25+
26+
data "coder_parameter" "second_parameter_from_module" {
27+
name = "Second parameter from module"
28+
mutable = true
29+
type = "string"
30+
description = "Second parameter from module"
31+
default = "ghijkl"
32+
}

provisioner/terraform/testdata/rich-parameters/rich-parameters.tf

+4
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ terraform {
77
}
88
}
99

10+
module "this_is_external_module" {
11+
source = "./external-module"
12+
}
13+
1014
data "coder_parameter" "sample" {
1115
name = "Sample"
1216
type = "string"

provisioner/terraform/testdata/rich-parameters/rich-parameters.tfplan.dot

+23
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)