Skip to content

Commit d157f35

Browse files
committed
feat: generate providers (experimental)
Signed-off-by: i4k <[email protected]>
1 parent f7e88f9 commit d157f35

File tree

9 files changed

+240
-2
lines changed

9 files changed

+240
-2
lines changed

.github/workflows/ci.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,12 @@ jobs:
2020
uses: terramate-io/terramate-action@v1
2121

2222
- name: Run generate tests
23-
run: terramate generate
23+
shell: bash
24+
run: |
25+
while :
26+
do
27+
terramate generate --detailed-exit-code
28+
if [ "$?" -neq "2" ];
29+
exit $?
30+
fi
31+
done
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
# Generate the required_providers and providers block.
2+
#
3+
# Example configuration:
4+
globals "modules" "generate" "terraform" "providers" {
5+
entries = [
6+
# {
7+
# name = "aws"
8+
# source = "hashicorp/aws"
9+
# version = "~> 5.0"
10+
# config = {
11+
# attributes = {
12+
# region = "us-east-1"
13+
# }
14+
15+
# blocks = [
16+
# {
17+
# name = "assume_role"
18+
# attributes = {
19+
# role_arn = "arn:aws:iam::123456789012:role/ROLE_NAME"
20+
# session_name = "SESSION_NAME"
21+
# external_id = "EXTERNAL_ID"
22+
# }
23+
# },
24+
# {
25+
# name = "assume_role"
26+
# attributes = {
27+
# role_arn = "arn:aws:iam::123456789012:role/FINAL_ROLE_NAME"
28+
# }
29+
# },
30+
# {
31+
# name = "any_other_block_name"
32+
# attributes = {
33+
# whatever = 1
34+
# }
35+
# },
36+
# ]
37+
# }
38+
# }
39+
]
40+
}
41+
42+
generate_hcl "_providers.tm" {
43+
lets {
44+
entries = tm_try(global.modules.generate.terraform.providers.entries, [])
45+
}
46+
content {
47+
generate_hcl "_providers.tf" {
48+
lets {
49+
entries = tm_hcl_expression("global.modules.generate.terraform.providers.entries")
50+
required_providers = tm_hcl_expression("{ for v in let.entries : v.name => {source = v.source, version = v.version}}")
51+
}
52+
53+
content {
54+
terraform {
55+
tm_dynamic "tm_dynamic" {
56+
labels = ["required_providers"]
57+
attributes = {
58+
for_each = tm_hcl_expression("tm_length(let.required_providers) > 0 ? [1] : []")
59+
attributes = tm_hcl_expression("let.required_providers")
60+
}
61+
}
62+
63+
tm_dynamic "tm_dynamic" {
64+
labels = ["provider"]
65+
attributes = {
66+
for_each = tm_hcl_expression("let.entries")
67+
iterator = tm_hcl_expression("p")
68+
labels = tm_hcl_expression("[p.value.name]")
69+
attributes = tm_hcl_expression("p.value.config.attributes")
70+
}
71+
72+
content {
73+
content {
74+
# hacks until Terramate supports tm_dynamic.block attribute.
75+
tm_dynamic "tm_dynamic" {
76+
for_each = tm_distinct(tm_flatten([for i, p in let.entries : [for b in tm_try(p.config.blocks, []) : b.name]]))
77+
iterator = block
78+
labels = [block.value]
79+
attributes = {
80+
for_each = tm_hcl_expression("[for b in tm_try(p.value.config.blocks, []) : b if b.name == \"${block.value}\"]")
81+
iterator = tm_hcl_expression("b")
82+
attributes = tm_hcl_expression("b.value.attributes")
83+
}
84+
}
85+
}
86+
}
87+
}
88+
}
89+
}
90+
}
91+
}
92+
}
93+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT
2+
3+
terraform {
4+
required_providers {
5+
aws = {
6+
source = "hashicorp/aws"
7+
version = "~> 5.0"
8+
}
9+
google = {
10+
source = "hashicorp/google"
11+
version = "~> 6.6.0"
12+
}
13+
}
14+
provider "aws" {
15+
region = "us-east-1"
16+
assume_role {
17+
external_id = "EXTERNAL_ID"
18+
role_arn = "arn:aws:iam::123456789012:role/ROLE_NAME"
19+
session_name = "SESSION_NAME"
20+
}
21+
assume_role {
22+
role_arn = "arn:aws:iam::123456789012:role/FINAL_ROLE_NAME"
23+
}
24+
any_other_block_name {
25+
whatever = 1
26+
}
27+
}
28+
provider "google" {
29+
project = "my-project-id"
30+
region = "us-central1"
31+
}
32+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// TERRAMATE: GENERATED AUTOMATICALLY DO NOT EDIT
2+
3+
generate_hcl "_providers.tf" {
4+
lets {
5+
entries = global.modules.generate.terraform.providers.entries
6+
required_providers = { for v in let.entries : v.name => {
7+
source = v.source
8+
version = v.version
9+
} }
10+
}
11+
content {
12+
terraform {
13+
tm_dynamic "required_providers" {
14+
attributes = let.required_providers
15+
for_each = tm_length(let.required_providers) > 0 ? [
16+
1,
17+
] : [
18+
]
19+
}
20+
tm_dynamic "provider" {
21+
attributes = p.value.config.attributes
22+
for_each = let.entries
23+
iterator = p
24+
labels = [
25+
p.value.name,
26+
]
27+
content {
28+
tm_dynamic "assume_role" {
29+
attributes = b.value.attributes
30+
for_each = [for b in tm_try(p.value.config.blocks, [
31+
]) : b if b.name == "assume_role"]
32+
iterator = b
33+
}
34+
tm_dynamic "any_other_block_name" {
35+
attributes = b.value.attributes
36+
for_each = [for b in tm_try(p.value.config.blocks, [
37+
]) : b if b.name == "any_other_block_name"]
38+
iterator = b
39+
}
40+
}
41+
}
42+
}
43+
}
44+
}

tests/generate/providers/stack.tm.hcl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
stack {
2+
name = "providers"
3+
description = "providers"
4+
id = "91d68d46-42f4-4c78-9446-a099b174bdc4"
5+
tags = ["tests", "terraform"]
6+
}

tests/generate/providers/tests.tm

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
# Test providers block generation
2+
3+
import {
4+
source = "/generate/terraform/providers/providers.tm"
5+
}
6+
7+
globals "modules" "generate" "terraform" "providers" {
8+
entries = [
9+
{
10+
name = "aws"
11+
source = "hashicorp/aws"
12+
version = "~> 5.0"
13+
config = {
14+
attributes = {
15+
region = "us-east-1"
16+
}
17+
18+
blocks = [
19+
{
20+
name = "assume_role"
21+
attributes = {
22+
role_arn = "arn:aws:iam::123456789012:role/ROLE_NAME"
23+
session_name = "SESSION_NAME"
24+
external_id = "EXTERNAL_ID"
25+
}
26+
},
27+
{
28+
name = "assume_role"
29+
attributes = {
30+
role_arn = "arn:aws:iam::123456789012:role/FINAL_ROLE_NAME"
31+
}
32+
},
33+
{
34+
name = "any_other_block_name"
35+
attributes = {
36+
whatever = 1
37+
}
38+
},
39+
]
40+
}
41+
},
42+
{
43+
name = "google"
44+
source = "hashicorp/google"
45+
version = "~> 6.6.0",
46+
config = {
47+
attributes = {
48+
project = "my-project-id"
49+
region = "us-central1"
50+
}
51+
}
52+
}
53+
]
54+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
stack {
2-
name = "strings"
2+
name = "variables"
33
description = "strings"
44
id = "40baaeaa-feea-405f-91c0-9424c060fe89"
5+
tags = ["tests", "terraform"]
56
}

0 commit comments

Comments
 (0)