Skip to content

Commit ed41301

Browse files
authored
required_providers: support ephemeral resources (#252)
1 parent c11fbd5 commit ed41301

File tree

3 files changed

+63
-16
lines changed

3 files changed

+63
-16
lines changed

rules/terraform_required_providers_test.go

+35-10
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,31 @@ resource "random_string" "foo" {
6464
},
6565
},
6666
},
67+
{
68+
Name: "implicit provider - resource",
69+
Content: `
70+
ephemeral "random_string" "foo" {
71+
length = 16
72+
}
73+
`,
74+
Expected: helper.Issues{
75+
{
76+
Rule: NewTerraformRequiredProvidersRule(),
77+
Message: "Missing version constraint for provider \"random\" in `required_providers`",
78+
Range: hcl.Range{
79+
Filename: "module.tf",
80+
Start: hcl.Pos{
81+
Line: 2,
82+
Column: 1,
83+
},
84+
End: hcl.Pos{
85+
Line: 2,
86+
Column: 32,
87+
},
88+
},
89+
},
90+
},
91+
},
6792
{
6893
Name: "implicit provider - data source",
6994
Content: `
@@ -96,11 +121,11 @@ terraform {
96121
required_providers {
97122
template = {
98123
source = "hashicorp/template"
99-
version = "~> 2"
124+
version = "~> 2"
100125
}
101126
}
102127
}
103-
provider "template" {}
128+
provider "template" {}
104129
`,
105130
Expected: helper.Issues{},
106131
},
@@ -112,7 +137,7 @@ terraform {
112137
template = "~> 2"
113138
}
114139
}
115-
provider "template" {}
140+
provider "template" {}
116141
`,
117142
Expected: helper.Issues{
118143
{
@@ -154,7 +179,7 @@ terraform {
154179
}
155180
}
156181
157-
provider "template" {}
182+
provider "template" {}
158183
`,
159184
Expected: helper.Issues{
160185
{
@@ -185,7 +210,7 @@ terraform {
185210
}
186211
}
187212
188-
provider "template" {}
213+
provider "template" {}
189214
`,
190215
Config: `
191216
rule "terraform_required_providers" {
@@ -207,7 +232,7 @@ terraform {
207232
}
208233
}
209234
210-
provider "template" {}
235+
provider "template" {}
211236
`,
212237
Expected: helper.Issues{
213238
{
@@ -250,7 +275,7 @@ terraform {
250275
}
251276
}
252277
253-
provider "template" {}
278+
provider "template" {}
254279
`,
255280
Config: `
256281
rule "terraform_required_providers" {
@@ -270,7 +295,7 @@ terraform {
270295
}
271296
}
272297
273-
provider "template" {}
298+
provider "template" {}
274299
`,
275300
Expected: helper.Issues{
276301
{
@@ -355,7 +380,7 @@ terraform {
355380
356381
provider "template" {
357382
version = "~> 2"
358-
}
383+
}
359384
`,
360385
Expected: helper.Issues{
361386
{
@@ -409,7 +434,7 @@ terraform {
409434
provider "template" {
410435
alias = "foo"
411436
version = "~> 2"
412-
}
437+
}
413438
`,
414439
Expected: helper.Issues{
415440
{

rules/terraform_unused_required_providers_test.go

+18-3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,21 @@ func Test_TerraformUnusedRequiredProvidersRule(t *testing.T) {
3232
`,
3333
Expected: helper.Issues{},
3434
},
35+
{
36+
Name: "used - ephemeral resource",
37+
Content: `
38+
terraform {
39+
required_providers {
40+
null = {
41+
source = "hashicorp/null"
42+
}
43+
}
44+
}
45+
46+
ephemeral "null_resource" "foo" {}
47+
`,
48+
Expected: helper.Issues{},
49+
},
3550
{
3651
Name: "used - data source",
3752
Content: `
@@ -42,7 +57,7 @@ func Test_TerraformUnusedRequiredProvidersRule(t *testing.T) {
4257
}
4358
}
4459
}
45-
resource "null_data_source" "foo" {}
60+
data "null_data_source" "foo" {}
4661
`,
4762
Expected: helper.Issues{},
4863
},
@@ -56,7 +71,7 @@ func Test_TerraformUnusedRequiredProvidersRule(t *testing.T) {
5671
}
5772
}
5873
}
59-
resource "null_resource" "foo" {
74+
data "null_resource" "foo" {
6075
provider = custom-null
6176
}
6277
`,
@@ -72,7 +87,7 @@ func Test_TerraformUnusedRequiredProvidersRule(t *testing.T) {
7287
}
7388
}
7489
}
75-
resource "null_data_source" "foo" {
90+
data "null_data_source" "foo" {
7691
provider = custom-null
7792
}
7893
`,

terraform/runner.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,15 @@ func (r *Runner) GetProviderRefs() (map[string]*ProviderRef, hcl.Diagnostics) {
122122
},
123123
},
124124
},
125+
{
126+
Type: "ephemeral",
127+
LabelNames: []string{"type", "name"},
128+
Body: &hclext.BodySchema{
129+
Attributes: []hclext.AttributeSchema{
130+
{Name: "provider"},
131+
},
132+
},
133+
},
125134
{
126135
Type: "data",
127136
LabelNames: []string{"type", "name"},
@@ -177,9 +186,7 @@ func (r *Runner) GetProviderRefs() (map[string]*ProviderRef, hcl.Diagnostics) {
177186
var diags hcl.Diagnostics
178187
for _, block := range body.Blocks {
179188
switch block.Type {
180-
case "resource":
181-
fallthrough
182-
case "data":
189+
case "resource", "ephemeral", "data":
183190
if attr, exists := block.Body.Attributes["provider"]; exists {
184191
ref, decodeDiags := decodeProviderRef(attr.Expr, block.DefRange)
185192
diags = diags.Extend(decodeDiags)

0 commit comments

Comments
 (0)