diff --git a/terraform/eval_read_data.go b/terraform/eval_read_data.go index b00f031a3..4630841b7 100644 --- a/terraform/eval_read_data.go +++ b/terraform/eval_read_data.go @@ -52,6 +52,12 @@ type evalReadData struct { // - If planned action is plans.Update, it indicates that the data source // was read, and the result needs to be stored in state during apply. OutputChange **plans.ResourceInstanceChange + + // dependsOn stores the list of transitive resource addresses that any + // configuration depends_on references may resolve to. This is used to + // determine if there are any changes that will force this data sources to + // be deferred to apply. + dependsOn []addrs.ConfigResource } // readDataSource handles everything needed to call ReadDataSource on the provider. @@ -235,7 +241,7 @@ func (n *evalReadDataRefresh) Eval(ctx EvalContext) (interface{}, error) { // refresh, that we can read this resource. If there are dependency updates // in the config, they we be discovered in plan and the data source will be // read again. - if !configKnown || (priorVal.IsNull() && len(n.Config.DependsOn) > 0) { + if !configKnown || (priorVal.IsNull() && n.forcePlanRead()) { if configKnown { log.Printf("[TRACE] evalReadDataRefresh: %s configuration is fully known, but we're forcing a read plan to be created", absAddr) } else { @@ -291,3 +297,10 @@ func (n *evalReadDataRefresh) Eval(ctx EvalContext) (interface{}, error) { return nil, diags.ErrWithWarnings() } + +// forcePlanRead determines if we need to override the usual behavior of +// immediately reading from the data source where possible, instead forcing us +// to generate a plan. +func (n *evalReadDataRefresh) forcePlanRead() bool { + return len(n.Config.DependsOn) > 0 || len(n.dependsOn) > 0 +} diff --git a/terraform/eval_read_data_plan.go b/terraform/eval_read_data_plan.go index 0a6d4c431..fd7fd276f 100644 --- a/terraform/eval_read_data_plan.go +++ b/terraform/eval_read_data_plan.go @@ -6,7 +6,6 @@ import ( "github.com/zclconf/go-cty/cty" - "github.com/hashicorp/terraform/addrs" "github.com/hashicorp/terraform/plans" "github.com/hashicorp/terraform/plans/objchange" "github.com/hashicorp/terraform/states" @@ -18,12 +17,6 @@ import ( // or generating a plan to do so. type evalReadDataPlan struct { evalReadData - - // dependsOn stores the list of transitive resource addresses that any - // configuration depends_on references may resolve to. This is used to - // determine if there are any changes that will force this data sources to - // be deferred to apply. - dependsOn []addrs.ConfigResource } func (n *evalReadDataPlan) Eval(ctx EvalContext) (interface{}, error) { diff --git a/terraform/graph_builder_refresh.go b/terraform/graph_builder_refresh.go index e34d05647..546fdff63 100644 --- a/terraform/graph_builder_refresh.go +++ b/terraform/graph_builder_refresh.go @@ -171,6 +171,7 @@ func (b *RefreshGraphBuilder) Steps() []GraphTransformer { // have to connect again later for providers and so on. &ReferenceTransformer{}, &AttachDependenciesTransformer{}, + &attachDataResourceDependenciesTransformer{}, // Target &TargetsTransformer{ diff --git a/terraform/node_data_refresh.go b/terraform/node_data_refresh.go index 98eda631c..0c191d272 100644 --- a/terraform/node_data_refresh.go +++ b/terraform/node_data_refresh.go @@ -121,6 +121,7 @@ func (n *NodeRefreshableDataResource) DynamicExpand(ctx EvalContext) (*Graph, er a.Config = n.Config a.ResolvedProvider = n.ResolvedProvider a.ProviderMetas = n.ProviderMetas + a.dependsOn = n.dependsOn return &NodeRefreshableDataResourceInstance{ NodeAbstractResourceInstance: a, @@ -227,6 +228,7 @@ func (n *NodeRefreshableDataResourceInstance) EvalTree() EvalNode { ProviderSchema: &providerSchema, OutputChange: &change, State: &state, + dependsOn: n.dependsOn, }, }, diff --git a/terraform/node_resource_plan_instance.go b/terraform/node_resource_plan_instance.go index 19f2b633f..4b9c2bde4 100644 --- a/terraform/node_resource_plan_instance.go +++ b/terraform/node_resource_plan_instance.go @@ -83,8 +83,8 @@ func (n *NodePlannableResourceInstance) evalTreeDataResource(addr addrs.AbsResou ProviderSchema: &providerSchema, OutputChange: &change, State: &state, + dependsOn: n.dependsOn, }, - dependsOn: n.dependsOn, }, &EvalWriteState{