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 {
