Skip to content

Commit

Permalink
stacks: check if resource instance is deferred
Browse files Browse the repository at this point in the history
before marking it as deferred
  • Loading branch information
DanielMSchmidt committed Apr 8, 2024
1 parent 3010610 commit 4db9ab8
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 6 deletions.
19 changes: 18 additions & 1 deletion internal/plans/deferring/deferred.go
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,22 @@ func (d *Deferred) HaveAnyDeferrals() bool {
len(d.partialExpandedModulesDeferred) != 0)
}

// IsResourceInstanceDeferred returns true if the receiver knows some reason
// why the resource instance with the given address should have its planned
// action deferred for a future plan/apply round.
func (d *Deferred) IsResourceInstanceDeferred(addr addrs.AbsResourceInstance) bool {
if d.externalDependencyDeferred {
return true
}

// Our resource graph describes relationships between the static resource
// configuration blocks, not their dynamic instances, so we need to start
// with the config address that the given instance belongs to.
configAddr := addr.ConfigResource()

return d.resourceInstancesDeferred.Get(configAddr).Has(addr)
}

// ShouldDeferResourceInstanceChanges returns true if the receiver knows some
// reason why the resource instance with the given address should have its
// planned action deferred for a future plan/apply round.
Expand All @@ -196,7 +212,8 @@ func (d *Deferred) HaveAnyDeferrals() bool {
// It's invalid to call this method for an address that was already reported
// as deferred using [Deferred.ReportResourceInstanceDeferred], and so this
// method will panic in that case. Callers should always test whether a resource
// instance action should be deferred _before_ reporting that it has been.
// instance action should be deferred _before_ reporting that it has been by calling
// [Deferred.IsResourceInstanceDeferred].
func (d *Deferred) ShouldDeferResourceInstanceChanges(addr addrs.AbsResourceInstance) bool {
d.mu.Lock()
defer d.mu.Unlock()
Expand Down
3 changes: 0 additions & 3 deletions internal/terraform/context_apply_deferred_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1351,7 +1351,6 @@ output "a" {
}),
stages: []deferredActionsTestStage{
{

buildOpts: func(opts *PlanOpts) {
opts.Mode = plans.RefreshOnlyMode
},
Expand Down Expand Up @@ -1613,9 +1612,7 @@ func (provider *deferredActionsProvider) Provider() providers.Interface {
},
},
ReadResourceFn: func(req providers.ReadResourceRequest) providers.ReadResourceResponse {
fmt.Println("ReadResourceFn called")
if key := req.PriorState.GetAttr("name"); key.IsKnown() && key.AsString() == "deferred_read" {
fmt.Println("Deferring read")
return providers.ReadResourceResponse{
NewState: req.PriorState,
Deferred: &providers.Deferred{
Expand Down
8 changes: 6 additions & 2 deletions internal/terraform/node_resource_plan_instance.go
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,11 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext)
}

deferrals := ctx.Deferrals()
if !deferrals.ShouldDeferResourceInstanceChanges(n.Addr) {

if deferrals.IsResourceInstanceDeferred(n.Addr) {
// This resource instance is already deferred, probably because it
// was deferred during the refresh or import step.
} else if !deferrals.ShouldDeferResourceInstanceChanges(n.Addr) {
// We intentionally write the change before the subsequent checks, because
// all of the checks below this point are for problems caused by the
// context surrounding the change, rather than the change itself, and
Expand Down Expand Up @@ -614,7 +618,7 @@ func (n *NodePlannableResourceInstance) importState(ctx EvalContext, addr addrs.
}

// verify the existence of the imported resource
if instanceRefreshState.Value.IsNull() {
if instanceRefreshState.Value.IsNull() && deferred == nil {
var diags tfdiags.Diagnostics
diags = diags.Append(tfdiags.Sourceless(
tfdiags.Error,
Expand Down

0 comments on commit 4db9ab8

Please sign in to comment.