This is an automated email from the ASF dual-hosted git repository.
aswinshakil 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 c9becb3196 HDDS-8014. [Snapshot] Implement Native Acl Integration
tests for Snapshotting (#4301)
c9becb3196 is described below
commit c9becb3196b4502ef1caaa8485df627cba191527
Author: Mladjan Gadzic <[email protected]>
AuthorDate: Tue Mar 7 19:26:26 2023 +0100
HDDS-8014. [Snapshot] Implement Native Acl Integration tests for
Snapshotting (#4301)
---
.../om/snapshot/TestOzoneManagerSnapshotAcl.java | 543 +++++++++++++++++++++
.../hadoop/ozone/om/snapshot/package-info.java | 22 +
2 files changed, 565 insertions(+)
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
new file mode 100644
index 0000000000..74ac6f15cd
--- /dev/null
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOzoneManagerSnapshotAcl.java
@@ -0,0 +1,543 @@
+/*
+ * 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.hadoop.ozone.om.snapshot;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.UUID;
+import java.util.concurrent.TimeoutException;
+import java.util.stream.Stream;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.scm.HddsWhiteboxTestUtils;
+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;
+import org.apache.hadoop.ozone.client.OzoneBucket;
+import org.apache.hadoop.ozone.client.OzoneClient;
+import org.apache.hadoop.ozone.client.OzoneVolume;
+import org.apache.hadoop.ozone.client.VolumeArgs;
+import org.apache.hadoop.ozone.client.io.OzoneOutputStream;
+import org.apache.hadoop.ozone.om.KeyManagerImpl;
+import org.apache.hadoop.ozone.om.OMStorage;
+import org.apache.hadoop.ozone.om.OmSnapshotManager;
+import org.apache.hadoop.ozone.om.OzoneManager;
+import org.apache.hadoop.ozone.om.exceptions.OMException;
+import org.apache.hadoop.ozone.om.helpers.BucketLayout;
+import org.apache.hadoop.ozone.om.helpers.OmKeyArgs;
+import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
+import org.apache.hadoop.ozone.security.acl.OzoneObj;
+import org.apache.hadoop.ozone.security.acl.OzoneObjInfo;
+import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.ozone.test.GenericTestUtils;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Timeout;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.EnumSource;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.hadoop.fs.FileSystem.FS_DEFAULT_NAME_KEY;
+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.OzoneConsts.ADMIN;
+import static org.apache.hadoop.ozone.OzoneConsts.OM_DB_NAME;
+import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX;
+import static org.apache.hadoop.ozone.OzoneConsts.OM_SNAPSHOT_DIR;
+import static org.apache.hadoop.ozone.OzoneConsts.OZONE_OFS_URI_SCHEME;
+import static org.junit.jupiter.params.provider.Arguments.arguments;
+
+/**
+ * Test for Snapshot feature with ACL.
+ */
+@Timeout(value = 300)
+public class TestOzoneManagerSnapshotAcl {
+
+ private static final String ADMIN_USER = "om";
+ private static final String ADMIN_GROUP = "ozone";
+ private static final UserGroupInformation ADMIN_UGI =
+ UserGroupInformation
+ .createUserForTesting(ADMIN_USER, new String[] {ADMIN_GROUP});
+ private static final String USER1 = "user1";
+ private static final String GROUP1 = "group1";
+ private static final UserGroupInformation UGI1 =
+ UserGroupInformation.createUserForTesting(USER1, new String[] {GROUP1});
+ private static final String USER2 = "user2";
+ private static final String GROUP2 = "group2";
+ private static final UserGroupInformation UGI2 =
+ UserGroupInformation.createUserForTesting(USER2, new String[] {GROUP2});
+ private static final OzoneObj.ResourceType RESOURCE_TYPE_KEY =
+ OzoneObj.ResourceType.KEY;
+ private static MiniOzoneCluster cluster;
+ private static ObjectStore objectStore;
+ private static File metaDir;
+ private static OzoneManager ozoneManager;
+ private String volumeName;
+ private String bucketName;
+ private static final String KEY_PREFIX = "key-";
+ private String keyName;
+ private String snapshotKeyPrefix;
+
+ @BeforeAll
+ public static void init() throws Exception {
+ UserGroupInformation.setLoginUser(ADMIN_UGI);
+ final OzoneConfiguration conf = new OzoneConfiguration();
+ conf.setBoolean(OZONE_ACL_ENABLED, true);
+ conf.set(OZONE_ACL_AUTHORIZER_CLASS, OZONE_ACL_AUTHORIZER_CLASS_NATIVE);
+ final String omServiceId = "om-service-test-1"
+ + RandomStringUtils.randomNumeric(5);
+
+ cluster = MiniOzoneCluster.newOMHABuilder(conf)
+ .setClusterId(UUID.randomUUID().toString())
+ .setScmId(UUID.randomUUID().toString())
+ .setOMServiceId(omServiceId)
+ .setNumOfOzoneManagers(1)
+ .build();
+ cluster.waitForClusterToBeReady();
+
+ ozoneManager = cluster.getOzoneManager();
+ final OzoneConfiguration ozoneManagerConf =
ozoneManager.getConfiguration();
+ cluster.setConf(ozoneManagerConf);
+
+ final String hostPrefix = OZONE_OFS_URI_SCHEME + "://" + omServiceId;
+ final OzoneConfiguration clientConf =
+ new OzoneConfiguration(cluster.getConf());
+ clientConf.set(FS_DEFAULT_NAME_KEY, hostPrefix);
+
+ final OzoneClient client = cluster.getClient();
+ objectStore = client.getObjectStore();
+
+ final KeyManagerImpl keyManager = (KeyManagerImpl) HddsWhiteboxTestUtils
+ .getInternalState(ozoneManager, "keyManager");
+
+ // stop the deletion services so that keys can still be read
+ keyManager.stop();
+ metaDir = OMStorage.getOmDbDir(ozoneManagerConf);
+ }
+
+ @AfterEach
+ public void cleanup() throws IOException {
+ setDefaultAcls();
+ }
+
+ @AfterAll
+ public static void tearDown() throws Exception {
+ if (cluster != null) {
+ cluster.shutdown();
+ }
+ }
+
+ @ParameterizedTest
+ @EnumSource(BucketLayout.class)
+ public void testLookupKeyWithAllowedUser(BucketLayout bucketLayout)
+ throws Exception {
+ // GIVEN
+ setup(bucketLayout);
+ final OmKeyArgs snapshotKeyArgs = getOmKeyArgs(true);
+
+ // WHEN-THEN
+ Assertions.assertDoesNotThrow(
+ () -> ozoneManager.lookupKey(snapshotKeyArgs));
+ }
+
+ @ParameterizedTest
+ @EnumSource(BucketLayout.class)
+ public void testLookupKeyWithNotAllowedUser(BucketLayout bucketLayout)
+ throws Exception {
+ // GIVEN
+ setup(bucketLayout);
+ final OmKeyArgs snapshotKeyArgs = getOmKeyArgs(true);
+ final OmKeyArgs keyArgs = getOmKeyArgs(false);
+
+ // when reading from snapshot, read disallowed.
+ UserGroupInformation.setLoginUser(UGI2);
+ final OMException ex = Assertions.assertThrows(OMException.class,
+ () -> ozoneManager.lookupKey(snapshotKeyArgs));
+
+ // THEN
+ Assertions.assertEquals(OMException.ResultCodes.PERMISSION_DENIED,
+ ex.getResult());
+ // when same user reads same key from active fs, read allowed.
+ Assertions.assertDoesNotThrow(() -> ozoneManager.lookupKey(keyArgs));
+ }
+
+ @ParameterizedTest
+ @EnumSource(BucketLayout.class)
+ public void testGeyKeyInfoWithAllowedUser(BucketLayout bucketLayout)
+ throws IOException, InterruptedException, TimeoutException {
+ // GIVEN
+ setup(bucketLayout);
+ final OmKeyArgs snapshotKeyArgs = getOmKeyArgs(true);
+ final boolean assumeS3Context = false;
+
+ // WHEN-THEN
+ Assertions.assertDoesNotThrow(
+ () -> ozoneManager.getKeyInfo(snapshotKeyArgs, assumeS3Context));
+ }
+
+ @ParameterizedTest
+ @EnumSource(BucketLayout.class)
+ public void testGeyKeyInfoWithNotAllowedUser(BucketLayout bucketLayout)
+ throws IOException, InterruptedException, TimeoutException {
+ // GIVEN
+ setup(bucketLayout);
+ final OmKeyArgs snapshotKeyOmKeyArgs = getOmKeyArgs(true);
+ final OmKeyArgs omKeyArgs = getOmKeyArgs(false);
+ final boolean assumeS3Context = false;
+
+ // when reading from snapshot, read disallowed.
+ UserGroupInformation.setLoginUser(UGI2);
+ final OMException ex =
+ Assertions.assertThrows(OMException.class,
+ () -> ozoneManager.getKeyInfo(snapshotKeyOmKeyArgs,
+ assumeS3Context));
+
+ // THEN
+ Assertions.assertEquals(OMException.ResultCodes.PERMISSION_DENIED,
+ ex.getResult());
+ // when same user reads same key from active fs, read allowed.
+ Assertions.assertDoesNotThrow(
+ () -> ozoneManager.getKeyInfo(omKeyArgs, assumeS3Context));
+ }
+
+ @ParameterizedTest
+ @MethodSource("getListStatusArguments")
+ public void testListStatusWithAllowedUser(BucketLayout bucketLayout,
+ boolean recursive, boolean allowPartialPrefixes)
+ throws IOException, InterruptedException, TimeoutException {
+ // GIVEN
+ setup(bucketLayout);
+ final OmKeyArgs snapshotKeyArgs = getOmKeyArgs(true);
+ final long numEntries = Long.parseLong(RandomStringUtils.randomNumeric(1));
+
+ // WHEN-THEN
+ Assertions.assertDoesNotThrow(
+ () -> ozoneManager.listStatus(snapshotKeyArgs, recursive,
+ snapshotKeyArgs.getKeyName(), numEntries,
+ allowPartialPrefixes));
+ }
+
+ @ParameterizedTest
+ @MethodSource("getListStatusArguments")
+ public void testListStatusWithNotAllowedUser(BucketLayout bucketLayout,
+ boolean recursive, boolean allowPartialPrefixes)
+ throws IOException, InterruptedException, TimeoutException {
+ // GIVEN
+ setup(bucketLayout);
+ final OmKeyArgs snapshotKeyArgs = getOmKeyArgs(true);
+ final OmKeyArgs keyArgs = getOmKeyArgs(false);
+ final long numEntries = Long.parseLong(RandomStringUtils.randomNumeric(1));
+
+ // when reading from snapshot, read disallowed.
+ UserGroupInformation.setLoginUser(UGI2);
+ final OMException ex =
+ Assertions.assertThrows(OMException.class,
+ () -> ozoneManager.listStatus(snapshotKeyArgs, recursive,
+ snapshotKeyArgs.getKeyName(), numEntries,
+ allowPartialPrefixes));
+
+ // THEN
+ Assertions.assertEquals(OMException.ResultCodes.PERMISSION_DENIED,
+ ex.getResult());
+ // when same user reads same key from active fs, read allowed.
+ Assertions.assertDoesNotThrow(() -> ozoneManager.listStatus(keyArgs,
+ recursive, keyName, numEntries, allowPartialPrefixes));
+ }
+
+ @ParameterizedTest
+ @EnumSource(BucketLayout.class)
+ public void testLookupFileWithAllowedUser(BucketLayout bucketLayout)
+ throws Exception {
+ // GIVEN
+ setup(bucketLayout);
+ final OmKeyArgs snapshotKeyArgs = getOmKeyArgs(true);
+
+ // WHEN-THEN
+ Assertions.assertDoesNotThrow(
+ () -> ozoneManager.lookupFile(snapshotKeyArgs));
+ }
+
+ @ParameterizedTest
+ @EnumSource(BucketLayout.class)
+ public void testLookupFileWithNotAllowedUser(BucketLayout bucketLayout)
+ throws Exception {
+ // GIVEN
+ setup(bucketLayout);
+ final OmKeyArgs snapshotKeyArgs = getOmKeyArgs(true);
+ final OmKeyArgs keyArgs = getOmKeyArgs(false);
+
+ // when reading from snapshot, read disallowed.
+ UserGroupInformation.setLoginUser(UGI2);
+ final OMException ex = Assertions.assertThrows(OMException.class,
+ () -> ozoneManager.lookupFile(snapshotKeyArgs));
+
+ // THEN
+ Assertions.assertEquals(OMException.ResultCodes.PERMISSION_DENIED,
+ ex.getResult());
+ // when same user reads same key from active fs, read allowed.
+ Assertions.assertDoesNotThrow(() -> ozoneManager.lookupFile(keyArgs));
+ }
+
+ @ParameterizedTest
+ @EnumSource(BucketLayout.class)
+ public void testListKeysWithAllowedUser(BucketLayout bucketLayout)
+ throws Exception {
+ // GIVEN
+ setup(bucketLayout);
+ final OmKeyArgs snapshotKeyArgs = getOmKeyArgs(true);
+ final int maxKeys = Integer.parseInt(RandomStringUtils.randomNumeric(1));
+
+ // WHEN-THEN
+ Assertions.assertDoesNotThrow(() -> ozoneManager.listKeys(volumeName,
+ bucketName, snapshotKeyArgs.getKeyName(), snapshotKeyPrefix, maxKeys));
+ }
+
+ @ParameterizedTest
+ @EnumSource(BucketLayout.class)
+ public void testListKeysWithNotAllowedUser(BucketLayout bucketLayout)
+ throws Exception {
+ // GIVEN
+ setup(bucketLayout);
+ final OmKeyArgs snapshotKeyArgs = getOmKeyArgs(true);
+ final int maxKeys = Integer.parseInt(RandomStringUtils.randomNumeric(1));
+
+ // WHEN
+ UserGroupInformation.setLoginUser(UGI2);
+
+ // THEN
+ Assertions.assertDoesNotThrow(
+ () -> ozoneManager.listKeys(volumeName, bucketName,
+ snapshotKeyArgs.getKeyName(), snapshotKeyPrefix, maxKeys));
+ Assertions.assertDoesNotThrow(() -> ozoneManager.listKeys(volumeName,
+ bucketName, keyName, KEY_PREFIX, maxKeys));
+ }
+
+ @ParameterizedTest
+ @EnumSource(BucketLayout.class)
+ public void testGetAclWithAllowedUser(BucketLayout bucketLayout)
+ throws Exception {
+ // GIVEN
+ setup(bucketLayout);
+ final OmKeyArgs snapshotKeyOmKeyArgs = getOmKeyArgs(true);
+ final OzoneObj ozoneObj = OzoneObjInfo.Builder.newBuilder()
+ .setResType(RESOURCE_TYPE_KEY)
+ .setStoreType(OzoneObj.StoreType.OZONE)
+ .setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setKeyName(snapshotKeyOmKeyArgs.getKeyName())
+ .build();
+
+ // WHEN-THEN
+ Assertions.assertDoesNotThrow(() -> ozoneManager.getAcl(ozoneObj));
+ }
+
+ @ParameterizedTest
+ @EnumSource(BucketLayout.class)
+ public void testGetAclWithNotAllowedUser(BucketLayout bucketLayout)
+ throws Exception {
+ // GIVEN
+ setup(bucketLayout);
+ final OzoneObj snapshotObj = OzoneObjInfo.Builder.newBuilder()
+ .setResType(RESOURCE_TYPE_KEY)
+ .setStoreType(OzoneObj.StoreType.OZONE)
+ .setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setKeyName(snapshotKeyPrefix + keyName)
+ .build();
+ final OzoneObj keyObj = OzoneObjInfo.Builder.newBuilder()
+ .setResType(RESOURCE_TYPE_KEY)
+ .setStoreType(OzoneObj.StoreType.OZONE)
+ .setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setKeyName(keyName)
+ .build();
+
+ // when reading from snapshot, read disallowed.
+ UserGroupInformation.setLoginUser(UGI2);
+ final OMException ex = Assertions.assertThrows(OMException.class,
+ () -> ozoneManager.getAcl(snapshotObj));
+
+ // THEN
+ Assertions.assertEquals(OMException.ResultCodes.PERMISSION_DENIED,
+ ex.getResult());
+ // when same user reads same key from active fs, read allowed.
+ Assertions.assertDoesNotThrow(() -> ozoneManager.getAcl(keyObj));
+ }
+
+ private void setup(BucketLayout bucketLayout)
+ throws IOException, InterruptedException, TimeoutException {
+ UserGroupInformation.setLoginUser(UGI1);
+
+ createVolume();
+
+ final OzoneVolume volume = objectStore.getVolume(volumeName);
+ createBucket(bucketLayout, volume);
+
+ final OzoneBucket bucket = volume.getBucket(bucketName);
+ createKey(bucket);
+
+ setDefaultAcls();
+
+ createSnapshot();
+
+ setKeyAcl();
+ setBucketAcl();
+ }
+
+ private void setDefaultAcls() throws IOException {
+ final OzoneObj volumeObj = OzoneObjInfo.Builder.newBuilder()
+ .setResType(OzoneObj.ResourceType.VOLUME)
+ .setStoreType(OzoneObj.StoreType.OZONE)
+ .setVolumeName(volumeName)
+ .build();
+ objectStore.setAcl(volumeObj, OzoneAcl.parseAcls(
+ "user:" + USER1 + ":r," +
+ "user:" + USER2 + ":r"));
+
+ final 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"));
+
+ final OzoneObj keyObj = OzoneObjInfo.Builder.newBuilder()
+ .setResType(RESOURCE_TYPE_KEY)
+ .setStoreType(OzoneObj.StoreType.OZONE)
+ .setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setKeyName(keyName)
+ .build();
+ objectStore.setAcl(keyObj, OzoneAcl.parseAcls(
+ "user:" + USER1 + ":r," +
+ "user:" + USER1 + ":x"));
+ }
+
+ private void setKeyAcl() throws IOException {
+ final OzoneObj keyObj = OzoneObjInfo.Builder.newBuilder()
+ .setResType(RESOURCE_TYPE_KEY)
+ .setStoreType(OzoneObj.StoreType.OZONE)
+ .setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setKeyName(keyName)
+ .build();
+ objectStore.setAcl(keyObj, OzoneAcl.parseAcls(
+ "user:" + USER1 + ":r," +
+ "user:" + USER1 + ":x," +
+ "user:" + USER2 + ":r," +
+ "user:" + USER2 + ":x"));
+ }
+
+ private void createKey(OzoneBucket bucket)
+ throws IOException {
+ keyName = KEY_PREFIX + RandomStringUtils.randomNumeric(5);
+ byte[] data = RandomStringUtils.randomAscii(1).getBytes(UTF_8);
+ final OzoneOutputStream fileKey = bucket.createKey(keyName, data.length);
+ fileKey.write(data);
+ fileKey.close();
+ }
+
+ private void createSnapshot()
+ throws IOException, InterruptedException, TimeoutException {
+ final String snapshotPrefix = "snapshot-";
+ final String snapshotName =
+ snapshotPrefix + RandomStringUtils.randomNumeric(5);
+ objectStore.createSnapshot(volumeName, bucketName, snapshotName);
+ snapshotKeyPrefix = OmSnapshotManager
+ .getSnapshotPrefix(snapshotName);
+ final SnapshotInfo snapshotInfo = ozoneManager
+ .getMetadataManager()
+ .getSnapshotInfoTable()
+ .get(SnapshotInfo.getTableKey(volumeName, bucketName, snapshotName));
+ final String snapshotDirName = metaDir + OM_KEY_PREFIX +
+ OM_SNAPSHOT_DIR + OM_KEY_PREFIX + OM_DB_NAME +
+ snapshotInfo.getCheckpointDirName() + OM_KEY_PREFIX + "CURRENT";
+ GenericTestUtils.waitFor(() -> new File(snapshotDirName).exists(),
+ 1000, 120000);
+ }
+
+ 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),
+ arguments(BucketLayout.FILE_SYSTEM_OPTIMIZED, false, false),
+ arguments(BucketLayout.LEGACY, false, false),
+ arguments(BucketLayout.OBJECT_STORE, true, false),
+ arguments(BucketLayout.LEGACY, true, false),
+ arguments(BucketLayout.OBJECT_STORE, false, true),
+ arguments(BucketLayout.FILE_SYSTEM_OPTIMIZED, false, true),
+ arguments(BucketLayout.LEGACY, false, true),
+ arguments(BucketLayout.OBJECT_STORE, true, true),
+ arguments(BucketLayout.LEGACY, true, true));
+ }
+
+ private OmKeyArgs getOmKeyArgs(boolean isSnapshot) {
+ return new OmKeyArgs.Builder()
+ .setVolumeName(volumeName)
+ .setBucketName(bucketName)
+ .setKeyName(isSnapshot ? snapshotKeyPrefix + keyName : keyName)
+ .build();
+ }
+
+ private void createBucket(BucketLayout bucketLayout,
+ OzoneVolume volume) throws IOException {
+ final String bucketPrefix = "bucket-";
+ bucketName = bucketPrefix + RandomStringUtils.randomNumeric(5);
+ final BucketArgs bucketArgs = BucketArgs.newBuilder()
+ .setOwner(ADMIN)
+ .setBucketLayout(bucketLayout).build();
+ volume.createBucket(bucketName, bucketArgs);
+ }
+
+ private void createVolume() throws IOException {
+ final String volumePrefix = "volume-";
+ volumeName = volumePrefix + RandomStringUtils.randomNumeric(5);
+ final VolumeArgs volumeArgs = new VolumeArgs.Builder()
+ .setAdmin(ADMIN)
+ .setOwner(ADMIN)
+ .build();
+ objectStore.createVolume(volumeName, volumeArgs);
+ }
+
+}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/package-info.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/package-info.java
new file mode 100644
index 0000000000..db22625d17
--- /dev/null
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ *
+ */
+/**
+ * Ozone Manager Tests for Snapshot feature.
+ */
+package org.apache.hadoop.ozone.om.snapshot;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]