/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package alluxio.shell.command;
import alluxio.AlluxioURI;
import alluxio.client.WriteType;
import alluxio.client.file.FileSystemTestUtils;
import alluxio.client.file.URIStatus;
import alluxio.client.file.options.CreateDirectoryOptions;
import alluxio.shell.AbstractAlluxioShellTest;
import alluxio.underfs.UnderFileSystemFactoryRegistry;
import alluxio.underfs.ConfExpectingUnderFileSystemFactory;
import alluxio.util.io.BufferUtils;
import alluxio.util.io.PathUtils;
import com.google.common.collect.ImmutableMap;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import java.nio.file.Files;
import java.nio.file.Paths;
/**
* Tests for mount command.
*/
public final class MountCommandTest extends AbstractAlluxioShellTest {
@Rule
public TemporaryFolder mFolder = new TemporaryFolder();
private void checkMountPoint(AlluxioURI mountPoint, String ufsPath) throws Exception {
// File in UFS can be read in Alluxio
AlluxioURI testFile = mountPoint.join("testFile");
generateRelativeFileContent(PathUtils.concatPath(ufsPath, "testFile"),
BufferUtils.getIncreasingByteArray(10));
Assert.assertTrue(fileExists(testFile));
// Dir in Alluxio can be persisted to UFS
AlluxioURI testDir = mountPoint.join("testDir");
mFileSystem.createDirectory(testDir,
CreateDirectoryOptions.defaults().setWriteType(WriteType.CACHE_THROUGH));
Assert.assertTrue(fileExists(testDir));
Assert.assertTrue(Files.exists(Paths.get(ufsPath, "testDir")));
}
@Test
public void mount() throws Exception {
AlluxioURI mountPoint = new AlluxioURI("/mnt");
String ufsPath = mFolder.getRoot().getAbsolutePath();
Assert.assertEquals(0, mFsShell.run("mount", mountPoint.toString(), ufsPath));
checkMountPoint(mountPoint, ufsPath);
}
@Test
public void mountWithWrongArgs() throws Exception {
AlluxioURI mountPoint = new AlluxioURI("/mnt");
String ufsPath = mFolder.getRoot().getAbsolutePath();
// alluxio, ufs path missing
Assert.assertEquals(-1, mFsShell.run("mount"));
// ufs missing
Assert.assertEquals(-1, mFsShell.run("mount", mountPoint.toString()));
// extra arg
Assert.assertEquals(-1, mFsShell.run("mount", mountPoint.toString(), ufsPath, "extraArg"));
// --option with wrong argument format
Assert.assertEquals(-1,
mFsShell.run("mount", "--option", "wrongArgFormat", mountPoint.toString(), ufsPath));
}
@Test
public void mountWithMultipleOptions() throws Exception {
ConfExpectingUnderFileSystemFactory factory =
new ConfExpectingUnderFileSystemFactory("ufs", ImmutableMap.of("k1", "v1", "k2", "v2"));
UnderFileSystemFactoryRegistry.register(factory);
AlluxioURI mountPoint = new AlluxioURI("/mnt");
String ufsPath = "ufs://" + mFolder.getRoot().getAbsolutePath();
Assert.assertEquals(0, mFsShell
.run("mount", "--option", "k1=v1", "--option", "k2=v2", mountPoint.toString(), ufsPath));
FileSystemTestUtils.createByteFile(mFileSystem, "/mnt/testFile1", WriteType.CACHE_THROUGH, 20);
Assert.assertTrue(mFileSystem.exists(new AlluxioURI("/mnt/testFile1")));
URIStatus status = mFileSystem.getStatus(new AlluxioURI("/mnt/testFile1"));
Assert.assertTrue(status.isPersisted());
UnderFileSystemFactoryRegistry.unregister(factory);
}
@Test
public void mountWithWrongOptions() throws Exception {
ConfExpectingUnderFileSystemFactory factory =
new ConfExpectingUnderFileSystemFactory("ufs", ImmutableMap.of("k1", "v1", "k2", "v2"));
UnderFileSystemFactoryRegistry.register(factory);
AlluxioURI mountPoint = new AlluxioURI("/mnt");
String ufsPath = "ufs://" + mFolder.getRoot().getAbsolutePath();
// one property is wrong
Assert.assertEquals(-1, mFsShell
.run("mount", "--option", "k1=not_v1", "--option", "k2=v2", mountPoint.toString(),
ufsPath));
// one property is missing
Assert.assertEquals(-1,
mFsShell.run("mount", "--option", "k1=v1", mountPoint.toString(), ufsPath));
// one property is unnecessary
Assert.assertEquals(-1, mFsShell
.run("mount", "--option", "k1=v1", "--option", "k2=v2", "--option", "k3=v3",
mountPoint.toString(), ufsPath));
UnderFileSystemFactoryRegistry.unregister(factory);
}
@Test
public void mountWithSpaceInOptionValues() throws Exception {
AlluxioURI mountPoint = new AlluxioURI("/mnt");
String ufsPath = mFolder.getRoot().getAbsolutePath();
Assert.assertEquals(0, mFsShell
.run("mount", "--option", "key=\" value with spaces\"", mountPoint.toString(), ufsPath));
}
@Test
public void mountWithQuotesInOptionValues() throws Exception {
AlluxioURI mountPoint = new AlluxioURI("/mnt");
String ufsPath = mFolder.getRoot().getAbsolutePath();
Assert.assertEquals(0, mFsShell
.run("mount", "--option", "key=valueWith\"Quotes\"", mountPoint.toString(), ufsPath));
}
@Test
public void mountWithEqualsInOptionValues() throws Exception {
AlluxioURI mountPoint = new AlluxioURI("/mnt");
String ufsPath = mFolder.getRoot().getAbsolutePath();
Assert.assertEquals(0,
mFsShell.run("mount", "--option", "key=k=v", mountPoint.toString(), ufsPath));
}
@Test
public void mountToRootFailed() throws Exception {
String ufsPath = mFolder.getRoot().getAbsolutePath();
Assert.assertEquals(-1, mFsShell.run("mount", "/", ufsPath));
}
@Test
public void mountToExistingMountPointFailed() throws Exception {
AlluxioURI mountPoint = new AlluxioURI("/mnt");
String ufsPath1 = mFolder.newFolder().getAbsolutePath();
String ufsPath2 = mFolder.newFolder().getAbsolutePath();
Assert.assertEquals(0, mFsShell.run("mount", mountPoint.toString(), ufsPath1));
Assert.assertEquals(-1, mFsShell.run("mount", mountPoint.toString(), ufsPath2));
}
@Test
public void mountTwiceFailed() throws Exception {
AlluxioURI mountPoint = new AlluxioURI("/mnt");
String ufsPath = mFolder.getRoot().getAbsolutePath();
Assert.assertEquals(0, mFsShell.run("mount", mountPoint.toString(), ufsPath));
Assert.assertEquals(-1, mFsShell.run("mount", mountPoint.toString(), ufsPath));
}
}