Repository: pulumi/pulumi-terraform-bridge
Pull request #1672 (2024-02-03 01:34:18)

Docs Readability: Newlines in Import sections
This PR allows docsgen to retain newlines in import sections by adding a double newline placeholder to the end of every line in the `Import` section of the docs.

Previously, newlines were not honored except around the import code part itself.

Tests are adjusted to reflect newlines being appended rather than prepended.

[Here is a registry preview](http://registry--origin-pr-3897-6eedfa57.s3-website.us-west-2.amazonaws.com/registry/packages/gcp/api-docs/certificatemanager/certificatemap/)

Screenshot from that preview:

<img width="768" alt="Screenshot 2024-02-02 at 5 33 14 PM" src="https://github.com/pulumi/pulumi-terraform-bridge/assets/13116240/80c61703-9f88-424d-bd56-50829a2c46e9">

Closes https://github.com/pulumi/pulumi-gcp/issues/1375.



Patch:
diff --git a/.github/workflows/update-providers-auto.yml b/.github/workflows/update-providers-auto.yml
index f98cea24..960d7631 100644
--- a/.github/workflows/update-providers-auto.yml
+++ b/.github/workflows/update-providers-auto.yml
@@ -31,7 +31,7 @@ jobs:
           # Not specifying target-bridge-version in the payload will make it upgrade to the latest.
           client-payload: |-
             {
-               "pr-reviewers": ${{ toJSON( github.actor ) == 'pulumi-bot' && 'VenelinMartinov' || toJSON( github.actor || 'VenelinMartinov' ) }},
+               "pr-reviewers": "t0yv0",
                "automerge": true
             }
     needs: generate-providers-list
diff --git a/go.mod b/go.mod
index e71edb8a..8fba60d3 100644
--- a/go.mod
+++ b/go.mod
@@ -246,4 +246,4 @@ require (
 	lukechampine.com/frand v1.4.2 // indirect
 )
 
-replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9
+replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9
diff --git a/go.sum b/go.sum
index 75371e6f..b5914172 100644
--- a/go.sum
+++ b/go.sum
@@ -2191,8 +2191,8 @@ github.com/pulumi/schema-tools v0.1.2 h1:Fd9xvUjgck4NA+7/jSk7InqCUT4Kj940+EcnbQK
 github.com/pulumi/schema-tools v0.1.2/go.mod h1:62lgj52Tzq11eqWTIaKd+EVyYAu5dEcDJxMhTjvMO/k=
 github.com/pulumi/terraform-diff-reader v0.0.2 h1:kTE4nEXU3/SYXESvAIem+wyHMI3abqkI3OhJ0G04LLI=
 github.com/pulumi/terraform-diff-reader v0.0.2/go.mod h1:sZ9FUzGO+yM41hsQHs/yIcj/Y993qMdBxBU5mpDmAfQ=
-github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9 h1:k3SdGlmaJ49yaRV79Ktb5KGdPvuNfeiv4+oHXN+wyhs=
-github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9/go.mod h1:qH/34G25Ugdj5FcM95cSoXzUgIbgfhVLXCcEcYaMwq8=
+github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9 h1:p8vtMw4abpcmwE0v8b6x2GKZQKisrmdjojkoP3oelak=
+github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9/go.mod h1:qH/34G25Ugdj5FcM95cSoXzUgIbgfhVLXCcEcYaMwq8=
 github.com/rakyll/embedmd v0.0.0-20171029212350-c8060a0752a2/go.mod h1:7jOTMgqac46PZcF54q6l2hkLEG8op93fZu61KmxWDV4=
 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
diff --git a/pf/go.mod b/pf/go.mod
index bff537f0..3c230265 100644
--- a/pf/go.mod
+++ b/pf/go.mod
@@ -46,11 +46,8 @@ require (
 	github.com/deckarep/golang-set/v2 v2.5.0 // indirect
 	github.com/gedex/inflector v0.0.0-20170307190818-16278e9db813 // indirect
 	github.com/golang-jwt/jwt/v5 v5.1.0 // indirect
-	github.com/google/go-cmp v0.6.0 // indirect
 	github.com/google/s2a-go v0.1.7 // indirect
 	github.com/hashicorp/go-hclog v1.5.0 // indirect
-	github.com/hashicorp/logutils v1.0.0 // indirect
-	github.com/hashicorp/terraform-plugin-sdk/v2 v2.29.0 // indirect
 	github.com/kylelemons/godebug v1.1.0 // indirect
 	github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
 	github.com/mattn/go-localereader v0.0.1 // indirect
@@ -62,7 +59,6 @@ require (
 	github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 // indirect
 	github.com/pulumi/esc v0.6.2 // indirect
 	github.com/shopspring/decimal v1.3.1 // indirect
-	github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect
 	github.com/vmihailenco/msgpack/v5 v5.3.5 // indirect
 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
 	golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect
@@ -240,4 +236,4 @@ require (
 	lukechampine.com/frand v1.4.2 // indirect
 )
 
-replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9
+replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9
diff --git a/pf/go.sum b/pf/go.sum
index 85fd6f05..fc5d7a14 100644
--- a/pf/go.sum
+++ b/pf/go.sum
@@ -966,7 +966,6 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8
 github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
-github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
 github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
@@ -1662,8 +1661,7 @@ github.com/pulumi/pulumi/sdk/v3 v3.104.2/go.mod h1:Ml3rpGfyZlI4zQCG7LN2XDSmH4XUN
 github.com/pulumi/schema-tools v0.1.2 h1:Fd9xvUjgck4NA+7/jSk7InqCUT4Kj940+EcnbQKpfZo=
 github.com/pulumi/schema-tools v0.1.2/go.mod h1:62lgj52Tzq11eqWTIaKd+EVyYAu5dEcDJxMhTjvMO/k=
 github.com/pulumi/terraform-diff-reader v0.0.2 h1:kTE4nEXU3/SYXESvAIem+wyHMI3abqkI3OhJ0G04LLI=
-github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9 h1:k3SdGlmaJ49yaRV79Ktb5KGdPvuNfeiv4+oHXN+wyhs=
-github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9/go.mod h1:qH/34G25Ugdj5FcM95cSoXzUgIbgfhVLXCcEcYaMwq8=
+github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9 h1:p8vtMw4abpcmwE0v8b6x2GKZQKisrmdjojkoP3oelak=
 github.com/rakyll/embedmd v0.0.0-20171029212350-c8060a0752a2/go.mod h1:7jOTMgqac46PZcF54q6l2hkLEG8op93fZu61KmxWDV4=
 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
@@ -1824,7 +1822,6 @@ github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1
 github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
 github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
 github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI=
-github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk=
 github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU=
 github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=
 github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
diff --git a/pkg/tfbridge/check_failures.go b/pkg/tfbridge/check_failures.go
index 3f6a94c7..136657f5 100644
--- a/pkg/tfbridge/check_failures.go
+++ b/pkg/tfbridge/check_failures.go
@@ -16,7 +16,6 @@ package tfbridge
 
 import (
 	"fmt"
-	"regexp"
 	"strings"
 
 	"github.com/agext/levenshtein"
@@ -38,33 +37,13 @@ const (
 
 // Identifies a path to the property that is failing checks. See [NewCheckFailure].
 type CheckFailurePath struct {
-	schemaPath walk.SchemaPath
-
-	// valuePath is a form suitable to pass to `pulumi config get`.
-	//
-	// "accessToken" is a top-level property example, can be used as:
-	//
-	//	pulumi config get aws:accessToken
-	//
-	// "assumeRoleArn.roleArn" is a nested example, can be used as:
-	//
-	//	pulumi config get --path aws:assumeRoleArn.roleArn
-	//
-	// For complicated literals it may resort to quoting as needed:
-	//
-	//      foo["c o m p l i c a t e d"]`
-	//
-	// It form is also approximately a TypeScript-like literal and is used as such in error
-	// message suggestions.
-	valuePath string
-
+	schemaPath  walk.SchemaPath
+	valuePath   string
 	schemaMap   shim.SchemaMap
 	schemaInfos map[string]*SchemaInfo
 }
 
-func NewCheckFailurePath(
-	schemaMap shim.SchemaMap, schemaInfos map[string]*SchemaInfo, prop string,
-) CheckFailurePath {
+func NewCheckFailurePath(schemaMap shim.SchemaMap, schemaInfos map[string]*SchemaInfo, prop string) CheckFailurePath {
 	pulumiName := TerraformToPulumiNameV2(prop, schemaMap, schemaInfos)
 	return CheckFailurePath{
 		schemaPath:  walk.NewSchemaPath().GetAttr(prop),
@@ -74,14 +53,6 @@ func NewCheckFailurePath(
 	}
 }
 
-func (p CheckFailurePath) valuePathDot(prop string) string {
-	r := regexp.MustCompile("^[_a-zA-Z][-_a-zA-Z0-9]*$")
-	if r.MatchString(prop) {
-		return fmt.Sprintf("%s.%s", p.valuePath, prop)
-	}
-	return fmt.Sprintf("%s[%q]", p.valuePath, prop)
-}
-
 func (p CheckFailurePath) Attribute(name string) CheckFailurePath {
 	path := p.schemaPath.GetAttr(name)
 	pulumiName, err := TerraformToPulumiNameAtPath(path, p.schemaMap, p.schemaInfos)
@@ -90,7 +61,7 @@ func (p CheckFailurePath) Attribute(name string) CheckFailurePath {
 	}
 	return CheckFailurePath{
 		schemaPath:  path,
-		valuePath:   p.valuePathDot(pulumiName),
+		valuePath:   fmt.Sprintf("%s.%s", p.valuePath, pulumiName),
 		schemaMap:   p.schemaMap,
 		schemaInfos: p.schemaInfos,
 	}
@@ -120,7 +91,7 @@ func (p CheckFailurePath) ListElement(n int64) CheckFailurePath {
 func (p CheckFailurePath) MapElement(s string) CheckFailurePath {
 	valuePath := p.valuePath
 	if !p.isMaxItemsOne() {
-		valuePath = p.valuePathDot(s)
+		valuePath = fmt.Sprintf("%s[%q]", p.valuePath, s)
 	}
 	return CheckFailurePath{
 		schemaPath:  p.schemaPath.Element(),
@@ -227,13 +198,19 @@ func formatDefaultProviderCheckFailure(
 	schemaMap shim.SchemaMap,
 	schemaInfos map[string]*SchemaInfo,
 ) plugin.CheckFailure {
-	if pp != nil && reasonType == InvalidKey {
-		return formatDefaultProviderInvalidKey(*pp, configPrefix, schemaMap, schemaInfos)
-	}
 	if pp != nil {
 		getExpr := "pulumi config get " + pulumiConfigExpr(configPrefix, *pp)
 		reason = fmt.Sprintf("%s. Check `%s`.", reason, getExpr)
 	}
+	if pp != nil && reasonType == InvalidKey {
+		if sugg := keySuggestions(*pp, schemaMap, schemaInfos); len(sugg) > 0 {
+			quoted := []string{}
+			for _, s := range sugg {
+				quoted = append(quoted, fmt.Sprintf("`%s:%s`", configPrefix, string(s)))
+			}
+			reason = fmt.Sprintf("%s Did you mean %s?", reason, strings.Join(quoted, " or "))
+		}
+	}
 	return plugin.CheckFailure{
 		Reason: reason,
 		// Do not populate Property here intentionally as currently CLI would display that with a default
@@ -242,37 +219,6 @@ func formatDefaultProviderCheckFailure(
 	}
 }
 
-// This error arises when the user sets `pulumi config set aws:foo` but the AWS provider does not
-// recognize foo. The upstream error message is not very actionable:
-//
-//	could not validate provider configuration: Invalid or unknown key.
-//
-// So this function provides a Pulumi-specific message instead, anchoring it with the key compatible
-// with `pulumi config get --path key`.
-func formatDefaultProviderInvalidKey(
-	p CheckFailurePath,
-	prefix string,
-	schemaMap shim.SchemaMap,
-	schemaInfos map[string]*SchemaInfo,
-) plugin.CheckFailure {
-	sentences := []string{}
-	invalid := fmt.Sprintf("`%s:%s` is not a valid configuration key for the %s provider.",
-		prefix, p.valuePath, prefix)
-	sentences = append(sentences, invalid)
-	if sugg := keySuggestions(p, schemaMap, schemaInfos); len(sugg) > 0 {
-		quoted := []string{}
-		for _, s := range sugg {
-			quoted = append(quoted, fmt.Sprintf("`%s:%s`", prefix, string(s)))
-		}
-		dym := fmt.Sprintf("Did you mean %s?", strings.Join(quoted, " or "))
-		sentences = append(sentences, dym)
-	}
-	suggest := fmt.Sprintf("If the referenced key is not intended for the provider, please "+
-		"choose a different namespace from `%s:`.", prefix)
-	sentences = append(sentences, suggest)
-	return plugin.CheckFailure{Reason: strings.Join(sentences, " ")}
-}
-
 func keySuggestions(
 	pp CheckFailurePath,
 	schemaMap shim.SchemaMap,
diff --git a/pkg/tfbridge/provider.go b/pkg/tfbridge/provider.go
index 6ba440da..a2b1a66e 100644
--- a/pkg/tfbridge/provider.go
+++ b/pkg/tfbridge/provider.go
@@ -1123,7 +1123,7 @@ func (p *Provider) Read(ctx context.Context, req *pulumirpc.ReadRequest) (*pulum
 		}
 	}
 
-	config, assets, err := MakeTerraformConfig(ctx, p, oldInputs, res.TF.Schema(), res.Schema.Fields)
+	config, _, err := MakeTerraformConfig(ctx, p, oldInputs, res.TF.Schema(), res.Schema.Fields)
 	if err != nil {
 		return nil, errors.Wrapf(err, "preparing %s's new property state", urn)
 	}
@@ -1136,7 +1136,7 @@ func (p *Provider) Read(ctx context.Context, req *pulumirpc.ReadRequest) (*pulum
 	// Store the ID and properties in the output.  The ID *should* be the same as the input ID, but in the case
 	// that the resource no longer exists, we will simply return the empty string and an empty property map.
 	if newstate != nil {
-		props, err := MakeTerraformResult(ctx, p.tf, newstate, res.TF.Schema(), res.Schema.Fields, assets, p.supportsSecrets)
+		props, err := MakeTerraformResult(ctx, p.tf, newstate, res.TF.Schema(), res.Schema.Fields, nil, p.supportsSecrets)
 		if err != nil {
 			return nil, err
 		}
diff --git a/pkg/tfgen/docs.go b/pkg/tfgen/docs.go
index 8050e895..65cb91b6 100644
--- a/pkg/tfgen/docs.go
+++ b/pkg/tfgen/docs.go
@@ -1046,13 +1046,15 @@ func (p *tfMarkdownParser) parseImports(subsection []string) {
 			} else {
 				tok = "MISSING_TOK"
 			}
-			// We are going to use a placeholder here for the linebreak so that when we get into converting examples
-			// we can format our Import section outside of the examples section
+			// Because splitGroupLines will strip any newlines off our description text, we use `<break>` as a
+			// placeholder, which we will replace with newlines in convertExamplesInner.
 			importCommand := fmt.Sprintf("$ pulumi import %s%s", tok, importString)
-			importDetails := []string{"<break><break>```sh<break>", importCommand, "<break>```<break><break>"}
+			importDetails := []string{"```sh<break>", importCommand, "<break>```<break><break>"}
 			importDocString = append(importDocString, importDetails...)
 		} else {
 			if !isBlank(section) {
+				// Ensure every section receives a line break.
+				section = section + "<break><break>"
 				importDocString = append(importDocString, section)
 			}
 		}
@@ -1453,7 +1455,6 @@ func (g *Generator) convertExamplesInner(
 			importDetails := strings.Join(section, " ")
 			importDetails = strings.Replace(importDetails, "  ", "\n\n", -1)
 			importDetails = strings.Replace(importDetails, "<break>", "\n", -1)
-			importDetails = strings.Replace(importDetails, ": ", "", -1)
 			importDetails = strings.Replace(importDetails, " \n", "\n", -1)
 			fprintf(output, "%s", importDetails)
 			continue
diff --git a/pkg/tfgen/main.go b/pkg/tfgen/main.go
index 4294235c..4b3f6867 100644
--- a/pkg/tfgen/main.go
+++ b/pkg/tfgen/main.go
@@ -24,7 +24,6 @@ import (
 	"runtime/trace"
 
 	"github.com/golang/glog"
-	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
 	"github.com/pulumi/pulumi-terraform-bridge/v3/pkg/tfbridge"
 	"github.com/pulumi/pulumi/sdk/v3/go/common/util/cmdutil"
 	"github.com/pulumi/pulumi/sdk/v3/go/common/util/contract"
@@ -34,9 +33,6 @@ import (
 
 // Main executes the TFGen process for the given package pkg and provider prov.
 func Main(pkg string, version string, prov tfbridge.ProviderInfo) {
-	// Enable additional provider validation.
-	schema.RunProviderInternalValidation = true
-
 	MainWithCustomGenerate(pkg, version, prov, func(opts GeneratorOptions) error {
 		// Create a generator with the specified settings.
 		g, err := NewGenerator(opts)


Test patch:
diff --git a/internal/testprovider/schema.go b/internal/testprovider/schema.go
index dd96ce6f..771089d8 100644
--- a/internal/testprovider/schema.go
+++ b/internal/testprovider/schema.go
@@ -1057,16 +1057,3 @@ func RequiredWithValidationProvider() *schemav2.Provider {
 		},
 	}
 }
-
-func SchemaFuncPanicsProvider() *schemav2.Provider {
-	return &schemav2.Provider{
-		Schema: map[string]*schemav2.Schema{},
-		ResourcesMap: map[string]*schemav2.Resource{
-			"res": {
-				SchemaFunc: func() map[string]*schemav2.Schema {
-					panic("schema func panic")
-				},
-			},
-		},
-	}
-}
diff --git a/pf/tests/go.mod b/pf/tests/go.mod
index 9a777544..dac99d8d 100644
--- a/pf/tests/go.mod
+++ b/pf/tests/go.mod
@@ -7,7 +7,6 @@ require (
 	github.com/hashicorp/terraform-plugin-go v0.19.0
 	github.com/hashicorp/terraform-plugin-sdk/v2 v2.29.0
 	github.com/hashicorp/terraform-provider-tls/shim v0.0.0-00010101000000-000000000000
-	github.com/hexops/autogold/v2 v2.2.1
 	github.com/pulumi/providertest v0.0.10
 	github.com/pulumi/pulumi-terraform-bridge/pf v0.0.0
 	github.com/pulumi/pulumi-terraform-bridge/v3 v3.73.0
@@ -39,15 +38,12 @@ require (
 	github.com/golang-jwt/jwt/v5 v5.1.0 // indirect
 	github.com/google/s2a-go v0.1.7 // indirect
 	github.com/hashicorp/logutils v1.0.0 // indirect
-	github.com/hexops/gotextdiff v1.0.3 // indirect
-	github.com/hexops/valast v1.4.4 // indirect
 	github.com/kylelemons/godebug v1.1.0 // indirect
 	github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
 	github.com/mattn/go-localereader v0.0.1 // indirect
 	github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
 	github.com/muesli/reflow v0.3.0 // indirect
 	github.com/muesli/termenv v0.15.2 // indirect
-	github.com/nightlyone/lockfile v1.0.0 // indirect
 	github.com/pgavlin/fx v0.1.6 // indirect
 	github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
 	github.com/pulumi/appdash v0.0.0-20231130102222-75f619a67231 // indirect
@@ -60,7 +56,6 @@ require (
 	golang.org/x/tools v0.15.0 // indirect
 	google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f // indirect
 	google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect
-	mvdan.cc/gofumpt v0.5.0 // indirect
 )
 
 replace (
@@ -259,4 +254,4 @@ require (
 	sourcegraph.com/sourcegraph/appdash v0.0.0-20211028080628-e2786a622600
 )
 
-replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9
+replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9
diff --git a/pf/tests/go.sum b/pf/tests/go.sum
index b05e1c25..5b69da78 100644
--- a/pf/tests/go.sum
+++ b/pf/tests/go.sum
@@ -1207,9 +1207,7 @@ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2
 github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
 github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
 github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU=
-github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
-github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
-github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
+github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
@@ -1693,14 +1691,10 @@ github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE
 github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
 github.com/hetznercloud/hcloud-go v1.33.1/go.mod h1:XX/TQub3ge0yWR2yHWmnDVIrB+MQbda1pHxkUmDlUME=
 github.com/hetznercloud/hcloud-go v1.35.0/go.mod h1:mepQwR6va27S3UQthaEPGS86jtzSY9xWL1e9dyxXpgA=
-github.com/hexops/autogold v0.8.1/go.mod h1:97HLDXyG23akzAoRYJh/2OBs3kd80eHyKPvZw0S5ZBY=
 github.com/hexops/autogold v1.3.0 h1:IEtGNPxBeBu8RMn8eKWh/Ll9dVNgSnJ7bp/qHgMQ14o=
 github.com/hexops/autogold/v2 v2.2.1 h1:JPUXuZQGkcQMv7eeDXuNMovjfoRYaa0yVcm+F3voaGY=
-github.com/hexops/autogold/v2 v2.2.1/go.mod h1:IJwxtUfj1BGLm0YsR/k+dIxYi6xbeLjqGke2bzcOTMI=
 github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
-github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
 github.com/hexops/valast v1.4.4 h1:rETyycw+/L2ZVJHHNxEBgh8KUn+87WugH9MxcEv9PGs=
-github.com/hexops/valast v1.4.4/go.mod h1:Jcy1pNH7LNraVaAZDLyv21hHg2WBv9Nf9FL6fGxU7o4=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
 github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
@@ -1893,7 +1887,6 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA
 github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
 github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
-github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
 github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
 github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4=
@@ -2007,7 +2000,6 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS
 github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/nightlyone/lockfile v1.0.0 h1:RHep2cFKK4PonZJDdEl4GmkabuhbsRMgk/k3uAmxBiA=
-github.com/nightlyone/lockfile v1.0.0/go.mod h1:rywoIealpdNse2r832aiD9jRk8ErCatROs6LzC841CI=
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs=
@@ -2203,8 +2195,8 @@ github.com/pulumi/schema-tools v0.1.2 h1:Fd9xvUjgck4NA+7/jSk7InqCUT4Kj940+EcnbQK
 github.com/pulumi/schema-tools v0.1.2/go.mod h1:62lgj52Tzq11eqWTIaKd+EVyYAu5dEcDJxMhTjvMO/k=
 github.com/pulumi/terraform-diff-reader v0.0.2 h1:kTE4nEXU3/SYXESvAIem+wyHMI3abqkI3OhJ0G04LLI=
 github.com/pulumi/terraform-diff-reader v0.0.2/go.mod h1:sZ9FUzGO+yM41hsQHs/yIcj/Y993qMdBxBU5mpDmAfQ=
-github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9 h1:k3SdGlmaJ49yaRV79Ktb5KGdPvuNfeiv4+oHXN+wyhs=
-github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9/go.mod h1:qH/34G25Ugdj5FcM95cSoXzUgIbgfhVLXCcEcYaMwq8=
+github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9 h1:p8vtMw4abpcmwE0v8b6x2GKZQKisrmdjojkoP3oelak=
+github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9/go.mod h1:qH/34G25Ugdj5FcM95cSoXzUgIbgfhVLXCcEcYaMwq8=
 github.com/rakyll/embedmd v0.0.0-20171029212350-c8060a0752a2/go.mod h1:7jOTMgqac46PZcF54q6l2hkLEG8op93fZu61KmxWDV4=
 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
@@ -2220,7 +2212,6 @@ github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
-github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
 github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
 github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
 github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
@@ -2581,7 +2572,6 @@ golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2Uz
 golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
 golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
 golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
-golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
 golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
 golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
 golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
@@ -2646,7 +2636,6 @@ golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
 golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
-golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
 golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
@@ -2737,7 +2726,6 @@ golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfS
 golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
 golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
-golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
 golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
 golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
@@ -2747,7 +2735,6 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
 golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
 golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
-golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
 golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
 golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -2803,7 +2790,6 @@ golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
 golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
 golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -2966,7 +2952,6 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
 golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
@@ -2985,7 +2970,6 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
 golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
 golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
 golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
-golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
 golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
 golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE=
 golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
@@ -3006,7 +2990,6 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
-golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
@@ -3117,11 +3100,8 @@ golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
 golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
-golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s=
-golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4=
-golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM=
 golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8=
 golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk=
 golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -3612,9 +3592,7 @@ modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw
 modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw=
 modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
 modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8=
-mvdan.cc/gofumpt v0.4.0/go.mod h1:PljLOHDeZqgS8opHRKLzp2It2VBuSdteAgqUfzMTxlQ=
 mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E=
-mvdan.cc/gofumpt v0.5.0/go.mod h1:HBeVDtMKRZpXyxFciAirzdKklDlGu8aAy1wEbH5Y9js=
 nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
 pgregory.net/rapid v0.6.1 h1:4eyrDxyht86tT4Ztm+kvlyNBLIk071gR+ZQdhphc9dQ=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
diff --git a/pf/tests/internal/randomshim/go.mod b/pf/tests/internal/randomshim/go.mod
index d717d146..caee4c2e 100644
--- a/pf/tests/internal/randomshim/go.mod
+++ b/pf/tests/internal/randomshim/go.mod
@@ -39,4 +39,4 @@ require (
 	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
 )
 
-replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9
+replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9
diff --git a/pf/tests/internal/randomshim/go.sum b/pf/tests/internal/randomshim/go.sum
index 6dbaa165..f5f12fbb 100644
--- a/pf/tests/internal/randomshim/go.sum
+++ b/pf/tests/internal/randomshim/go.sum
@@ -71,7 +71,7 @@ github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
 github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9 h1:k3SdGlmaJ49yaRV79Ktb5KGdPvuNfeiv4+oHXN+wyhs=
+github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9 h1:p8vtMw4abpcmwE0v8b6x2GKZQKisrmdjojkoP3oelak=
 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
 github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
diff --git a/pf/tests/internal/tlsshim/go.mod b/pf/tests/internal/tlsshim/go.mod
index ff2e8332..bd3e0346 100644
--- a/pf/tests/internal/tlsshim/go.mod
+++ b/pf/tests/internal/tlsshim/go.mod
@@ -38,4 +38,4 @@ require (
 
 replace github.com/hashicorp/terraform-provider-tls => github.com/hashicorp/terraform-provider-tls v1.2.1-0.20230117062332-afdd54107aba
 
-replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9
+replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9
diff --git a/pf/tests/internal/tlsshim/go.sum b/pf/tests/internal/tlsshim/go.sum
index e452ffbe..6ffe7541 100644
--- a/pf/tests/internal/tlsshim/go.sum
+++ b/pf/tests/internal/tlsshim/go.sum
@@ -72,7 +72,7 @@ github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
 github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9 h1:k3SdGlmaJ49yaRV79Ktb5KGdPvuNfeiv4+oHXN+wyhs=
+github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9 h1:p8vtMw4abpcmwE0v8b6x2GKZQKisrmdjojkoP3oelak=
 github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
 github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
diff --git a/pf/tests/provider_checkconfig_test.go b/pf/tests/provider_checkconfig_test.go
index d3c4d828..5af0fd3a 100644
--- a/pf/tests/provider_checkconfig_test.go
+++ b/pf/tests/provider_checkconfig_test.go
@@ -22,7 +22,6 @@ import (
 
 	"github.com/hashicorp/terraform-plugin-framework/provider/schema"
 	"github.com/hashicorp/terraform-plugin-framework/types"
-	"github.com/hexops/autogold/v2"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	"google.golang.org/protobuf/types/known/structpb"
@@ -181,7 +180,9 @@ func TestCheckConfig(t *testing.T) {
 		})
 		require.NoError(t, err)
 		require.Equal(t, 1, len(resp.Failures))
-		autogold.Expect("`testprovider:requiredprop` is not a valid configuration key for the testprovider provider. If the referenced key is not intended for the provider, please choose a different namespace from `testprovider:`.").Equal(t, resp.Failures[0].Reason)
+		assert.Equal(t, "could not validate provider configuration: "+
+			"Invalid or unknown key. Check `pulumi config get testprovider:requiredprop`.",
+			resp.Failures[0].Reason)
 		// Explicit provider.
 		resp, err = provider.CheckConfig(ctx, &pulumirpc.CheckRequest{
 			Urn:  "urn:pulumi:r::cloudflare-record-ts::pulumi:providers:cloudflare::explicitprovider",
@@ -189,7 +190,9 @@ func TestCheckConfig(t *testing.T) {
 		})
 		require.NoError(t, err)
 		require.Equal(t, 1, len(resp.Failures))
-		autogold.Expect("could not validate provider configuration: Invalid or unknown key. Examine values at 'explicitprovider.requiredprop'.").Equal(t, resp.Failures[0].Reason)
+		assert.Equal(t, "could not validate provider configuration: "+
+			"Invalid or unknown key. Examine values at 'explicitprovider.requiredprop'.",
+			resp.Failures[0].Reason)
 	})
 
 	t.Run("levenshtein_correction", func(t *testing.T) {
@@ -213,8 +216,10 @@ func TestCheckConfig(t *testing.T) {
 		require.NoError(t, err)
 		require.NoError(t, err)
 		require.Equal(t, 1, len(resp.Failures))
-		//nolint:lll
-		autogold.Expect("`testprovider:cofnigValue` is not a valid configuration key for the testprovider provider. Did you mean `testprovider:configValue`? If the referenced key is not intended for the provider, please choose a different namespace from `testprovider:`.").Equal(t, resp.Failures[0].Reason)
+		require.Equal(t, "could not validate provider configuration: "+
+			"Invalid or unknown key. Check `pulumi config get testprovider:cofnigValue`. "+
+			"Did you mean `testprovider:configValue`?",
+			resp.Failures[0].Reason)
 	})
 
 	t.Run("validators", func(t *testing.T) {
diff --git a/pf/tests/testdatagen/genrandom/go.mod b/pf/tests/testdatagen/genrandom/go.mod
index f67435a1..e792838b 100644
--- a/pf/tests/testdatagen/genrandom/go.mod
+++ b/pf/tests/testdatagen/genrandom/go.mod
@@ -93,4 +93,4 @@ require (
 	lukechampine.com/frand v1.4.2 // indirect
 )
 
-replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9
+replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9
diff --git a/pkg/tests/go.mod b/pkg/tests/go.mod
index c688228a..aca009d3 100644
--- a/pkg/tests/go.mod
+++ b/pkg/tests/go.mod
@@ -239,4 +239,4 @@ require (
 	lukechampine.com/frand v1.4.2 // indirect
 )
 
-replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9
+replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9
diff --git a/pkg/tests/go.sum b/pkg/tests/go.sum
index 6ad1c75d..a561e73e 100644
--- a/pkg/tests/go.sum
+++ b/pkg/tests/go.sum
@@ -2181,8 +2181,8 @@ github.com/pulumi/schema-tools v0.1.2 h1:Fd9xvUjgck4NA+7/jSk7InqCUT4Kj940+EcnbQK
 github.com/pulumi/schema-tools v0.1.2/go.mod h1:62lgj52Tzq11eqWTIaKd+EVyYAu5dEcDJxMhTjvMO/k=
 github.com/pulumi/terraform-diff-reader v0.0.2 h1:kTE4nEXU3/SYXESvAIem+wyHMI3abqkI3OhJ0G04LLI=
 github.com/pulumi/terraform-diff-reader v0.0.2/go.mod h1:sZ9FUzGO+yM41hsQHs/yIcj/Y993qMdBxBU5mpDmAfQ=
-github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9 h1:k3SdGlmaJ49yaRV79Ktb5KGdPvuNfeiv4+oHXN+wyhs=
-github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9/go.mod h1:qH/34G25Ugdj5FcM95cSoXzUgIbgfhVLXCcEcYaMwq8=
+github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9 h1:p8vtMw4abpcmwE0v8b6x2GKZQKisrmdjojkoP3oelak=
+github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9/go.mod h1:qH/34G25Ugdj5FcM95cSoXzUgIbgfhVLXCcEcYaMwq8=
 github.com/rakyll/embedmd v0.0.0-20171029212350-c8060a0752a2/go.mod h1:7jOTMgqac46PZcF54q6l2hkLEG8op93fZu61KmxWDV4=
 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
diff --git a/pkg/tfbridge/provider_test.go b/pkg/tfbridge/provider_test.go
index 61a2856a..b5d2c9c4 100644
--- a/pkg/tfbridge/provider_test.go
+++ b/pkg/tfbridge/provider_test.go
@@ -24,7 +24,6 @@ import (
 
 	"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
 	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
-	"github.com/hexops/autogold/v2"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 	"google.golang.org/protobuf/types/known/structpb"
@@ -1092,19 +1091,6 @@ func TestCheckConfig(t *testing.T) {
 
 	t.Run("invalid_config_value", func(t *testing.T) {
 		p := testprovider.ProviderV2()
-		p.Schema["assume_role"] = &schema.Schema{
-			Type:     schema.TypeList,
-			Optional: true,
-			MaxItems: 1,
-			Elem: &schema.Resource{
-				Schema: map[string]*schema.Schema{
-					"role_arn": {
-						Type:     schema.TypeString,
-						Optional: true,
-					},
-				},
-			},
-		}
 		provider := &Provider{
 			tf:     shimv2.NewProvider(p),
 			config: shimv2.NewSchemaMap(p.Schema),
@@ -1122,25 +1108,9 @@ func TestCheckConfig(t *testing.T) {
 		})
 		require.NoError(t, err)
 		require.Equal(t, 1, len(resp.Failures))
-		//nolint:lll
-		autogold.Expect("`cloudflare:requiredprop` is not a valid configuration key for the cloudflare provider. If the referenced key is not intended for the provider, please choose a different namespace from `cloudflare:`.").Equal(t, resp.Failures[0].Reason)
-		// Default provider nested config property case.
-		deepArgs, err := structpb.NewStruct(
-			map[string]interface{}{
-				"assumeRole": map[string]interface{}{
-					"roleAnr": "someRoleARN",
-				},
-			},
-		)
-		require.NoError(t, err)
-		resp, err = provider.CheckConfig(ctx, &pulumirpc.CheckRequest{
-			Urn:  "urn:pulumi:r::cloudflare-record-ts::pulumi:providers:aws::default_5_2_1",
-			News: deepArgs,
-		})
-		require.NoError(t, err)
-		require.Equal(t, 1, len(resp.Failures))
-		//nolint:lll
-		autogold.Expect("`cloudflare:assumeRole.roleAnr` is not a valid configuration key for the cloudflare provider. If the referenced key is not intended for the provider, please choose a different namespace from `cloudflare:`.").Equal(t, resp.Failures[0].Reason)
+		require.Equal(t, "could not validate provider configuration: "+
+			"Invalid or unknown key. Check `pulumi config get cloudflare:requiredprop`.",
+			resp.Failures[0].Reason)
 		// Explicit provider.
 		resp, err = provider.CheckConfig(ctx, &pulumirpc.CheckRequest{
 			Urn:  "urn:pulumi:r::cloudflare-record-ts::pulumi:providers:cloudflare::explicitprovider",
@@ -1148,8 +1118,8 @@ func TestCheckConfig(t *testing.T) {
 		})
 		require.NoError(t, err)
 		require.Equal(t, 1, len(resp.Failures))
-		require.Equal(t, "could not validate provider configuration: Invalid or unknown key. "+
-			"Examine values at 'explicitprovider.requiredprop'.",
+		require.Equal(t, "could not validate provider configuration: "+
+			"Invalid or unknown key. Examine values at 'explicitprovider.requiredprop'.",
 			resp.Failures[0].Reason)
 	})
 
@@ -1172,8 +1142,10 @@ func TestCheckConfig(t *testing.T) {
 		require.NoError(t, err)
 		require.NoError(t, err)
 		require.Equal(t, 1, len(resp.Failures))
-		//nolint:lll
-		autogold.Expect("`testprovider:cofnigValue` is not a valid configuration key for the testprovider provider. Did you mean `testprovider:configValue`? If the referenced key is not intended for the provider, please choose a different namespace from `testprovider:`.").Equal(t, resp.Failures[0].Reason)
+		require.Equal(t, "could not validate provider configuration: "+
+			"Invalid or unknown key. Check `pulumi config get testprovider:cofnigValue`. "+
+			"Did you mean `testprovider:configValue`?",
+			resp.Failures[0].Reason)
 	})
 
 	t.Run("missing_required_config_value_explicit_provider", func(t *testing.T) {
@@ -2929,59 +2901,6 @@ func testRefresh(t *testing.T, newProvider func(*schema.Provider) shim.Provider)
 		  "response": {}
 		}`)
 	})
-
-	t.Run("refresh-read-unchanged-archive", func(t *testing.T) {
-		provider := init(func(
-			ctx context.Context, rd *schema.ResourceData, i interface{},
-		) diag.Diagnostics {
-			return diag.Diagnostics{}
-		})
-		provider.info.Resources["example_resource"].Fields = map[string]*SchemaInfo{
-			"string_property_value": {
-				Asset: &AssetTranslation{
-					Kind: FileAsset,
-				},
-			},
-		}
-
-		testutils.Replay(t, provider, `
-		{
-		  "method": "/pulumirpc.ResourceProvider/Read",
-		  "request": {
-		    "id": "someres",
-		    "urn": "urn:pulumi:dev::teststack::ExampleResource::exres",
-		    "properties": {
-		      "stringPropertyValue": {
-			"4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
-			"hash": "a72e573d8c91ec1c6bb0dfdf641bc2de1e2417c0d980ecfcdf039c2a9bcbbf67"
-		      }
-		    },
-		    "inputs": {
-		      "stringPropertyValue": {
-			"4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
-			"hash": "a72e573d8c91ec1c6bb0dfdf641bc2de1e2417c0d980ecfcdf039c2a9bcbbf67"
-		      }
-		    }
-		  },
-		  "response": {
-		    "id": "someres",
-		    "properties": {
-                      "id": "someres",
-                      "__meta": "*",
-		      "stringPropertyValue": {
-			"4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
-			"hash": "a72e573d8c91ec1c6bb0dfdf641bc2de1e2417c0d980ecfcdf039c2a9bcbbf67"
-		      }
-		    },
-		    "inputs": {
-		      "stringPropertyValue": {
-			"4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
-			"hash": "a72e573d8c91ec1c6bb0dfdf641bc2de1e2417c0d980ecfcdf039c2a9bcbbf67"
-		      }
-		    }
-		  }
-		}`)
-	})
 }
 
 func TestDestroy(t *testing.T) {
@@ -3048,58 +2967,3 @@ func testDestroy(t *testing.T, newProvider func(*schema.Provider) shim.Provider)
 		require.Equal(t, 1, called)
 	})
 }
-
-func TestSchemaFuncsNotCalledDuringRuntime(t *testing.T) {
-	p := testprovider.SchemaFuncPanicsProvider()
-	shimProv := shimv2.NewProvider(p)
-	provider := &Provider{
-		tf:     shimProv,
-		config: shimv2.NewSchemaMap(p.Schema),
-		info: ProviderInfo{
-			P: shimProv,
-		},
-	}
-
-	t.Run("Schema func not called if validate disabled", func(t *testing.T) {
-		schema.RunProviderInternalValidation = false
-		testutils.Replay(t, provider, `
-		{
-			"method": "/pulumirpc.ResourceProvider/CheckConfig",
-			"request": {
-				"urn": "urn:pulumi:dev::aws_no_creds::pulumi:providers:aws::default_6_18_2",
-				"olds": {},
-				"news": { "version": "6.18.2" }
-			},
-			"response": {
-				"inputs": {
-					"version": "6.18.2"
-				}
-			}
-		}`)
-	})
-
-	t.Run("Schema func panic if validate enabled", func(t *testing.T) {
-		schema.RunProviderInternalValidation = true
-		defer func() {
-			r := recover()
-			if r.(string) != "schema func panic" {
-				t.Errorf("Wrong panic: %v", r)
-			}
-		}()
-		testutils.Replay(t, provider, `
-		{
-			"method": "/pulumirpc.ResourceProvider/CheckConfig",
-			"request": {
-				"urn": "urn:pulumi:dev::aws_no_creds::pulumi:providers:aws::default_6_18_2",
-				"olds": {},
-				"news": { "version": "6.18.2" }
-			},
-			"response": {
-				"inputs": {
-					"version": "6.18.2"
-				}
-			}
-		}`)
-		t.Errorf("The code did not panic!")
-	})
-}
diff --git a/pkg/tfgen/docs_test.go b/pkg/tfgen/docs_test.go
index 0c536e2f..60f763e7 100644
--- a/pkg/tfgen/docs_test.go
+++ b/pkg/tfgen/docs_test.go
@@ -816,7 +816,7 @@ func TestParseImports_NoOverrides(t *testing.T) {
 				"",
 			},
 			token:    "snowflake:index/accountGrant:AccountGrant",
-			expected: "## Import\n\nformat is account name | | | privilege | true/false for with_grant_option <break><break>```sh<break> $ pulumi import snowflake:index/accountGrant:AccountGrant example 'accountName|||USAGE|true' <break>```<break><break>",
+			expected: "## Import\n\nformat is account name | | | privilege | true/false for with_grant_option<break><break> ```sh<break> $ pulumi import snowflake:index/accountGrant:AccountGrant example 'accountName|||USAGE|true' <break>```<break><break>",
 		},
 		{
 			input: []string{
@@ -829,7 +829,22 @@ func TestParseImports_NoOverrides(t *testing.T) {
 				"",
 			},
 			token:    "snowflake:index/apiIntegration:ApiIntegration",
-			expected: "## Import\n\n<break><break>```sh<break> $ pulumi import snowflake:index/apiIntegration:ApiIntegration example name <break>```<break><break>",
+			expected: "## Import\n\n```sh<break> $ pulumi import snowflake:index/apiIntegration:ApiIntegration example name <break>```<break><break>",
+		},
+		{
+			input: []string{
+				"",
+				"This is a first line in a multi-line import section",
+				"* `{{name}}`",
+				"* `{{id}}`",
+				"For example:",
+				"```sh", // This has several variations upstream
+				"terraform import gcp_accesscontextmanager_access_level.example name",
+				"```",
+				"",
+			},
+			token:    "gcp:accesscontextmanager/accessLevel:AccessLevel",
+			expected: "## Import\n\nThis is a first line in a multi-line import section<break><break> * `{{name}}`<break><break> * `{{id}}`<break><break> For example:<break><break> ```sh<break> $ pulumi import gcp:accesscontextmanager/accessLevel:AccessLevel example name <break>```<break><break>",
 		},
 		{
 			input:        readlines(t, "test_data/parse-imports/accessanalyzer.md"),
diff --git a/pkg/tfgen/test_data/address_map/expected.json b/pkg/tfgen/test_data/address_map/expected.json
index cda15d4f..07752cb9 100644
--- a/pkg/tfgen/test_data/address_map/expected.json
+++ b/pkg/tfgen/test_data/address_map/expected.json
@@ -25,5 +25,5 @@
     "ips": "The set of IPs on the Address Map.",
     "memberships": "Zones and Accounts which will be assigned IPs on this Address Map."
   },
-  "Import": "## Import\n\n\u003cbreak\u003e\u003cbreak\u003e```sh\u003cbreak\u003e $ pulumi import MISSING_TOK example \u003caccount_id\u003e/\u003caddress_map_id\u003e \u003cbreak\u003e```\u003cbreak\u003e\u003cbreak\u003e"
+  "Import": "## Import\n\n```sh\u003cbreak\u003e $ pulumi import MISSING_TOK example \u003caccount_id\u003e/\u003caddress_map_id\u003e \u003cbreak\u003e```\u003cbreak\u003e\u003cbreak\u003e"
 }
\ No newline at end of file
diff --git a/pkg/tfgen/test_data/azurerm-sql-firewall-rule/expected.json b/pkg/tfgen/test_data/azurerm-sql-firewall-rule/expected.json
index f5222fac..6007e0dc 100644
--- a/pkg/tfgen/test_data/azurerm-sql-firewall-rule/expected.json
+++ b/pkg/tfgen/test_data/azurerm-sql-firewall-rule/expected.json
@@ -20,5 +20,5 @@
   "Attributes": {
     "id": "The SQL Firewall Rule ID."
   },
-  "Import": "## Import\n\nSQL Firewall Rules can be imported using the `resource id`, e.g. \u003cbreak\u003e\u003cbreak\u003e```sh\u003cbreak\u003e $ pulumi import MISSING_TOK rule1 /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myresourcegroup/providers/Microsoft.Sql/servers/myserver/firewallRules/rule1 \u003cbreak\u003e```\u003cbreak\u003e\u003cbreak\u003e"
+  "Import": "## Import\n\nSQL Firewall Rules can be imported using the `resource id`, e.g.\u003cbreak\u003e\u003cbreak\u003e ```sh\u003cbreak\u003e $ pulumi import MISSING_TOK rule1 /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myresourcegroup/providers/Microsoft.Sql/servers/myserver/firewallRules/rule1 \u003cbreak\u003e```\u003cbreak\u003e\u003cbreak\u003e"
 }
\ No newline at end of file
diff --git a/testing/go.mod b/testing/go.mod
index 9a59e856..d4ef19a7 100644
--- a/testing/go.mod
+++ b/testing/go.mod
@@ -27,4 +27,4 @@ require (
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )
 
-replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240202163305-e2a20ae13ef9
+replace github.com/hashicorp/terraform-plugin-sdk/v2 => github.com/pulumi/terraform-plugin-sdk/v2 v2.0.0-20240129205329-74776a5cd5f9