From a1829fc8bd2ea2867bdfda5c327a720c3997d8f2 Mon Sep 17 00:00:00 2001 From: Christian Mesh Date: Thu, 15 Jan 2026 08:26:42 -0500 Subject: [PATCH] Add comments on partial GraphNodeProvider implementation Signed-off-by: Christian Mesh --- internal/tofu/node_provider.go | 2 +- internal/tofu/node_provider_abstract.go | 9 ++++++--- internal/tofu/node_provider_eval.go | 2 +- internal/tofu/transform_provider.go | 7 +++++++ 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/internal/tofu/node_provider.go b/internal/tofu/node_provider.go index 46ae5b3710..166977118b 100644 --- a/internal/tofu/node_provider.go +++ b/internal/tofu/node_provider.go @@ -57,7 +57,7 @@ type NodeApplyableProvider struct { var ( _ GraphNodeExecutable = (*NodeApplyableProvider)(nil) - _ GraphNodeProvider = (*NodeApplyableProvider)(nil) + _ GraphNodeProvider = (*NodeApplyableProvider)(nil) // Partial, see NodeAbstractProvider ) // GraphNodeProvider diff --git a/internal/tofu/node_provider_abstract.go b/internal/tofu/node_provider_abstract.go index 34e336cd96..14bb8dc1fa 100644 --- a/internal/tofu/node_provider_abstract.go +++ b/internal/tofu/node_provider_abstract.go @@ -18,7 +18,10 @@ import ( type ConcreteProviderNodeFunc func(*NodeAbstractProvider) dag.Vertex // NodeAbstractProvider represents a provider that has no associated operations. -// It registers all the common interfaces across operations for providers. +// It registers all the common interfaces across operations for providers, except +// for GraphNodeProvider as that depends on additional implementation details. +// It does however implement what methods it can from GraphNodeProvider to reduce +// duplication between concrete implementations. type NodeAbstractProvider struct { Addr addrs.AbsProviderConfig @@ -63,12 +66,12 @@ func (n *NodeAbstractProvider) References() []*addrs.Reference { return ReferencesFromConfig(n.Config.Config, n.Schema) } -// GraphNodeProvider +// GraphNodeProvider (Partial Implementation) func (n *NodeAbstractProvider) ProviderAddr() addrs.AbsProviderConfig { return n.Addr } -// GraphNodeProvider +// GraphNodeProvider (Partial Implementation) func (n *NodeAbstractProvider) ProviderConfig() *configs.Provider { if n.Config == nil { return nil diff --git a/internal/tofu/node_provider_eval.go b/internal/tofu/node_provider_eval.go index 85131a9a3a..a7660c300a 100644 --- a/internal/tofu/node_provider_eval.go +++ b/internal/tofu/node_provider_eval.go @@ -24,7 +24,7 @@ type NodeEvalableProvider struct { } var _ GraphNodeExecutable = (*NodeEvalableProvider)(nil) -var _ GraphNodeProvider = (*NodeEvalableProvider)(nil) +var _ GraphNodeProvider = (*NodeEvalableProvider)(nil) // Partial, see NodeAbstractProvider // GraphNodeProvider func (n *NodeEvalableProvider) Instance(key addrs.InstanceKey) providers.Configured { diff --git a/internal/tofu/transform_provider.go b/internal/tofu/transform_provider.go index 3aa4f544c4..b978a5d230 100644 --- a/internal/tofu/transform_provider.go +++ b/internal/tofu/transform_provider.go @@ -54,7 +54,14 @@ type GraphNodeProvider interface { GraphNodeModulePath ProviderAddr() addrs.AbsProviderConfig Name() string + // Retrieve the instance specified by the key. + // With the limited implementation of provider for_each, we only support + // keys after the AbsProviderConfig level and not at any of the modules it may live in + // This is a hard requirement that we have determined it is too hard to change, + // which is an extension of the "provider configurations may not live in modules with + // expansion" that we ensure within the configuration. Instance(addrs.InstanceKey) providers.Configured + // Call close for all provider instances within this GraphNodeProvider Close(ctx context.Context) error // For test framework MocksAndOverrides() (IsMocked bool, MockResources []*configs.MockResource, OverrideResources []*configs.OverrideResource)