diff --git a/internal/configs/config.go b/internal/configs/config.go index 7b74726510..888d2db1b0 100644 --- a/internal/configs/config.go +++ b/internal/configs/config.go @@ -483,6 +483,15 @@ func (c *Config) addProviderRequirements(reqs providerreqs.Requirements, recurse reqs[fqn] = nil } + for _, rc := range c.Module.Actions { + fqn := rc.Provider + if _, exists := reqs[fqn]; exists { + // Explicit dependency already present + continue + } + reqs[fqn] = nil + } + // Import blocks that are generating config may have a custom provider // meta-argument. Like the provider meta-argument used in resource blocks, // we use this opportunity to load any implicit providers. @@ -1022,6 +1031,9 @@ func (c *Config) EffectiveRequiredProviderConfigs() addrs.Map[addrs.RootProvider for _, rc := range c.Module.DataResources { maybePutLocal(rc.ProviderConfigAddr(), false) } + for _, rc := range c.Module.Actions { + maybePutLocal(rc.ProviderConfigAddr(), false) + } for _, ic := range c.Module.Import { if ic.ProviderConfigRef != nil { maybePutLocal(addrs.LocalProviderConfig{ diff --git a/internal/configs/config_test.go b/internal/configs/config_test.go index 9d81d12cc9..06d22fd3f6 100644 --- a/internal/configs/config_test.go +++ b/internal/configs/config_test.go @@ -29,14 +29,16 @@ func TestConfigProviderTypes(t *testing.T) { t.Fatal("expected empty result from empty config") } - cfg, diags := testModuleConfigFromFile("testdata/valid-files/providers-explicit-implied.tf") + cfg, diags := testModuleFromFileWithExperiments("testdata/valid-files/providers-explicit-implied.tf") if diags.HasErrors() { t.Fatal(diags.Error()) } got = cfg.ProviderTypes() + want := []addrs.Provider{ addrs.NewDefaultProvider("aws"), + addrs.NewDefaultProvider("external"), addrs.NewDefaultProvider("local"), addrs.NewDefaultProvider("null"), addrs.NewDefaultProvider("template"), diff --git a/internal/configs/parser_test.go b/internal/configs/parser_test.go index 868cd3d7e6..af80a343b2 100644 --- a/internal/configs/parser_test.go +++ b/internal/configs/parser_test.go @@ -52,6 +52,18 @@ func testModuleConfigFromFile(filename string) (*Config, hcl.Diagnostics) { return cfg, append(diags, moreDiags...) } +// testModuleFromFileWithExperiments File reads a single file from the given path as a +// module and returns its configuration. This is a helper for use in unit tests. +func testModuleFromFileWithExperiments(filename string) (*Config, hcl.Diagnostics) { + parser := NewParser(nil) + parser.AllowLanguageExperiments(true) + f, diags := parser.LoadConfigFile(filename) + mod, modDiags := NewModule([]*File{f}, nil) + diags = append(diags, modDiags...) + cfg, moreDiags := BuildConfig(mod, nil, nil) + return cfg, append(diags, moreDiags...) +} + // testModuleFromDir reads configuration from the given directory path as // a module and returns it. This is a helper for use in unit tests. func testModuleFromDir(path string) (*Module, hcl.Diagnostics) { diff --git a/internal/configs/testdata/valid-files/providers-explicit-implied.tf b/internal/configs/testdata/valid-files/providers-explicit-implied.tf index 49c063a1e2..882b494ed7 100644 --- a/internal/configs/testdata/valid-files/providers-explicit-implied.tf +++ b/internal/configs/testdata/valid-files/providers-explicit-implied.tf @@ -14,6 +14,9 @@ resource "null_resource" "foo" { } +action "external_test" "foo" { +} + import { id = "directory/filename" to = local_file.foo