mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
Merge pull request #31990 from hashicorp/jbardin/orphan-noop
core: A NoOp orphan change has nothing to apply
This commit is contained in:
commit
980bf430f3
@ -1442,3 +1442,46 @@ resource "test_object" "x" {
|
|||||||
t.Fatalf("apply: %s", diags.Err())
|
t.Fatalf("apply: %s", diags.Err())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestContext2Apply_missingOrphanedResource(t *testing.T) {
|
||||||
|
m := testModuleInline(t, map[string]string{
|
||||||
|
"main.tf": `
|
||||||
|
# changed resource address to create a new object
|
||||||
|
resource "test_object" "y" {
|
||||||
|
test_string = "y"
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
})
|
||||||
|
|
||||||
|
p := simpleMockProvider()
|
||||||
|
|
||||||
|
// report the prior value is missing
|
||||||
|
p.ReadResourceFn = func(req providers.ReadResourceRequest) (resp providers.ReadResourceResponse) {
|
||||||
|
resp.NewState = cty.NullVal(req.PriorState.Type())
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
|
||||||
|
state := states.NewState()
|
||||||
|
root := state.EnsureModule(addrs.RootModuleInstance)
|
||||||
|
root.SetResourceInstanceCurrent(
|
||||||
|
mustResourceInstanceAddr("test_object.x").Resource,
|
||||||
|
&states.ResourceInstanceObjectSrc{
|
||||||
|
Status: states.ObjectReady,
|
||||||
|
AttrsJSON: []byte(`{"test_string":"x"}`),
|
||||||
|
},
|
||||||
|
mustProviderConfig(`provider["registry.terraform.io/hashicorp/test"]`),
|
||||||
|
)
|
||||||
|
|
||||||
|
ctx := testContext2(t, &ContextOpts{
|
||||||
|
Providers: map[addrs.Provider]providers.Factory{
|
||||||
|
addrs.NewDefaultProvider("test"): testProviderFuncFixed(p),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
opts := SimplePlanOpts(plans.NormalMode, nil)
|
||||||
|
plan, diags := ctx.Plan(m, state, opts)
|
||||||
|
assertNoErrors(t, diags)
|
||||||
|
|
||||||
|
_, diags = ctx.Apply(plan, m)
|
||||||
|
assertNoErrors(t, diags)
|
||||||
|
}
|
||||||
|
@ -113,11 +113,16 @@ func (n *NodeApplyableResourceInstance) Execute(ctx EvalContext, op walkOperatio
|
|||||||
addr := n.ResourceInstanceAddr()
|
addr := n.ResourceInstanceAddr()
|
||||||
|
|
||||||
if n.Config == nil {
|
if n.Config == nil {
|
||||||
// This should not be possible, but we've got here in at least one
|
// If there is no config, and there is no change, then we have nothing
|
||||||
// case as discussed in the following issue:
|
// to do and the change was left in the plan for informational
|
||||||
// https://github.com/hashicorp/terraform/issues/21258
|
// purposes only.
|
||||||
// To avoid an outright crash here, we'll instead return an explicit
|
changes := ctx.Changes()
|
||||||
// error.
|
csrc := changes.GetResourceInstanceChange(n.ResourceInstanceAddr(), states.CurrentGen)
|
||||||
|
if csrc == nil || csrc.Action == plans.NoOp {
|
||||||
|
log.Printf("[DEBUG] NodeApplyableResourceInstance: No config or planned change recorded for %s", n.Addr)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
diags = diags.Append(tfdiags.Sourceless(
|
diags = diags.Append(tfdiags.Sourceless(
|
||||||
tfdiags.Error,
|
tfdiags.Error,
|
||||||
"Resource node has no configuration attached",
|
"Resource node has no configuration attached",
|
||||||
|
Loading…
Reference in New Issue
Block a user