don't plan data source reads during refresh-only

When executing a refresh-only plan, it is not valid to plan a data
source read. If the data source config is not known during planning, the
only valid update would be the prior state, if there is any.
This commit is contained in:
James Bardin 2022-10-28 10:45:49 -04:00
parent 730756eca2
commit 300ad02937
3 changed files with 15 additions and 4 deletions

View File

@ -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>
`)
}

View File

@ -1555,7 +1555,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
@ -1609,6 +1609,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:

View File

@ -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