Skip to content

Commit 3ff4fa4

Browse files
Enable PlanResourceChange (#4419)
Enable PlanResourceChange by default for every resource in the provider. This pulumi-terraform-bridge feature was incubated under a flag and deployed selectively or quite some time. It should be ready to become the new default. Improvements include prevention of panics and undesirable plans such as permanent diff cycling, as the flow is brought more in line with how TF operates the provider e.g. the expected behavior. --------- Co-authored-by: Venelin <[email protected]> Co-authored-by: VenelinMartinov <[email protected]>
1 parent 290c8c3 commit 3ff4fa4

File tree

7 files changed

+160
-185
lines changed

7 files changed

+160
-185
lines changed

examples/examples_go_test.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,13 @@ func (st tagsState) expectedTags() map[string]string {
202202
return r
203203
}
204204

205+
func normTags(tags map[string]string) map[string]string {
206+
if tags == nil {
207+
return map[string]string{}
208+
}
209+
return tags
210+
}
211+
205212
type tagsFetcher = func() (map[string]string, error)
206213

207214
func (st tagsState) assertTagsEqualWithRetry(
@@ -214,7 +221,7 @@ func (st tagsState) assertTagsEqualWithRetry(
214221
for attempt := 0; attempt < 10; attempt++ {
215222
var err error = nil
216223
actualTags, err = getActualTags()
217-
if err == nil && assert.ObjectsAreEqual(expectTags, actualTags) {
224+
if err == nil && assert.ObjectsAreEqual(normTags(expectTags), normTags(actualTags)) {
218225
break
219226
}
220227
if err != nil {
@@ -226,7 +233,7 @@ func (st tagsState) assertTagsEqualWithRetry(
226233
time.Sleep(5 * time.Second)
227234
t.Logf("Trying to fetch tags again, attempt %d", attempt+1)
228235
}
229-
require.Equalf(t, expectTags, actualTags, msg)
236+
require.Equalf(t, normTags(expectTags), normTags(actualTags), msg)
230237
}
231238

232239
func (st tagsState) validateStateResult(phase int) func(
@@ -247,7 +254,7 @@ func (st tagsState) validateStateResult(phase int) func(
247254
require.NoError(t, err)
248255
t.Logf("phase: %d", phase)
249256
t.Logf("state: %v", st.serialize(t))
250-
require.Equalf(t, st.expectedTags(), actualTags, "key=%s", k)
257+
require.Equalf(t, normTags(st.expectedTags()), normTags(actualTags), "key=%s", k)
251258
t.Logf("key=%s tags are as expected: %v", k, actualTagsJSON)
252259

253260
if k == "bucket" {

examples/examples_yaml_test.go

Lines changed: 4 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -380,9 +380,9 @@ outputs:
380380
// The first test ensures we don't regress on https://github.com/pulumi/pulumi-aws/issues/2682
381381
//
382382
// The second test is when upgrading from pulumi-aws version <5.0.0 to v6.x.x, and
383-
// prevents regressions on https://github.com/pulumi/pulumi-aws/issues/2823.
383+
// prevents regressions on https://github.com/pulumi/pulumi-aws/issues/2823
384384
//
385-
// Updated in https://github.com/pulumi/pulumi-aws/pull/3881 to accept CHANGES_SOME so long as they are not
385+
// Updated in https://github.com/pulumi/pulumi-aws/pull/3881
386386
// replacements.
387387
func TestMigrateRdsInstance(t *testing.T) {
388388
case1 := `[{
@@ -533,143 +533,7 @@ func TestMigrateRdsInstance(t *testing.T) {
533533
"__meta": "{\"e2bfb730-ecaa-11e6-8f88-34363bc7c4c0\":{\"create\":2400000000000,\"delete\":3600000000000,\"update\":4800000000000},\"schema_version\":\"1\"}",
534534
"address": "rds2f5ed54.c1xxca33i6kr.us-east-2.rds.amazonaws.com",
535535
"allocatedStorage": 16,
536-
"arn": "arn:aws:rds:us-east-2:616138583583:db:rds2f5ed54",
537-
"autoMinorVersionUpgrade": true,
538-
"availabilityZone": "us-east-2c",
539-
"backupRetentionPeriod": 0,
540-
"backupWindow": "07:34-08:04",
541-
"caCertIdentifier": "rds-ca-2019",
542-
"copyTagsToSnapshot": false,
543-
"dbSubnetGroupName": "default",
544-
"deleteAutomatedBackups": true,
545-
"deletionProtection": false,
546-
"domain": "",
547-
"domainIamRoleName": "",
548-
"enabledCloudwatchLogsExports": [],
549-
"endpoint": "rds2f5ed54.c1xxca33i6kr.us-east-2.rds.amazonaws.com:3306",
550-
"engine": "mysql",
551-
"engineVersion": "8.0.33",
552-
"hostedZoneId": "Z2XHWR1WZ565X2",
553-
"iamDatabaseAuthenticationEnabled": false,
554-
"id": "rds2f5ed54",
555-
"identifier": "rds2f5ed54",
556-
"instanceClass": "db.t3.micro",
557-
"iops": 0,
558-
"kmsKeyId": "",
559-
"latestRestorableTime": "0001-01-01T00:00:00Z",
560-
"licenseModel": "general-public-license",
561-
"maintenanceWindow": "sun:03:59-sun:04:29",
562-
"maxAllocatedStorage": 0,
563-
"monitoringInterval": 0,
564-
"monitoringRoleArn": "",
565-
"multiAz": false,
566-
"name": "name",
567-
"optionGroupName": "default:mysql-8-0",
568-
"parameterGroupName": "default.mysql8.0",
569-
"password": "FOO-BAR-FIZZ1!2",
570-
"performanceInsightsEnabled": false,
571-
"performanceInsightsKmsKeyId": "",
572-
"performanceInsightsRetentionPeriod": 0,
573-
"port": 3306,
574-
"publiclyAccessible": false,
575-
"replicas": [],
576-
"replicateSourceDb": "",
577-
"resourceId": "db-N57SF65OZ5KO3TPK73R7DQMLZA",
578-
"securityGroupNames": [],
579-
"skipFinalSnapshot": true,
580-
"status": "available",
581-
"storageEncrypted": false,
582-
"storageType": "gp2",
583-
"tags": {
584-
"some": "change"
585-
},
586-
"timezone": "",
587-
"username": "root",
588-
"vpcSecurityGroupIds": [
589-
"sg-1928d262"
590-
]
591-
},
592-
"news": {
593-
"__defaults": [
594-
"applyImmediately",
595-
"autoMinorVersionUpgrade",
596-
"copyTagsToSnapshot",
597-
"deleteAutomatedBackups",
598-
"identifier",
599-
"monitoringInterval",
600-
"performanceInsightsEnabled",
601-
"publiclyAccessible"
602-
],
603-
"allocatedStorage": 16,
604536
"applyImmediately": false,
605-
"autoMinorVersionUpgrade": true,
606-
"copyTagsToSnapshot": false,
607-
"dbName": "name",
608-
"deleteAutomatedBackups": true,
609-
"engine": "mysql",
610-
"identifier": "rds2f5ed54",
611-
"instanceClass": "db.t3.micro",
612-
"monitoringInterval": 0,
613-
"password": "FOO-BAR-FIZZ1!2",
614-
"performanceInsightsEnabled": false,
615-
"publiclyAccessible": false,
616-
"skipFinalSnapshot": true,
617-
"tags": {
618-
"__defaults": [],
619-
"some": "change"
620-
},
621-
"username": "root"
622-
},
623-
"oldInputs": {
624-
"__defaults": [
625-
"applyImmediately",
626-
"autoMinorVersionUpgrade",
627-
"copyTagsToSnapshot",
628-
"deleteAutomatedBackups",
629-
"identifier",
630-
"monitoringInterval",
631-
"performanceInsightsEnabled",
632-
"publiclyAccessible"
633-
],
634-
"allocatedStorage": 16,
635-
"applyImmediately": false,
636-
"autoMinorVersionUpgrade": true,
637-
"copyTagsToSnapshot": false,
638-
"deleteAutomatedBackups": true,
639-
"engine": "mysql",
640-
"identifier": "rds2f5ed54",
641-
"instanceClass": "db.t3.micro",
642-
"monitoringInterval": 0,
643-
"name": "name",
644-
"password": "FOO-BAR-FIZZ1!2",
645-
"performanceInsightsEnabled": false,
646-
"publiclyAccessible": false,
647-
"skipFinalSnapshot": true,
648-
"tags": {
649-
"__defaults": [],
650-
"some": "change"
651-
},
652-
"username": "root"
653-
}
654-
},
655-
"response": {
656-
"stables": "*",
657-
"changes": "*",
658-
"hasDetailedDiff": true
659-
}
660-
}
661-
]`
662-
663-
// Like case2 but permits detailedDiff.
664-
case2a := `[{
665-
"method": "/pulumirpc.ResourceProvider/Diff",
666-
"request": {
667-
"id": "rds2f5ed54",
668-
"urn": "urn:pulumi:exp2::secret-random-yaml::aws:rds/instance:Instance::rds",
669-
"olds": {
670-
"__meta": "{\"e2bfb730-ecaa-11e6-8f88-34363bc7c4c0\":{\"create\":2400000000000,\"delete\":3600000000000,\"update\":4800000000000},\"schema_version\":\"1\"}",
671-
"address": "rds2f5ed54.c1xxca33i6kr.us-east-2.rds.amazonaws.com",
672-
"allocatedStorage": 16,
673537
"arn": "arn:aws:rds:us-east-2:616138583583:db:rds2f5ed54",
674538
"autoMinorVersionUpgrade": true,
675539
"availabilityZone": "us-east-2c",
@@ -790,20 +654,15 @@ func TestMigrateRdsInstance(t *testing.T) {
790654
}
791655
},
792656
"response": {
793-
"diffs": "*",
794657
"stables": "*",
795658
"changes": "*",
796-
"hasDetailedDiff": true,
797-
"detailedDiff": "*"
659+
"hasDetailedDiff": true
798660
}
799661
}
800662
]`
801663

802664
t.Run("case1", func(t *testing.T) { replay(t, case1) })
803665
t.Run("case2", func(t *testing.T) { replay(t, case2) })
804-
t.Setenv("PULUMI_ENABLE_PLAN_RESOURCE_CHANGE", "true")
805-
t.Run("case1-plan-resource-change", func(t *testing.T) { replay(t, case1) })
806-
t.Run("case2-plan-resource-change", func(t *testing.T) { replay(t, case2a) })
807666
}
808667

809668
func TestRegressUnknownTags(t *testing.T) {
@@ -1042,4 +901,4 @@ func TestSourceCodeHashImportedLambdaChecksCleanly(t *testing.T) {
1042901
"name": "aws"
1043902
}
1044903
}]`)
1045-
}
904+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2+
From: Anton Tayanovskyy <[email protected]>
3+
Date: Thu, 29 Aug 2024 13:17:47 -0400
4+
Subject: [PATCH] Legacy bucket Read now sets acl and force_destroy defaults
5+
6+
7+
diff --git a/internal/service/s3legacy/bucket_legacy.go b/internal/service/s3legacy/bucket_legacy.go
8+
index d5c03b22fb..8c26fee574 100644
9+
--- a/internal/service/s3legacy/bucket_legacy.go
10+
+++ b/internal/service/s3legacy/bucket_legacy.go
11+
@@ -35,6 +35,10 @@ import (
12+
"github.com/hashicorp/terraform-provider-aws/internal/verify"
13+
)
14+
15+
+const (
16+
+ bucketACLDefaultValue = "private"
17+
+)
18+
+
19+
func ResourceBucketLegacy() *schema.Resource {
20+
return &schema.Resource{
21+
CreateWithoutTimeout: resourceBucketLegacyCreate,
22+
@@ -80,7 +84,7 @@ func ResourceBucketLegacy() *schema.Resource {
23+
24+
"acl": {
25+
Type: schema.TypeString,
26+
- Default: "private",
27+
+ Default: bucketACLDefaultValue,
28+
Optional: true,
29+
ConflictsWith: []string{"grant"},
30+
ValidateFunc: validation.StringInSlice(BucketCannedACL_Values(), false),
31+
@@ -943,7 +947,7 @@ func resourceBucketLegacyRead(ctx context.Context, d *schema.ResourceData, meta
32+
}
33+
34+
//Read the Grant ACL. Reset if `acl` (canned ACL) is set.
35+
- if acl, ok := d.GetOk("acl"); ok && acl.(string) != "private" {
36+
+ if acl, ok := d.GetOk("acl"); ok && acl.(string) != bucketACLDefaultValue {
37+
if err := d.Set("grant", nil); err != nil {
38+
return diag.Errorf("error resetting grant %s", err)
39+
}
40+
@@ -1403,6 +1407,18 @@ func resourceBucketLegacyRead(ctx context.Context, d *schema.ResourceData, meta
41+
}.String()
42+
d.Set("arn", arn)
43+
44+
+ // Set ACL default if unset, this fixes resource import option operation under Pulumi.
45+
+ _, gotGrant := d.GetOk("grant")
46+
+ _, gotACL := d.GetOk("acl")
47+
+ if !gotGrant && !gotACL {
48+
+ d.Set("acl", bucketACLDefaultValue)
49+
+ }
50+
+
51+
+ // Similarly, set force_destroy to default value if unset, to fix resource import operation.
52+
+ if _, fdSet := d.GetOk("force_destroy"); !fdSet {
53+
+ d.Set("force_destroy", false)
54+
+ }
55+
+
56+
return nil
57+
}
58+

provider/provider_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,8 @@ func pulumiUpWithSnapshot(t *testing.T, pulumiTest *pulumitest.PulumiTest) {
205205
}
206206
pulumiTest.Preview(optpreview.Plan(planFile))
207207
upResult := pulumiTest.Up(optup.Plan(planFile))
208-
fmt.Printf("stdout: %s \n", upResult.StdOut)
209-
fmt.Printf("stderr: %s \n", upResult.StdErr)
208+
t.Logf("stdout: %s \n", upResult.StdOut)
209+
t.Logf("stderr: %s \n", upResult.StdErr)
210210
}
211211

212212
func pulumiTest(t *testing.T, dir string, opts ...opttest.Option) *pulumitest.PulumiTest {

provider/provider_yaml_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -371,13 +371,13 @@ resources:
371371
})
372372

373373
res := pulumiTest.Preview()
374-
fmt.Printf("stdout: %s \n", res.StdOut)
375-
fmt.Printf("stderr: %s \n", res.StdErr)
374+
t.Logf("stdout: %s \n", res.StdOut)
375+
t.Logf("stderr: %s \n", res.StdErr)
376376
assertpreview.HasNoChanges(t, res)
377377

378378
upResult := pulumiTest.Up()
379-
fmt.Printf("stdout: %s \n", upResult.StdOut)
380-
fmt.Printf("stderr: %s \n", upResult.StdErr)
379+
t.Logf("stdout: %s \n", upResult.StdOut)
380+
t.Logf("stderr: %s \n", upResult.StdErr)
381381
})
382382

383383
// test that we can deploy a new filesystem with a list of subnetIds
@@ -548,7 +548,7 @@ type tagsTestStep struct {
548548

549549
// TestAccDefaultTags tries to test all the scenarios that might affect provider defaultTags / resource tags
550550
// i.e. up, refresh, preview, import, etc
551-
func TestAccDefaultTags(t *testing.T) {
551+
func TestAccDefaultTagsWithImport(t *testing.T) {
552552
t.Parallel()
553553
if testing.Short() {
554554
t.Skipf("Skipping in testing.Short() mode, assuming this is a CI run without credentials")

provider/resources.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -819,20 +819,8 @@ func ProviderFromMeta(metaInfo *tfbridge.MetadataInfo) *tfbridge.ProviderInfo {
819819

820820
v2p := shimv2.NewProvider(upstreamProvider.SDKV2Provider,
821821
shimv2.WithDiffStrategy(shimv2.PlanState),
822-
shimv2.WithPlanResourceChange(func(s string) bool {
823-
switch s {
824-
case "aws_ssm_document",
825-
"aws_wafv2_web_acl",
826-
"aws_wafv2_rule_group",
827-
"aws_batch_job_definition",
828-
"aws_lb_listener",
829-
"aws_lb_listener_rule",
830-
"aws_alb_listener",
831-
"aws_alb_listener_rule":
832-
return true
833-
default:
834-
return false
835-
}
822+
shimv2.WithPlanResourceChange(func(string) bool {
823+
return true
836824
}))
837825

838826
p := pftfbridge.MuxShimWithDisjointgPF(ctx, v2p, upstreamProvider.PluginFrameworkProvider)
@@ -2204,6 +2192,18 @@ compatibility shim in favor of the new "name" field.`)
22042192
"node_group_name": tfbridge.AutoName("nodeGroupName", 255, "-"),
22052193
},
22062194
},
2195+
"aws_eks_cluster": {
2196+
TransformFromState: func(_ context.Context, pm resource.PropertyMap) (resource.PropertyMap, error) {
2197+
// if the defaultOutboundAccessEnabled property is not set, set it to the default value of true
2198+
// this prevents an unnecessary replacement when upgrading the provider
2199+
// There is a TF migration which should handle this but due to [pulumi/pulumi-terraform-bridge#1667]
2200+
// it does not work as expected.
2201+
if _, ok := pm["bootstrapSelfManagedAddons"]; !ok {
2202+
pm["bootstrapSelfManagedAddons"] = resource.NewBoolProperty(true)
2203+
}
2204+
return pm, nil
2205+
},
2206+
},
22072207
"aws_eks_fargate_profile": {
22082208
Tok: awsResource(eksMod, "FargateProfile"),
22092209
Fields: map[string]*tfbridge.SchemaInfo{

0 commit comments

Comments
 (0)