Skip to content

Commit

Permalink
Merge pull request #32111 from hashicorp/jbardin/refresh-only-data-read
Browse files Browse the repository at this point in the history
don't plan data source reads during refresh-only
  • Loading branch information
jbardin committed Nov 2, 2022
2 parents 6521355 + 300ad02 commit cccfa5e
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 4 deletions.
4 changes: 2 additions & 2 deletions internal/terraform/context_refresh_test.go
Expand Up @@ -201,12 +201,12 @@ func TestContext2Refresh_dataComputedModuleVar(t *testing.T) {
},
})

s, diags := ctx.Refresh(m, states.NewState(), &PlanOpts{Mode: plans.NormalMode})
plan, diags := ctx.Plan(m, states.NewState(), &PlanOpts{Mode: plans.RefreshOnlyMode})
if diags.HasErrors() {
t.Fatalf("refresh errors: %s", diags.Err())
}

checkStateString(t, s, `
checkStateString(t, plan.PriorState, `
<no state>
`)
}
Expand Down
13 changes: 12 additions & 1 deletion internal/terraform/node_resource_abstract_instance.go
Expand Up @@ -1562,7 +1562,7 @@ func (n *NodeAbstractResourceInstance) providerMetas(ctx EvalContext) (cty.Value
// value, but it still matches the previous state, then we can record a NoNop
// change. If the states don't match then we record a Read change so that the
// new value is applied to the state.
func (n *NodeAbstractResourceInstance) planDataSource(ctx EvalContext, checkRuleSeverity tfdiags.Severity) (*plans.ResourceInstanceChange, *states.ResourceInstanceObject, instances.RepetitionData, tfdiags.Diagnostics) {
func (n *NodeAbstractResourceInstance) planDataSource(ctx EvalContext, checkRuleSeverity tfdiags.Severity, skipPlanChanges bool) (*plans.ResourceInstanceChange, *states.ResourceInstanceObject, instances.RepetitionData, tfdiags.Diagnostics) {
var diags tfdiags.Diagnostics
var keyData instances.RepetitionData
var configVal cty.Value
Expand Down Expand Up @@ -1616,6 +1616,17 @@ func (n *NodeAbstractResourceInstance) planDataSource(ctx EvalContext, checkRule
// producing a "Read" change for this resource, and a placeholder value for
// it in the state.
if depsPending || !configKnown {
// We can't plan any changes if we're only refreshing, so the only
// value we can set here is whatever was in state previously.
if skipPlanChanges {
plannedNewState := &states.ResourceInstanceObject{
Value: priorVal,
Status: states.ObjectReady,
}

return nil, plannedNewState, keyData, diags
}

var reason plans.ResourceInstanceChangeActionReason
switch {
case !configKnown:
Expand Down
2 changes: 1 addition & 1 deletion internal/terraform/node_resource_plan_instance.go
Expand Up @@ -87,7 +87,7 @@ func (n *NodePlannableResourceInstance) dataResourceExecute(ctx EvalContext) (di
checkRuleSeverity = tfdiags.Warning
}

change, state, repeatData, planDiags := n.planDataSource(ctx, checkRuleSeverity)
change, state, repeatData, planDiags := n.planDataSource(ctx, checkRuleSeverity, n.skipPlanChanges)
diags = diags.Append(planDiags)
if diags.HasErrors() {
return diags
Expand Down

0 comments on commit cccfa5e

Please sign in to comment.