Skip to content

Commit 0c8b4ce

Browse files
committedApr 28, 2021
add context to UgpradeResourceState diags
This path was not yet using diagnostics, and returned simple errors.
1 parent 89f986d commit 0c8b4ce

7 files changed

+50
-43
lines changed
 

Diff for: ‎terraform/node_resource_abstract.go

+28-17
Original file line numberDiff line numberDiff line change
@@ -347,10 +347,12 @@ func (n *NodeAbstractResource) writeResourceState(ctx EvalContext, addr addrs.Ab
347347

348348
// readResourceInstanceState reads the current object for a specific instance in
349349
// the state.
350-
func (n *NodeAbstractResource) readResourceInstanceState(ctx EvalContext, addr addrs.AbsResourceInstance) (*states.ResourceInstanceObject, error) {
350+
func (n *NodeAbstractResource) readResourceInstanceState(ctx EvalContext, addr addrs.AbsResourceInstance) (*states.ResourceInstanceObject, tfdiags.Diagnostics) {
351+
var diags tfdiags.Diagnostics
351352
provider, providerSchema, err := getProvider(ctx, n.ResolvedProvider)
352353
if err != nil {
353-
return nil, err
354+
diags = diags.Append(err)
355+
return nil, diags
354356
}
355357

356358
log.Printf("[TRACE] readResourceInstanceState: reading state for %s", addr)
@@ -365,36 +367,41 @@ func (n *NodeAbstractResource) readResourceInstanceState(ctx EvalContext, addr a
365367
schema, currentVersion := (providerSchema).SchemaForResourceAddr(addr.Resource.ContainingResource())
366368
if schema == nil {
367369
// Shouldn't happen since we should've failed long ago if no schema is present
368-
return nil, fmt.Errorf("no schema available for %s while reading state; this is a bug in Terraform and should be reported", addr)
370+
return nil, diags.Append(fmt.Errorf("no schema available for %s while reading state; this is a bug in Terraform and should be reported", addr))
369371
}
370-
var diags tfdiags.Diagnostics
371-
src, diags = upgradeResourceState(addr, provider, src, schema, currentVersion)
372+
src, upgradeDiags := upgradeResourceState(addr, provider, src, schema, currentVersion)
373+
if n.Config != nil {
374+
upgradeDiags = upgradeDiags.InConfigBody(n.Config.Config, addr.String())
375+
}
376+
diags = diags.Append(upgradeDiags)
372377
if diags.HasErrors() {
373378
// Note that we don't have any channel to return warnings here. We'll
374379
// accept that for now since warnings during a schema upgrade would
375380
// be pretty weird anyway, since this operation is supposed to seem
376381
// invisible to the user.
377-
return nil, diags.Err()
382+
return nil, diags
378383
}
379384

380385
obj, err := src.Decode(schema.ImpliedType())
381386
if err != nil {
382-
return nil, err
387+
diags = diags.Append(err)
383388
}
384389

385-
return obj, nil
390+
return obj, diags
386391
}
387392

388393
// readResourceInstanceStateDeposed reads the deposed object for a specific
389394
// instance in the state.
390-
func (n *NodeAbstractResource) readResourceInstanceStateDeposed(ctx EvalContext, addr addrs.AbsResourceInstance, key states.DeposedKey) (*states.ResourceInstanceObject, error) {
395+
func (n *NodeAbstractResource) readResourceInstanceStateDeposed(ctx EvalContext, addr addrs.AbsResourceInstance, key states.DeposedKey) (*states.ResourceInstanceObject, tfdiags.Diagnostics) {
396+
var diags tfdiags.Diagnostics
391397
provider, providerSchema, err := getProvider(ctx, n.ResolvedProvider)
392398
if err != nil {
393-
return nil, err
399+
diags = diags.Append(err)
400+
return nil, diags
394401
}
395402

396403
if key == states.NotDeposed {
397-
return nil, fmt.Errorf("readResourceInstanceStateDeposed used with no instance key; this is a bug in Terraform and should be reported")
404+
return nil, diags.Append(fmt.Errorf("readResourceInstanceStateDeposed used with no instance key; this is a bug in Terraform and should be reported"))
398405
}
399406

400407
log.Printf("[TRACE] readResourceInstanceStateDeposed: reading state for %s deposed object %s", addr, key)
@@ -403,31 +410,35 @@ func (n *NodeAbstractResource) readResourceInstanceStateDeposed(ctx EvalContext,
403410
if src == nil {
404411
// Presumably we only have deposed objects, then.
405412
log.Printf("[TRACE] readResourceInstanceStateDeposed: no state present for %s deposed object %s", addr, key)
406-
return nil, nil
413+
return nil, diags
407414
}
408415

409416
schema, currentVersion := (providerSchema).SchemaForResourceAddr(addr.Resource.ContainingResource())
410417
if schema == nil {
411418
// Shouldn't happen since we should've failed long ago if no schema is present
412-
return nil, fmt.Errorf("no schema available for %s while reading state; this is a bug in Terraform and should be reported", addr)
419+
return nil, diags.Append(fmt.Errorf("no schema available for %s while reading state; this is a bug in Terraform and should be reported", addr))
413420

414421
}
415422

416-
src, diags := upgradeResourceState(addr, provider, src, schema, currentVersion)
423+
src, upgradeDiags := upgradeResourceState(addr, provider, src, schema, currentVersion)
424+
if n.Config != nil {
425+
upgradeDiags = upgradeDiags.InConfigBody(n.Config.Config, addr.String())
426+
}
427+
diags = diags.Append(upgradeDiags)
417428
if diags.HasErrors() {
418429
// Note that we don't have any channel to return warnings here. We'll
419430
// accept that for now since warnings during a schema upgrade would
420431
// be pretty weird anyway, since this operation is supposed to seem
421432
// invisible to the user.
422-
return nil, diags.Err()
433+
return nil, diags
423434
}
424435

425436
obj, err := src.Decode(schema.ImpliedType())
426437
if err != nil {
427-
return nil, err
438+
diags = diags.Append(err)
428439
}
429440

430-
return obj, nil
441+
return obj, diags
431442
}
432443

433444
// graphNodesAreResourceInstancesInDifferentInstancesOfSameModule is an

Diff for: ‎terraform/node_resource_abstract_test.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,9 @@ func TestNodeAbstractResource_ReadResourceInstanceState(t *testing.T) {
160160
ctx.ProviderSchemaSchema = mockProvider.ProviderSchema()
161161
ctx.ProviderProvider = providers.Interface(mockProvider)
162162

163-
got, err := test.Node.readResourceInstanceState(ctx, test.Node.Addr.Resource.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance))
164-
if err != nil {
165-
t.Fatalf("[%s] Got err: %#v", k, err.Error())
163+
got, readDiags := test.Node.readResourceInstanceState(ctx, test.Node.Addr.Resource.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance))
164+
if readDiags.HasErrors() {
165+
t.Fatalf("[%s] Got err: %#v", k, readDiags.Err())
166166
}
167167

168168
expected := test.ExpectedInstanceId
@@ -223,9 +223,9 @@ func TestNodeAbstractResource_ReadResourceInstanceStateDeposed(t *testing.T) {
223223

224224
key := states.DeposedKey("00000001") // shim from legacy state assigns 0th deposed index this key
225225

226-
got, err := test.Node.readResourceInstanceStateDeposed(ctx, test.Node.Addr.Resource.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), key)
227-
if err != nil {
228-
t.Fatalf("[%s] Got err: %#v", k, err.Error())
226+
got, readDiags := test.Node.readResourceInstanceStateDeposed(ctx, test.Node.Addr.Resource.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), key)
227+
if readDiags.HasErrors() {
228+
t.Fatalf("[%s] Got err: %#v", k, readDiags.Err())
229229
}
230230

231231
expected := test.ExpectedInstanceId

Diff for: ‎terraform/node_resource_apply_instance.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,8 @@ func (n *NodeApplyableResourceInstance) managedResourceExecute(ctx EvalContext)
217217
log.Printf("[TRACE] managedResourceExecute: prior object for %s now deposed with key %s", n.Addr, deposedKey)
218218
}
219219

220-
state, err = n.readResourceInstanceState(ctx, n.ResourceInstanceAddr())
221-
diags = diags.Append(err)
220+
state, readDiags := n.readResourceInstanceState(ctx, n.ResourceInstanceAddr())
221+
diags = diags.Append(readDiags)
222222
if diags.HasErrors() {
223223
return diags
224224
}
@@ -244,8 +244,8 @@ func (n *NodeApplyableResourceInstance) managedResourceExecute(ctx EvalContext)
244244
return diags
245245
}
246246

247-
state, err = n.readResourceInstanceState(ctx, n.ResourceInstanceAddr())
248-
diags = diags.Append(err)
247+
state, readDiags = n.readResourceInstanceState(ctx, n.ResourceInstanceAddr())
248+
diags = diags.Append(readDiags)
249249
if diags.HasErrors() {
250250
return diags
251251
}

Diff for: ‎terraform/node_resource_destroy.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -177,8 +177,8 @@ func (n *NodeDestroyResourceInstance) managedResourceExecute(ctx EvalContext) (d
177177
return diags
178178
}
179179

180-
state, err = n.readResourceInstanceState(ctx, addr)
181-
diags = diags.Append(err)
180+
state, readDiags := n.readResourceInstanceState(ctx, addr)
181+
diags = diags.Append(readDiags)
182182
if diags.HasErrors() {
183183
return diags
184184
}

Diff for: ‎terraform/node_resource_destroy_deposed.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -184,9 +184,10 @@ func (n *NodeDestroyDeposedResourceInstanceObject) Execute(ctx EvalContext, op w
184184
// Always write the resource back to the state deposed. If it
185185
// was successfully destroyed it will be pruned. If it was not, it will
186186
// be caught on the next run.
187-
err = n.writeResourceInstanceState(ctx, state)
188-
if err != nil {
189-
return diags.Append(err)
187+
writeDiags := n.writeResourceInstanceState(ctx, state)
188+
diags.Append(writeDiags)
189+
if diags.HasErrors() {
190+
return diags
190191
}
191192

192193
diags = diags.Append(n.postApplyHook(ctx, state, diags.Err()))

Diff for: ‎terraform/node_resource_plan_instance.go

+4-6
Original file line numberDiff line numberDiff line change
@@ -52,16 +52,15 @@ func (n *NodePlannableResourceInstance) dataResourceExecute(ctx EvalContext) (di
5252
addr := n.ResourceInstanceAddr()
5353

5454
var change *plans.ResourceInstanceChange
55-
var state *states.ResourceInstanceObject
5655

5756
_, providerSchema, err := getProvider(ctx, n.ResolvedProvider)
5857
diags = diags.Append(err)
5958
if diags.HasErrors() {
6059
return diags
6160
}
6261

63-
state, err = n.readResourceInstanceState(ctx, addr)
64-
diags = diags.Append(err)
62+
state, readDiags := n.readResourceInstanceState(ctx, addr)
63+
diags = diags.Append(readDiags)
6564
if diags.HasErrors() {
6665
return diags
6766
}
@@ -97,7 +96,6 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext)
9796
addr := n.ResourceInstanceAddr()
9897

9998
var change *plans.ResourceInstanceChange
100-
var instanceRefreshState *states.ResourceInstanceObject
10199
var instancePlanState *states.ResourceInstanceObject
102100

103101
_, providerSchema, err := getProvider(ctx, n.ResolvedProvider)
@@ -111,8 +109,8 @@ func (n *NodePlannableResourceInstance) managedResourceExecute(ctx EvalContext)
111109
return diags
112110
}
113111

114-
instanceRefreshState, err = n.readResourceInstanceState(ctx, addr)
115-
diags = diags.Append(err)
112+
instanceRefreshState, readDiags := n.readResourceInstanceState(ctx, addr)
113+
diags = diags.Append(readDiags)
116114
if diags.HasErrors() {
117115
return diags
118116
}

Diff for: ‎terraform/node_resource_plan_orphan.go

+2-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66

77
"github.com/hashicorp/terraform/addrs"
88
"github.com/hashicorp/terraform/plans"
9-
"github.com/hashicorp/terraform/states"
109
"github.com/hashicorp/terraform/tfdiags"
1110
)
1211

@@ -77,11 +76,9 @@ func (n *NodePlannableResourceInstanceOrphan) managedResourceExecute(ctx EvalCon
7776
// Declare a bunch of variables that are used for state during
7877
// evaluation. These are written to by-address below.
7978
var change *plans.ResourceInstanceChange
80-
var state *states.ResourceInstanceObject
81-
var err error
8279

83-
state, err = n.readResourceInstanceState(ctx, addr)
84-
diags = diags.Append(err)
80+
state, readDiags := n.readResourceInstanceState(ctx, addr)
81+
diags = diags.Append(readDiags)
8582
if diags.HasErrors() {
8683
return diags
8784
}

0 commit comments

Comments
 (0)