blob: b0ff58b384f5bfaf5e72b77badccb6145a7be10f [file] [log] [blame]
/**
* 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);
}
}