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