pass ephemeral through various contexts

pull/35764/head
James Bardin 2 years ago
parent 0d3530c815
commit 94ea935cf1

@ -17,6 +17,7 @@ import (
"github.com/hashicorp/terraform/internal/plans/deferring"
"github.com/hashicorp/terraform/internal/providers"
"github.com/hashicorp/terraform/internal/refactoring"
"github.com/hashicorp/terraform/internal/resources/ephemeral"
"github.com/hashicorp/terraform/internal/states"
"github.com/hashicorp/terraform/internal/tfdiags"
)
@ -186,6 +187,7 @@ func (c *Context) graphWalker(graph *Graph, operation walkOperation, opts *graph
PrevRunState: prevRunState,
Changes: changes.SyncWrapper(),
NamedValues: namedvals.NewState(),
EphemeralResources: ephemeral.NewResources(),
Deferrals: deferred,
Checks: checkState,
InstanceExpander: instances.NewExpander(opts.Overrides),

@ -21,6 +21,7 @@ import (
"github.com/hashicorp/terraform/internal/namedvals"
"github.com/hashicorp/terraform/internal/plans"
"github.com/hashicorp/terraform/internal/plans/deferring"
"github.com/hashicorp/terraform/internal/resources/ephemeral"
"github.com/hashicorp/terraform/internal/states"
"github.com/hashicorp/terraform/internal/tfdiags"
)
@ -50,6 +51,10 @@ type Evaluator struct {
// variables, local values, and output values.
NamedValues *namedvals.State
// EphemeralResources tracks the currently-open instances of any ephemeral
// resources.
EphemeralResources *ephemeral.Resources
// Deferrals tracks resources and modules that have had either their
// expansion or their specific planned actions deferred to a future
// plan/apply round.

@ -21,6 +21,7 @@ import (
"github.com/hashicorp/terraform/internal/providers"
"github.com/hashicorp/terraform/internal/provisioners"
"github.com/hashicorp/terraform/internal/refactoring"
"github.com/hashicorp/terraform/internal/resources/ephemeral"
"github.com/hashicorp/terraform/internal/states"
"github.com/hashicorp/terraform/internal/tfdiags"
)
@ -32,14 +33,15 @@ type ContextGraphWalker struct {
// Configurable values
Context *Context
State *states.SyncState // Used for safe concurrent access to state
RefreshState *states.SyncState // Used for safe concurrent access to state
PrevRunState *states.SyncState // Used for safe concurrent access to state
Changes *plans.ChangesSync // Used for safe concurrent writes to changes
Checks *checks.State // Used for safe concurrent writes of checkable objects and their check results
NamedValues *namedvals.State // Tracks evaluation of input variables, local values, and output values
InstanceExpander *instances.Expander // Tracks our gradual expansion of module and resource instances
Deferrals *deferring.Deferred // Tracks any deferred actions
State *states.SyncState // Used for safe concurrent access to state
RefreshState *states.SyncState // Used for safe concurrent access to state
PrevRunState *states.SyncState // Used for safe concurrent access to state
Changes *plans.ChangesSync // Used for safe concurrent writes to changes
Checks *checks.State // Used for safe concurrent writes of checkable objects and their check results
NamedValues *namedvals.State // Tracks evaluation of input variables, local values, and output values
InstanceExpander *instances.Expander // Tracks our gradual expansion of module and resource instances
Deferrals *deferring.Deferred // Tracks any deferred actions
EphemeralResources *ephemeral.Resources // Tracks active instances of ephemeral resources
Imports []configs.Import
MoveResults refactoring.MoveResults // Read-only record of earlier processing of move statements
Operation walkOperation
@ -98,22 +100,24 @@ func (w *ContextGraphWalker) EvalContext() EvalContext {
// so that we can safely run multiple evaluations at once across
// different modules.
evaluator := &Evaluator{
Meta: w.Context.meta,
Config: w.Config,
Operation: w.Operation,
State: w.State,
Changes: w.Changes,
Plugins: w.Context.plugins,
Instances: w.InstanceExpander,
NamedValues: w.NamedValues,
Deferrals: w.Deferrals,
PlanTimestamp: w.PlanTimestamp,
Meta: w.Context.meta,
Config: w.Config,
Operation: w.Operation,
State: w.State,
Changes: w.Changes,
EphemeralResources: w.EphemeralResources,
Plugins: w.Context.plugins,
Instances: w.InstanceExpander,
NamedValues: w.NamedValues,
Deferrals: w.Deferrals,
PlanTimestamp: w.PlanTimestamp,
}
ctx := &BuiltinEvalContext{
StopContext: w.StopContext,
Hooks: w.Context.hooks,
InputValue: w.Context.uiInput,
EphemeralResourcesValue: w.EphemeralResources,
InstanceExpanderValue: w.InstanceExpander,
Plugins: w.Context.plugins,
ExternalProviderConfigs: w.ExternalProviderConfigs,

@ -4,6 +4,7 @@
package terraform
import (
"context"
"log"
"github.com/hashicorp/terraform/internal/addrs"
@ -213,6 +214,9 @@ func (n *nodeCloseModule) Execute(ctx EvalContext, op walkOperation) (diags tfdi
// any running plugins
diags = diags.Append(ctx.ClosePlugins())
// We also close up the ephemeral resource manager
diags = diags.Append(ctx.EphemeralResources().Close(context.TODO()))
switch op {
case walkApply, walkDestroy:
state := ctx.State().Lock()

@ -12,6 +12,7 @@ import (
"github.com/hashicorp/terraform/internal/addrs"
"github.com/hashicorp/terraform/internal/configs"
"github.com/hashicorp/terraform/internal/instances"
"github.com/hashicorp/terraform/internal/resources/ephemeral"
"github.com/hashicorp/terraform/internal/states"
)
@ -43,7 +44,8 @@ func TestNodeCloseModuleExecute(t *testing.T) {
state := states.NewState()
state.EnsureModule(addrs.RootModuleInstance.Child("child", addrs.NoKey))
ctx := &MockEvalContext{
StateState: state.SyncWrapper(),
StateState: state.SyncWrapper(),
EphemeralResourcesResources: ephemeral.NewResources(),
}
node := nodeCloseModule{addrs.Module{"child"}}
diags := node.Execute(ctx, walkApply)
@ -74,7 +76,8 @@ func TestNodeCloseModuleExecute(t *testing.T) {
state := states.NewState()
state.EnsureModule(addrs.RootModuleInstance.Child("child", addrs.NoKey))
ctx := &MockEvalContext{
StateState: state.SyncWrapper(),
StateState: state.SyncWrapper(),
EphemeralResourcesResources: ephemeral.NewResources(),
}
node := nodeCloseModule{addrs.Module{"child"}}

Loading…
Cancel
Save