| /** |
| * 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.hdfs.server.namenode.snapshot; |
| |
| import static org.junit.Assert.assertTrue; |
| import static org.junit.Assert.fail; |
| import java.util.ArrayList; |
| import org.apache.hadoop.conf.Configuration; |
| import org.apache.hadoop.fs.Options; |
| import org.apache.hadoop.fs.Path; |
| import org.apache.hadoop.fs.permission.FsPermission; |
| import org.apache.hadoop.hdfs.DFSClient; |
| import org.apache.hadoop.hdfs.DistributedFileSystem; |
| import org.apache.hadoop.hdfs.MiniDFSCluster; |
| import org.apache.hadoop.hdfs.server.namenode.FSNamesystem; |
| import org.junit.AfterClass; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| |
| /** |
| * This class tests snapshot functionality. One or multiple snapshots are |
| * created. The snapshotted directory is changed and verification is done to |
| * ensure snapshots remain unchanges. |
| */ |
| public class TestDisallowModifyROSnapshot { |
| private final static Path dir = new Path("/TestSnapshot"); |
| private final static Path sub1 = new Path(dir, "sub1"); |
| private final static Path sub2 = new Path(dir, "sub2"); |
| |
| protected static Configuration conf; |
| protected static MiniDFSCluster cluster; |
| protected static FSNamesystem fsn; |
| protected static DistributedFileSystem fs; |
| |
| /** |
| * The list recording all previous snapshots. Each element in the array |
| * records a snapshot root. |
| */ |
| protected static ArrayList<Path> snapshotList = new ArrayList<Path>(); |
| static Path objInSnapshot = null; |
| |
| @BeforeClass |
| public static void setUp() throws Exception { |
| conf = new Configuration(); |
| cluster = new MiniDFSCluster.Builder(conf).numDataNodes(1).build(); |
| cluster.waitActive(); |
| |
| fsn = cluster.getNamesystem(); |
| fs = cluster.getFileSystem(); |
| |
| Path path1 = new Path(sub1, "dir1"); |
| assertTrue(fs.mkdirs(path1)); |
| Path path2 = new Path(sub2, "dir2"); |
| assertTrue(fs.mkdirs(path2)); |
| SnapshotTestHelper.createSnapshot(fs, sub1, "testSnapshot"); |
| objInSnapshot = SnapshotTestHelper.getSnapshotPath(sub1, "testSnapshot", |
| "dir1"); |
| } |
| |
| @AfterClass |
| public static void tearDown() throws Exception { |
| if (cluster != null) { |
| cluster.shutdown(); |
| } |
| } |
| |
| @Test(timeout=60000, expected = SnapshotAccessControlException.class) |
| public void testSetReplication() throws Exception { |
| fs.setReplication(objInSnapshot, (short) 1); |
| } |
| |
| @Test(timeout=60000, expected = SnapshotAccessControlException.class) |
| public void testSetPermission() throws Exception { |
| fs.setPermission(objInSnapshot, new FsPermission("777")); |
| } |
| |
| @Test(timeout=60000, expected = SnapshotAccessControlException.class) |
| public void testSetOwner() throws Exception { |
| fs.setOwner(objInSnapshot, "username", "groupname"); |
| } |
| |
| @Test (timeout=60000) |
| public void testRename() throws Exception { |
| try { |
| fs.rename(objInSnapshot, new Path("/invalid/path")); |
| fail("Didn't throw SnapshotAccessControlException"); |
| } catch (SnapshotAccessControlException e) { /* Ignored */ } |
| |
| try { |
| fs.rename(sub2, objInSnapshot); |
| fail("Didn't throw SnapshotAccessControlException"); |
| } catch (SnapshotAccessControlException e) { /* Ignored */ } |
| |
| try { |
| fs.rename(sub2, objInSnapshot, (Options.Rename) null); |
| fail("Didn't throw SnapshotAccessControlException"); |
| } catch (SnapshotAccessControlException e) { /* Ignored */ } |
| } |
| |
| @Test(timeout=60000, expected = SnapshotAccessControlException.class) |
| public void testDelete() throws Exception { |
| fs.delete(objInSnapshot, true); |
| } |
| |
| @Test(timeout=60000, expected = SnapshotAccessControlException.class) |
| public void testQuota() throws Exception { |
| fs.setQuota(objInSnapshot, 100, 100); |
| } |
| |
| @Test(timeout=60000, expected = SnapshotAccessControlException.class) |
| public void testSetTime() throws Exception { |
| fs.setTimes(objInSnapshot, 100, 100); |
| } |
| |
| @Test(timeout=60000, expected = SnapshotAccessControlException.class) |
| public void testCreate() throws Exception { |
| @SuppressWarnings("deprecation") |
| DFSClient dfsclient = new DFSClient(conf); |
| dfsclient.create(objInSnapshot.toString(), true); |
| } |
| |
| @Test(timeout=60000, expected = SnapshotAccessControlException.class) |
| public void testAppend() throws Exception { |
| fs.append(objInSnapshot, 65535, null); |
| } |
| |
| @Test(timeout=60000, expected = SnapshotAccessControlException.class) |
| public void testMkdir() throws Exception { |
| fs.mkdirs(objInSnapshot, new FsPermission("777")); |
| } |
| |
| @Test(timeout=60000, expected = SnapshotAccessControlException.class) |
| public void testCreateSymlink() throws Exception { |
| @SuppressWarnings("deprecation") |
| DFSClient dfsclient = new DFSClient(conf); |
| dfsclient.createSymlink(sub2.toString(), "/TestSnapshot/sub1/.snapshot", |
| false); |
| } |
| } |