From 63e6a226cf3e3a23a8bf117ea7ea004a81101d47 Mon Sep 17 00:00:00 2001 From: "Kim, YoungTaek" Date: Fri, 23 May 2025 11:07:21 +0800 Subject: [PATCH] Added new method to CreateBucketRequest and new test case for FileSystem bucket creation on ADO enabled namespace. --- src/main/java/com/emc/object/s3/S3Client.java | 6 ++- .../s3/request/CreateBucketRequest.java | 43 +++++++++++++++++++ .../java/com/emc/object/util/RestUtil.java | 2 + .../com/emc/object/s3/S3JerseyClientTest.java | 23 +++++++++- 4 files changed, 70 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/emc/object/s3/S3Client.java b/src/main/java/com/emc/object/s3/S3Client.java index 8e66c3bb..406b9288 100644 --- a/src/main/java/com/emc/object/s3/S3Client.java +++ b/src/main/java/com/emc/object/s3/S3Client.java @@ -227,8 +227,10 @@ public interface S3Client { /** * Sets whether stale reads are allowed on bucketName. If true, during a temporary site outage (TSO), * objects in the bucket may still be read from secondary sites, but these reads are not guaranteed to be strongly - * consistent (they may be stale if the primary site is inaccessible). Note that stale reads are not - * supported on {@link CreateBucketRequest#setFileSystemEnabled(Boolean) filesystem} buckets. + * consistent (they may be stale if the primary site is inaccessible). + * Note : + * That stale reads are not supported on {@link CreateBucketRequest#setFileSystemEnabled(Boolean) filesystem} buckets. + * That stale reads are supported on {@link CreateBucketRequest#setFileSystemEnabledOnADO(Boolean) filesystem} buckets. */ void setBucketStaleReadAllowed(String bucketName, boolean staleReadsAllowed); diff --git a/src/main/java/com/emc/object/s3/request/CreateBucketRequest.java b/src/main/java/com/emc/object/s3/request/CreateBucketRequest.java index 36ae5ed9..1c4f1fc9 100755 --- a/src/main/java/com/emc/object/s3/request/CreateBucketRequest.java +++ b/src/main/java/com/emc/object/s3/request/CreateBucketRequest.java @@ -44,6 +44,7 @@ public class CreateBucketRequest extends AbstractBucketRequest { private AccessControlList acl; private String vPoolId; private Boolean fileSystemEnabled; + private Boolean fileSystemEnabledOnADO; private Boolean staleReadAllowed; private Boolean encryptionEnabled; private Long retentionPeriod; @@ -62,6 +63,10 @@ public Map> getHeaders() { if (acl != null) headers.putAll(acl.toHeaders()); if (vPoolId != null) RestUtil.putSingle(headers, RestUtil.EMC_VPOOL, vPoolId); if (fileSystemEnabled != null) RestUtil.putSingle(headers, RestUtil.EMC_FS_ENABLED, fileSystemEnabled); + if (fileSystemEnabledOnADO != null) { + RestUtil.putSingle(headers, RestUtil.EMC_FS_ENABLED, fileSystemEnabledOnADO); + RestUtil.add(headers, RestUtil.EMC_TSO_READONLY, Boolean.TRUE); + } if (staleReadAllowed != null) RestUtil.putSingle(headers, RestUtil.EMC_STALE_READ_ALLOWED, staleReadAllowed); if (encryptionEnabled != null) RestUtil.putSingle(headers, RestUtil.EMC_ENCRYPTION_ENABLED, encryptionEnabled); if (retentionPeriod != null) RestUtil.putSingle(headers, RestUtil.EMC_RETENTION_PERIOD, retentionPeriod); @@ -99,15 +104,31 @@ public Boolean getFileSystemEnabled() { return fileSystemEnabled; } + public Boolean getFileSystemEnabledOnADO() { + return fileSystemEnabledOnADO; + } + /** * Sets whether the bucket can be access via filesystem (i.e. HDFS). This will enable some internal semantics for * directories and may affect other features (i.e. * {@link com.emc.object.s3.S3Client#setBucketStaleReadAllowed(String, boolean) TSO support}) */ public void setFileSystemEnabled(Boolean fileSystemEnabled) { + if(this.fileSystemEnabledOnADO != null) this.fileSystemEnabledOnADO = null; this.fileSystemEnabled = fileSystemEnabled; } + /** + * Sets whether the bucket can be access via filesystem (i.e. HDFS) using ADO semantics. + * This will enable some internal semantics for directories and may affect other features (i.e. + * {@link com.emc.object.s3.S3Client#setBucketStaleReadAllowed(String, boolean) TSO support}) + * Note that this will override any existing file system enabled setting. + */ + public void setFileSystemEnabledOnADO(Boolean fileSystemEnabledOnADO) { + if(this.fileSystemEnabled != null) this.fileSystemEnabled = null; + this.fileSystemEnabledOnADO = fileSystemEnabledOnADO; + } + public Boolean getStaleReadAllowed() { return staleReadAllowed; } @@ -184,10 +205,32 @@ public CreateBucketRequest withVPoolId(String vPoolId) { return this; } + /** + * Sets whether the bucket can be accessed via a filesystem (i.e. HDFS) and returns this request object. + * + * This will enable some internal semantics for directories and may affect other features. + * Note that this will override any existing file system enabled with ADO setting. + * + * @param fileSystemEnabled Whether to enable filesystem access on the bucket of non-ADO enabled namespace + * @return this request object + */ public CreateBucketRequest withFileSystemEnabled(boolean fileSystemEnabled) { setFileSystemEnabled(fileSystemEnabled); return this; } + /** + * Sets whether the bucket can be accessed via a filesystem (i.e. HDFS) using ADO semantics and returns this request object. + * + * This will enable some internal semantics for directories and may affect other features. + * Note that this will override any existing file system enabled setting. + * + * @param fileSystemEnabledOnADO Whether to enable filesystem access via ADO semantics on the bucket of ADO enabled namespace + * @return this request object + */ + public CreateBucketRequest withFileSystemEnabledOnADO(boolean fileSystemEnabledOnADO) { + setFileSystemEnabledOnADO(fileSystemEnabledOnADO); + return this; + } public CreateBucketRequest withStaleReadAllowed(boolean staleReadAllowed) { setStaleReadAllowed(staleReadAllowed); diff --git a/src/main/java/com/emc/object/util/RestUtil.java b/src/main/java/com/emc/object/util/RestUtil.java index 8e851b56..440e3b37 100644 --- a/src/main/java/com/emc/object/util/RestUtil.java +++ b/src/main/java/com/emc/object/util/RestUtil.java @@ -79,6 +79,8 @@ public final class RestUtil { public static final String EMC_COPY_MODE = EMC_PREFIX + "copy-mode"; public final static String EMC_MULTIPART_COPY = EMC_PREFIX + "multipart-copy"; public final static String EMC_EMPTY_BUCKET = EMC_PREFIX + "empty-bucket"; + public final static String EMC_TSO_READONLY = EMC_PREFIX + "is-tso-read-only"; + public static final String TYPE_APPLICATION_OCTET_STREAM = "application/octet-stream"; public static final String TYPE_APPLICATION_XML = "application/xml"; public static final String TYPE_APPLICATION_JSON = "application/json"; diff --git a/src/test/java/com/emc/object/s3/S3JerseyClientTest.java b/src/test/java/com/emc/object/s3/S3JerseyClientTest.java index d4952ccf..b5922e2b 100644 --- a/src/test/java/com/emc/object/s3/S3JerseyClientTest.java +++ b/src/test/java/com/emc/object/s3/S3JerseyClientTest.java @@ -178,10 +178,29 @@ public void testCreateFilesystemBucket() { Assume.assumeFalse("FS buckets are not supported with IAM user.", isIamUser); String bucketName = getTestBucket() + "-y"; + try { + client.createBucket(new CreateBucketRequest(bucketName).withFileSystemEnabled(true)); - client.createBucket(new CreateBucketRequest(bucketName).withFileSystemEnabled(true)); + client.deleteBucket(bucketName); + } catch (S3Exception e) { + Assert.assertEquals(409, e.getHttpCode()); + Assert.assertEquals("InvalidBucketState", e.getErrorCode()); + } + } - client.deleteBucket(bucketName); + @Test + public void testCreateFilesystemBucketOnADO() { + Assume.assumeFalse("FS buckets are not supported with IAM user.", isIamUser); + + String bucketName = getTestBucket() + "-ado"; + try { + client.createBucket(new CreateBucketRequest(bucketName).withFileSystemEnabledOnADO(true)); + + client.deleteBucket(bucketName); + } catch (S3Exception e) { + Assert.assertEquals(409, e.getHttpCode()); + Assert.assertEquals("InvalidBucketState", e.getErrorCode()); + } } @Test