This is an automated email from the ASF dual-hosted git repository.

hemant pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new b02741fa5f HDDS-8793. Added integration test to confirm prefix Acls 
work properly with snapshots (#6128)
b02741fa5f is described below

commit b02741fa5f1af6c65f9928ed2f57f7212c7081e0
Author: Hemant Kumar <[email protected]>
AuthorDate: Wed Jan 31 16:02:00 2024 -0800

    HDDS-8793. Added integration test to confirm prefix Acls work properly with 
snapshots (#6128)
---
 .../om/snapshot/TestOzoneManagerSnapshotAcl.java   | 145 ++++++++++++++++++---
 1 file changed, 124 insertions(+), 21 deletions(-)

diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOzoneManagerSnapshotAcl.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOzoneManagerSnapshotAcl.java
index efe854dbc3..0fa439f2ac 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOzoneManagerSnapshotAcl.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOzoneManagerSnapshotAcl.java
@@ -97,7 +97,8 @@ public class TestOzoneManagerSnapshotAcl {
   private static OzoneClient client;
   private String volumeName;
   private String bucketName;
-  private static final String KEY_PREFIX = "key-";
+  private static final String DIR_PREFIX = "dir1/";
+  private static final String KEY_PREFIX = DIR_PREFIX + "key-";
   private String keyName;
   private String snapshotKeyPrefix;
 
@@ -382,6 +383,69 @@ public class TestOzoneManagerSnapshotAcl {
     assertDoesNotThrow(() -> ozoneManager.getAcl(keyObj));
   }
 
+  @ParameterizedTest
+  @EnumSource(BucketLayout.class)
+  public void testLookupKeyWithAllowedUserForPrefixAcl(BucketLayout 
bucketLayout) throws Exception {
+    UserGroupInformation.setLoginUser(UGI1);
+
+    createVolume();
+
+    final OzoneVolume volume = objectStore.getVolume(volumeName);
+    createBucket(bucketLayout, volume);
+
+    final OzoneBucket bucket = volume.getBucket(bucketName);
+
+    setDefaultPrefixAcls();
+
+    createKey(bucket);
+
+    setDefaultVolumeAcls();
+    setDefaultBucketAcls();
+
+    createSnapshot();
+
+    final OmKeyArgs snapshotKeyArgs = getOmKeyArgs(true);
+    assertDoesNotThrow(() -> ozoneManager.lookupKey(snapshotKeyArgs));
+  }
+
+  @ParameterizedTest
+  @EnumSource(BucketLayout.class)
+  public void testLookupKeyWithNotAllowedUserForPrefixAcl(BucketLayout 
bucketLayout) throws Exception {
+    UserGroupInformation.setLoginUser(UGI1);
+
+    createVolume();
+
+    final OzoneVolume volume = objectStore.getVolume(volumeName);
+    createBucket(bucketLayout, volume);
+
+    final OzoneBucket bucket = volume.getBucket(bucketName);
+
+    setDefaultPrefixAcls();
+
+    createKey(bucket);
+
+    setDefaultVolumeAcls();
+    setDefaultBucketAcls();
+
+    createSnapshot();
+
+    final OmKeyArgs snapshotKeyArgs = getOmKeyArgs(true);
+
+    // Add user2 to bucket and prefix ACL
+    setBucketAcl();
+    setPrefixAcls();
+
+    createKey(bucket);
+    final OmKeyArgs keyArgs = getOmKeyArgs(false);
+
+    UserGroupInformation.setLoginUser(UGI2);
+    final OMException ex = assertThrows(OMException.class, () -> 
ozoneManager.lookupKey(snapshotKeyArgs));
+    assertEquals(OMException.ResultCodes.PERMISSION_DENIED, ex.getResult());
+
+    assertDoesNotThrow(() -> ozoneManager.lookupKey(keyArgs));
+  }
+
+
   private void setup(BucketLayout bucketLayout)
       throws IOException {
     UserGroupInformation.setLoginUser(UGI1);
@@ -403,6 +467,12 @@ public class TestOzoneManagerSnapshotAcl {
   }
 
   private void setDefaultAcls() throws IOException {
+    setDefaultVolumeAcls();
+    setDefaultBucketAcls();
+    setDefaultKeyAcls();
+  }
+
+  private void setDefaultVolumeAcls() throws IOException {
     final OzoneObj volumeObj = OzoneObjInfo.Builder.newBuilder()
         .setResType(OzoneObj.ResourceType.VOLUME)
         .setStoreType(OzoneObj.StoreType.OZONE)
@@ -410,8 +480,10 @@ public class TestOzoneManagerSnapshotAcl {
         .build();
     objectStore.setAcl(volumeObj, OzoneAcl.parseAcls(
         "user:" + USER1 + ":r," +
-        "user:" + USER2 + ":r"));
+            "user:" + USER2 + ":r"));
+  }
 
+  private void setDefaultBucketAcls() throws IOException {
     final OzoneObj bucketObj = OzoneObjInfo.Builder.newBuilder()
         .setResType(OzoneObj.ResourceType.BUCKET)
         .setStoreType(OzoneObj.StoreType.OZONE)
@@ -420,8 +492,10 @@ public class TestOzoneManagerSnapshotAcl {
         .build();
     objectStore.setAcl(bucketObj, OzoneAcl.parseAcls(
         "user:" + USER1 + ":r," +
-        "user:" + USER1 + ":l"));
+            "user:" + USER1 + ":l"));
+  }
 
+  private void setDefaultKeyAcls() throws IOException {
     final OzoneObj keyObj = OzoneObjInfo.Builder.newBuilder()
         .setResType(RESOURCE_TYPE_KEY)
         .setStoreType(OzoneObj.StoreType.OZONE)
@@ -431,7 +505,36 @@ public class TestOzoneManagerSnapshotAcl {
         .build();
     objectStore.setAcl(keyObj, OzoneAcl.parseAcls(
         "user:" + USER1 + ":r," +
-        "user:" + USER1 + ":x"));
+            "user:" + USER1 + ":x"));
+  }
+
+  private void setDefaultPrefixAcls() throws IOException {
+    final OzoneObj prefixObj = OzoneObjInfo.Builder.newBuilder()
+        .setResType(OzoneObj.ResourceType.PREFIX)
+        .setStoreType(OzoneObj.StoreType.OZONE)
+        .setVolumeName(volumeName)
+        .setBucketName(bucketName)
+        .setPrefixName(DIR_PREFIX)
+        .build();
+
+    objectStore.setAcl(prefixObj, OzoneAcl.parseAcls(
+        "user:" + USER1 + ":r[DEFAULT]," +
+            "user:" + USER1 + ":x[DEFAULT]"));
+  }
+
+  private void setBucketAcl() throws IOException {
+    OzoneObj bucketObj = OzoneObjInfo.Builder.newBuilder()
+        .setResType(OzoneObj.ResourceType.BUCKET)
+        .setStoreType(OzoneObj.StoreType.OZONE)
+        .setVolumeName(volumeName)
+        .setBucketName(bucketName)
+        .build();
+
+    objectStore.setAcl(bucketObj, OzoneAcl.parseAcls(
+        "user:" + USER1 + ":r," +
+            "user:" + USER1 + ":l," +
+            "user:" + USER2 + ":r," +
+            "user:" + USER2 + ":l"));
   }
 
   private void setKeyAcl() throws IOException {
@@ -449,8 +552,23 @@ public class TestOzoneManagerSnapshotAcl {
             "user:" + USER2 + ":x"));
   }
 
-  private void createKey(OzoneBucket bucket)
-      throws IOException {
+  private void setPrefixAcls() throws IOException {
+    final OzoneObj prefixObj = OzoneObjInfo.Builder.newBuilder()
+        .setResType(OzoneObj.ResourceType.PREFIX)
+        .setStoreType(OzoneObj.StoreType.OZONE)
+        .setVolumeName(volumeName)
+        .setBucketName(bucketName)
+        .setPrefixName(DIR_PREFIX)
+        .build();
+
+    objectStore.setAcl(prefixObj, OzoneAcl.parseAcls(
+        "user:" + USER1 + ":r[DEFAULT]," +
+            "user:" + USER1 + ":x[DEFAULT]," +
+            "user:" + USER2 + ":r[DEFAULT]," +
+            "user:" + USER2 + ":x[DEFAULT]"));
+  }
+
+  private void createKey(OzoneBucket bucket) throws IOException {
     keyName = KEY_PREFIX + RandomStringUtils.randomNumeric(32);
     byte[] data = RandomStringUtils.randomAscii(1).getBytes(UTF_8);
     final OzoneOutputStream fileKey = bucket.createKey(keyName, data.length);
@@ -480,21 +598,6 @@ public class TestOzoneManagerSnapshotAcl {
     }
   }
 
-  private void setBucketAcl() throws IOException {
-    OzoneObj bucketObj = OzoneObjInfo.Builder.newBuilder()
-        .setResType(OzoneObj.ResourceType.BUCKET)
-        .setStoreType(OzoneObj.StoreType.OZONE)
-        .setVolumeName(volumeName)
-        .setBucketName(bucketName)
-        .build();
-
-    objectStore.setAcl(bucketObj, OzoneAcl.parseAcls(
-        "user:" + USER1 + ":r," +
-            "user:" + USER1 + ":l," +
-            "user:" + USER2 + ":r," +
-            "user:" + USER2 + ":l"));
-  }
-
   private static Stream<Arguments> getListStatusArguments() {
     return Stream.of(
         arguments(BucketLayout.OBJECT_STORE, false, false),


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to