You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2016/01/14 23:46:19 UTC

[1/7] mesos git commit: Pulled out Provisioner from linux filesystem isolator.

Repository: mesos
Updated Branches:
  refs/heads/master 5a5af2189 -> d2f4b299f


Pulled out Provisioner from linux filesystem isolator.

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


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

Branch: refs/heads/master
Commit: d2f4b299f25d6e860212bc617298236a6ffddcae
Parents: b1c481d
Author: Gilbert Song <so...@gmail.com>
Authored: Thu Jan 14 13:22:27 2016 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Jan 14 14:45:43 2016 -0800

----------------------------------------------------------------------
 src/slave/containerizer/mesos/containerizer.cpp | 173 +++++++++++++++----
 src/slave/containerizer/mesos/containerizer.hpp |  29 +++-
 .../mesos/isolators/filesystem/linux.cpp        | 132 ++------------
 .../mesos/isolators/filesystem/linux.hpp        |  32 +---
 .../containerizer/filesystem_isolator_tests.cpp |   9 +-
 5 files changed, 191 insertions(+), 184 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/d2f4b299/src/slave/containerizer/mesos/containerizer.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.cpp b/src/slave/containerizer/mesos/containerizer.cpp
index 478699b..0639324 100644
--- a/src/slave/containerizer/mesos/containerizer.cpp
+++ b/src/slave/containerizer/mesos/containerizer.cpp
@@ -190,9 +190,7 @@ Try<MesosContainerizer*> MesosContainerizer::create(
     // Filesystem isolators.
     {"filesystem/posix", &PosixFilesystemIsolatorProcess::create},
 #ifdef __linux__
-    {"filesystem/linux", lambda::bind(&LinuxFilesystemIsolatorProcess::create,
-                                      lambda::_1,
-                                      provisioner.get())},
+    {"filesystem/linux", &LinuxFilesystemIsolatorProcess::create},
 
     // TODO(jieyu): Deprecate this in favor of using filesystem/linux.
     {"filesystem/shared", &SharedFilesystemIsolatorProcess::create},
@@ -478,6 +476,18 @@ Future<Nothing> MesosContainerizerProcess::_recover(
     const list<ContainerState>& recoverable,
     const hashset<ContainerID>& orphans)
 {
+  // Recover isolators first then recover the provisioner, because of
+  // possible cleanups on unknown containers.
+  return recoverIsolators(recoverable, orphans)
+    .then(defer(self(), &Self::recoverProvisioner, recoverable, orphans))
+    .then(defer(self(), &Self::__recover, recoverable, orphans));
+}
+
+
+Future<list<Nothing>> MesosContainerizerProcess::recoverIsolators(
+    const list<ContainerState>& recoverable,
+    const hashset<ContainerID>& orphans)
+{
   list<Future<Nothing>> futures;
 
   // Then recover the isolators.
@@ -486,8 +496,15 @@ Future<Nothing> MesosContainerizerProcess::_recover(
   }
 
   // If all isolators recover then continue.
-  return collect(futures)
-    .then(defer(self(), &Self::__recover, recoverable, orphans));
+  return collect(futures);
+}
+
+
+Future<Nothing> MesosContainerizerProcess::recoverProvisioner(
+    const list<ContainerState>& recoverable,
+    const hashset<ContainerID>& orphans)
+{
+  return provisioner->recover(recoverable, orphans);
 }
 
 
@@ -625,16 +642,39 @@ Future<bool> MesosContainerizerProcess::launch(
 
   containers_.put(containerId, Owned<Container>(container));
 
-  return provision(containerId, executorInfo)
-    .then(defer(self(),
-                &Self::prepare,
-                containerId,
-                executorInfo,
-                directory,
-                user,
-                lambda::_1))
-    .then(defer(self(),
-                &Self::_launch,
+  if (!executorInfo.has_container()) {
+    return prepare(containerId, executorInfo, directory, user, None())
+      .then(defer(self(),
+                  &Self::__launch,
+                  containerId,
+                  executorInfo,
+                  directory,
+                  user,
+                  slaveId,
+                  slavePid,
+                  checkpoint,
+                  lambda::_1));
+  }
+
+  // Provision the root filesystem if needed.
+  CHECK_EQ(executorInfo.container().type(), ContainerInfo::MESOS);
+
+  if (!executorInfo.container().mesos().has_image()) {
+    return _launch(containerId,
+                   executorInfo,
+                   directory,
+                   user,
+                   slaveId,
+                   slavePid,
+                   checkpoint,
+                   None());
+  }
+
+  const Image& image = executorInfo.container().mesos().image();
+
+  return provisioner->provision(containerId, image)
+    .then(defer(PID<MesosContainerizerProcess>(this),
+                &MesosContainerizerProcess::_launch,
                 containerId,
                 executorInfo,
                 directory,
@@ -646,27 +686,67 @@ Future<bool> MesosContainerizerProcess::launch(
 }
 
 
-Future<Option<ProvisionInfo>> MesosContainerizerProcess::provision(
+Future<bool> MesosContainerizerProcess::_launch(
     const ContainerID& containerId,
-    const ExecutorInfo& executorInfo)
+    const ExecutorInfo& executorInfo,
+    const string& directory,
+    const Option<string>& user,
+    const SlaveID& slaveId,
+    const PID<Slave>& slavePid,
+    bool checkpoint,
+    const Option<ProvisionInfo>& provisionInfo)
 {
-  if (!executorInfo.has_container()) {
-    return None();
-  }
-
-  // Provision the root filesystem if needed.
+  CHECK(executorInfo.has_container());
   CHECK_EQ(executorInfo.container().type(), ContainerInfo::MESOS);
 
-  if (!executorInfo.container().mesos().has_image()) {
-    return None();
+  // We will provision the images specified in ContainerInfo::volumes
+  // as well. We will mutate ContainerInfo::volumes to include the
+  // paths to the provisioned root filesystems (by setting the
+  // 'host_path') if the volume specifies an image as the source.
+  Owned<ExecutorInfo> _executorInfo(new ExecutorInfo(executorInfo));
+  list<Future<Nothing>> futures;
+
+  for (int i = 0; i < _executorInfo->container().volumes_size(); i++) {
+    Volume* volume = _executorInfo->mutable_container()->mutable_volumes(i);
+
+    if (!volume->has_image()) {
+      continue;
+    }
+
+    const Image& image = volume->image();
+
+    futures.push_back(
+        provisioner->provision(containerId, image)
+          .then([volume](const ProvisionInfo& info) -> Future<Nothing> {
+            volume->set_host_path(info.rootfs);
+            return Nothing();
+          }));
   }
 
-  const Image& image = executorInfo.container().mesos().image();
+  // TODO(gilbert): For command executors, we modify the executorInfo
+  // so that the user specified image will be mounted in as a volume.
+  // However, we also need to figure out a way to support passing and
+  // handling those runtime configurations in the image.
 
-  return provisioner->provision(containerId, image)
-    .then([](const ProvisionInfo& provisionInfo)
-        -> Future<Option<ProvisionInfo>> {
-      return provisionInfo;
+  // We put `prepare` inside of a lambda expression, in order to get
+  // _executorInfo object after host path set in volume.
+  return collect(futures)
+    .then([=]() -> Future<bool> {
+      return prepare(containerId,
+                     *_executorInfo,
+                     directory,
+                     user,
+                     provisionInfo)
+        .then(defer(self(),
+                    &Self::__launch,
+                    containerId,
+                    *_executorInfo,
+                    directory,
+                    user,
+                    slaveId,
+                    slavePid,
+                    checkpoint,
+                    lambda::_1));
     });
 }
 
@@ -757,7 +837,7 @@ Future<Nothing> MesosContainerizerProcess::fetch(
 }
 
 
-Future<bool> MesosContainerizerProcess::_launch(
+Future<bool> MesosContainerizerProcess::__launch(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
     const string& directory,
@@ -1259,6 +1339,39 @@ void MesosContainerizerProcess::____destroy(
     }
   }
 
+  provisioner->destroy(containerId)
+    .onAny(defer(self(),
+                 &Self::_____destroy,
+                 containerId,
+                 status,
+                 lambda::_1,
+                 message));
+}
+
+
+void MesosContainerizerProcess::_____destroy(
+    const ContainerID& containerId,
+    const Future<Option<int>>& status,
+    const Future<bool>& destroy,
+    Option<string> message)
+{
+  CHECK(containers_.contains(containerId));
+
+  Container* container = containers_[containerId].get();
+
+  if (!destroy.isReady()) {
+    container->promise.fail(
+        "Failed to destroy the provisioned filesystem when destroying "
+        "container '" + stringify(containerId) + "': " +
+        (destroy.isFailed() ? destroy.failure() : "discarded future"));
+
+    containers_.erase(containerId);
+
+    ++metrics.container_destroy_errors;
+
+    return;
+  }
+
   containerizer::Termination termination;
 
   if (status.isReady() && status->isSome()) {

http://git-wip-us.apache.org/repos/asf/mesos/blob/d2f4b299/src/slave/containerizer/mesos/containerizer.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.hpp b/src/slave/containerizer/mesos/containerizer.hpp
index 48bdd4f..f530355 100644
--- a/src/slave/containerizer/mesos/containerizer.hpp
+++ b/src/slave/containerizer/mesos/containerizer.hpp
@@ -171,14 +171,18 @@ private:
       const std::list<mesos::slave::ContainerState>& recoverable,
       const hashset<ContainerID>& orphans);
 
+  process::Future<std::list<Nothing>> recoverIsolators(
+      const std::list<mesos::slave::ContainerState>& recoverable,
+      const hashset<ContainerID>& orphans);
+
+  process::Future<Nothing> recoverProvisioner(
+      const std::list<mesos::slave::ContainerState>& recoverable,
+      const hashset<ContainerID>& orphans);
+
   process::Future<Nothing> __recover(
       const std::list<mesos::slave::ContainerState>& recovered,
       const hashset<ContainerID>& orphans);
 
-  process::Future<Option<ProvisionInfo>> provision(
-      const ContainerID& containerId,
-      const ExecutorInfo& executorInfo);
-
   process::Future<std::list<Option<mesos::slave::ContainerPrepareInfo>>>
     prepare(const ContainerID& containerId,
             const ExecutorInfo& executorInfo,
@@ -201,6 +205,16 @@ private:
       const SlaveID& slaveId,
       const process::PID<Slave>& slavePid,
       bool checkpoint,
+      const Option<ProvisionInfo>& provisionInfo);
+
+  process::Future<bool> __launch(
+      const ContainerID& containerId,
+      const ExecutorInfo& executorInfo,
+      const std::string& directory,
+      const Option<std::string>& user,
+      const SlaveID& slaveId,
+      const process::PID<Slave>& slavePid,
+      bool checkpoint,
       const std::list<Option<mesos::slave::ContainerPrepareInfo>>& scripts);
 
   process::Future<bool> isolate(
@@ -229,6 +243,13 @@ private:
       const process::Future<std::list<process::Future<Nothing>>>& cleanups,
       Option<std::string> message);
 
+  // Continues '____destroy()' once provisioner have completed destroy.
+  void _____destroy(
+      const ContainerID& containerId,
+      const process::Future<Option<int>>& status,
+      const process::Future<bool>& destroy,
+      Option<std::string> message);
+
   // Call back for when an isolator limits a container and impacts the
   // processes. This will trigger container destruction.
   void limited(

http://git-wip-us.apache.org/repos/asf/mesos/blob/d2f4b299/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp b/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
index b6456bc..39850ae 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
@@ -59,9 +59,7 @@ namespace mesos {
 namespace internal {
 namespace slave {
 
-Try<Isolator*> LinuxFilesystemIsolatorProcess::create(
-    const Flags& flags,
-    const Owned<Provisioner>& provisioner)
+Try<Isolator*> LinuxFilesystemIsolatorProcess::create(const Flags& flags)
 {
   Result<string> user = os::user();
   if (!user.isSome()) {
@@ -165,17 +163,15 @@ Try<Isolator*> LinuxFilesystemIsolatorProcess::create(
   }
 
   Owned<MesosIsolatorProcess> process(
-      new LinuxFilesystemIsolatorProcess(flags, provisioner));
+      new LinuxFilesystemIsolatorProcess(flags));
 
   return new MesosIsolator(process);
 }
 
 
 LinuxFilesystemIsolatorProcess::LinuxFilesystemIsolatorProcess(
-    const Flags& _flags,
-    const Owned<Provisioner>& _provisioner)
+    const Flags& _flags)
   : flags(_flags),
-    provisioner(_provisioner),
     metrics(PID<LinuxFilesystemIsolatorProcess>(this)) {}
 
 
@@ -255,18 +251,6 @@ Future<Nothing> LinuxFilesystemIsolatorProcess::recover(
   }
 
   return collect(futures)
-    .then(defer(PID<LinuxFilesystemIsolatorProcess>(this),
-                &LinuxFilesystemIsolatorProcess::_recover,
-                states,
-                orphans));
-}
-
-
-Future<Nothing> LinuxFilesystemIsolatorProcess::_recover(
-    const list<ContainerState>& states,
-    const hashset<ContainerID>& orphans)
-{
-  return provisioner->recover(states, orphans)
     .then([]() -> Future<Nothing> { return Nothing(); });
 }
 
@@ -289,91 +273,12 @@ Future<Option<ContainerPrepareInfo>> LinuxFilesystemIsolatorProcess::prepare(
 
   infos.put(containerId, Owned<Info>(new Info(directory)));
 
-  if (!executorInfo.has_container()) {
-    return __prepare(containerId, executorInfo, directory, user, None());
-  }
-
-  // Provision the root filesystem if needed.
-  CHECK_EQ(executorInfo.container().type(), ContainerInfo::MESOS);
-
-  if (!executorInfo.container().mesos().has_image()) {
-    return _prepare(containerId, executorInfo, directory, user, None());
-  }
-
-  const Image& image = executorInfo.container().mesos().image();
-
-  return provisioner->provision(containerId, image)
-    .then(defer(PID<LinuxFilesystemIsolatorProcess>(this),
-                &LinuxFilesystemIsolatorProcess::_prepare,
-                containerId,
-                executorInfo,
-                directory,
-                user,
-                lambda::_1));
-}
-
-
-Future<Option<ContainerPrepareInfo>> LinuxFilesystemIsolatorProcess::_prepare(
-    const ContainerID& containerId,
-    const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user,
-    const Option<ProvisionInfo>& provisionInfo)
-{
-  CHECK(executorInfo.has_container());
-  CHECK_EQ(executorInfo.container().type(), ContainerInfo::MESOS);
-
-  // We will provision the images specified in ContainerInfo::volumes
-  // as well. We will mutate ContainerInfo::volumes to include the
-  // paths to the provisioned root filesystems (by setting the
-  // 'host_path') if the volume specifies an image as the source.
-  Owned<ExecutorInfo> _executorInfo(new ExecutorInfo(executorInfo));
-  list<Future<Nothing>> futures;
-
-  for (int i = 0; i < _executorInfo->container().volumes_size(); i++) {
-    Volume* volume = _executorInfo->mutable_container()->mutable_volumes(i);
-
-    if (!volume->has_image()) {
-      continue;
-    }
-
-    const Image& image = volume->image();
-
-    futures.push_back(
-        provisioner->provision(containerId, image)
-          .then([volume](const ProvisionInfo& info) -> Future<Nothing> {
-            volume->set_host_path(info.rootfs);
-            return Nothing();
-          }));
-  }
-
-  return collect(futures)
-    .then([=]() -> Future<Option<ContainerPrepareInfo>> {
-      return __prepare(
-          containerId,
-          *_executorInfo,
-          directory,
-          user,
-          provisionInfo);
-    });
-}
-
-
-Future<Option<ContainerPrepareInfo>> LinuxFilesystemIsolatorProcess::__prepare(
-    const ContainerID& containerId,
-    const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user,
-    const Option<ProvisionInfo>& provisionInfo)
-{
-  CHECK(infos.contains(containerId));
-
   const Owned<Info>& info = infos[containerId];
 
   ContainerPrepareInfo prepareInfo;
   prepareInfo.set_namespaces(CLONE_NEWNS);
 
-  if (provisionInfo.isSome()) {
+  if (containerConfig.has_rootfs()) {
     // If the container changes its root filesystem, we need to mount
     // the container's work directory into its root filesystem
     // (creating it if needed) so that the executor and the task can
@@ -383,11 +288,10 @@ Future<Option<ContainerPrepareInfo>> LinuxFilesystemIsolatorProcess::__prepare(
     // the host filesystem so that any mounts underneath it will
     // propagate into the container's mount namespace. This is how we
     // can update persistent volumes for the container.
+    const string rootfs = containerConfig.rootfs();
 
     // This is the mount point of the work directory in the root filesystem.
-    const string sandbox = path::join(
-        provisionInfo.get().rootfs,
-        flags.sandbox_directory);
+    const string sandbox = path::join(rootfs, flags.sandbox_directory);
 
     // Save the path 'sandbox' which will be used in 'cleanup()'.
     info->sandbox = sandbox;
@@ -441,7 +345,7 @@ Future<Option<ContainerPrepareInfo>> LinuxFilesystemIsolatorProcess::__prepare(
           "' as a shared mount: " + mount.error());
     }
 
-    prepareInfo.set_rootfs(provisionInfo.get().rootfs);
+    prepareInfo.set_rootfs(rootfs);
   }
 
   // Prepare the commands that will be run in the container's mount
@@ -449,7 +353,7 @@ Future<Option<ContainerPrepareInfo>> LinuxFilesystemIsolatorProcess::__prepare(
   // commands to mount those volumes specified in the container info
   // so that they don't pollute the host mount namespace.
   Try<string> _script =
-    script(containerId, executorInfo, directory, provisionInfo);
+    script(containerId, executorInfo, containerConfig);
   if (_script.isError()) {
     return Failure("Failed to generate isolation script: " + _script.error());
   }
@@ -467,8 +371,7 @@ Future<Option<ContainerPrepareInfo>> LinuxFilesystemIsolatorProcess::__prepare(
 Try<string> LinuxFilesystemIsolatorProcess::script(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<ProvisionInfo>& provisionInfo)
+    const ContainerConfig& containerConfig)
 {
   ostringstream out;
   out << "#!/bin/sh\n";
@@ -537,7 +440,7 @@ Try<string> LinuxFilesystemIsolatorProcess::script(
       }
     } else {
       // Path is interpreted as relative to the work directory.
-      source = path::join(directory, volume.host_path());
+      source = path::join(containerConfig.directory(), volume.host_path());
 
       // TODO(jieyu): We need to check that source resolves under the
       // work directory because a user can potentially use a container
@@ -557,9 +460,9 @@ Try<string> LinuxFilesystemIsolatorProcess::script(
     string target;
 
     if (strings::startsWith(volume.container_path(), "/")) {
-      if (provisionInfo.isSome()) {
+      if (containerConfig.has_rootfs()) {
         target = path::join(
-            provisionInfo.get().rootfs,
+            containerConfig.rootfs(),
             volume.container_path());
       } else {
         target = volume.container_path();
@@ -576,12 +479,13 @@ Try<string> LinuxFilesystemIsolatorProcess::script(
       // 'rootfs' because a user can potentially use a container path
       // like '/../../abc'.
     } else {
-      if (provisionInfo.isSome()) {
-        target = path::join(provisionInfo.get().rootfs,
+      if (containerConfig.has_rootfs()) {
+        target = path::join(containerConfig.rootfs(),
                             flags.sandbox_directory,
                             volume.container_path());
       } else {
-        target = path::join(directory, volume.container_path());
+        target = path::join(containerConfig.directory(),
+                            volume.container_path());
       }
 
       // TODO(jieyu): We need to check that target resolves under the
@@ -871,9 +775,7 @@ Future<Nothing> LinuxFilesystemIsolatorProcess::cleanup(
     }
   }
 
-  // Destroy the provisioned root filesystems.
-  return provisioner->destroy(containerId)
-    .then([]() -> Future<Nothing> { return Nothing(); });
+  return Nothing();
 }
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/d2f4b299/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp b/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp
index 0748137..bdc9271 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp
@@ -31,8 +31,6 @@
 
 #include "slave/containerizer/mesos/isolator.hpp"
 
-#include "slave/containerizer/mesos/provisioner/provisioner.hpp"
-
 namespace mesos {
 namespace internal {
 namespace slave {
@@ -44,9 +42,7 @@ namespace slave {
 class LinuxFilesystemIsolatorProcess : public MesosIsolatorProcess
 {
 public:
-  static Try<mesos::slave::Isolator*> create(
-      const Flags& flags,
-      const process::Owned<Provisioner>& provisioner);
+  static Try<mesos::slave::Isolator*> create(const Flags& flags);
 
   virtual ~LinuxFilesystemIsolatorProcess();
 
@@ -77,36 +73,14 @@ public:
       const ContainerID& containerId);
 
 private:
-  LinuxFilesystemIsolatorProcess(
-      const Flags& flags,
-      const process::Owned<Provisioner>& provisioner);
-
-  process::Future<Nothing> _recover(
-      const std::list<mesos::slave::ContainerState>& states,
-      const hashset<ContainerID>& orphans);
-
-  process::Future<Option<mesos::slave::ContainerPrepareInfo>> _prepare(
-      const ContainerID& containerId,
-      const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user,
-      const Option<ProvisionInfo>& provisionInfo);
-
-  process::Future<Option<mesos::slave::ContainerPrepareInfo>> __prepare(
-      const ContainerID& containerId,
-      const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user,
-      const Option<ProvisionInfo>& provisionInfo);
+  LinuxFilesystemIsolatorProcess(const Flags& flags);
 
   Try<std::string> script(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<ProvisionInfo>& provisionInfo);
+      const mesos::slave::ContainerConfig& containerConfig);
 
   const Flags flags;
-  const process::Owned<Provisioner> provisioner;
 
   struct Info
   {

http://git-wip-us.apache.org/repos/asf/mesos/blob/d2f4b299/src/tests/containerizer/filesystem_isolator_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/filesystem_isolator_tests.cpp b/src/tests/containerizer/filesystem_isolator_tests.cpp
index 5c2240f..f0c5b51 100644
--- a/src/tests/containerizer/filesystem_isolator_tests.cpp
+++ b/src/tests/containerizer/filesystem_isolator_tests.cpp
@@ -154,8 +154,7 @@ protected:
 
     Owned<Provisioner> provisioner(new Provisioner(provisionerProcess));
 
-    Try<Isolator*> isolator =
-      LinuxFilesystemIsolatorProcess::create(flags, provisioner);
+    Try<Isolator*> isolator = LinuxFilesystemIsolatorProcess::create(flags);
 
     if (isolator.isError()) {
       return Error(
@@ -1005,8 +1004,7 @@ TEST_F(LinuxFilesystemIsolatorTest, ROOT_WorkDirMount)
 {
   slave::Flags flags = CreateSlaveFlags();
 
-  Try<Isolator*> isolator =
-    LinuxFilesystemIsolatorProcess::create(flags, Owned<Provisioner>());
+  Try<Isolator*> isolator = LinuxFilesystemIsolatorProcess::create(flags);
 
   ASSERT_SOME(isolator);
 
@@ -1041,8 +1039,7 @@ TEST_F(LinuxFilesystemIsolatorTest, ROOT_WorkDirMountPreExists)
       flags.work_dir.c_str(),
       flags.work_dir.c_str()));
 
-  Try<Isolator*> isolator =
-    LinuxFilesystemIsolatorProcess::create(flags, Owned<Provisioner>());
+  Try<Isolator*> isolator = LinuxFilesystemIsolatorProcess::create(flags);
 
   ASSERT_SOME(isolator);
 


[5/7] mesos git commit: Added Provisioner to MesosContainerizer.

Posted by ji...@apache.org.
Added Provisioner to MesosContainerizer.

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


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

Branch: refs/heads/master
Commit: d6a5e962ee40bd62aa2d3a97f50c019ccb50205a
Parents: 5558982
Author: Gilbert Song <so...@gmail.com>
Authored: Thu Jan 14 13:20:38 2016 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Jan 14 14:45:43 2016 -0800

----------------------------------------------------------------------
 src/slave/containerizer/mesos/containerizer.cpp |  6 ++---
 src/slave/containerizer/mesos/containerizer.hpp |  6 +++++
 .../containerizer/filesystem_isolator_tests.cpp |  1 +
 .../containerizer/mesos_containerizer_tests.cpp | 23 ++++++++++++++++++++
 4 files changed, 33 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/d6a5e962/src/slave/containerizer/mesos/containerizer.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.cpp b/src/slave/containerizer/mesos/containerizer.cpp
index ce02523..4070e6c 100644
--- a/src/slave/containerizer/mesos/containerizer.cpp
+++ b/src/slave/containerizer/mesos/containerizer.cpp
@@ -178,13 +178,10 @@ Try<MesosContainerizer*> MesosContainerizer::create(
     return Error("Failed to create launcher: " + launcher.error());
   }
 
-#ifdef __linux__
-  // The provisioner will be used by the 'filesystem/linux' isolator.
   Try<Owned<Provisioner>> provisioner = Provisioner::create(flags_);
   if (provisioner.isError()) {
     return Error("Failed to create provisioner: " + provisioner.error());
   }
-#endif
 
   // Create the isolators for the MesosContainerizer.
   const hashmap<string, lambda::function<Try<Isolator*>(const Flags&)>>
@@ -248,6 +245,7 @@ Try<MesosContainerizer*> MesosContainerizer::create(
       fetcher,
       Owned<ContainerLogger>(logger.get()),
       Owned<Launcher>(launcher.get()),
+      provisioner.get(),
       isolators);
 }
 
@@ -258,6 +256,7 @@ MesosContainerizer::MesosContainerizer(
     Fetcher* fetcher,
     const Owned<ContainerLogger>& logger,
     const Owned<Launcher>& launcher,
+    const Owned<Provisioner>& provisioner,
     const vector<Owned<Isolator>>& isolators)
   : process(new MesosContainerizerProcess(
       flags,
@@ -265,6 +264,7 @@ MesosContainerizer::MesosContainerizer(
       fetcher,
       logger,
       launcher,
+      provisioner,
       isolators))
 {
   spawn(process.get());

http://git-wip-us.apache.org/repos/asf/mesos/blob/d6a5e962/src/slave/containerizer/mesos/containerizer.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.hpp b/src/slave/containerizer/mesos/containerizer.hpp
index 89d1862..9afe9f7 100644
--- a/src/slave/containerizer/mesos/containerizer.hpp
+++ b/src/slave/containerizer/mesos/containerizer.hpp
@@ -34,6 +34,8 @@
 
 #include "slave/containerizer/mesos/launcher.hpp"
 
+#include "slave/containerizer/mesos/provisioner/provisioner.hpp"
+
 namespace mesos {
 namespace internal {
 namespace slave {
@@ -57,6 +59,7 @@ public:
       Fetcher* fetcher,
       const process::Owned<mesos::slave::ContainerLogger>& logger,
       const process::Owned<Launcher>& launcher,
+      const process::Owned<Provisioner>& provisioner,
       const std::vector<process::Owned<mesos::slave::Isolator>>& isolators);
 
   // Used for testing.
@@ -115,12 +118,14 @@ public:
       Fetcher* _fetcher,
       const process::Owned<mesos::slave::ContainerLogger>& _logger,
       const process::Owned<Launcher>& _launcher,
+      const process::Owned<Provisioner>& _provisioner,
       const std::vector<process::Owned<mesos::slave::Isolator>>& _isolators)
     : flags(_flags),
       local(_local),
       fetcher(_fetcher),
       logger(_logger),
       launcher(_launcher),
+      provisioner(_provisioner),
       isolators(_isolators) {}
 
   virtual ~MesosContainerizerProcess() {}
@@ -239,6 +244,7 @@ private:
   Fetcher* fetcher;
   process::Owned<mesos::slave::ContainerLogger> logger;
   const process::Owned<Launcher> launcher;
+  const process::Owned<Provisioner> provisioner;
   const std::vector<process::Owned<mesos::slave::Isolator>> isolators;
 
   enum State

http://git-wip-us.apache.org/repos/asf/mesos/blob/d6a5e962/src/tests/containerizer/filesystem_isolator_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/filesystem_isolator_tests.cpp b/src/tests/containerizer/filesystem_isolator_tests.cpp
index 5bb8503..5c2240f 100644
--- a/src/tests/containerizer/filesystem_isolator_tests.cpp
+++ b/src/tests/containerizer/filesystem_isolator_tests.cpp
@@ -184,6 +184,7 @@ protected:
             &fetcher,
             Owned<ContainerLogger>(logger.get()),
             Owned<Launcher>(launcher.get()),
+            provisioner,
             {Owned<Isolator>(isolator.get())}));
   }
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/d6a5e962/src/tests/containerizer/mesos_containerizer_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/mesos_containerizer_tests.cpp b/src/tests/containerizer/mesos_containerizer_tests.cpp
index 95b493c..bd243f5 100644
--- a/src/tests/containerizer/mesos_containerizer_tests.cpp
+++ b/src/tests/containerizer/mesos_containerizer_tests.cpp
@@ -39,6 +39,8 @@
 #include "slave/containerizer/mesos/containerizer.hpp"
 #include "slave/containerizer/mesos/launcher.hpp"
 
+#include "slave/containerizer/mesos/provisioner/provisioner.hpp"
+
 #include "tests/flags.hpp"
 #include "tests/mesos.hpp"
 #include "tests/utils.hpp"
@@ -55,6 +57,7 @@ using mesos::internal::slave::Launcher;
 using mesos::internal::slave::MesosContainerizer;
 using mesos::internal::slave::MesosContainerizerProcess;
 using mesos::internal::slave::PosixLauncher;
+using mesos::internal::slave::Provisioner;
 using mesos::internal::slave::Slave;
 
 using mesos::internal::slave::state::ExecutorState;
@@ -119,12 +122,18 @@ public:
       return Error("Failed to create container logger: " + logger.error());
     }
 
+    Try<Owned<Provisioner>> provisioner = Provisioner::create(flags);
+    if (provisioner.isError()) {
+      return Error("Failed to create provisioner: " + provisioner.error());
+    }
+
     return new MesosContainerizer(
         flags,
         false,
         fetcher,
         Owned<ContainerLogger>(logger.get()),
         Owned<Launcher>(launcher.get()),
+        provisioner.get(),
         isolators);
   }
 
@@ -456,6 +465,7 @@ public:
       Fetcher* fetcher,
       const Owned<ContainerLogger>& logger,
       const Owned<Launcher>& launcher,
+      const Owned<Provisioner>& provisioner,
       const vector<Owned<Isolator>>& isolators)
     : MesosContainerizerProcess(
           flags,
@@ -463,6 +473,7 @@ public:
           fetcher,
           logger,
           launcher,
+          provisioner,
           isolators)
   {
     // NOTE: See TestContainerizer::setup for why we use
@@ -570,12 +581,16 @@ TEST_F(MesosContainerizerDestroyTest, DestroyWhileFetching)
 
   ASSERT_SOME(logger);
 
+  Try<Owned<Provisioner>> provisioner = Provisioner::create(flags);
+  ASSERT_SOME(provisioner);
+
   MockMesosContainerizerProcess* process = new MockMesosContainerizerProcess(
       flags,
       true,
       &fetcher,
       Owned<ContainerLogger>(logger.get()),
       Owned<Launcher>(launcher.get()),
+      provisioner.get(),
       vector<Owned<Isolator>>());
 
   Future<Nothing> exec;
@@ -642,12 +657,16 @@ TEST_F(MesosContainerizerDestroyTest, DestroyWhilePreparing)
 
   ASSERT_SOME(logger);
 
+  Try<Owned<Provisioner>> provisioner = Provisioner::create(flags);
+  ASSERT_SOME(provisioner);
+
   MockMesosContainerizerProcess* process = new MockMesosContainerizerProcess(
       flags,
       true,
       &fetcher,
       Owned<ContainerLogger>(logger.get()),
       Owned<Launcher>(launcher.get()),
+      provisioner.get(),
       {Owned<Isolator>(isolator)});
 
   MesosContainerizer containerizer((Owned<MesosContainerizerProcess>(process)));
@@ -724,12 +743,16 @@ TEST_F(MesosContainerizerDestroyTest, LauncherDestroyFailure)
 
   ASSERT_SOME(logger);
 
+  Try<Owned<Provisioner>> provisioner = Provisioner::create(flags);
+  ASSERT_SOME(provisioner);
+
   MesosContainerizerProcess* process = new MesosContainerizerProcess(
       flags,
       true,
       &fetcher,
       Owned<ContainerLogger>(logger.get()),
       Owned<Launcher>(launcher),
+      provisioner.get(),
       vector<Owned<Isolator>>());
 
   MesosContainerizer containerizer((Owned<MesosContainerizerProcess>(process)));


[6/7] mesos git commit: Used ContainerConfig in all built-in isolators.

Posted by ji...@apache.org.
Used ContainerConfig in all built-in isolators.

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


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

Branch: refs/heads/master
Commit: b1c481d8d32802bdeba23d08c5a04f47c57bbc4e
Parents: 2d4a895
Author: Gilbert Song <so...@gmail.com>
Authored: Thu Jan 14 13:22:01 2016 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Jan 14 14:45:43 2016 -0800

----------------------------------------------------------------------
 src/slave/containerizer/mesos/containerizer.cpp          |  2 +-
 src/slave/containerizer/mesos/isolator.cpp               |  1 +
 .../containerizer/mesos/isolators/cgroups/cpushare.cpp   |  8 ++++----
 .../containerizer/mesos/isolators/cgroups/cpushare.hpp   |  3 +--
 src/slave/containerizer/mesos/isolators/cgroups/mem.cpp  |  8 ++++----
 src/slave/containerizer/mesos/isolators/cgroups/mem.hpp  |  3 +--
 .../containerizer/mesos/isolators/cgroups/perf_event.cpp |  8 ++++----
 .../containerizer/mesos/isolators/cgroups/perf_event.hpp |  3 +--
 .../containerizer/mesos/isolators/filesystem/linux.cpp   | 11 +++++++++--
 .../containerizer/mesos/isolators/filesystem/linux.hpp   |  3 +--
 .../containerizer/mesos/isolators/filesystem/posix.cpp   |  6 +++---
 .../containerizer/mesos/isolators/filesystem/posix.hpp   |  3 +--
 .../containerizer/mesos/isolators/filesystem/shared.cpp  |  8 ++++----
 .../containerizer/mesos/isolators/filesystem/shared.hpp  |  3 +--
 .../containerizer/mesos/isolators/namespaces/pid.cpp     |  4 ++--
 .../containerizer/mesos/isolators/namespaces/pid.hpp     |  3 +--
 .../mesos/isolators/network/port_mapping.cpp             |  4 ++--
 .../mesos/isolators/network/port_mapping.hpp             |  3 +--
 src/slave/containerizer/mesos/isolators/posix.hpp        |  3 +--
 src/slave/containerizer/mesos/isolators/posix/disk.cpp   |  6 +++---
 src/slave/containerizer/mesos/isolators/posix/disk.hpp   |  3 +--
 21 files changed, 47 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/containerizer.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.cpp b/src/slave/containerizer/mesos/containerizer.cpp
index c2215fd..478699b 100644
--- a/src/slave/containerizer/mesos/containerizer.cpp
+++ b/src/slave/containerizer/mesos/containerizer.cpp
@@ -688,7 +688,7 @@ static Future<list<Option<ContainerPrepareInfo>>> _prepare(
     const list<Option<ContainerPrepareInfo>> prepareInfos)
 {
   // Propagate any failure.
-  return isolator->prepare(containerId, executorInfo, directory, user)
+  return isolator->prepare(containerId, executorInfo, containerConfig)
     .then(lambda::bind(&accumulate, prepareInfos, lambda::_1));
 }
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolator.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolator.cpp b/src/slave/containerizer/mesos/isolator.cpp
index 9f70115..e49ecfa 100644
--- a/src/slave/containerizer/mesos/isolator.cpp
+++ b/src/slave/containerizer/mesos/isolator.cpp
@@ -23,6 +23,7 @@ using namespace process;
 using std::string;
 using std::list;
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerLimitation;
 using mesos::slave::ContainerPrepareInfo;
 using mesos::slave::ContainerState;

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/cgroups/cpushare.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/cgroups/cpushare.cpp b/src/slave/containerizer/mesos/isolators/cgroups/cpushare.cpp
index 3b95e19..f37a3ef 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups/cpushare.cpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups/cpushare.cpp
@@ -45,6 +45,7 @@ using std::set;
 using std::string;
 using std::vector;
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerLimitation;
 using mesos::slave::ContainerPrepareInfo;
 using mesos::slave::ContainerState;
@@ -246,8 +247,7 @@ Future<Nothing> CgroupsCpushareIsolatorProcess::recover(
 Future<Option<ContainerPrepareInfo>> CgroupsCpushareIsolatorProcess::prepare(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user)
+    const ContainerConfig& containerConfig)
 {
   if (infos.contains(containerId)) {
     return Failure("Container has already been prepared");
@@ -278,9 +278,9 @@ Future<Option<ContainerPrepareInfo>> CgroupsCpushareIsolatorProcess::prepare(
     // Chown the cgroup so the executor can create nested cgroups. Do
     // not recurse so the control files are still owned by the slave
     // user and thus cannot be changed by the executor.
-    if (user.isSome()) {
+    if (containerConfig.has_user()) {
       Try<Nothing> chown = os::chown(
-          user.get(),
+          containerConfig.user(),
           path::join(hierarchies[subsystem], info->cgroup),
           false);
       if (chown.isError()) {

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/cgroups/cpushare.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/cgroups/cpushare.hpp b/src/slave/containerizer/mesos/isolators/cgroups/cpushare.hpp
index 123b9ed..d8310e6 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups/cpushare.hpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups/cpushare.hpp
@@ -55,8 +55,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user);
+      const mesos::slave::ContainerConfig& containerConfig);
 
   virtual process::Future<Nothing> isolate(
       const ContainerID& containerId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/cgroups/mem.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/cgroups/mem.cpp b/src/slave/containerizer/mesos/isolators/cgroups/mem.cpp
index 2ddb9f4..b4a53fe 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups/mem.cpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups/mem.cpp
@@ -53,6 +53,7 @@ using std::set;
 using std::string;
 using std::vector;
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerLimitation;
 using mesos::slave::ContainerPrepareInfo;
 using mesos::slave::ContainerState;
@@ -233,8 +234,7 @@ Future<Nothing> CgroupsMemIsolatorProcess::recover(
 Future<Option<ContainerPrepareInfo>> CgroupsMemIsolatorProcess::prepare(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user)
+    const ContainerConfig& containerConfig)
 {
   if (infos.contains(containerId)) {
     return Failure("Container has already been prepared");
@@ -266,9 +266,9 @@ Future<Option<ContainerPrepareInfo>> CgroupsMemIsolatorProcess::prepare(
   // Chown the cgroup so the executor can create nested cgroups. Do
   // not recurse so the control files are still owned by the slave
   // user and thus cannot be changed by the executor.
-  if (user.isSome()) {
+  if (containerConfig.has_user()) {
     Try<Nothing> chown = os::chown(
-        user.get(),
+        containerConfig.user(),
         path::join(hierarchy, info->cgroup),
         false);
     if (chown.isError()) {

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/cgroups/mem.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/cgroups/mem.hpp b/src/slave/containerizer/mesos/isolators/cgroups/mem.hpp
index 0995236..e17bb83 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups/mem.hpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups/mem.hpp
@@ -50,8 +50,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user);
+      const mesos::slave::ContainerConfig& containerConfig);
 
   virtual process::Future<Nothing> isolate(
       const ContainerID& containerId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/cgroups/perf_event.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/cgroups/perf_event.cpp b/src/slave/containerizer/mesos/isolators/cgroups/perf_event.cpp
index 4d82c2b..ed6697c 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups/perf_event.cpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups/perf_event.cpp
@@ -45,6 +45,7 @@
 
 #include "slave/containerizer/mesos/isolators/cgroups/perf_event.hpp"
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerLimitation;
 using mesos::slave::ContainerPrepareInfo;
 using mesos::slave::ContainerState;
@@ -208,8 +209,7 @@ Future<Nothing> CgroupsPerfEventIsolatorProcess::recover(
 Future<Option<ContainerPrepareInfo>> CgroupsPerfEventIsolatorProcess::prepare(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user)
+    const ContainerConfig& containerConfig)
 {
   if (infos.contains(containerId)) {
     return Failure("Container has already been prepared");
@@ -244,9 +244,9 @@ Future<Option<ContainerPrepareInfo>> CgroupsPerfEventIsolatorProcess::prepare(
   // Chown the cgroup so the executor can create nested cgroups. Do
   // not recurse so the control files are still owned by the slave
   // user and thus cannot be changed by the executor.
-  if (user.isSome()) {
+  if (containerConfig.has_user()) {
     Try<Nothing> chown = os::chown(
-        user.get(),
+        containerConfig.user(),
         path::join(hierarchy, info->cgroup),
         false);
     if (chown.isError()) {

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/cgroups/perf_event.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/cgroups/perf_event.hpp b/src/slave/containerizer/mesos/isolators/cgroups/perf_event.hpp
index 5eaf49f..9e084d8 100644
--- a/src/slave/containerizer/mesos/isolators/cgroups/perf_event.hpp
+++ b/src/slave/containerizer/mesos/isolators/cgroups/perf_event.hpp
@@ -46,8 +46,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user);
+      const mesos::slave::ContainerConfig& containerConfig);
 
   virtual process::Future<Nothing> isolate(
       const ContainerID& containerId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp b/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
index 8af2cec..b6456bc 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/linux.cpp
@@ -49,6 +49,7 @@ using std::list;
 using std::ostringstream;
 using std::string;
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerState;
 using mesos::slave::ContainerLimitation;
 using mesos::slave::ContainerPrepareInfo;
@@ -273,9 +274,15 @@ Future<Nothing> LinuxFilesystemIsolatorProcess::_recover(
 Future<Option<ContainerPrepareInfo>> LinuxFilesystemIsolatorProcess::prepare(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user)
+    const ContainerConfig& containerConfig)
 {
+  const string& directory = containerConfig.directory();
+
+  Option<string> user;
+  if (containerConfig.has_user()) {
+    user = containerConfig.user();
+  }
+
   if (infos.contains(containerId)) {
     return Failure("Container has already been prepared");
   }

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp b/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp
index a29f9d1..0748137 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/linux.hpp
@@ -57,8 +57,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user);
+      const mesos::slave::ContainerConfig& containerConfig);
 
   virtual process::Future<Nothing> isolate(
       const ContainerID& containerId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/filesystem/posix.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/posix.cpp b/src/slave/containerizer/mesos/isolators/filesystem/posix.cpp
index 4d6100e..6d14135 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/posix.cpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/posix.cpp
@@ -30,6 +30,7 @@ using namespace process;
 using std::list;
 using std::string;
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerLimitation;
 using mesos::slave::ContainerPrepareInfo;
 using mesos::slave::ContainerState;
@@ -71,8 +72,7 @@ Future<Nothing> PosixFilesystemIsolatorProcess::recover(
 Future<Option<ContainerPrepareInfo>> PosixFilesystemIsolatorProcess::prepare(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user)
+    const ContainerConfig& containerConfig)
 {
   if (infos.contains(containerId)) {
     return Failure("Container has already been prepared");
@@ -92,7 +92,7 @@ Future<Option<ContainerPrepareInfo>> PosixFilesystemIsolatorProcess::prepare(
     }
   }
 
-  infos.put(containerId, Owned<Info>(new Info(directory)));
+  infos.put(containerId, Owned<Info>(new Info(containerConfig.directory())));
 
   return update(containerId, executorInfo.resources())
       .then([]() -> Future<Option<ContainerPrepareInfo>> { return None(); });

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/filesystem/posix.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/posix.hpp b/src/slave/containerizer/mesos/isolators/filesystem/posix.hpp
index c3544aa..19b0287 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/posix.hpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/posix.hpp
@@ -41,8 +41,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user);
+      const mesos::slave::ContainerConfig& containerConfig);
 
   virtual process::Future<Nothing> isolate(
       const ContainerID& containerId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/filesystem/shared.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/shared.cpp b/src/slave/containerizer/mesos/isolators/filesystem/shared.cpp
index 361ed65..e052da0 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/shared.cpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/shared.cpp
@@ -28,6 +28,7 @@ using std::list;
 using std::set;
 using std::string;
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerLimitation;
 using mesos::slave::ContainerPrepareInfo;
 using mesos::slave::ContainerState;
@@ -77,8 +78,7 @@ Future<Nothing> SharedFilesystemIsolatorProcess::recover(
 Future<Option<ContainerPrepareInfo>> SharedFilesystemIsolatorProcess::prepare(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user)
+    const ContainerConfig& containerConfig)
 {
   if (executorInfo.has_container() &&
       executorInfo.container().type() != ContainerInfo::MESOS) {
@@ -99,7 +99,7 @@ Future<Option<ContainerPrepareInfo>> SharedFilesystemIsolatorProcess::prepare(
   // to another container path as this can mask entries. We'll keep
   // track of all container paths so we can check this.
   set<string> containerPaths;
-  containerPaths.insert(directory);
+  containerPaths.insert(containerConfig.directory());
 
   ContainerPrepareInfo prepareInfo;
   prepareInfo.set_namespaces(CLONE_NEWNS);
@@ -149,7 +149,7 @@ Future<Option<ContainerPrepareInfo>> SharedFilesystemIsolatorProcess::prepare(
     // directory, otherwise check it already exists.
     string hostPath;
     if (!strings::startsWith(volume.host_path(), "/")) {
-      hostPath = path::join(directory, volume.host_path());
+      hostPath = path::join(containerConfig.directory(), volume.host_path());
 
       // Do not support any relative components in the resulting path.
       // There should not be any links in the work directory to

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/filesystem/shared.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/filesystem/shared.hpp b/src/slave/containerizer/mesos/isolators/filesystem/shared.hpp
index 2e45701..186b5d1 100644
--- a/src/slave/containerizer/mesos/isolators/filesystem/shared.hpp
+++ b/src/slave/containerizer/mesos/isolators/filesystem/shared.hpp
@@ -44,8 +44,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user);
+      const mesos::slave::ContainerConfig& containerConfig);
 
   virtual process::Future<Nothing> isolate(
       const ContainerID& containerId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/namespaces/pid.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/namespaces/pid.cpp b/src/slave/containerizer/mesos/isolators/namespaces/pid.cpp
index d65c159..36b9dd8 100644
--- a/src/slave/containerizer/mesos/isolators/namespaces/pid.cpp
+++ b/src/slave/containerizer/mesos/isolators/namespaces/pid.cpp
@@ -37,6 +37,7 @@ using std::list;
 using std::set;
 using std::string;
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerLimitation;
 using mesos::slave::ContainerPrepareInfo;
 using mesos::slave::ContainerState;
@@ -154,8 +155,7 @@ Future<Nothing> NamespacesPidIsolatorProcess::recover(
 Future<Option<ContainerPrepareInfo>> NamespacesPidIsolatorProcess::prepare(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user)
+    const ContainerConfig& containerConfig)
 {
   ContainerPrepareInfo prepareInfo;
   prepareInfo.set_namespaces(CLONE_NEWPID | CLONE_NEWNS);

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/namespaces/pid.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/namespaces/pid.hpp b/src/slave/containerizer/mesos/isolators/namespaces/pid.hpp
index c2d1455..6d61155 100644
--- a/src/slave/containerizer/mesos/isolators/namespaces/pid.hpp
+++ b/src/slave/containerizer/mesos/isolators/namespaces/pid.hpp
@@ -61,8 +61,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user);
+      const mesos::slave::ContainerConfig& containerConfig);
 
   virtual process::Future<Nothing> isolate(
       const ContainerID& containerId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp b/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp
index 22a8428..efc87e0 100644
--- a/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp
+++ b/src/slave/containerizer/mesos/isolators/network/port_mapping.cpp
@@ -104,6 +104,7 @@ using std::vector;
 
 using filter::ip::PortRange;
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerLimitation;
 using mesos::slave::ContainerPrepareInfo;
 using mesos::slave::ContainerState;
@@ -2109,8 +2110,7 @@ PortMappingIsolatorProcess::_recover(pid_t pid)
 Future<Option<ContainerPrepareInfo>> PortMappingIsolatorProcess::prepare(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user)
+    const ContainerConfig& containerConfig)
 {
   if (unmanaged.contains(containerId)) {
     return Failure("Asked to prepare an unmanaged container");

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/network/port_mapping.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/network/port_mapping.hpp b/src/slave/containerizer/mesos/isolators/network/port_mapping.hpp
index e3766c3..b4097b5 100644
--- a/src/slave/containerizer/mesos/isolators/network/port_mapping.hpp
+++ b/src/slave/containerizer/mesos/isolators/network/port_mapping.hpp
@@ -157,8 +157,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user);
+      const mesos::slave::ContainerConfig& containerConfig);
 
   virtual process::Future<Nothing> isolate(
       const ContainerID& containerId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/posix.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/posix.hpp b/src/slave/containerizer/mesos/isolators/posix.hpp
index 7e1ebc2..3d628aa 100644
--- a/src/slave/containerizer/mesos/isolators/posix.hpp
+++ b/src/slave/containerizer/mesos/isolators/posix.hpp
@@ -64,8 +64,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user)
+      const mesos::slave::ContainerConfig& containerConfig)
   {
     if (promises.contains(containerId)) {
       return process::Failure("Container " + stringify(containerId) +

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/posix/disk.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/posix/disk.cpp b/src/slave/containerizer/mesos/isolators/posix/disk.cpp
index 248c34a..075a4ec 100644
--- a/src/slave/containerizer/mesos/isolators/posix/disk.cpp
+++ b/src/slave/containerizer/mesos/isolators/posix/disk.cpp
@@ -54,6 +54,7 @@ using std::list;
 using std::string;
 using std::vector;
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerLimitation;
 using mesos::slave::ContainerPrepareInfo;
 using mesos::slave::ContainerState;
@@ -105,14 +106,13 @@ Future<Nothing> PosixDiskIsolatorProcess::recover(
 Future<Option<ContainerPrepareInfo>> PosixDiskIsolatorProcess::prepare(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user)
+    const ContainerConfig& containerConfig)
 {
   if (infos.contains(containerId)) {
     return Failure("Container has already been prepared");
   }
 
-  infos.put(containerId, Owned<Info>(new Info(directory)));
+  infos.put(containerId, Owned<Info>(new Info(containerConfig.directory())));
 
   return None();
 }

http://git-wip-us.apache.org/repos/asf/mesos/blob/b1c481d8/src/slave/containerizer/mesos/isolators/posix/disk.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolators/posix/disk.hpp b/src/slave/containerizer/mesos/isolators/posix/disk.hpp
index 31808c1..cbb4f39 100644
--- a/src/slave/containerizer/mesos/isolators/posix/disk.hpp
+++ b/src/slave/containerizer/mesos/isolators/posix/disk.hpp
@@ -83,8 +83,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user);
+      const mesos::slave::ContainerConfig& containerConfig);
 
   virtual process::Future<Nothing> isolate(
       const ContainerID& containerId,


[7/7] mesos git commit: Populated ContainerConfig in MesosContainerizer.

Posted by ji...@apache.org.
Populated ContainerConfig in MesosContainerizer.

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


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

Branch: refs/heads/master
Commit: 4f1d08c821e8c04f51280622504477e86ff2dfa8
Parents: d6a5e96
Author: Gilbert Song <so...@gmail.com>
Authored: Thu Jan 14 13:20:54 2016 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Jan 14 14:45:43 2016 -0800

----------------------------------------------------------------------
 src/slave/containerizer/mesos/containerizer.cpp | 56 +++++++++++++++++---
 src/slave/containerizer/mesos/containerizer.hpp |  7 ++-
 2 files changed, 56 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/4f1d08c8/src/slave/containerizer/mesos/containerizer.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.cpp b/src/slave/containerizer/mesos/containerizer.cpp
index 4070e6c..c2215fd 100644
--- a/src/slave/containerizer/mesos/containerizer.cpp
+++ b/src/slave/containerizer/mesos/containerizer.cpp
@@ -90,6 +90,7 @@ namespace slave {
 
 using mesos::modules::ModuleManager;
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerLimitation;
 using mesos::slave::ContainerLogger;
 using mesos::slave::ContainerPrepareInfo;
@@ -624,7 +625,14 @@ Future<bool> MesosContainerizerProcess::launch(
 
   containers_.put(containerId, Owned<Container>(container));
 
-  return prepare(containerId, executorInfo, directory, user)
+  return provision(containerId, executorInfo)
+    .then(defer(self(),
+                &Self::prepare,
+                containerId,
+                executorInfo,
+                directory,
+                user,
+                lambda::_1))
     .then(defer(self(),
                 &Self::_launch,
                 containerId,
@@ -638,6 +646,31 @@ Future<bool> MesosContainerizerProcess::launch(
 }
 
 
+Future<Option<ProvisionInfo>> MesosContainerizerProcess::provision(
+    const ContainerID& containerId,
+    const ExecutorInfo& executorInfo)
+{
+  if (!executorInfo.has_container()) {
+    return None();
+  }
+
+  // Provision the root filesystem if needed.
+  CHECK_EQ(executorInfo.container().type(), ContainerInfo::MESOS);
+
+  if (!executorInfo.container().mesos().has_image()) {
+    return None();
+  }
+
+  const Image& image = executorInfo.container().mesos().image();
+
+  return provisioner->provision(containerId, image)
+    .then([](const ProvisionInfo& provisionInfo)
+        -> Future<Option<ProvisionInfo>> {
+      return provisionInfo;
+    });
+}
+
+
 static list<Option<ContainerPrepareInfo>> accumulate(
     list<Option<ContainerPrepareInfo>> l,
     const Option<ContainerPrepareInfo>& e)
@@ -651,8 +684,7 @@ static Future<list<Option<ContainerPrepareInfo>>> _prepare(
     const Owned<Isolator>& isolator,
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user,
+    const ContainerConfig& containerConfig,
     const list<Option<ContainerPrepareInfo>> prepareInfos)
 {
   // Propagate any failure.
@@ -665,10 +697,23 @@ Future<list<Option<ContainerPrepareInfo>>> MesosContainerizerProcess::prepare(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
     const string& directory,
-    const Option<string>& user)
+    const Option<string>& user,
+    const Option<ProvisionInfo>& provisionInfo)
 {
   CHECK(containers_.contains(containerId));
 
+  // Construct ContainerConfig.
+  ContainerConfig containerConfig;
+  containerConfig.set_directory(directory);
+
+  if (user.isSome()) {
+    containerConfig.set_user(user.get());
+  }
+
+  if (provisionInfo.isSome()) {
+    containerConfig.set_rootfs(provisionInfo.get().rootfs);
+  }
+
   // We prepare the isolators sequentially according to their ordering
   // to permit basic dependency specification, e.g., preparing a
   // filesystem isolator before other isolators.
@@ -681,8 +726,7 @@ Future<list<Option<ContainerPrepareInfo>>> MesosContainerizerProcess::prepare(
                             isolator,
                             containerId,
                             executorInfo,
-                            directory,
-                            user,
+                            containerConfig,
                             lambda::_1));
   }
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/4f1d08c8/src/slave/containerizer/mesos/containerizer.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.hpp b/src/slave/containerizer/mesos/containerizer.hpp
index 9afe9f7..48bdd4f 100644
--- a/src/slave/containerizer/mesos/containerizer.hpp
+++ b/src/slave/containerizer/mesos/containerizer.hpp
@@ -175,11 +175,16 @@ private:
       const std::list<mesos::slave::ContainerState>& recovered,
       const hashset<ContainerID>& orphans);
 
+  process::Future<Option<ProvisionInfo>> provision(
+      const ContainerID& containerId,
+      const ExecutorInfo& executorInfo);
+
   process::Future<std::list<Option<mesos::slave::ContainerPrepareInfo>>>
     prepare(const ContainerID& containerId,
             const ExecutorInfo& executorInfo,
             const std::string& directory,
-            const Option<std::string>& user);
+            const Option<std::string>& user,
+            const Option<ProvisionInfo>& provisionInfo);
 
   process::Future<Nothing> fetch(
       const ContainerID& containerId,


[3/7] mesos git commit: Cleaned up unnecessary parameter in provisioner constructor.

Posted by ji...@apache.org.
Cleaned up unnecessary parameter in provisioner constructor.

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


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

Branch: refs/heads/master
Commit: 5558982cead26fd2dd5de7f3dcebf092036e2784
Parents: 4208a53
Author: Gilbert Song <so...@gmail.com>
Authored: Thu Jan 14 13:20:31 2016 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Jan 14 14:45:43 2016 -0800

----------------------------------------------------------------------
 src/slave/containerizer/mesos/containerizer.cpp           | 2 +-
 src/slave/containerizer/mesos/provisioner/provisioner.cpp | 4 +---
 src/slave/containerizer/mesos/provisioner/provisioner.hpp | 4 +---
 src/tests/containerizer/provisioner_appc_tests.cpp        | 6 +++---
 4 files changed, 6 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/5558982c/src/slave/containerizer/mesos/containerizer.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/containerizer.cpp b/src/slave/containerizer/mesos/containerizer.cpp
index f3c370a..ce02523 100644
--- a/src/slave/containerizer/mesos/containerizer.cpp
+++ b/src/slave/containerizer/mesos/containerizer.cpp
@@ -180,7 +180,7 @@ Try<MesosContainerizer*> MesosContainerizer::create(
 
 #ifdef __linux__
   // The provisioner will be used by the 'filesystem/linux' isolator.
-  Try<Owned<Provisioner>> provisioner = Provisioner::create(flags_, fetcher);
+  Try<Owned<Provisioner>> provisioner = Provisioner::create(flags_);
   if (provisioner.isError()) {
     return Error("Failed to create provisioner: " + provisioner.error());
   }

http://git-wip-us.apache.org/repos/asf/mesos/blob/5558982c/src/slave/containerizer/mesos/provisioner/provisioner.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/provisioner/provisioner.cpp b/src/slave/containerizer/mesos/provisioner/provisioner.cpp
index 89d06e9..023f736 100644
--- a/src/slave/containerizer/mesos/provisioner/provisioner.cpp
+++ b/src/slave/containerizer/mesos/provisioner/provisioner.cpp
@@ -47,9 +47,7 @@ namespace mesos {
 namespace internal {
 namespace slave {
 
-Try<Owned<Provisioner>> Provisioner::create(
-    const Flags& flags,
-    Fetcher* fetcher)
+Try<Owned<Provisioner>> Provisioner::create(const Flags& flags)
 {
   string _rootDir = slave::paths::getProvisionerDir(flags.work_dir);
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/5558982c/src/slave/containerizer/mesos/provisioner/provisioner.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/provisioner/provisioner.hpp b/src/slave/containerizer/mesos/provisioner/provisioner.hpp
index b2e23d8..4202f55 100644
--- a/src/slave/containerizer/mesos/provisioner/provisioner.hpp
+++ b/src/slave/containerizer/mesos/provisioner/provisioner.hpp
@@ -61,9 +61,7 @@ class Provisioner
 {
 public:
   // Create the provisioner based on the specified flags.
-  static Try<process::Owned<Provisioner>> create(
-      const Flags& flags,
-      Fetcher* fetcher);
+  static Try<process::Owned<Provisioner>> create(const Flags& flags);
 
   // Available only for testing.
   explicit Provisioner(process::Owned<ProvisionerProcess> process);

http://git-wip-us.apache.org/repos/asf/mesos/blob/5558982c/src/tests/containerizer/provisioner_appc_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/provisioner_appc_tests.cpp b/src/tests/containerizer/provisioner_appc_tests.cpp
index 98d5a46..e3d08d9 100644
--- a/src/tests/containerizer/provisioner_appc_tests.cpp
+++ b/src/tests/containerizer/provisioner_appc_tests.cpp
@@ -214,7 +214,7 @@ TEST_F(ProvisionerAppcTest, ROOT_Provision)
 
   Fetcher fetcher;
 
-  Try<Owned<Provisioner>> provisioner = Provisioner::create(flags, &fetcher);
+  Try<Owned<Provisioner>> provisioner = Provisioner::create(flags);
   ASSERT_SOME(provisioner);
 
   // Create a simple image in the store:
@@ -325,7 +325,7 @@ TEST_F(ProvisionerAppcTest, Recover)
   flags.work_dir = "work_dir";
 
   Fetcher fetcher;
-  Try<Owned<Provisioner>> provisioner1 = Provisioner::create(flags, &fetcher);
+  Try<Owned<Provisioner>> provisioner1 = Provisioner::create(flags);
   ASSERT_SOME(provisioner1);
 
   // Create a simple image in the store:
@@ -371,7 +371,7 @@ TEST_F(ProvisionerAppcTest, Recover)
   AWAIT_READY(provisionInfo);
 
   // Create a new provisioner to recover the state from the container.
-  Try<Owned<Provisioner>> provisioner2 = Provisioner::create(flags, &fetcher);
+  Try<Owned<Provisioner>> provisioner2 = Provisioner::create(flags);
   ASSERT_SOME(provisioner2);
 
   mesos::slave::ContainerState state;


[4/7] mesos git commit: Created ContainerConfig protobuf for MesosContainerizer.

Posted by ji...@apache.org.
Created ContainerConfig protobuf for MesosContainerizer.

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


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

Branch: refs/heads/master
Commit: 4208a531827b14152f7516d1add7872d17c96511
Parents: 5a5af21
Author: Gilbert Song <so...@gmail.com>
Authored: Thu Jan 14 13:19:54 2016 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Jan 14 14:45:43 2016 -0800

----------------------------------------------------------------------
 include/mesos/slave/isolator.proto | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/4208a531/include/mesos/slave/isolator.proto
----------------------------------------------------------------------
diff --git a/include/mesos/slave/isolator.proto b/include/mesos/slave/isolator.proto
index d2032ad..f4f93ca 100644
--- a/include/mesos/slave/isolator.proto
+++ b/include/mesos/slave/isolator.proto
@@ -14,9 +14,11 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+package mesos.slave;
+
 import "mesos/mesos.proto";
 
-package mesos.slave;
+import "mesos/docker/v1.proto";
 
 
 /**
@@ -62,6 +64,31 @@ message ContainerState
 
 
 /**
+ * The container configuration that will be passed to each isolator
+ * during `prepare`.
+ */
+message ContainerConfig {
+  // The root filesystem for the container.
+  optional string rootfs = 1;
+
+  // The work directory for the container in the host filesystem.
+  required string directory = 2;
+
+  // The user the task will be run as.
+  optional string user = 3;
+
+  // Docker v1 image manifest.
+  message Docker {
+    optional docker.spec.v1.ImageManifest manifest = 1;
+  }
+
+  optional Docker docker = 4;
+
+  // TODO(gilbert): Add appc image manifest.
+}
+
+
+/**
  * Protobuf returned by Isolator::prepare(). The command is executed
  * by the Launcher in the containerized context.
  * Note: Currently, any URIs or Environment in the CommandInfo will be


[2/7] mesos git commit: Changed the isolator interface to use ContainerConfig.

Posted by ji...@apache.org.
Changed the isolator interface to use ContainerConfig.

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


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

Branch: refs/heads/master
Commit: 2d4a895c5990a6f4a9b78375a27c1ec2260103b8
Parents: 4f1d08c
Author: Gilbert Song <so...@gmail.com>
Authored: Thu Jan 14 13:21:24 2016 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Jan 14 14:45:43 2016 -0800

----------------------------------------------------------------------
 include/mesos/slave/isolator.hpp                |  3 +-
 src/slave/containerizer/mesos/isolator.cpp      |  6 +-
 src/slave/containerizer/mesos/isolator.hpp      |  6 +-
 src/tests/containerizer/isolator.hpp            |  3 +-
 src/tests/containerizer/isolator_tests.cpp      | 68 +++++++++++++-------
 .../containerizer/mesos_containerizer_tests.cpp | 13 ++--
 6 files changed, 58 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/2d4a895c/include/mesos/slave/isolator.hpp
----------------------------------------------------------------------
diff --git a/include/mesos/slave/isolator.hpp b/include/mesos/slave/isolator.hpp
index 95a2933..9c46a85 100644
--- a/include/mesos/slave/isolator.hpp
+++ b/include/mesos/slave/isolator.hpp
@@ -58,8 +58,7 @@ public:
   virtual process::Future<Option<ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user) = 0;
+      const ContainerConfig& containerConfig) = 0;
 
   // Isolate the executor.
   virtual process::Future<Nothing> isolate(

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d4a895c/src/slave/containerizer/mesos/isolator.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolator.cpp b/src/slave/containerizer/mesos/isolator.cpp
index 493b5dd..9f70115 100644
--- a/src/slave/containerizer/mesos/isolator.cpp
+++ b/src/slave/containerizer/mesos/isolator.cpp
@@ -59,15 +59,13 @@ Future<Nothing> MesosIsolator::recover(
 Future<Option<ContainerPrepareInfo>> MesosIsolator::prepare(
     const ContainerID& containerId,
     const ExecutorInfo& executorInfo,
-    const string& directory,
-    const Option<string>& user)
+    const ContainerConfig& containerConfig)
 {
   return dispatch(process.get(),
                   &MesosIsolatorProcess::prepare,
                   containerId,
                   executorInfo,
-                  directory,
-                  user);
+                  containerConfig);
 }
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d4a895c/src/slave/containerizer/mesos/isolator.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/isolator.hpp b/src/slave/containerizer/mesos/isolator.hpp
index 937f253..6192b04 100644
--- a/src/slave/containerizer/mesos/isolator.hpp
+++ b/src/slave/containerizer/mesos/isolator.hpp
@@ -48,8 +48,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user);
+      const mesos::slave::ContainerConfig& containerConfig);
 
   virtual process::Future<Nothing> isolate(
       const ContainerID& containerId,
@@ -85,8 +84,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user) = 0;
+      const mesos::slave::ContainerConfig& containerConfig) = 0;
 
   virtual process::Future<Nothing> isolate(
       const ContainerID& containerId,

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d4a895c/src/tests/containerizer/isolator.hpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/isolator.hpp b/src/tests/containerizer/isolator.hpp
index e4101b1..8764846 100644
--- a/src/tests/containerizer/isolator.hpp
+++ b/src/tests/containerizer/isolator.hpp
@@ -46,8 +46,7 @@ public:
   virtual process::Future<Option<mesos::slave::ContainerPrepareInfo>> prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const std::string& directory,
-      const Option<std::string>& user)
+      const mesos::slave::ContainerConfig& containerConfig)
   {
     return prepareInfo;
   }

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d4a895c/src/tests/containerizer/isolator_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/isolator_tests.cpp b/src/tests/containerizer/isolator_tests.cpp
index 91178b6..9f67a2a 100644
--- a/src/tests/containerizer/isolator_tests.cpp
+++ b/src/tests/containerizer/isolator_tests.cpp
@@ -90,6 +90,7 @@ using mesos::internal::slave::PosixCpuIsolatorProcess;
 using mesos::internal::slave::PosixMemIsolatorProcess;
 using mesos::internal::slave::Slave;
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerPrepareInfo;
 using mesos::slave::Isolator;
 
@@ -160,11 +161,13 @@ TYPED_TEST(CpuIsolatorTest, UserCpuUsage)
   Try<string> dir = os::mkdtemp(path::join(os::getcwd(), "XXXXXX"));
   ASSERT_SOME(dir);
 
+  ContainerConfig containerConfig;
+  containerConfig.set_directory(dir.get());
+
   AWAIT_READY(isolator.get()->prepare(
       containerId,
       executorInfo,
-      dir.get(),
-      None()));
+      containerConfig));
 
   const string& file = path::join(dir.get(), "mesos_isolator_test_ready");
 
@@ -270,11 +273,13 @@ TYPED_TEST(CpuIsolatorTest, SystemCpuUsage)
   Try<string> dir = os::mkdtemp(path::join(os::getcwd(), "XXXXXX"));
   ASSERT_SOME(dir);
 
+  ContainerConfig containerConfig;
+  containerConfig.set_directory(dir.get());
+
   AWAIT_READY(isolator.get()->prepare(
       containerId,
       executorInfo,
-      dir.get(),
-      None()));
+      containerConfig));
 
   const string& file = path::join(dir.get(), "mesos_isolator_test_ready");
 
@@ -382,11 +387,13 @@ TEST_F(RevocableCpuIsolatorTest, ROOT_CGROUPS_RevocableCpu)
   ContainerID containerId;
   containerId.set_value(UUID::random().toString());
 
+  ContainerConfig containerConfig;
+  containerConfig.set_directory(os::getcwd());
+
   AWAIT_READY(isolator.get()->prepare(
         containerId,
         executorInfo,
-        os::getcwd(),
-        None()));
+        containerConfig));
 
   vector<string> argv{"sleep", "100"};
 
@@ -462,12 +469,14 @@ TEST_F(LimitedCpuIsolatorTest, ROOT_CGROUPS_CFS_Enable_Cfs)
   Try<string> dir = os::mkdtemp(path::join(os::getcwd(), "XXXXXX"));
   ASSERT_SOME(dir);
 
+  ContainerConfig containerConfig;
+  containerConfig.set_directory(dir.get());
+
   Future<Option<ContainerPrepareInfo>> prepare =
     isolator.get()->prepare(
         containerId,
         executorInfo,
-        dir.get(),
-        None());
+        containerConfig);
 
   AWAIT_READY(prepare);
 
@@ -576,12 +585,14 @@ TEST_F(LimitedCpuIsolatorTest, ROOT_CGROUPS_CFS_Big_Quota)
   Try<string> dir = os::mkdtemp(path::join(os::getcwd(), "XXXXXX"));
   ASSERT_SOME(dir);
 
+  ContainerConfig containerConfig;
+  containerConfig.set_directory(dir.get());
+
   Future<Option<ContainerPrepareInfo>> prepare =
     isolator.get()->prepare(
         containerId,
         executorInfo,
-        dir.get(),
-        None());
+        containerConfig);
 
   AWAIT_READY(prepare);
 
@@ -662,12 +673,14 @@ TEST_F(LimitedCpuIsolatorTest, ROOT_CGROUPS_Pids_and_Tids)
   Try<string> dir = os::mkdtemp(path::join(os::getcwd(), "XXXXXX"));
   ASSERT_SOME(dir);
 
+  ContainerConfig containerConfig;
+  containerConfig.set_directory(dir.get());
+
   Future<Option<ContainerPrepareInfo>> prepare =
     isolator.get()->prepare(
         containerId,
         executorInfo,
-        dir.get(),
-        None());
+        containerConfig);
 
   AWAIT_READY(prepare);
 
@@ -787,11 +800,13 @@ TYPED_TEST(MemIsolatorTest, MemUsage)
   Try<string> dir = os::mkdtemp(path::join(os::getcwd(), "XXXXXX"));
   ASSERT_SOME(dir);
 
+  ContainerConfig containerConfig;
+  containerConfig.set_directory(dir.get());
+
   AWAIT_READY(isolator.get()->prepare(
       containerId,
       executorInfo,
-      dir.get(),
-      None()));
+      containerConfig));
 
   MemoryTestHelper helper;
   ASSERT_SOME(helper.spawn());
@@ -849,11 +864,13 @@ TEST_F(PerfEventIsolatorTest, ROOT_CGROUPS_Sample)
   Try<string> dir = os::mkdtemp(path::join(os::getcwd(), "XXXXXX"));
   ASSERT_SOME(dir);
 
+  ContainerConfig containerConfig;
+  containerConfig.set_directory(dir.get());
+
   AWAIT_READY(isolator.get()->prepare(
       containerId,
       executorInfo,
-      dir.get(),
-      None()));
+      containerConfig));
 
   // This first sample is likely to be empty because perf hasn't
   // completed yet but we should still have the required fields.
@@ -944,12 +961,14 @@ TEST_F(SharedFilesystemIsolatorTest, DISABLED_ROOT_RelativeVolume)
   ContainerID containerId;
   containerId.set_value(UUID::random().toString());
 
+  ContainerConfig containerConfig;
+  containerConfig.set_directory(flags.work_dir);
+
   Future<Option<ContainerPrepareInfo> > prepare =
     isolator.get()->prepare(
         containerId,
         executorInfo,
-        flags.work_dir,
-        None());
+        containerConfig);
 
   AWAIT_READY(prepare);
   ASSERT_SOME(prepare.get());
@@ -1049,12 +1068,14 @@ TEST_F(SharedFilesystemIsolatorTest, DISABLED_ROOT_AbsoluteVolume)
   ContainerID containerId;
   containerId.set_value(UUID::random().toString());
 
+  ContainerConfig containerConfig;
+  containerConfig.set_directory(flags.work_dir);
+
   Future<Option<ContainerPrepareInfo> > prepare =
     isolator.get()->prepare(
         containerId,
         executorInfo,
-        flags.work_dir,
-        None());
+        containerConfig);
 
   AWAIT_READY(prepare);
   ASSERT_SOME(prepare.get());
@@ -1225,11 +1246,14 @@ TYPED_TEST(UserCgroupIsolatorTest, ROOT_CGROUPS_UserCgroup)
   ContainerID containerId;
   containerId.set_value(UUID::random().toString());
 
+  ContainerConfig containerConfig;
+  containerConfig.set_directory(os::getcwd());
+  containerConfig.set_user(UNPRIVILEGED_USERNAME);
+
   AWAIT_READY(isolator.get()->prepare(
       containerId,
       executorInfo,
-      os::getcwd(),
-      UNPRIVILEGED_USERNAME));
+      containerConfig));
 
   // Isolators don't provide a way to determine the cgroups they use
   // so we'll inspect the cgroups for an isolated dummy process.

http://git-wip-us.apache.org/repos/asf/mesos/blob/2d4a895c/src/tests/containerizer/mesos_containerizer_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/mesos_containerizer_tests.cpp b/src/tests/containerizer/mesos_containerizer_tests.cpp
index bd243f5..00ae739 100644
--- a/src/tests/containerizer/mesos_containerizer_tests.cpp
+++ b/src/tests/containerizer/mesos_containerizer_tests.cpp
@@ -65,6 +65,7 @@ using mesos::internal::slave::state::FrameworkState;
 using mesos::internal::slave::state::RunState;
 using mesos::internal::slave::state::SlaveState;
 
+using mesos::slave::ContainerConfig;
 using mesos::slave::ContainerLimitation;
 using mesos::slave::ContainerLogger;
 using mesos::slave::ContainerPrepareInfo;
@@ -514,7 +515,7 @@ public:
     EXPECT_CALL(*this, cleanup(_))
       .WillRepeatedly(Return(Nothing()));
 
-    EXPECT_CALL(*this, prepare(_, _, _, _))
+    EXPECT_CALL(*this, prepare(_, _, _))
       .WillRepeatedly(Invoke(this, &MockIsolator::_prepare));
   }
 
@@ -524,19 +525,17 @@ public:
           const list<ContainerState>&,
           const hashset<ContainerID>&));
 
-  MOCK_METHOD4(
+  MOCK_METHOD3(
       prepare,
       Future<Option<ContainerPrepareInfo>>(
           const ContainerID&,
           const ExecutorInfo&,
-          const string&,
-          const Option<string>&));
+          const ContainerConfig&));
 
   virtual Future<Option<ContainerPrepareInfo>> _prepare(
       const ContainerID& containerId,
       const ExecutorInfo& executorInfo,
-      const string& directory,
-      const Option<string>& user)
+      const ContainerConfig& containerConfig)
   {
     return None();
   }
@@ -646,7 +645,7 @@ TEST_F(MesosContainerizerDestroyTest, DestroyWhilePreparing)
   Promise<Option<ContainerPrepareInfo>> promise;
 
   // Simulate a long prepare from the isolator.
-  EXPECT_CALL(*isolator, prepare(_, _, _, _))
+  EXPECT_CALL(*isolator, prepare(_, _, _))
     .WillOnce(DoAll(FutureSatisfy(&prepare),
                     Return(promise.future())));