diff --git a/rules/terraform_required_providers_test.go b/rules/terraform_required_providers_test.go index 89a1395..551b058 100644 --- a/rules/terraform_required_providers_test.go +++ b/rules/terraform_required_providers_test.go @@ -64,6 +64,31 @@ resource "random_string" "foo" { }, }, }, + { + Name: "implicit provider - resource", + Content: ` +ephemeral "random_string" "foo" { + length = 16 +} +`, + Expected: helper.Issues{ + { + Rule: NewTerraformRequiredProvidersRule(), + Message: "Missing version constraint for provider \"random\" in `required_providers`", + Range: hcl.Range{ + Filename: "module.tf", + Start: hcl.Pos{ + Line: 2, + Column: 1, + }, + End: hcl.Pos{ + Line: 2, + Column: 32, + }, + }, + }, + }, + }, { Name: "implicit provider - data source", Content: ` @@ -96,11 +121,11 @@ terraform { required_providers { template = { source = "hashicorp/template" - version = "~> 2" + version = "~> 2" } } } -provider "template" {} +provider "template" {} `, Expected: helper.Issues{}, }, @@ -112,7 +137,7 @@ terraform { template = "~> 2" } } -provider "template" {} +provider "template" {} `, Expected: helper.Issues{ { @@ -154,7 +179,7 @@ terraform { } } -provider "template" {} +provider "template" {} `, Expected: helper.Issues{ { @@ -185,7 +210,7 @@ terraform { } } -provider "template" {} +provider "template" {} `, Config: ` rule "terraform_required_providers" { @@ -207,7 +232,7 @@ terraform { } } -provider "template" {} +provider "template" {} `, Expected: helper.Issues{ { @@ -250,7 +275,7 @@ terraform { } } -provider "template" {} +provider "template" {} `, Config: ` rule "terraform_required_providers" { @@ -270,7 +295,7 @@ terraform { } } -provider "template" {} +provider "template" {} `, Expected: helper.Issues{ { @@ -355,7 +380,7 @@ terraform { provider "template" { version = "~> 2" -} +} `, Expected: helper.Issues{ { @@ -409,7 +434,7 @@ terraform { provider "template" { alias = "foo" version = "~> 2" -} +} `, Expected: helper.Issues{ { diff --git a/rules/terraform_unused_required_providers_test.go b/rules/terraform_unused_required_providers_test.go index c846396..3bf1b86 100644 --- a/rules/terraform_unused_required_providers_test.go +++ b/rules/terraform_unused_required_providers_test.go @@ -32,6 +32,21 @@ func Test_TerraformUnusedRequiredProvidersRule(t *testing.T) { `, Expected: helper.Issues{}, }, + { + Name: "used - ephemeral resource", + Content: ` + terraform { + required_providers { + null = { + source = "hashicorp/null" + } + } + } + + ephemeral "null_resource" "foo" {} + `, + Expected: helper.Issues{}, + }, { Name: "used - data source", Content: ` @@ -42,7 +57,7 @@ func Test_TerraformUnusedRequiredProvidersRule(t *testing.T) { } } } - resource "null_data_source" "foo" {} + data "null_data_source" "foo" {} `, Expected: helper.Issues{}, }, @@ -56,7 +71,7 @@ func Test_TerraformUnusedRequiredProvidersRule(t *testing.T) { } } } - resource "null_resource" "foo" { + data "null_resource" "foo" { provider = custom-null } `, @@ -72,7 +87,7 @@ func Test_TerraformUnusedRequiredProvidersRule(t *testing.T) { } } } - resource "null_data_source" "foo" { + data "null_data_source" "foo" { provider = custom-null } `, diff --git a/terraform/runner.go b/terraform/runner.go index 8f0179a..11c61a4 100644 --- a/terraform/runner.go +++ b/terraform/runner.go @@ -122,6 +122,15 @@ func (r *Runner) GetProviderRefs() (map[string]*ProviderRef, hcl.Diagnostics) { }, }, }, + { + Type: "ephemeral", + LabelNames: []string{"type", "name"}, + Body: &hclext.BodySchema{ + Attributes: []hclext.AttributeSchema{ + {Name: "provider"}, + }, + }, + }, { Type: "data", LabelNames: []string{"type", "name"}, @@ -177,9 +186,7 @@ func (r *Runner) GetProviderRefs() (map[string]*ProviderRef, hcl.Diagnostics) { var diags hcl.Diagnostics for _, block := range body.Blocks { switch block.Type { - case "resource": - fallthrough - case "data": + case "resource", "ephemeral", "data": if attr, exists := block.Body.Attributes["provider"]; exists { ref, decodeDiags := decodeProviderRef(attr.Expr, block.DefRange) diags = diags.Extend(decodeDiags)