You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by gi...@apache.org on 2019/02/22 03:42:45 UTC
[mesos] 02/02: Added test cases for the `volume/host_path` isolator.
This is an automated email from the ASF dual-hosted git repository.
gilbert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git
commit b68acfda4ee2a501acb49a7b50438166807dd6c7
Author: Jason Lai <ja...@jasonlai.net>
AuthorDate: Thu Feb 21 18:29:52 2019 -0800
Added test cases for the `volume/host_path` isolator.
Added test cases for the `volume/host_path` isolator for whitelisted
non-existing host paths.
Review: https://reviews.apache.org/r/69287/
---
.../volume_host_path_isolator_tests.cpp | 86 ++++++++++++++++++++++
1 file changed, 86 insertions(+)
diff --git a/src/tests/containerizer/volume_host_path_isolator_tests.cpp b/src/tests/containerizer/volume_host_path_isolator_tests.cpp
index 81bf72e..330af25 100644
--- a/src/tests/containerizer/volume_host_path_isolator_tests.cpp
+++ b/src/tests/containerizer/volume_host_path_isolator_tests.cpp
@@ -28,6 +28,8 @@
#include "slave/containerizer/mesos/containerizer.hpp"
+#include "slave/containerizer/mesos/isolators/volume/utils.hpp"
+
#include "tests/cluster.hpp"
#include "tests/mesos.hpp"
@@ -48,6 +50,8 @@ using mesos::internal::slave::Containerizer;
using mesos::internal::slave::Fetcher;
using mesos::internal::slave::MesosContainerizer;
+using mesos::internal::slave::volume::HOST_PATH_WHITELIST_DELIM;
+
using mesos::master::detector::MasterDetector;
using mesos::slave::ContainerTermination;
@@ -345,6 +349,88 @@ TEST_F(VolumeHostPathIsolatorTest, ROOT_FileVolumeFromHostSandboxMountPoint)
}
+// This test verifies that non-existing host paths under whitelist paths
+// specified by the `host_path_volume_force_creation` agent flag can be
+// properly created and mounted into container's mount namespace.
+TEST_F(VolumeHostPathIsolatorTest, ROOT_VolumeFromHostForceCreation)
+{
+ const string imageName = "test-image";
+ const string registryPath = path::join(sandbox.get(), "registry");
+ AWAIT_READY(DockerArchive::create(registryPath, imageName));
+
+ const string storePath = path::join(sandbox.get(), "store");
+ const string mntPath = path::join(sandbox.get(), "mnt");
+ const vector<string> whitelistedPaths = {
+ path::join(mntPath, "whitelist-01"),
+ path::join(mntPath, "whitelist-02")
+ };
+
+ slave::Flags flags = CreateSlaveFlags();
+ flags.docker_registry = registryPath;
+ flags.docker_store_dir = storePath;
+ flags.image_providers = "docker";
+ flags.isolation = "filesystem/linux,docker/runtime";
+ flags.host_path_volume_force_creation = strings::join(
+ HOST_PATH_WHITELIST_DELIM, whitelistedPaths);
+
+ Fetcher fetcher(flags);
+
+ const Try<MesosContainerizer*> create =
+ MesosContainerizer::create(flags, true, &fetcher);
+
+ ASSERT_SOME(create);
+
+ Owned<Containerizer> containerizer(create.get());
+
+ const string sandboxPath = path::join(flags.work_dir, "sandbox");
+ ASSERT_SOME(os::mkdir(sandboxPath));
+
+ // Specify non-existing paths.
+ const vector<string> hostPaths = {
+ path::join(mntPath, "whitelist-01", "a", "b", "c"),
+ path::join(mntPath, "whitelist-02", "d", "e", "f")
+ };
+
+ // Ensure none of `hostPaths` exists.
+ foreach (const string& hostPath, hostPaths) {
+ ASSERT_FALSE(os::exists(hostPath));
+ }
+
+ ContainerID containerId;
+ containerId.set_value(id::UUID::random().toString());
+
+ ContainerInfo containerInfo = createContainerInfo(imageName, {
+ createVolumeHostPath("/mnt/foo", hostPaths.front(), Volume::RW),
+ createVolumeHostPath("/mnt/bar", hostPaths.back(), Volume::RW)});
+
+ ExecutorInfo executor = createExecutorInfo(
+ "test-executor",
+ "test -d /mnt/foo -a -d /mnt/bar");
+ executor.mutable_container()->CopyFrom(containerInfo);
+
+ Future<Containerizer::LaunchResult> launch = containerizer->launch(
+ containerId,
+ createContainerConfig(None(), executor, sandboxPath),
+ map<string, string>(),
+ None());
+
+ AWAIT_ASSERT_EQ(Containerizer::LaunchResult::SUCCESS, launch);
+
+ Future<Option<ContainerTermination>> wait =
+ containerizer->wait(containerId);
+
+ AWAIT_READY(wait);
+ ASSERT_SOME(wait.get());
+ ASSERT_TRUE(wait->get().has_status());
+ EXPECT_WEXITSTATUS_EQ(0, wait->get().status());
+
+ // Expect `hostPath` was created and is a directory.
+ foreach (const string& hostPath, hostPaths) {
+ EXPECT_TRUE(os::stat::isdir(hostPath));
+ }
+}
+
+
TEST_F(VolumeHostPathIsolatorTest, ROOT_MountPropagation)
{
slave::Flags flags = CreateSlaveFlags();