/** * 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.protocol.SnapshotAccessControlException; 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); } }