Skip to content

Conversation

jbonzo
Copy link
Contributor

@jbonzo jbonzo commented Oct 3, 2025

Rollback Plan

If a change needs to be reverted, we will publish an updated version of the library.

Changes to Security Controls

None

Description

This PR addresses a compatibility issue with Ceph RGW S3 lifecycle configurations where some Ceph RGW versions (confirmed in v19.2.3 Squid) add a deprecated <Prefix> element to lifecycle configuration responses as it's representation of having no prefix.

When Ceph RGW returns <Prefix></Prefix> in API responses, the Terraform provider's wait loop uses reflect.DeepEqual to compare configurations, which fails when comparing Prefix: nil (what Terraform sent) with Prefix: "" (what Ceph returns), causing timeouts during apply operations.

This fix normalizes empty prefix strings to nil after reading lifecycle configurations from S3-compatible APIs, creating symmetry with the existing expand logic that converts empty strings to nil before sending requests. This maintains compatibility with AWS S3 while restoring compatibility with Ceph RGW instances that exhibit this behavior.

Observed Behavior

Terraform sends (PUT request):

<Rule>
  <AbortIncompleteMultipartUpload>
    <DaysAfterInitiation>2</DaysAfterInitiation>
  </AbortIncompleteMultipartUpload>
  <!-- No prefix -->
  <Filter></Filter>  <!-- Empty filter -->
  <ID>Multipart Cleanup</ID>
  <Status>Enabled</Status>
</Rule>

Ceph RGW v19.2.3 returns (GET response):

<Rule>
  <ID>Multipart Cleanup</ID>
  <Prefix></Prefix>  <!-- ADDED BY CEPH - deprecated element -->
  <Status>Enabled</Status>
  <AbortIncompleteMultipartUpload>
    <DaysAfterInitiation>2</DaysAfterInitiation>
  </AbortIncompleteMultipartUpload>
</Rule>

AWS S3 returns (GET response):

<Rule>
  <ID>Multipart Cleanup</ID>
  <Status>Enabled</Status>
  <AbortIncompleteMultipartUpload>
    <DaysAfterInitiation>2</DaysAfterInitiation>
  </AbortIncompleteMultipartUpload>
</Rule>

The Difference: Ceph RGW adds <Prefix></Prefix> (empty string) when none was sent, while AWS S3 omits the deprecated Prefix element entirely.

Relations

I think this issue Relates #43333 , but the logging provided in that issue isn't sufficient to prove itl

References

Here is the spot that normalizes the empty Prefix when expanding the resource.

prefix := fwflex.EmptyStringAsNull(m.Prefix)

Output from Acceptance Testing

