From 0b4e468de635203cde19ceac5a9e2ed964b4cff4 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Fri, 12 Jan 2024 15:18:41 -0500 Subject: [PATCH 1/4] error when ReadResource returns unknown value --- .../terraform/node_resource_abstract_instance.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/internal/terraform/node_resource_abstract_instance.go b/internal/terraform/node_resource_abstract_instance.go index d3e969d629..960da8599e 100644 --- a/internal/terraform/node_resource_abstract_instance.go +++ b/internal/terraform/node_resource_abstract_instance.go @@ -656,13 +656,24 @@ func (n *NodeAbstractResourceInstance) refresh(ctx EvalContext, deposedKey state panic("new state is cty.NilVal") } + if !resp.NewState.IsWhollyKnown() { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Provider produced invalid object", + fmt.Sprintf( + "Provider %q planned an invalid value for %s during refresh: %s.\n\nThis is a bug in the provider, which should be reported in the provider's own issue tracker.", + n.ResolvedProvider.Provider, absAddr, "The returned state contains unknown values", + ), + )) + } + for _, err := range resp.NewState.Type().TestConformance(schema.ImpliedType()) { diags = diags.Append(tfdiags.Sourceless( tfdiags.Error, "Provider produced invalid object", fmt.Sprintf( "Provider %q planned an invalid value for %s during refresh: %s.\n\nThis is a bug in the provider, which should be reported in the provider's own issue tracker.", - n.ResolvedProvider.Provider.String(), absAddr, tfdiags.FormatError(err), + n.ResolvedProvider.Provider, absAddr, tfdiags.FormatError(err), ), )) } From ef44fd604e6cfc360a4a69302787e570c6450cdd Mon Sep 17 00:00:00 2001 From: James Bardin Date: Fri, 12 Jan 2024 15:18:56 -0500 Subject: [PATCH 2/4] error when UpgradeResourceState return unknown value --- internal/terraform/upgrade_resource_state.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/terraform/upgrade_resource_state.go b/internal/terraform/upgrade_resource_state.go index 659f991481..07d5ea3bb8 100644 --- a/internal/terraform/upgrade_resource_state.go +++ b/internal/terraform/upgrade_resource_state.go @@ -96,6 +96,14 @@ func upgradeResourceState(addr addrs.AbsResourceInstance, provider providers.Int return nil, diags } + if !resp.UpgradedState.IsWhollyKnown() { + diags = diags.Append(tfdiags.Sourceless( + tfdiags.Error, + "Invalid resource state upgrade", + fmt.Sprintf("The %s provider upgraded the state for %s from a previous version, but produced an invalid result: The returned state contains unknown values.", providerType, addr), + )) + } + // After upgrading, the new value must conform to the current schema. When // going over RPC this is actually already ensured by the // marshaling/unmarshaling of the new value, but we'll check it here From 105b2044d575aeceb7374c522d9eec7c9397bac4 Mon Sep 17 00:00:00 2001 From: James Bardin Date: Fri, 12 Jan 2024 15:19:21 -0500 Subject: [PATCH 3/4] remove leftover debug output --- internal/terraform/context_plan2_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/terraform/context_plan2_test.go b/internal/terraform/context_plan2_test.go index d0d8a73653..81e6094242 100644 --- a/internal/terraform/context_plan2_test.go +++ b/internal/terraform/context_plan2_test.go @@ -5264,7 +5264,6 @@ resource "test_resource" "a" { for _, res := range plan.Changes.Resources { switch res.Addr.String() { case "test_resource.a": - spew.Dump(res) if res.Action != plans.NoOp { t.Errorf("unexpected %s change for %s", res.Action, res.Addr) } From d8a335f52054ab597cee1c658ed67ee4d6808eab Mon Sep 17 00:00:00 2001 From: James Bardin Date: Mon, 15 Jan 2024 12:32:26 -0500 Subject: [PATCH 4/4] add unknown val error for MoveResourceState --- internal/refactoring/cross_provider_move.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/internal/refactoring/cross_provider_move.go b/internal/refactoring/cross_provider_move.go index 67a8e07c40..d6b7dca84d 100644 --- a/internal/refactoring/cross_provider_move.go +++ b/internal/refactoring/cross_provider_move.go @@ -161,6 +161,15 @@ func (move *crossTypeMove) applyCrossTypeMove(stmt *MoveStatement, source, targe }) return diags } + if !resp.TargetState.IsWhollyKnown() { + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Provider returned invalid value", + Detail: fmt.Sprintf("The provider %s returned an invalid value during an across type move operation: The returned state contains unknown values. This is a bug in the relevant provider; Please report it.", + move.targetProviderAddr), + Subject: stmt.DeclRange.ToHCL().Ptr(), + }) + } // Finally, we can update the source value with the new value.