Repository: mesos
Updated Branches:
  refs/heads/master f40554bab -> f15bf085d


Support mounting relative paths with docker.

Review: https://reviews.apache.org/r/35799


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/f15bf085
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/f15bf085
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/f15bf085

Branch: refs/heads/master
Commit: f15bf085de0f6958c5ee030b188bcc62d54a6db4
Parents: f40554b
Author: Timothy Chen <[email protected]>
Authored: Wed Jun 17 01:21:51 2015 -0700
Committer: Timothy Chen <[email protected]>
Committed: Wed Jul 1 10:31:36 2015 -0700

----------------------------------------------------------------------
 src/docker/docker.cpp      |   8 ++-
 src/tests/docker_tests.cpp | 127 +++++++++++++++++++++++++++++++++++-----
 2 files changed, 120 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/f15bf085/src/docker/docker.cpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
index 62aac27..cbcb16e 100644
--- a/src/docker/docker.cpp
+++ b/src/docker/docker.cpp
@@ -376,7 +376,13 @@ Future<Nothing> Docker::run(
   foreach (const Volume& volume, containerInfo.volumes()) {
     string volumeConfig = volume.container_path();
     if (volume.has_host_path()) {
-      volumeConfig = volume.host_path() + ":" + volumeConfig;
+      if (!strings::startsWith(volume.host_path(), "/")) {
+        // Support mapping relative paths from the sandbox.
+        volumeConfig =
+          path::join(sandboxDirectory, volume.host_path()) + ":" + 
volumeConfig;
+      } else {
+        volumeConfig = volume.host_path() + ":" + volumeConfig;
+      }
       if (volume.has_mode()) {
         switch (volume.mode()) {
           case Volume::RW: volumeConfig += ":rw"; break;

http://git-wip-us.apache.org/repos/asf/mesos/blob/f15bf085/src/tests/docker_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/docker_tests.cpp b/src/tests/docker_tests.cpp
index acf1e3c..a4a2725 100644
--- a/src/tests/docker_tests.cpp
+++ b/src/tests/docker_tests.cpp
@@ -33,6 +33,7 @@
 
 #include "tests/environment.hpp"
 #include "tests/flags.hpp"
+#include "tests/mesos.hpp"
 
 using namespace process;
 
@@ -44,18 +45,38 @@ namespace internal {
 namespace tests {
 
 
+static const string NAME_PREFIX="mesos-docker";
+
+
+class DockerTest : public MesosTest
+{
+  virtual void TearDown()
+  {
+    Try<Docker*> docker = Docker::create(tests::flags.docker, false);
+    ASSERT_SOME(docker);
+
+    Future<list<Docker::Container>> containers =
+      docker.get()->ps(true, NAME_PREFIX);
+
+    AWAIT_READY(containers);
+
+    // Cleanup all mesos launched containers.
+    foreach (const Docker::Container& container, containers.get()) {
+      AWAIT_READY_FOR(docker.get()->rm(container.id, true), Seconds(30));
+    }
+
+    delete docker.get();
+  }
+};
+
 // This test tests the functionality of the docker's interfaces.
-TEST(DockerTest, ROOT_DOCKER_interface)
+TEST_F(DockerTest, ROOT_DOCKER_interface)
 {
-  string containerName = "mesos-docker-test";
+  const string containerName = NAME_PREFIX + "-test";
   Resources resources = Resources::parse("cpus:1;mem:512").get();
 
   Owned<Docker> docker(Docker::create(tests::flags.docker, false).get());
 
-  // Cleaning up the container first if it exists.
-  Future<Nothing> status = docker->rm(containerName, true);
-  ASSERT_TRUE(status.await(Seconds(10)));
-
   // Verify that we do not see the container.
   Future<list<Docker::Container> > containers = docker->ps(true, 
containerName);
   AWAIT_READY(containers);
@@ -77,7 +98,7 @@ TEST(DockerTest, ROOT_DOCKER_interface)
   commandInfo.set_value("sleep 120");
 
   // Start the container.
-  status = docker->run(
+  Future<Nothing> status = docker->run(
       containerInfo,
       commandInfo,
       containerName,
@@ -199,7 +220,7 @@ TEST(DockerTest, ROOT_DOCKER_interface)
 }
 
 
-TEST(DockerTest, ROOT_DOCKER_CheckCommandWithShell)
+TEST_F(DockerTest, ROOT_DOCKER_CheckCommandWithShell)
 {
   Owned<Docker> docker(Docker::create(tests::flags.docker, false).get());
 
@@ -224,9 +245,9 @@ TEST(DockerTest, ROOT_DOCKER_CheckCommandWithShell)
 }
 
 
-TEST(DockerTest, ROOT_DOCKER_CheckPortResource)
+TEST_F(DockerTest, ROOT_DOCKER_CheckPortResource)
 {
-  string containerName = "mesos-docker-port-resource-test";
+  const string containerName = NAME_PREFIX + "-port-resource-test";
   Owned<Docker> docker(Docker::create(tests::flags.docker, false).get());
 
   // Make sure the container is removed.
@@ -280,13 +301,10 @@ TEST(DockerTest, ROOT_DOCKER_CheckPortResource)
       resources);
 
   AWAIT_READY(run);
-
-  Future<Nothing> status = docker->rm(containerName, true);
-  ASSERT_TRUE(process::internal::await(status, Seconds(10)));
 }
 
 
-TEST(DockerTest, ROOT_DOCKER_CancelPull)
+TEST_F(DockerTest, ROOT_DOCKER_CancelPull)
 {
   // Delete the test image if it exists.
 
@@ -317,6 +335,87 @@ TEST(DockerTest, ROOT_DOCKER_CancelPull)
   AWAIT_DISCARDED(future);
 }
 
+
+// This test verifies mounting in a relative path when running a
+// docker container works.
+TEST_F(DockerTest, ROOT_DOCKER_MountRelative)
+{
+  Owned<Docker> docker(Docker::create(tests::flags.docker, false).get());
+
+  ContainerInfo containerInfo;
+  containerInfo.set_type(ContainerInfo::DOCKER);
+
+  Volume* volume = containerInfo.add_volumes();
+  volume->set_host_path("test_file");
+  volume->set_container_path("/tmp/test_file");
+  volume->set_mode(Volume::RO);
+
+  ContainerInfo::DockerInfo dockerInfo;
+  dockerInfo.set_image("busybox");
+
+  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
+
+  CommandInfo commandInfo;
+  commandInfo.set_shell(true);
+  commandInfo.set_value("ls /tmp/test_file");
+
+  Try<string> directory = environment->mkdtemp();
+  CHECK_SOME(directory) << "Failed to create temporary directory";
+
+  const string testFile = path::join(directory.get(), "test_file");
+  EXPECT_SOME(os::write(testFile, "data"));
+
+  Future<Nothing> run = docker->run(
+      containerInfo,
+      commandInfo,
+      NAME_PREFIX + "-mount-relative-test",
+      directory.get(),
+      directory.get());
+
+  AWAIT_READY(run);
+}
+
+
+// This test verifies mounting in a absolute path when running a
+// docker container works.
+TEST_F(DockerTest, ROOT_DOCKER_MountAbsolute)
+{
+  Owned<Docker> docker(Docker::create(tests::flags.docker, false).get());
+
+  ContainerInfo containerInfo;
+  containerInfo.set_type(ContainerInfo::DOCKER);
+
+  Try<string> directory = environment->mkdtemp();
+  CHECK_SOME(directory) << "Failed to create temporary directory";
+
+  const string testFile = path::join(directory.get(), "test_file");
+  EXPECT_SOME(os::write(testFile, "data"));
+
+  Volume* volume = containerInfo.add_volumes();
+  volume->set_host_path(testFile);
+  volume->set_container_path("/tmp/test_file");
+  volume->set_mode(Volume::RO);
+
+  ContainerInfo::DockerInfo dockerInfo;
+  dockerInfo.set_image("busybox");
+
+  containerInfo.mutable_docker()->CopyFrom(dockerInfo);
+
+  CommandInfo commandInfo;
+  commandInfo.set_shell(true);
+  commandInfo.set_value("ls /tmp/test_file");
+
+  Future<Nothing> run = docker->run(
+      containerInfo,
+      commandInfo,
+      NAME_PREFIX + "-mount-absolute-test",
+      directory.get(),
+      directory.get());
+
+  AWAIT_READY(run);
+}
+
+
 } // namespace tests {
 } // namespace internal {
 } // namespace mesos {

Reply via email to