% make testacc TESTS='TestAccS3BucketLifecycleConfiguration.*' PKG=s3
make: Verifying source code with gofmt...
==> Checking that code complies with gofmt requirements...
make: Running acceptance tests on branch: 🌿 b-s3-lifecycle-normalize-prefix 🌿...
TF_ACC=1 go1.24.6 test ./internal/service/s3/... -v -count 1 -parallel 20 -run='TestAccS3BucketLifecycleConfiguration.*'  -timeout 360m -vet=off
2025/10/03 10:28:12 Creating Terraform AWS Provider (SDKv2-style)...
2025/10/03 10:28:12 Initializing Terraform AWS Provider (SDKv2-style)...
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_rule_NoFilterOrPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_rule_NoFilterOrPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_FilterWithPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_FilterWithPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_filterWithEmptyPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_filterWithEmptyPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeGreaterThanToPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeGreaterThanToPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeLessThanToPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeLessThanToPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeGreaterThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeGreaterThan
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeLessThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeLessThan
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRange
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRange
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRangeAndPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRangeAndPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_Tags
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_Tags
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_ZeroLessThan_ChangeOnUpdate
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_ZeroLessThan_ChangeOnUpdate
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_Tag
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_Tag
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions_WithChange
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions_WithChange
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_nonCurrentVersionExpiration
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_nonCurrentVersionExpiration
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_ruleAbortIncompleteMultipartUpload
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_ruleAbortIncompleteMultipartUpload
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_expireMarkerOnly
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_expireMarkerOnly
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_emptyBlock
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_emptyBlock
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RulePrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RulePrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionDate
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionDate
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionStorageClassOnly_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionStorageClassOnly_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionZeroDays_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionZeroDays_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_basic
=== PAUSE TestAccS3BucketLifecycleConfiguration_basic
=== RUN   TestAccS3BucketLifecycleConfiguration_disappears
=== PAUSE TestAccS3BucketLifecycleConfiguration_disappears
=== RUN   TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_filterWithPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_filterWithPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd
=== RUN   TestAccS3BucketLifecycleConfiguration_disableRule
=== PAUSE TestAccS3BucketLifecycleConfiguration_disableRule
=== RUN   TestAccS3BucketLifecycleConfiguration_multipleRules
=== PAUSE TestAccS3BucketLifecycleConfiguration_multipleRules
=== RUN   TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_nonCurrentVersionExpiration
=== PAUSE TestAccS3BucketLifecycleConfiguration_nonCurrentVersionExpiration
=== RUN   TestAccS3BucketLifecycleConfiguration_nonCurrentVersionExpiration_RemoveNoncurrentVersions
=== PAUSE TestAccS3BucketLifecycleConfiguration_nonCurrentVersionExpiration_RemoveNoncurrentVersions
=== RUN   TestAccS3BucketLifecycleConfiguration_nonCurrentVersionTransition
=== PAUSE TestAccS3BucketLifecycleConfiguration_nonCurrentVersionTransition
=== RUN   TestAccS3BucketLifecycleConfiguration_RulePrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_RulePrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter
=== PAUSE TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter
=== RUN   TestAccS3BucketLifecycleConfiguration_Filter_Tag
=== PAUSE TestAccS3BucketLifecycleConfiguration_Filter_Tag
=== RUN   TestAccS3BucketLifecycleConfiguration_RuleExpiration_expireMarkerOnly
=== PAUSE TestAccS3BucketLifecycleConfiguration_RuleExpiration_expireMarkerOnly
=== RUN   TestAccS3BucketLifecycleConfiguration_RuleExpiration_emptyBlock
=== PAUSE TestAccS3BucketLifecycleConfiguration_RuleExpiration_emptyBlock
=== RUN   TestAccS3BucketLifecycleConfiguration_ruleAbortIncompleteMultipartUpload
=== PAUSE TestAccS3BucketLifecycleConfiguration_ruleAbortIncompleteMultipartUpload
=== RUN   TestAccS3BucketLifecycleConfiguration_TransitionDate_standardIa
=== PAUSE TestAccS3BucketLifecycleConfiguration_TransitionDate_standardIa
=== RUN   TestAccS3BucketLifecycleConfiguration_TransitionDate_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_TransitionDate_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_TransitionStorageClassOnly_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_TransitionStorageClassOnly_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_TransitionZeroDays_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_TransitionZeroDays_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_TransitionUpdateBetweenDaysAndDate_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_TransitionUpdateBetweenDaysAndDate_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions
=== PAUSE TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions
=== RUN   TestAccS3BucketLifecycleConfiguration_migrateFromBucket_noChange
=== PAUSE TestAccS3BucketLifecycleConfiguration_migrateFromBucket_noChange
=== RUN   TestAccS3BucketLifecycleConfiguration_migrateFromBucket_withChange
=== PAUSE TestAccS3BucketLifecycleConfiguration_migrateFromBucket_withChange
=== RUN   TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_directoryBucket
=== PAUSE TestAccS3BucketLifecycleConfiguration_directoryBucket
=== RUN   TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_update
=== PAUSE TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_update
=== RUN   TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_remove
=== PAUSE TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_remove
=== RUN   TestAccS3BucketLifecycleConfiguration_removeRule
=== PAUSE TestAccS3BucketLifecycleConfiguration_removeRule
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_rule_NoFilterOrPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_rule_NoFilterOrPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_FilterWithPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_FilterWithPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeGreaterThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeGreaterThan
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeLessThan
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeLessThan
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRange
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRange
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRangeAndPrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRangeAndPrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_And_Tags
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_And_Tags
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_Tag
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_Tag
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions_WithChange
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions_WithChange
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_nonCurrentVersionExpiration
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_nonCurrentVersionExpiration
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_ruleAbortIncompleteMultipartUpload
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_ruleAbortIncompleteMultipartUpload
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_expireMarkerOnly
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_expireMarkerOnly
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_emptyBlock
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_emptyBlock
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RulePrefix
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RulePrefix
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionDate
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionDate
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionStorageClassOnly_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionStorageClassOnly_intelligentTiering
=== RUN   TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionZeroDays_intelligentTiering
=== PAUSE TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionZeroDays_intelligentTiering
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_rule_NoFilterOrPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_nonCurrentVersionExpiration_RemoveNoncurrentVersions
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionStorageClassOnly_intelligentTiering
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero
=== CONT  TestAccS3BucketLifecycleConfiguration_disableRule
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_ruleAbortIncompleteMultipartUpload
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionDate
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeGreaterThan
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RulePrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_expireMarkerOnly
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_Tags
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRangeAndPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRange
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeLessThan
=== CONT  TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_ZeroLessThan_ChangeOnUpdate
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_emptyBlock
--- PASS: TestAccS3BucketLifecycleConfiguration_multipleRules_noFilterOrPrefix (77.38s)
=== CONT  TestAccS3BucketLifecycleConfiguration_nonCurrentVersionExpiration
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRangeAndPrefix (77.58s)
=== CONT  TestAccS3BucketLifecycleConfiguration_multipleRules
--- PASS: TestAccS3BucketLifecycleConfiguration_nonCurrentVersionExpiration_RemoveNoncurrentVersions (146.84s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeRange (149.71s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions_WithChange
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThanZero (151.44s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionZeroDays_intelligentTiering
--- PASS: TestAccS3BucketLifecycleConfiguration_multipleRules (75.29s)
=== CONT  TestAccS3BucketLifecycleConfiguration_removeRule
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_PrefixToAnd (162.27s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionStorageClassOnly_intelligentTiering
--- PASS: TestAccS3BucketLifecycleConfiguration_disableRule (218.78s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions
--- PASS: TestAccS3BucketLifecycleConfiguration_nonCurrentVersionExpiration (154.52s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionDate
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeLessThan (150.20s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_Tag
--- PASS: TestAccS3BucketLifecycleConfiguration_removeRule (148.03s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_And_Tags
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeLessThan (1251.41s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RulePrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_Tags (1256.21s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRangeAndPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_ruleAbortIncompleteMultipartUpload (1274.83s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRange
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRangeAndPrefix (1280.13s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_emptyBlock
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_emptyBlock (1281.01s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeLessThan
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RulePrefix (1287.37s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_expireMarkerOnly
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionDate (1292.88s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeGreaterThan
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_ruleAbortIncompleteMultipartUpload
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_And_ZeroLessThan_ChangeOnUpdate (1306.72s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeGreaterThan (1308.87s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_FilterWithPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionZeroDays_intelligentTiering (1230.52s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_nonCurrentVersionExpiration
	--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionDate (1171.38s)
=== CONT  TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_rule_NoFilterOrPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions_WithChange (1264.52s)
=== CONT  TestAccS3BucketLifecycleConfiguration_disappears
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_Tag (1147.22s)
=== CONT  TestAccS3BucketLifecycleConfiguration_filterWithPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_And_Tags (1154.98s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan
--- PASS: TestAccS3BucketLifecycleConfiguration_disappears (72.82s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_filterWithPrefix (153.94s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix
=== CONT  TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_ObjectSizeGreaterThan (154.24s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_objectSizeLessThanToPrefix (155.68s)
=== CONT  TestAccS3BucketLifecycleConfiguration_TransitionStorageClassOnly_intelligentTiering
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_ObjectSizeRange (1728.64s)
=== CONT  TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_remove
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_objectSizeGreaterThanToPrefix (147.20s)
=== CONT  TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_update
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_TransitionStorageClassOnly_intelligentTiering (1586.58s)
=== CONT  TestAccS3BucketLifecycleConfiguration_directoryBucket
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_ruleAbortIncompleteMultipartUpload (444.15s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionStorageClassOnly_intelligentTiering (1759.18s)
=== CONT  TestAccS3BucketLifecycleConfiguration_migrateFromBucket_withChange
--- PASS: TestAccS3BucketLifecycleConfiguration_filterWithEmptyPrefix (152.27s)
=== CONT  TestAccS3BucketLifecycleConfiguration_migrateFromBucket_noChange
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_RuleExpiration_expireMarkerOnly (1769.93s)
=== CONT  TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_emptyBlock (503.14s)
=== CONT  TestAccS3BucketLifecycleConfiguration_TransitionUpdateBetweenDaysAndDate_intelligentTiering
--- PASS: TestAccS3BucketLifecycleConfiguration_TransitionStorageClassOnly_intelligentTiering (143.67s)
=== CONT  TestAccS3BucketLifecycleConfiguration_TransitionZeroDays_intelligentTiering
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_EmptyFilter_NonCurrentVersions (1576.65s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeLessThanToPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_rule_NoFilterOrPrefix (1812.99s)
=== CONT  TestAccS3BucketLifecycleConfiguration_RuleExpiration_expireMarkerOnly
=== CONT  TestAccS3BucketLifecycleConfiguration_TransitionDate_intelligentTiering
--- PASS: TestAccS3BucketLifecycleConfiguration_directoryBucket (81.00s)
--- PASS: TestAccS3BucketLifecycleConfiguration_migrateFromBucket_withChange (78.38s)
=== CONT  TestAccS3BucketLifecycleConfiguration_TransitionDate_standardIa
--- PASS: TestAccS3BucketLifecycleConfiguration_migrateFromBucket_noChange (78.63s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeGreaterThanToPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RulePrefix (599.28s)
=== CONT  TestAccS3BucketLifecycleConfiguration_basic
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeGreaterThan (571.55s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions_WithChange
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeLessThan (588.20s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions
--- PASS: TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_remove (142.94s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_nonCurrentVersionExpiration
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_RuleExpiration_expireMarkerOnly (584.76s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_Tag
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_rule_NoFilterOrPrefix (476.86s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_filterWithEmptyPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_FilterWithPrefix (579.34s)
=== CONT  TestAccS3BucketLifecycleConfiguration_RuleExpiration_emptyBlock
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_nonCurrentVersionExpiration (506.68s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_FilterWithPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_transitionDefaultMinimumObjectSize_update (144.10s)
=== CONT  TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter
--- PASS: TestAccS3BucketLifecycleConfiguration_TransitionDate_intelligentTiering (72.70s)
=== CONT  TestAccS3BucketLifecycleConfiguration_RulePrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRange (629.80s)
=== CONT  TestAccS3BucketLifecycleConfiguration_Filter_Tag
--- PASS: TestAccS3BucketLifecycleConfiguration_EmptyFilter_NonCurrentVersions (143.11s)
=== CONT  TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionZeroDays_intelligentTiering
--- PASS: TestAccS3BucketLifecycleConfiguration_upgradeV5_86_0_Filter_ObjectSizeRangeAndPrefix (657.47s)
=== CONT  TestAccS3BucketLifecycleConfiguration_nonCurrentVersionTransition
--- PASS: TestAccS3BucketLifecycleConfiguration_basic (74.99s)
=== CONT  TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix
--- PASS: TestAccS3BucketLifecycleConfiguration_TransitionZeroDays_intelligentTiering (144.85s)
=== CONT  TestAccS3BucketLifecycleConfiguration_ruleAbortIncompleteMultipartUpload
--- PASS: TestAccS3BucketLifecycleConfiguration_RuleExpiration_expireMarkerOnly (145.74s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Update_filterWithAndToFilterWithPrefix (211.42s)
--- PASS: TestAccS3BucketLifecycleConfiguration_TransitionDate_standardIa (147.60s)
--- PASS: TestAccS3BucketLifecycleConfiguration_TransitionUpdateBetweenDaysAndDate_intelligentTiering (216.37s)
--- PASS: TestAccS3BucketLifecycleConfiguration_rule_NoFilterOrPrefix (82.11s)
--- PASS: TestAccS3BucketLifecycleConfiguration_RulePrefixToFilter (147.12s)
--- PASS: TestAccS3BucketLifecycleConfiguration_RuleExpiration_emptyBlock (153.20s)
--- PASS: TestAccS3BucketLifecycleConfiguration_RulePrefix (149.66s)
--- PASS: TestAccS3BucketLifecycleConfiguration_Filter_Tag (156.88s)
--- PASS: TestAccS3BucketLifecycleConfiguration_nonCurrentVersionTransition (149.57s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeLessThanToPrefix (274.40s)
--- PASS: TestAccS3BucketLifecycleConfiguration_ruleAbortIncompleteMultipartUpload (150.65s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_FilterWithPrefix (316.22s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions (341.30s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_nonCurrentVersionExpiration (341.48s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_objectSizeGreaterThanToPrefix (414.63s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_EmptyFilter_NonCurrentVersions_WithChange (404.38s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_TransitionZeroDays_intelligentTiering (391.40s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_filterWithEmptyPrefix (427.49s)
--- PASS: TestAccS3BucketLifecycleConfiguration_frameworkMigrationV0_Filter_Tag (436.78s)
PASS
ok  	github.com/hashicorp/terraform-provider-aws/internal/service/s3	2309.136s
...

Copy link
Contributor

github-actions bot commented Oct 3, 2025

Community Guidelines

This comment is added to every new Pull Request to provide quick reference to how the Terraform AWS Provider is maintained. Please review the information below, and thank you for contributing to the community that keeps the provider thriving! 🚀

Voting for Prioritization

  • Please vote on this Pull Request by adding a 👍 reaction to the original post to help the community and maintainers prioritize it.
  • Please see our prioritization guide for additional information on how the maintainers handle prioritization.
  • Please do not leave +1 or other comments that do not add relevant new information or questions; they generate extra noise for others following the Pull Request and do not help prioritize the request.

Pull Request Authors

  • Review the contribution guide relating to the type of change you are making to ensure all of the necessary steps have been taken.
  • Whether or not the branch has been rebased will not impact prioritization, but doing so is always a welcome surprise.

@github-actions github-actions bot added needs-triage Waiting for first response or review from a maintainer. tests PRs: expanded test coverage. Issues: expanded coverage, enhancements to test infrastructure. service/s3 Issues and PRs that pertain to the s3 service. size/M Managed by automation to categorize the size of a PR. labels Oct 3, 2025
@jbonzo jbonzo force-pushed the b-s3-lifecycle-normalize-prefix branch 2 times, most recently from b3b4389 to d7d292e Compare October 3, 2025 15:10
@github-actions github-actions bot added the size/XS Managed by automation to categorize the size of a PR. label Oct 3, 2025
@jbonzo jbonzo force-pushed the b-s3-lifecycle-normalize-prefix branch from d7d292e to ace96e1 Compare October 3, 2025 15:10
@jbonzo jbonzo marked this pull request as ready for review October 3, 2025 15:10
@jbonzo jbonzo requested a review from a team as a code owner October 3, 2025 15:10
@jbonzo jbonzo force-pushed the b-s3-lifecycle-normalize-prefix branch 2 times, most recently from 66d2eac to 6e72c13 Compare October 3, 2025 15:13
@justinretzolk justinretzolk added bug Addresses a defect in current functionality. aws-compatible-service Issues related to compatibility with AWS-compatible services. and removed needs-triage Waiting for first response or review from a maintainer. labels Oct 3, 2025
@jbonzo jbonzo force-pushed the b-s3-lifecycle-normalize-prefix branch from 6e72c13 to f7841c8 Compare October 3, 2025 18:01
@jbonzo
Copy link
Contributor Author

jbonzo commented Oct 3, 2025

Adding nolint entries because staticcheck is complaining that I'm touching a deprecated resource, which is the nature of this PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
aws-compatible-service Issues related to compatibility with AWS-compatible services. bug Addresses a defect in current functionality. service/s3 Issues and PRs that pertain to the s3 service. size/M Managed by automation to categorize the size of a PR. size/XS Managed by automation to categorize the size of a PR. tests PRs: expanded test coverage. Issues: expanded coverage, enhancements to test infrastructure.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants