This is an automated email from the ASF dual-hosted git repository.
adoroszlai 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 3cd088061c HDDS-12245. Share cluster in ACL integration tests (#7840)
3cd088061c is described below
commit 3cd088061ca10940b4114b6b08492286642f4c3c
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Wed Feb 12 08:22:08 2025 +0100
HDDS-12245. Share cluster in ACL integration tests (#7840)
---
.../apache/hadoop/ozone/om/TestBucketOwner.java | 87 +++-----
.../ozone/om/TestOzoneManagerListVolumes.java | 231 ++++++++++-----------
.../hadoop/ozone/om/TestRecursiveAclWithFSO.java | 87 ++------
.../test/java/org/apache/ozone/test/AclTests.java | 88 ++++++++
.../org/apache/ozone/test/ConfigAssumptions.java | 32 +++
.../java/org/apache/ozone/test/NonHATests.java | 8 +
.../ozone/test/TestOzoneNonHAWithNativeACL.java | 31 +++
7 files changed, 330 insertions(+), 234 deletions(-)
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestBucketOwner.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestBucketOwner.java
index 97512fec40..a5d31ca6af 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestBucketOwner.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestBucketOwner.java
@@ -16,9 +16,7 @@
*/
package org.apache.hadoop.ozone.om;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.StorageType;
-import org.apache.hadoop.ozone.MiniOzoneCluster;
import org.apache.hadoop.ozone.OzoneAcl;
import org.apache.hadoop.ozone.client.BucketArgs;
import org.apache.hadoop.ozone.client.ObjectStore;
@@ -31,19 +29,17 @@
import org.apache.hadoop.ozone.security.acl.OzoneObj;
import org.apache.hadoop.ozone.security.acl.OzoneObjInfo;
import org.apache.hadoop.security.UserGroupInformation;
-import org.junit.jupiter.api.AfterAll;
+import org.apache.ozone.test.AclTests;
+import org.apache.ozone.test.NonHATests;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.Timeout;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import java.io.IOException;
+import java.util.UUID;
import static org.apache.hadoop.ozone.OzoneAcl.AclScope.DEFAULT;
-import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_AUTHORIZER_CLASS;
-import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_AUTHORIZER_CLASS_NATIVE;
-import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_ENABLED;
import static
org.apache.hadoop.ozone.security.acl.IAccessAuthorizer.ACLIdentityType.USER;
import static org.apache.hadoop.ozone.security.acl.OzoneObj.StoreType.OZONE;
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -52,63 +48,48 @@
/**
* Test for Ozone Bucket Owner.
*/
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@Timeout(120)
-public class TestBucketOwner {
+public abstract class TestBucketOwner implements NonHATests.TestCase {
- private static MiniOzoneCluster cluster;
- private static final Logger LOG =
- LoggerFactory.getLogger(TestBucketOwner.class);
- private static UserGroupInformation adminUser =
- UserGroupInformation.createUserForTesting("om", new String[]{"ozone"});
+ private static final String UNIQUE = UUID.randomUUID().toString();
+ private static final String VOLUME_NAME = "vol-" + UNIQUE;
private static UserGroupInformation user1 = UserGroupInformation
- .createUserForTesting("user1", new String[] {"test1"});
+ .createUserForTesting("user-" + UNIQUE + 1, new String[] {"test1"});
private static UserGroupInformation user2 = UserGroupInformation
- .createUserForTesting("user2", new String[] {"test2"});
+ .createUserForTesting("user-" + UNIQUE + 2, new String[] {"test2"});
private static UserGroupInformation user3 = UserGroupInformation
- .createUserForTesting("user3", new String[] {"test3"});
+ .createUserForTesting("user-" + UNIQUE + 3, new String[] {"test3"});
@BeforeAll
- public static void init() throws Exception {
- // loginUser is the user running this test.
- UserGroupInformation.setLoginUser(adminUser);
- OzoneConfiguration conf = new OzoneConfiguration();
- conf.set(OZONE_ACL_AUTHORIZER_CLASS, OZONE_ACL_AUTHORIZER_CLASS_NATIVE);
- conf.setBoolean(OZONE_ACL_ENABLED, true);
- cluster = MiniOzoneCluster.newBuilder(conf).build();
- cluster.waitForClusterToBeReady();
- try (OzoneClient client = cluster.newClient()) {
+ void init() throws Exception {
+ UserGroupInformation.setLoginUser(AclTests.ADMIN_UGI);
+ try (OzoneClient client = cluster().newClient()) {
ObjectStore objectStore = client.getObjectStore();
/* r = READ, w = WRITE, c = CREATE, d = DELETE
l = LIST, a = ALL, n = NONE, x = READ_ACL, y = WRITE_ACL */
String aclWorldAll = "world::a";
- createVolumeWithOwnerAndAcl(objectStore, "volume1", "user2",
aclWorldAll);
+ createVolumeWithOwnerAndAcl(objectStore, VOLUME_NAME,
user2.getShortUserName(), aclWorldAll);
}
UserGroupInformation.setLoginUser(user1);
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
ObjectStore objectStore = client.getObjectStore();
- OzoneVolume volume = objectStore.getVolume("volume1");
+ OzoneVolume volume = objectStore.getVolume(VOLUME_NAME);
BucketArgs omBucketArgs = BucketArgs.newBuilder()
- .setStorageType(StorageType.DISK).setOwner("user1").build();
+
.setStorageType(StorageType.DISK).setOwner(user1.getShortUserName()).build();
volume.createBucket("bucket1", omBucketArgs);
volume.createBucket("bucket2", omBucketArgs);
volume.createBucket("bucket3", omBucketArgs);
}
}
- @AfterAll
- public static void stopCluster() {
- if (cluster != null) {
- cluster.shutdown();
- }
- }
-
@Test
public void testBucketOwner() throws Exception {
// Test Key Operations as Bucket Owner, Non-Volume Owner
UserGroupInformation.setLoginUser(user1);
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
OzoneVolume volume = client.getObjectStore()
- .getVolume("volume1");
+ .getVolume(VOLUME_NAME);
OzoneBucket ozoneBucket = volume.getBucket("bucket1");
//Key Create
createKey(ozoneBucket, "key1", 10, new byte[10]);
@@ -133,50 +114,50 @@ public void testNonBucketNonVolumeOwner() throws
Exception {
// Test Key Operations Non-Bucket Owner, Non-Volume Owner
//Key Create
UserGroupInformation.setLoginUser(user3);
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
assertThrows(Exception.class, () -> {
- OzoneVolume volume = client.getObjectStore().getVolume("volume1");
+ OzoneVolume volume = client.getObjectStore().getVolume(VOLUME_NAME);
OzoneBucket ozoneBucket = volume.getBucket("bucket1");
createKey(ozoneBucket, "key3", 10, new byte[10]);
}, "Create key as non-volume and non-bucket owner should fail");
}
//Key Delete - should fail
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
assertThrows(Exception.class, () -> {
- OzoneVolume volume = client.getObjectStore().getVolume("volume1");
+ OzoneVolume volume = client.getObjectStore().getVolume(VOLUME_NAME);
OzoneBucket ozoneBucket = volume.getBucket("bucket1");
ozoneBucket.deleteKey("key2");
}, "Delete key as non-volume and non-bucket owner should fail");
}
//Key Rename - should fail
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
assertThrows(Exception.class, () -> {
- OzoneVolume volume = client.getObjectStore().getVolume("volume1");
+ OzoneVolume volume = client.getObjectStore().getVolume(VOLUME_NAME);
OzoneBucket ozoneBucket = volume.getBucket("bucket1");
ozoneBucket.renameKey("key2", "key4");
}, "Rename key as non-volume and non-bucket owner should fail");
}
//List Keys - should fail
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
assertThrows(Exception.class, () -> {
- OzoneVolume volume = client.getObjectStore().getVolume("volume1");
+ OzoneVolume volume = client.getObjectStore().getVolume(VOLUME_NAME);
OzoneBucket ozoneBucket = volume.getBucket("bucket1");
ozoneBucket.listKeys("key");
}, "List keys as non-volume and non-bucket owner should fail");
}
//Get Acls - should fail
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
assertThrows(Exception.class, () -> {
- OzoneVolume volume = client.getObjectStore().getVolume("volume1");
+ OzoneVolume volume = client.getObjectStore().getVolume(VOLUME_NAME);
OzoneBucket ozoneBucket = volume.getBucket("bucket1");
ozoneBucket.getAcls();
}, "Get Acls as non-volume and non-bucket owner should fail");
}
//Add Acls - should fail
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
assertThrows(Exception.class, () -> {
- OzoneVolume volume = client.getObjectStore().getVolume("volume1");
+ OzoneVolume volume = client.getObjectStore().getVolume(VOLUME_NAME);
OzoneBucket ozoneBucket = volume.getBucket("bucket1");
OzoneAcl acl = new OzoneAcl(USER, "testuser1",
DEFAULT, IAccessAuthorizer.ACLType.ALL);
@@ -189,8 +170,8 @@ public void testNonBucketNonVolumeOwner() throws Exception {
public void testVolumeOwner() throws Exception {
//Test Key Operations for Volume Owner
UserGroupInformation.setLoginUser(user2);
- try (OzoneClient client = cluster.newClient()) {
- OzoneVolume volume = client.getObjectStore().getVolume("volume1");
+ try (OzoneClient client = cluster().newClient()) {
+ OzoneVolume volume = client.getObjectStore().getVolume(VOLUME_NAME);
OzoneBucket ozoneBucket = volume.getBucket("bucket1");
//Key Create
createKey(ozoneBucket, "key2", 10, new byte[10]);
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumes.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumes.java
index 1fcfa63d1a..06e9c7e562 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumes.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOzoneManagerListVolumes.java
@@ -25,10 +25,8 @@
import java.util.Iterator;
import java.util.List;
import java.util.Set;
-import java.util.concurrent.TimeoutException;
+import java.util.UUID;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
-import org.apache.hadoop.ozone.MiniOzoneCluster;
import org.apache.hadoop.ozone.OzoneAcl;
import org.apache.hadoop.ozone.client.ObjectStore;
import org.apache.hadoop.ozone.client.OzoneClient;
@@ -39,114 +37,102 @@
import org.apache.hadoop.ozone.security.acl.OzoneObjInfo;
import org.apache.hadoop.security.UserGroupInformation;
-import static
org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_RATIS_PIPELINE_LIMIT;
-import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_AUTHORIZER_CLASS;
-import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_AUTHORIZER_CLASS_NATIVE;
import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_ENABLED;
+import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_ENABLED_DEFAULT;
import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_VOLUME_LISTALL_ALLOWED;
+import static
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_VOLUME_LISTALL_ALLOWED_DEFAULT;
import static org.apache.hadoop.ozone.security.acl.OzoneObj.StoreType.OZONE;
+import static org.apache.ozone.test.ConfigAssumptions.assumeConfig;
+import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import org.junit.jupiter.api.AfterAll;
+import org.apache.ozone.test.AclTests;
+import org.apache.ozone.test.NonHATests;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.Timeout;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
/**
* Test OzoneManager list volume operation under combinations of configs.
*/
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@Timeout(120)
-public class TestOzoneManagerListVolumes {
+public abstract class TestOzoneManagerListVolumes implements
NonHATests.TestCase {
- private static MiniOzoneCluster cluster;
+ private static final String UNIQUE = UUID.randomUUID().toString();
+ private static final String VOL_PREFIX = "vol-" + UNIQUE;
+ private static final String VOLUME_1 = VOL_PREFIX + 1;
+ private static final String VOLUME_2 = VOL_PREFIX + 2;
+ private static final String VOLUME_3 = VOL_PREFIX + 3;
+ private static final String VOLUME_4 = VOL_PREFIX + 4;
+ private static final String VOLUME_5 = VOL_PREFIX + 5;
- private static UserGroupInformation adminUser =
- UserGroupInformation.createUserForTesting("om", new String[]{"ozone"});
+ public static final String USER_1 = "user1-" + UNIQUE;
private static UserGroupInformation user1 =
- UserGroupInformation.createUserForTesting("user1", new String[]{"test"});
+ UserGroupInformation.createUserForTesting(USER_1, new String[]{"test"});
+ public static final String USER_2 = "user2-" + UNIQUE;
private static UserGroupInformation user2 =
- UserGroupInformation.createUserForTesting("user2", new String[]{"test"});
+ UserGroupInformation.createUserForTesting(USER_2, new String[]{"test"});
// Typycal kerberos user, with shortname different from username.
private static UserGroupInformation user3 =
- UserGroupInformation.createUserForTesting("[email protected]",
+ UserGroupInformation.createUserForTesting("user3-" + UNIQUE +
"@example.com",
new String[]{"test"});
@BeforeEach
- public void init() throws Exception {
+ void loginAdmin() {
// loginUser is the user running this test.
// Implication: loginUser is automatically added to the OM admin list.
- UserGroupInformation.setLoginUser(adminUser);
+ UserGroupInformation.setLoginUser(AclTests.ADMIN_UGI);
}
- /**
- * Create a MiniDFSCluster for testing.
- */
+ @AfterEach
+ void logout() {
+ UserGroupInformation.setLoginUser(null);
+ setListAllVolumesAllowed(OZONE_OM_VOLUME_LISTALL_ALLOWED_DEFAULT);
+ }
@BeforeAll
- public static void setupClass()
- throws InterruptedException, TimeoutException, IOException {
- OzoneConfiguration conf = new OzoneConfiguration();
- UserGroupInformation.setLoginUser(adminUser);
- conf.setInt(OZONE_SCM_RATIS_PIPELINE_LIMIT, 10);
-
- // Use native impl here, default impl doesn't do actual checks
- conf.set(OZONE_ACL_AUTHORIZER_CLASS, OZONE_ACL_AUTHORIZER_CLASS_NATIVE);
-
- cluster = MiniOzoneCluster.newBuilder(conf)
- .withoutDatanodes()
- .build();
- cluster.waitForClusterToBeReady();
+ void createVolumes() throws IOException {
+ loginAdmin();
// Create volumes with non-default owners and ACLs
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
ObjectStore objectStore = client.getObjectStore();
/* r = READ, w = WRITE, c = CREATE, d = DELETE
l = LIST, a = ALL, n = NONE, x = READ_ACL, y = WRITE_ACL */
- String aclUser1All = "user:user1:a";
- String aclUser2All = "user:user2:a";
+ String aclUser1All = userAllACL(USER_1);
+ String aclUser2All = userAllACL(USER_2);
String aclWorldAll = "world::a";
- createVolumeWithOwnerAndAcl(objectStore, "volume1", "user1",
aclUser1All);
- createVolumeWithOwnerAndAcl(objectStore, "volume2", "user2",
aclUser2All);
- createVolumeWithOwnerAndAcl(objectStore, "volume3", "user1",
aclUser2All);
- createVolumeWithOwnerAndAcl(objectStore, "volume4", "user2",
aclUser1All);
- createVolumeWithOwnerAndAcl(objectStore, "volume5", "user1",
aclWorldAll);
+ createVolumeWithOwnerAndAcl(objectStore, VOLUME_1, USER_1, aclUser1All);
+ createVolumeWithOwnerAndAcl(objectStore, VOLUME_2, USER_2, aclUser2All);
+ createVolumeWithOwnerAndAcl(objectStore, VOLUME_3, USER_1, aclUser2All);
+ createVolumeWithOwnerAndAcl(objectStore, VOLUME_4, USER_2, aclUser1All);
+ createVolumeWithOwnerAndAcl(objectStore, VOLUME_5, USER_1, aclWorldAll);
}
-
- OzoneManager om = cluster.getOzoneManager();
- om.stop();
- om.join();
}
- @AfterAll
- public static void shutdownClass() {
- if (cluster != null) {
- cluster.shutdown();
- }
+ private static String userAllACL(String user) {
+ return "user:" + user + ":a";
}
- private void startOM(boolean aclEnabled,
- boolean volListAllAllowed) throws Exception {
-
- OzoneConfiguration conf = cluster.getOzoneManager().getConfiguration();
- // Note: OM doesn't support live config reloading
- conf.setBoolean(OZONE_ACL_ENABLED, aclEnabled);
- conf.setBoolean(OZONE_OM_VOLUME_LISTALL_ALLOWED, volListAllAllowed);
- cluster.getOzoneManager().restart();
+ private void assumeAclEnabled(boolean expected) {
+ assumeConfig(cluster().getConf(),
+ OZONE_ACL_ENABLED, OZONE_ACL_ENABLED_DEFAULT, expected);
}
- @AfterEach
- public void stopOM() {
- OzoneManager om = cluster.getOzoneManager();
- if (om != null) {
- om.stop();
- om.join();
- }
+ private void setListAllVolumesAllowed(boolean newValue) {
+ OzoneManager om = cluster().getOzoneManager();
+ om.getConfiguration().setBoolean(OZONE_OM_VOLUME_LISTALL_ALLOWED,
newValue);
+ om.setAllowListAllVolumesFromConfig();
}
private static void createVolumeWithOwnerAndAcl(ObjectStore objectStore,
@@ -181,7 +167,7 @@ private static void setVolumeAcl(ObjectStore objectStore,
String volumeName,
private void checkUser(UserGroupInformation user,
List<String> expectVol, boolean expectListAllSuccess,
boolean expectListByUserSuccess) throws IOException {
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
checkUser(client, user,
expectVol, expectListAllSuccess, expectListByUserSuccess);
}
@@ -204,7 +190,8 @@ private static void checkUser(OzoneClient client,
UserGroupInformation user,
String volumeName = vol.getName();
accessibleVolumes.add(volumeName);
}
- assertEquals(new HashSet<>(expectVol), accessibleVolumes);
+ assertThat(accessibleVolumes)
+ .containsAll(expectVol);
} catch (RuntimeException ex) {
if (expectListByUserSuccess) {
throw ex;
@@ -224,7 +211,7 @@ private static void checkUser(OzoneClient client,
UserGroupInformation user,
// `ozone sh volume list --all` returns all volumes,
// or throws exception (for non-admin if acl enabled & listall
disallowed).
if (expectListAllSuccess) {
- it = objectStore.listVolumes("volume");
+ it = objectStore.listVolumes(VOL_PREFIX);
int count = 0;
while (it.hasNext()) {
it.next();
@@ -233,7 +220,7 @@ private static void checkUser(OzoneClient client,
UserGroupInformation user,
assertEquals(5, count);
} else {
RuntimeException ex =
- assertThrows(RuntimeException.class, () ->
objectStore.listVolumes("volume"));
+ assertThrows(RuntimeException.class, () ->
objectStore.listVolumes(VOL_PREFIX));
// Current listAllVolumes throws RuntimeException
if (ex.getCause() instanceof OMException) {
// Expect PERMISSION_DENIED
@@ -256,27 +243,28 @@ private static void checkUser(OzoneClient client,
UserGroupInformation user,
@Test
public void testListVolumeWithOtherUsersListAllAllowed() throws Exception {
// ozone.acl.enabled = true, ozone.om.volume.listall.allowed = true
- startOM(true, true);
+ assumeAclEnabled(true);
+ setListAllVolumesAllowed(true);
// Login as user1, list other users' volumes
UserGroupInformation.setLoginUser(user1);
- checkUser(user2, Arrays.asList("volume2", "volume3", "volume4",
- "volume5"), true, false);
+ checkUser(user2, Arrays.asList(VOLUME_2, VOLUME_3, VOLUME_4,
+ VOLUME_5), true, false);
// Add "s3v" created default by OM.
- checkUser(adminUser, Arrays.asList("volume1", "volume2", "volume3",
- "volume4", "volume5", "s3v"), true);
+ checkUser(AclTests.ADMIN_UGI, Arrays.asList(VOLUME_1, VOLUME_2, VOLUME_3,
+ VOLUME_4, VOLUME_5, "s3v"), true);
UserGroupInformation.setLoginUser(user2);
- checkUser(user1, Arrays.asList("volume1", "volume3", "volume4",
- "volume5"), true);
- checkUser(adminUser, Arrays.asList("volume1", "volume2", "volume3",
- "volume4", "volume5", "s3v"), true);
+ checkUser(user1, Arrays.asList(VOLUME_1, VOLUME_3, VOLUME_4,
+ VOLUME_5), true);
+ checkUser(AclTests.ADMIN_UGI, Arrays.asList(VOLUME_1, VOLUME_2, VOLUME_3,
+ VOLUME_4, VOLUME_5, "s3v"), true);
// list volumes should success for user with shortname different from
// full name.
UserGroupInformation.setLoginUser(user3);
- checkUser(user3, Collections.singletonList("volume5"), true, true);
+ checkUser(user3, Collections.singletonList(VOLUME_5), true, true);
}
/**
@@ -287,76 +275,87 @@ public void testListVolumeWithOtherUsersListAllAllowed()
throws Exception {
@Test
public void testListVolumeWithOtherUsersListAllDisallowed() throws Exception
{
// ozone.acl.enabled = true, ozone.om.volume.listall.allowed = false
- startOM(true, false);
+ assumeAclEnabled(true);
+ setListAllVolumesAllowed(false);
// Login as user1, list other users' volumes, expect failure
UserGroupInformation.setLoginUser(user1);
- checkUser(user2, Arrays.asList("volume2", "volume3", "volume4",
- "volume5"), false, false);
+ checkUser(user2, Arrays.asList(VOLUME_2, VOLUME_3, VOLUME_4,
+ VOLUME_5), false, false);
// Add "s3v" created default by OM.
- checkUser(adminUser, Arrays.asList("volume1", "volume2", "volume3",
- "volume4", "volume5", "s3v"), false, false);
+ checkUser(AclTests.ADMIN_UGI, Arrays.asList(VOLUME_1, VOLUME_2, VOLUME_3,
+ VOLUME_4, VOLUME_5, "s3v"), false, false);
// While admin should be able to list volumes just fine.
- UserGroupInformation.setLoginUser(adminUser);
- checkUser(user1, Arrays.asList("volume1", "volume3", "volume4",
- "volume5"), true);
- checkUser(user2, Arrays.asList("volume2", "volume3", "volume4",
- "volume5"), true);
+ UserGroupInformation.setLoginUser(AclTests.ADMIN_UGI);
+ checkUser(user1, Arrays.asList(VOLUME_1, VOLUME_3, VOLUME_4,
+ VOLUME_5), true);
+ checkUser(user2, Arrays.asList(VOLUME_2, VOLUME_3, VOLUME_4,
+ VOLUME_5), true);
}
@Test
public void testAclEnabledListAllAllowed() throws Exception {
// ozone.acl.enabled = true, ozone.om.volume.listall.allowed = true
- startOM(true, true);
- checkUser(user1, Arrays.asList("volume1", "volume3", "volume4",
- "volume5"), true);
- checkUser(user2, Arrays.asList("volume2", "volume3", "volume4",
- "volume5"), true);
+ assumeAclEnabled(true);
+ setListAllVolumesAllowed(true);
+
+ checkUser(user1, Arrays.asList(VOLUME_1, VOLUME_3, VOLUME_4,
+ VOLUME_5), true);
+ checkUser(user2, Arrays.asList(VOLUME_2, VOLUME_3, VOLUME_4,
+ VOLUME_5), true);
// Add "s3v" created default by OM.
- checkUser(adminUser, Arrays.asList("volume1", "volume2", "volume3",
- "volume4", "volume5", "s3v"), true);
+ checkUser(AclTests.ADMIN_UGI, Arrays.asList(VOLUME_1, VOLUME_2, VOLUME_3,
+ VOLUME_4, VOLUME_5, "s3v"), true);
}
@Test
public void testAclEnabledListAllDisallowed() throws Exception {
// ozone.acl.enabled = true, ozone.om.volume.listall.allowed = false
- startOM(true, false);
- // The default user is adminUser as set in init(),
+ assumeAclEnabled(true);
+ setListAllVolumesAllowed(false);
+
+ // The default user is AclTests.ADMIN_UGI as set in init(),
// listall always succeeds if we use that UGI, we should use non-admin here
UserGroupInformation.setLoginUser(user1);
- checkUser(user1, Arrays.asList("volume1", "volume3", "volume4",
- "volume5"), false);
+ checkUser(user1, Arrays.asList(VOLUME_1, VOLUME_3, VOLUME_4,
+ VOLUME_5), false);
UserGroupInformation.setLoginUser(user2);
- checkUser(user2, Arrays.asList("volume2", "volume3", "volume4",
- "volume5"), false);
- UserGroupInformation.setLoginUser(adminUser);
+ checkUser(user2, Arrays.asList(VOLUME_2, VOLUME_3, VOLUME_4,
+ VOLUME_5), false);
+ UserGroupInformation.setLoginUser(AclTests.ADMIN_UGI);
// Add "s3v" created default by OM.
- checkUser(adminUser, Arrays.asList("volume1", "volume2",
- "volume3", "volume4", "volume5", "s3v"), true);
+ checkUser(AclTests.ADMIN_UGI, Arrays.asList(VOLUME_1, VOLUME_2,
+ VOLUME_3, VOLUME_4, VOLUME_5, "s3v"), true);
}
- @Test
- public void testAclDisabledListAllAllowed() throws Exception {
- // ozone.acl.enabled = false, ozone.om.volume.listall.allowed = true
- startOM(false, true);
- checkUser(user1, Arrays.asList("volume1", "volume3", "volume5"),
+ @ParameterizedTest
+ @ValueSource(booleans = {true, false})
+ public void testAclDisabledAdmin(boolean allowListAllVolumes) throws
Exception {
+ // ozone.acl.enabled = false, ozone.om.volume.listall.allowed = don't care
+ assumeAclEnabled(false);
+ setListAllVolumesAllowed(allowListAllVolumes);
+
+ checkUser(user1, Arrays.asList(VOLUME_1, VOLUME_3, VOLUME_5),
true);
- checkUser(user2, Arrays.asList("volume2", "volume4"),
+ checkUser(user2, Arrays.asList(VOLUME_2, VOLUME_4),
true);
}
- @Test
- public void testAclDisabledListAllDisallowed() throws Exception {
- // ozone.acl.enabled = false, ozone.om.volume.listall.allowed = false
- startOM(false, false);
+ @ParameterizedTest
+ @ValueSource(booleans = {true, false})
+ public void testAclDisabled(boolean allowListAllVolumes) throws Exception {
+ // ozone.acl.enabled = false, ozone.om.volume.listall.allowed = don't care
+ assumeAclEnabled(false);
+ setListAllVolumesAllowed(allowListAllVolumes);
+
// If ACL is disabled, all permission checks are disabled in Ozone by
design
UserGroupInformation.setLoginUser(user1);
- checkUser(user1, Arrays.asList("volume1", "volume3", "volume5"),
+ checkUser(user1, Arrays.asList(VOLUME_1, VOLUME_3, VOLUME_5),
true);
UserGroupInformation.setLoginUser(user2);
- checkUser(user2, Arrays.asList("volume2", "volume4"),
+ checkUser(user2, Arrays.asList(VOLUME_2, VOLUME_4),
true); // listall will succeed since acl is disabled
}
}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestRecursiveAclWithFSO.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestRecursiveAclWithFSO.java
index 1a2e61b880..df3e66d570 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestRecursiveAclWithFSO.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestRecursiveAclWithFSO.java
@@ -19,9 +19,7 @@
package org.apache.hadoop.ozone.om;
import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.hdds.protocol.StorageType;
-import org.apache.hadoop.ozone.MiniOzoneCluster;
import org.apache.hadoop.ozone.OzoneAcl;
import org.apache.hadoop.ozone.client.BucketArgs;
import org.apache.hadoop.ozone.client.ObjectStore;
@@ -31,13 +29,12 @@
import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
import org.apache.hadoop.ozone.client.protocol.ClientProtocol;
import org.apache.hadoop.ozone.om.exceptions.OMException;
-import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
import org.apache.hadoop.ozone.security.acl.OzoneAclConfig;
import org.apache.hadoop.ozone.security.acl.OzoneObj;
import org.apache.hadoop.ozone.security.acl.OzoneObjInfo;
import org.apache.hadoop.security.UserGroupInformation;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
+import org.apache.ozone.test.AclTests;
+import org.apache.ozone.test.NonHATests;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.Timeout;
@@ -48,9 +45,6 @@
import java.util.List;
import java.util.UUID;
-import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_AUTHORIZER_CLASS;
-import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_AUTHORIZER_CLASS_NATIVE;
-import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_ENABLED;
import static org.apache.hadoop.ozone.security.acl.OzoneObj.StoreType.OZONE;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -61,28 +55,17 @@
* Test recursive acl checks for delete and rename for FSO Buckets.
*/
@Timeout(120)
-public class TestRecursiveAclWithFSO {
+public abstract class TestRecursiveAclWithFSO implements NonHATests.TestCase {
- private MiniOzoneCluster cluster;
+ private static final String UNIQUE = UUID.randomUUID().toString();
+ private static final String VOLUME_NAME = "vol-" + UNIQUE;
- private final UserGroupInformation adminUser =
- UserGroupInformation.createUserForTesting("om", new String[] {"ozone"});
private final UserGroupInformation user1 = UserGroupInformation
- .createUserForTesting("user1", new String[] {"test1"});
+ .createUserForTesting("user1-" + UNIQUE, new String[] {"test1"});
private final UserGroupInformation user2 = UserGroupInformation
- .createUserForTesting("user2", new String[] {"test2"});
+ .createUserForTesting("user2-" + UNIQUE, new String[] {"test2"});
private final UserGroupInformation user3 = UserGroupInformation
- .createUserForTesting("user3", new String[] {"test3, test4"});
-
- @BeforeEach
- public void init() throws Exception {
- // loginUser is the user running this test.
- // Implication: loginUser is automatically added to the OM admin list.
- UserGroupInformation.setLoginUser(adminUser);
- // ozone.acl.enabled = true
- // start a cluster
- startCluster();
- }
+ .createUserForTesting("user3-" + UNIQUE, new String[] {"test3, test4"});
@Test
public void testKeyDeleteAndRenameWithoutPermission() throws Exception {
@@ -91,16 +74,16 @@ public void testKeyDeleteAndRenameWithoutPermission()
throws Exception {
String aclWorldAll = "world::a";
List<String> keys = new ArrayList<>();
// Create volumes with user1
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
ObjectStore objectStore = client.getObjectStore();
- createVolumeWithOwnerAndAcl(objectStore, "volume1", "user1",
aclWorldAll);
+ createVolumeWithOwnerAndAcl(objectStore, VOLUME_NAME,
user1.getShortUserName(), aclWorldAll);
}
// Login as user1, create directories and keys
UserGroupInformation.setLoginUser(user1);
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
ObjectStore objectStore = client.getObjectStore();
- OzoneVolume volume = objectStore.getVolume("volume1");
+ OzoneVolume volume = objectStore.getVolume(VOLUME_NAME);
BucketArgs omBucketArgs =
BucketArgs.newBuilder().setStorageType(StorageType.DISK).build();
@@ -166,9 +149,9 @@ public void testKeyDeleteAndRenameWithoutPermission()
throws Exception {
}
UserGroupInformation.setLoginUser(user2);
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
ObjectStore objectStore = client.getObjectStore();
- OzoneVolume volume = objectStore.getVolume("volume1");
+ OzoneVolume volume = objectStore.getVolume(VOLUME_NAME);
OzoneBucket ozoneBucket = volume.getBucket("bucket1");
// perform delete
@@ -188,9 +171,9 @@ public void testKeyDeleteAndRenameWithoutPermission()
throws Exception {
// Remove acl from directory c2, delete/rename a/b1 should throw
// permission denied since c2 is a subdirectory
user1.doAs((PrivilegedExceptionAction<Void>) () -> {
- try (OzoneClient c = cluster.newClient()) {
+ try (OzoneClient c = cluster().newClient()) {
ObjectStore o = c.getObjectStore();
- OzoneBucket b = o.getVolume("volume1").getBucket("bucket1");
+ OzoneBucket b = o.getVolume(VOLUME_NAME).getBucket("bucket1");
removeAclsFromKey(o, b, "a/b1/c2");
}
return null;
@@ -221,7 +204,7 @@ public void testKeyDeleteAndRenameWithoutPermission()
throws Exception {
@Test
public void testKeyDefaultACL() throws Exception {
String volumeName = "vol1";
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
ObjectStore objectStore = client.getObjectStore();
objectStore.createVolume(volumeName);
addVolumeAcl(objectStore, volumeName, "world::a");
@@ -232,10 +215,10 @@ public void testKeyDefaultACL() throws Exception {
.setStoreType(OZONE).build();
List<OzoneAcl> acls = objectStore.getAcl(obj);
assertEquals(3, acls.size());
- assertEquals(adminUser.getShortUserName(), acls.get(0).getName());
- OzoneAclConfig aclConfig =
cluster.getConf().getObject(OzoneAclConfig.class);
+ assertEquals(AclTests.ADMIN_UGI.getShortUserName(),
acls.get(0).getName());
+ OzoneAclConfig aclConfig =
cluster().getConf().getObject(OzoneAclConfig.class);
assertArrayEquals(aclConfig.getUserDefaultRights(),
acls.get(0).getAclList().toArray());
- assertEquals(adminUser.getPrimaryGroupName(), acls.get(1).getName());
+ assertEquals(AclTests.ADMIN_UGI.getPrimaryGroupName(),
acls.get(1).getName());
assertArrayEquals(aclConfig.getGroupDefaultRights(),
acls.get(1).getAclList().toArray());
assertEquals("WORLD", acls.get(2).getName());
assertArrayEquals(aclConfig.getUserDefaultRights(),
acls.get(2).getAclList().toArray());
@@ -243,7 +226,7 @@ public void testKeyDefaultACL() throws Exception {
// set LoginUser as user3
UserGroupInformation.setLoginUser(user3);
- try (OzoneClient client = cluster.newClient()) {
+ try (OzoneClient client = cluster().newClient()) {
ObjectStore objectStore = client.getObjectStore();
OzoneVolume volume = objectStore.getVolume(volumeName);
BucketArgs omBucketArgs =
@@ -259,7 +242,7 @@ public void testKeyDefaultACL() throws Exception {
List<OzoneAcl> acls = objectStore.getAcl(obj);
assertEquals(2, acls.size());
assertEquals(user3.getShortUserName(), acls.get(0).getName());
- OzoneAclConfig aclConfig =
cluster.getConf().getObject(OzoneAclConfig.class);
+ OzoneAclConfig aclConfig =
cluster().getConf().getObject(OzoneAclConfig.class);
assertArrayEquals(aclConfig.getUserDefaultRights(),
acls.get(0).getAclList().toArray());
assertEquals(user3.getPrimaryGroupName(), acls.get(1).getName());
assertArrayEquals(aclConfig.getGroupDefaultRights(),
acls.get(1).getAclList().toArray());
@@ -295,32 +278,6 @@ private void removeAclsFromKey(ObjectStore objectStore,
}
}
- /**
- * Create a MiniOzoneCluster for testing.
- */
- private void startCluster() throws Exception {
-
- OzoneConfiguration conf = new OzoneConfiguration();
-
- // Use native impl here, default impl doesn't do actual checks
- conf.set(OZONE_ACL_AUTHORIZER_CLASS, OZONE_ACL_AUTHORIZER_CLASS_NATIVE);
- // Note: OM doesn't support live config reloading
- conf.setBoolean(OZONE_ACL_ENABLED, true);
-
- OMRequestTestUtils.configureFSOptimizedPaths(conf, true);
-
- cluster = MiniOzoneCluster.newBuilder(conf).build();
- cluster.waitForClusterToBeReady();
-
- }
-
- @AfterEach
- public void stopCluster() {
- if (cluster != null) {
- cluster.shutdown();
- }
- }
-
private void createVolumeWithOwnerAndAcl(ObjectStore objectStore,
String volumeName, String ownerName, String aclString)
throws IOException {
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/AclTests.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/AclTests.java
new file mode 100644
index 0000000000..1633fa8443
--- /dev/null
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/AclTests.java
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ozone.test;
+
+import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.ozone.MiniOzoneCluster;
+import org.apache.hadoop.ozone.om.OMConfigKeys;
+import org.apache.hadoop.security.UserGroupInformation;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.TestInstance;
+
+import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_AUTHORIZER_CLASS;
+import static
org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_AUTHORIZER_CLASS_NATIVE;
+import static org.apache.hadoop.ozone.OzoneConfigKeys.OZONE_ACL_ENABLED;
+
+/**
+ * Tests with ACL enabled using Ozone Native Authorizer.
+ */
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public abstract class AclTests extends ClusterForTests<MiniOzoneCluster> {
+
+ public static final String ADMIN_USER = "om";
+ public static final String ADMIN_GROUP = "ozone";
+ public static final UserGroupInformation ADMIN_UGI =
+ UserGroupInformation.createUserForTesting(ADMIN_USER, new String[]
{ADMIN_GROUP});
+
+ /** Hook method for subclasses. */
+ MiniOzoneCluster.Builder newClusterBuilder() {
+ return MiniOzoneCluster.newBuilder(createOzoneConfig())
+ .setNumDatanodes(3);
+ }
+
+ @Override
+ protected OzoneConfiguration createOzoneConfig() {
+ loginAdmin();
+ OzoneConfiguration conf = super.createOzoneConfig();
+ conf.setBoolean(OZONE_ACL_ENABLED, true);
+ conf.set(OZONE_ACL_AUTHORIZER_CLASS, OZONE_ACL_AUTHORIZER_CLASS_NATIVE);
+ conf.setBoolean(OMConfigKeys.OZONE_OM_ENABLE_FILESYSTEM_PATHS, true);
+ return conf;
+ }
+
+ @BeforeEach
+ void loginAdmin() {
+ UserGroupInformation.setLoginUser(ADMIN_UGI);
+ }
+
+ @Nested
+ class BucketOwner extends org.apache.hadoop.ozone.om.TestBucketOwner {
+ @Override
+ public MiniOzoneCluster cluster() {
+ return getCluster();
+ }
+ }
+
+ @Nested
+ class OzoneManagerListVolumes extends
org.apache.hadoop.ozone.om.TestOzoneManagerListVolumes {
+ @Override
+ public MiniOzoneCluster cluster() {
+ return getCluster();
+ }
+ }
+
+ @Nested
+ class RecursiveAclWithFSO extends
org.apache.hadoop.ozone.om.TestRecursiveAclWithFSO {
+ @Override
+ public MiniOzoneCluster cluster() {
+ return getCluster();
+ }
+ }
+
+}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/ConfigAssumptions.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/ConfigAssumptions.java
new file mode 100644
index 0000000000..6f2a5d5b83
--- /dev/null
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/ConfigAssumptions.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ozone.test;
+
+import org.apache.hadoop.hdds.conf.ConfigurationSource;
+
+import static org.assertj.core.api.Assumptions.assumeThat;
+
+/** Assumptions for skipping tests based on configuration. */
+public interface ConfigAssumptions {
+
+ static void assumeConfig(ConfigurationSource conf, String key, boolean
defaultValue, boolean expected) {
+ boolean actual = conf.getBoolean(key, defaultValue);
+ assumeThat(actual).isEqualTo(expected);
+ }
+
+}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/NonHATests.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/NonHATests.java
index 54aa14273f..1e02d43e7e 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/NonHATests.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/NonHATests.java
@@ -178,6 +178,14 @@ public MiniOzoneCluster cluster() {
}
}
+ @Nested
+ class OzoneManagerListVolumes extends
org.apache.hadoop.ozone.om.TestOzoneManagerListVolumes {
+ @Override
+ public MiniOzoneCluster cluster() {
+ return getCluster();
+ }
+ }
+
@Nested
class OzoneManagerRestInterface extends
org.apache.hadoop.ozone.om.TestOzoneManagerRestInterface {
@Override
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/TestOzoneNonHAWithNativeACL.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/TestOzoneNonHAWithNativeACL.java
new file mode 100644
index 0000000000..7f030e141e
--- /dev/null
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/ozone/test/TestOzoneNonHAWithNativeACL.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ozone.test;
+
+import org.apache.hadoop.ozone.MiniOzoneCluster;
+import org.junit.jupiter.api.TestInstance;
+
+/** Test Ozone with native ACLs in non-HA cluster. */
+@TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class TestOzoneNonHAWithNativeACL extends AclTests {
+ @Override
+ protected MiniOzoneCluster createCluster() throws Exception {
+ return newClusterBuilder()
+ .build();
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]