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();