From ab5bf50fc3a185ef722e2b57db2a5eb6bc7a2226 Mon Sep 17 00:00:00 2001 From: Kristin Laemmert Date: Fri, 25 Sep 2020 12:18:20 -0400 Subject: [PATCH] terrafrom: create NodeAbstractResource ReadResourceInstanceState function The original EvalReadState node is used only by `NodeAbstractResource`s, so I've created a new method on NodeAbstractResource which does the same thing as EvalReadState. When the EvalNode refactor project is complete, EvalReadState will be removed entirely. --- terraform/node_resource_abstract.go | 42 ++++++++++++++++++++++++++ terraform/node_resource_destroy.go | 8 +---- terraform/node_resource_plan_orphan.go | 11 ++----- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/terraform/node_resource_abstract.go b/terraform/node_resource_abstract.go index f74d651f3..8aef0a9b6 100644 --- a/terraform/node_resource_abstract.go +++ b/terraform/node_resource_abstract.go @@ -496,6 +496,48 @@ func (n *NodeAbstractResource) WriteResourceState(ctx EvalContext, addr addrs.Ab return nil } +func (n *NodeAbstractResource) ReadResourceInstanceState(ctx EvalContext, addr addrs.AbsResourceInstance) (*states.ResourceInstanceObject, error) { + provider, providerSchema, err := GetProvider(ctx, n.ResolvedProvider) + + if provider == nil { + panic("ReadResourceInstanceState used with no Provider object") + } + if providerSchema == nil { + panic("ReadResourceInstanceState used with no ProviderSchema object") + } + + log.Printf("[TRACE] ReadResourceInstanceState: reading state for %s", addr) + + src := ctx.State().ResourceInstanceObject(addr, states.CurrentGen) + if src == nil { + // Presumably we only have deposed objects, then. + log.Printf("[TRACE] ReadResourceInstanceState: no state present for %s", addr) + return nil, nil + } + + schema, currentVersion := (providerSchema).SchemaForResourceAddr(addr.Resource.ContainingResource()) + if schema == nil { + // Shouldn't happen since we should've failed long ago if no schema is present + return nil, fmt.Errorf("no schema available for %s while reading state; this is a bug in Terraform and should be reported", addr) + } + var diags tfdiags.Diagnostics + src, diags = UpgradeResourceState(addr, provider, src, schema, currentVersion) + if diags.HasErrors() { + // Note that we don't have any channel to return warnings here. We'll + // accept that for now since warnings during a schema upgrade would + // be pretty weird anyway, since this operation is supposed to seem + // invisible to the user. + return nil, diags.Err() + } + + obj, err := src.Decode(schema.ImpliedType()) + if err != nil { + return nil, err + } + + return obj, nil +} + // graphNodesAreResourceInstancesInDifferentInstancesOfSameModule is an // annoyingly-task-specific helper function that returns true if and only if // the following conditions hold: diff --git a/terraform/node_resource_destroy.go b/terraform/node_resource_destroy.go index 70533ca7f..7b1a2f580 100644 --- a/terraform/node_resource_destroy.go +++ b/terraform/node_resource_destroy.go @@ -170,13 +170,7 @@ func (n *NodeDestroyResourceInstance) Execute(ctx EvalContext, op walkOperation) return EvalEarlyExitError{} } - evalReadState := &EvalReadState{ - Addr: addr.Resource, - Output: &state, - Provider: &provider, - ProviderSchema: &providerSchema, - } - _, err = evalReadState.Eval(ctx) + state, err = n.ReadResourceInstanceState(ctx, addr) if err != nil { return err } diff --git a/terraform/node_resource_plan_orphan.go b/terraform/node_resource_plan_orphan.go index bbff235a5..53884534f 100644 --- a/terraform/node_resource_plan_orphan.go +++ b/terraform/node_resource_plan_orphan.go @@ -35,19 +35,12 @@ func (n *NodePlannableResourceInstanceOrphan) Execute(ctx EvalContext, op walkOp var change *plans.ResourceInstanceChange var state *states.ResourceInstanceObject - provider, providerSchema, err := GetProvider(ctx, n.ResolvedProvider) + _, providerSchema, err := GetProvider(ctx, n.ResolvedProvider) if err != nil { return err } - //EvalReadState - readState := &EvalReadState{ - Addr: addr.Resource, - Provider: &provider, - ProviderSchema: &providerSchema, - Output: &state, - } - _, err = readState.Eval(ctx) + state, err = n.ReadResourceInstanceState(ctx, addr) if err != nil { return err }