From 5443ba4b360bececba3e0c52e9a0e964e860f9d3 Mon Sep 17 00:00:00 2001 From: zhuxiaolong37 Date: Wed, 7 Jul 2021 15:15:06 +0800 Subject: [PATCH 1/2] add PutBucketLifecycle support overlap --- .../oss/internal/OSSBucketOperation.java | 10 +-- .../com/aliyun/oss/internal/OSSHeaders.java | 2 +- .../integrationtests/BucketLifecycleTest.java | 70 +++++++++++++++++++ 3 files changed, 76 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/aliyun/oss/internal/OSSBucketOperation.java b/src/main/java/com/aliyun/oss/internal/OSSBucketOperation.java index 369d6b9f..c9003395 100644 --- a/src/main/java/com/aliyun/oss/internal/OSSBucketOperation.java +++ b/src/main/java/com/aliyun/oss/internal/OSSBucketOperation.java @@ -96,11 +96,7 @@ import static com.aliyun.oss.internal.ResponseParsers.getBucketTransferAccelerationResponseParser; import java.io.ByteArrayInputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import com.aliyun.oss.ClientException; import com.aliyun.oss.HttpMethod; @@ -855,6 +851,10 @@ public VoidResult setBucketLifecycle(SetBucketLifecycleRequest setBucketLifecycl .setInputStreamWithLength(setBucketLifecycleRequestMarshaller.marshall(setBucketLifecycleRequest)) .setOriginalRequest(setBucketLifecycleRequest).build(); + if(!setBucketLifecycleRequest.getHeaders().isEmpty()){ + request.addHeader(OSSHeaders.OSS_HEADER_LIFECYCLE_OVERLAP, setBucketLifecycleRequest.getHeaders().get(OSSHeaders.OSS_HEADER_LIFECYCLE_OVERLAP)); + } + return doOperation(request, requestIdResponseParser, bucketName, null); } diff --git a/src/main/java/com/aliyun/oss/internal/OSSHeaders.java b/src/main/java/com/aliyun/oss/internal/OSSHeaders.java index 687630b4..9ba09a62 100644 --- a/src/main/java/com/aliyun/oss/internal/OSSHeaders.java +++ b/src/main/java/com/aliyun/oss/internal/OSSHeaders.java @@ -111,5 +111,5 @@ public interface OSSHeaders extends HttpHeaders { static final String OSS_RENAME_SOURCE = "x-oss-rename-source"; static final String OSS_RESOURCE_GROUP_ID = "x-oss-resource-group-id"; - + static final String OSS_HEADER_LIFECYCLE_OVERLAP = "x-oss-allow-same-action-overlap"; } diff --git a/src/test/java/com/aliyun/oss/integrationtests/BucketLifecycleTest.java b/src/test/java/com/aliyun/oss/integrationtests/BucketLifecycleTest.java index 72407c7b..cdf46a51 100644 --- a/src/test/java/com/aliyun/oss/integrationtests/BucketLifecycleTest.java +++ b/src/test/java/com/aliyun/oss/integrationtests/BucketLifecycleTest.java @@ -569,4 +569,74 @@ public void testUnormalDeleteBucketLifecycle() { ossClient.deleteBucket(bucketWithoutLifecycleConfiguration); } } + + @Test + public void testLifecycleOverlap() throws ParseException { + final String bucketName = super.bucketName + "normal-set-bucket-lifecycle"; + final String ruleId1 = "overlap/"; + final String matchPrefix1 = "Prefix"; + final String ruleId2 = "overlap/a"; + final String matchPrefix2 = "Prefix/SubPrefix"; + + try { + SetBucketLifecycleRequest request = new SetBucketLifecycleRequest(bucketName); + ossClient.createBucket(bucketName); + + + LifecycleRule rule = new LifecycleRule(ruleId1, matchPrefix1, RuleStatus.Disabled); + List storageTransitions = new ArrayList(); + StorageTransition storageTransition = new StorageTransition(); + storageTransition.setStorageClass(StorageClass.Archive); + storageTransition.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z")); + storageTransitions.add(storageTransition); + rule.setStorageTransition(storageTransitions); + request.AddLifecycleRule(rule); + + LifecycleRule rule2 = new LifecycleRule(ruleId2, matchPrefix2, RuleStatus.Disabled); + List storageTransitions2 = new ArrayList(); + StorageTransition storageTransition2 = new StorageTransition(); + storageTransition2.setStorageClass(StorageClass.Archive); + storageTransition2.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-15T00:00:00.000Z")); + storageTransitions2.add(storageTransition2); + rule2.setStorageTransition(storageTransitions2); + request.AddLifecycleRule(rule2); + + request.addHeader("x-oss-allow-same-action-overlap", "true"); + ossClient.setBucketLifecycle(request); + + List rules = ossClient.getBucketLifecycle(bucketName); + Assert.assertEquals(rules.size(), 2); + + LifecycleRule r1 = rules.get(0); + Assert.assertEquals(r1.getId(), ruleId1); + Assert.assertEquals(r1.getPrefix(), matchPrefix1); + Assert.assertEquals(r1.getStatus(), RuleStatus.Disabled); + Assert.assertFalse(r1.hasCreatedBeforeDate()); + Assert.assertFalse(r1.hasExpirationTime()); + Assert.assertFalse(r1.hasExpirationDays()); + Assert.assertFalse(r1.hasAbortMultipartUpload()); + Assert.assertTrue(r1.hasStorageTransition()); + Assert.assertEquals(DateUtil.formatIso8601Date(r1.getStorageTransition().get(0).getCreatedBeforeDate()), + "2022-10-12T00:00:00.000Z"); + Assert.assertEquals(r1.getStorageTransition().get(0).getStorageClass(), StorageClass.Archive); + + LifecycleRule r2 = rules.get(1); + Assert.assertEquals(r2.getId(), ruleId2); + Assert.assertEquals(r2.getPrefix(), matchPrefix2); + Assert.assertEquals(r2.getStatus(), RuleStatus.Disabled); + Assert.assertFalse(r2.hasCreatedBeforeDate()); + Assert.assertFalse(r2.hasExpirationTime()); + Assert.assertFalse(r2.hasExpirationDays()); + Assert.assertFalse(r2.hasAbortMultipartUpload()); + Assert.assertTrue(r2.hasStorageTransition()); + Assert.assertEquals(DateUtil.formatIso8601Date(r2.getStorageTransition().get(0).getCreatedBeforeDate()), + "2022-10-15T00:00:00.000Z"); + Assert.assertEquals(r2.getStorageTransition().get(0).getStorageClass(), StorageClass.IA); + + } catch (OSSException e) { + Assert.fail(e.getMessage()); + } finally { + ossClient.deleteBucket(bucketName); + } + } } From 984976e14ffb38792ad8dfc64d0006c1eef3e233 Mon Sep 17 00:00:00 2001 From: zhuxiaolong37 Date: Wed, 7 Jul 2021 17:19:01 +0800 Subject: [PATCH 2/2] update lifecycle test --- .../integrationtests/BucketLifecycleTest.java | 45 +++++++------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/src/test/java/com/aliyun/oss/integrationtests/BucketLifecycleTest.java b/src/test/java/com/aliyun/oss/integrationtests/BucketLifecycleTest.java index cdf46a51..69e21cb3 100644 --- a/src/test/java/com/aliyun/oss/integrationtests/BucketLifecycleTest.java +++ b/src/test/java/com/aliyun/oss/integrationtests/BucketLifecycleTest.java @@ -583,24 +583,19 @@ public void testLifecycleOverlap() throws ParseException { ossClient.createBucket(bucketName); - LifecycleRule rule = new LifecycleRule(ruleId1, matchPrefix1, RuleStatus.Disabled); - List storageTransitions = new ArrayList(); - StorageTransition storageTransition = new StorageTransition(); - storageTransition.setStorageClass(StorageClass.Archive); - storageTransition.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z")); - storageTransitions.add(storageTransition); - rule.setStorageTransition(storageTransitions); + LifecycleRule rule = new LifecycleRule(ruleId1, matchPrefix1, RuleStatus.Enabled, + DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z")); request.AddLifecycleRule(rule); - LifecycleRule rule2 = new LifecycleRule(ruleId2, matchPrefix2, RuleStatus.Disabled); - List storageTransitions2 = new ArrayList(); - StorageTransition storageTransition2 = new StorageTransition(); - storageTransition2.setStorageClass(StorageClass.Archive); - storageTransition2.setCreatedBeforeDate(DateUtil.parseIso8601Date("2022-10-15T00:00:00.000Z")); - storageTransitions2.add(storageTransition2); - rule2.setStorageTransition(storageTransitions2); - request.AddLifecycleRule(rule2); + rule = new LifecycleRule(ruleId2, matchPrefix2, RuleStatus.Enabled, + DateUtil.parseIso8601Date("2022-10-12T00:00:00.000Z")); + request.AddLifecycleRule(rule); + try { + ossClient.setBucketLifecycle(request); + } catch (OSSException e){ + Assert.assertEquals("Overlap for same action type Expiration",e.getErrorMessage()); + } request.addHeader("x-oss-allow-same-action-overlap", "true"); ossClient.setBucketLifecycle(request); @@ -610,28 +605,18 @@ public void testLifecycleOverlap() throws ParseException { LifecycleRule r1 = rules.get(0); Assert.assertEquals(r1.getId(), ruleId1); Assert.assertEquals(r1.getPrefix(), matchPrefix1); - Assert.assertEquals(r1.getStatus(), RuleStatus.Disabled); + Assert.assertEquals(r1.getStatus(), RuleStatus.Enabled); Assert.assertFalse(r1.hasCreatedBeforeDate()); - Assert.assertFalse(r1.hasExpirationTime()); - Assert.assertFalse(r1.hasExpirationDays()); - Assert.assertFalse(r1.hasAbortMultipartUpload()); - Assert.assertTrue(r1.hasStorageTransition()); - Assert.assertEquals(DateUtil.formatIso8601Date(r1.getStorageTransition().get(0).getCreatedBeforeDate()), + Assert.assertEquals(DateUtil.formatIso8601Date(r1.getExpirationTime()), "2022-10-12T00:00:00.000Z"); - Assert.assertEquals(r1.getStorageTransition().get(0).getStorageClass(), StorageClass.Archive); LifecycleRule r2 = rules.get(1); Assert.assertEquals(r2.getId(), ruleId2); Assert.assertEquals(r2.getPrefix(), matchPrefix2); - Assert.assertEquals(r2.getStatus(), RuleStatus.Disabled); + Assert.assertEquals(r2.getStatus(), RuleStatus.Enabled); Assert.assertFalse(r2.hasCreatedBeforeDate()); - Assert.assertFalse(r2.hasExpirationTime()); - Assert.assertFalse(r2.hasExpirationDays()); - Assert.assertFalse(r2.hasAbortMultipartUpload()); - Assert.assertTrue(r2.hasStorageTransition()); - Assert.assertEquals(DateUtil.formatIso8601Date(r2.getStorageTransition().get(0).getCreatedBeforeDate()), - "2022-10-15T00:00:00.000Z"); - Assert.assertEquals(r2.getStorageTransition().get(0).getStorageClass(), StorageClass.IA); + Assert.assertEquals(DateUtil.formatIso8601Date(r2.getExpirationTime()), + "2022-10-12T00:00:00.000Z"); } catch (OSSException e) { Assert.fail(e.getMessage());