From a51c034cc3a317e4cd9918859201230719697c2a Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 5 Jan 2024 16:32:17 -0800 Subject: [PATCH] stackeval: Include component configurations in our static walks This means both that the validate walk can now describe static problems in the component's module tree, and that we'll catch such problems earlier in the planning phase and thus avoid reporting them repeatedly in cases where a component block uses for_each to declare multiple instances. This includes a fix to a bug in StackConfig.Components, which was incorrectly using the input variable declarations as the source for its result, instead of the component declarations. --- .../internal/stackeval/component_config.go | 14 ++++++++++++-- .../internal/stackeval/stack_config.go | 2 +- .../stackruntime/internal/stackeval/walk_static.go | 4 ++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/internal/stacks/stackruntime/internal/stackeval/component_config.go b/internal/stacks/stackruntime/internal/stackeval/component_config.go index 88b9086adf..e14f54fb14 100644 --- a/internal/stacks/stackruntime/internal/stackeval/component_config.go +++ b/internal/stacks/stackruntime/internal/stackeval/component_config.go @@ -20,6 +20,7 @@ import ( "github.com/hashicorp/terraform/internal/promising" "github.com/hashicorp/terraform/internal/stacks/stackaddrs" "github.com/hashicorp/terraform/internal/stacks/stackconfig" + "github.com/hashicorp/terraform/internal/stacks/stackplan" "github.com/hashicorp/terraform/internal/tfdiags" "github.com/spf13/afero" "github.com/zclconf/go-cty/cty" @@ -228,8 +229,7 @@ func (c *ComponentConfig) ExprReferenceValue(ctx context.Context, phase EvalPhas return cty.DynamicVal } -// Validate implements Validatable. -func (c *ComponentConfig) Validate(ctx context.Context) tfdiags.Diagnostics { +func (c *ComponentConfig) checkValid(ctx context.Context, phase EvalPhase) tfdiags.Diagnostics { var diags tfdiags.Diagnostics _, moreDiags := c.CheckModuleTree(ctx) @@ -238,6 +238,16 @@ func (c *ComponentConfig) Validate(ctx context.Context) tfdiags.Diagnostics { return diags } +// Validate implements Validatable. +func (c *ComponentConfig) Validate(ctx context.Context) tfdiags.Diagnostics { + return c.checkValid(ctx, ValidatePhase) +} + +// PlanChanges implements Plannable. +func (c *ComponentConfig) PlanChanges(ctx context.Context) ([]stackplan.PlannedChange, tfdiags.Diagnostics) { + return nil, c.checkValid(ctx, PlanPhase) +} + func (c *ComponentConfig) tracingName() string { return c.Addr().String() } diff --git a/internal/stacks/stackruntime/internal/stackeval/stack_config.go b/internal/stacks/stackruntime/internal/stackeval/stack_config.go index 1e22ad6b20..b012eb2eb7 100644 --- a/internal/stacks/stackruntime/internal/stackeval/stack_config.go +++ b/internal/stacks/stackruntime/internal/stackeval/stack_config.go @@ -303,7 +303,7 @@ func (s *StackConfig) Components(ctx context.Context) map[stackaddrs.Component]* return nil } ret := make(map[stackaddrs.Component]*ComponentConfig, len(s.config.Stack.Components)) - for name := range s.config.Stack.InputVariables { + for name := range s.config.Stack.Components { addr := stackaddrs.Component{Name: name} ret[addr] = s.Component(ctx, addr) } diff --git a/internal/stacks/stackruntime/internal/stackeval/walk_static.go b/internal/stacks/stackruntime/internal/stackeval/walk_static.go index ad96e0c8e4..d23469f2dc 100644 --- a/internal/stacks/stackruntime/internal/stackeval/walk_static.go +++ b/internal/stacks/stackruntime/internal/stackeval/walk_static.go @@ -53,6 +53,10 @@ func walkStaticObjectsInStackConfig[Output any]( // TODO: All of the other static object types + for _, obj := range stackConfig.Components(ctx) { + visit(ctx, walk, obj) + } + for _, obj := range stackConfig.StackCalls(ctx) { visit(ctx, walk, obj) }