From 84f7116ac89ed32da180baaa288b66c105885064 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Wed, 23 Sep 2020 11:05:09 -0400 Subject: [PATCH] thread skipContext through to the instance node --- terraform/graph_builder_plan.go | 4 ++ terraform/node_resource_plan.go | 8 ++++ terraform/node_resource_plan_instance.go | 56 ++++++++++++++---------- 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/terraform/graph_builder_plan.go b/terraform/graph_builder_plan.go index 082d9721ca..d6bab3a6d6 100644 --- a/terraform/graph_builder_plan.go +++ b/terraform/graph_builder_plan.go @@ -42,6 +42,9 @@ type PlanGraphBuilder struct { // Validate will do structural validation of the graph. Validate bool + // skipRefresh indicates that we should skip refreshing managed resources + skipRefresh bool + // CustomConcrete can be set to customize the node types created // for various parts of the plan. This is useful in order to customize // the plan behavior. @@ -196,6 +199,7 @@ func (b *PlanGraphBuilder) init() { b.ConcreteResource = func(a *NodeAbstractResource) dag.Vertex { return &nodeExpandPlannableResource{ NodeAbstractResource: a, + skipRefresh: b.skipRefresh, } } diff --git a/terraform/node_resource_plan.go b/terraform/node_resource_plan.go index d201207156..e62d9401fd 100644 --- a/terraform/node_resource_plan.go +++ b/terraform/node_resource_plan.go @@ -21,6 +21,9 @@ type nodeExpandPlannableResource struct { // on regardless of what the configuration says. ForceCreateBeforeDestroy *bool + // skipRefresh indicates that we should skip refreshing individual instances + skipRefresh bool + // We attach dependencies to the Resource during refresh, since the // instances are instantiated during DynamicExpand. dependencies []addrs.ConfigResource @@ -82,6 +85,7 @@ func (n *nodeExpandPlannableResource) DynamicExpand(ctx EvalContext) (*Graph, er Addr: resAddr, ForceCreateBeforeDestroy: n.ForceCreateBeforeDestroy, dependencies: n.dependencies, + skipRefresh: n.skipRefresh, }) } @@ -144,6 +148,9 @@ type NodePlannableResource struct { // on regardless of what the configuration says. ForceCreateBeforeDestroy *bool + // skipRefresh indicates that we should skip refreshing individual instances + skipRefresh bool + dependencies []addrs.ConfigResource } @@ -243,6 +250,7 @@ func (n *NodePlannableResource) DynamicExpand(ctx EvalContext) (*Graph, error) { // to force on CreateBeforeDestroy due to dependencies on other // nodes that have it. ForceCreateBeforeDestroy: n.CreateBeforeDestroy(), + skipRefresh: n.skipRefresh, } } diff --git a/terraform/node_resource_plan_instance.go b/terraform/node_resource_plan_instance.go index 6176eb3c3b..523f0001dd 100644 --- a/terraform/node_resource_plan_instance.go +++ b/terraform/node_resource_plan_instance.go @@ -16,6 +16,7 @@ import ( type NodePlannableResourceInstance struct { *NodeAbstractResourceInstance ForceCreateBeforeDestroy bool + skipRefresh bool } var ( @@ -134,29 +135,38 @@ func (n *NodePlannableResourceInstance) evalTreeManagedResource(addr addrs.AbsRe ProviderSchema: &providerSchema, }, - // Refresh the instance - &EvalReadState{ - Addr: addr.Resource, - Provider: &provider, - ProviderSchema: &providerSchema, - Output: &instanceRefreshState, - }, - &EvalRefresh{ - Addr: addr.Resource, - ProviderAddr: n.ResolvedProvider, - Provider: &provider, - ProviderMetas: n.ProviderMetas, - ProviderSchema: &providerSchema, - State: &instanceRefreshState, - Output: &instanceRefreshState, - }, - &EvalWriteState{ - Addr: addr.Resource, - ProviderAddr: n.ResolvedProvider, - State: &instanceRefreshState, - ProviderSchema: &providerSchema, - targetState: refreshState, - Dependencies: &n.Dependencies, + &EvalIf{ + If: func(ctx EvalContext) (bool, error) { + return !n.skipRefresh, nil + }, + Then: &EvalSequence{ + Nodes: []EvalNode{ + // Refresh the instance + &EvalReadState{ + Addr: addr.Resource, + Provider: &provider, + ProviderSchema: &providerSchema, + Output: &instanceRefreshState, + }, + &EvalRefresh{ + Addr: addr.Resource, + ProviderAddr: n.ResolvedProvider, + Provider: &provider, + ProviderMetas: n.ProviderMetas, + ProviderSchema: &providerSchema, + State: &instanceRefreshState, + Output: &instanceRefreshState, + }, + &EvalWriteState{ + Addr: addr.Resource, + ProviderAddr: n.ResolvedProvider, + State: &instanceRefreshState, + ProviderSchema: &providerSchema, + targetState: refreshState, + Dependencies: &n.Dependencies, + }, + }, + }, }, // Plan the instance