Modified `TestContainerizer` to handle HTTP based executors. This change modifies the `TestContainerizer` class to handle HTTP based executors. Previously, the containerizer test class only used to handle the driver interface.
Review: https://reviews.apache.org/r/41290/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/37bb5ebc Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/37bb5ebc Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/37bb5ebc Branch: refs/heads/master Commit: 37bb5ebc7c181b35afd24a2cf55df68f63916fb5 Parents: 97d3527 Author: Anand Mazumdar <[email protected]> Authored: Tue Feb 9 11:17:37 2016 -0800 Committer: Vinod Kone <[email protected]> Committed: Tue Feb 9 11:17:37 2016 -0800 ---------------------------------------------------------------------- src/tests/containerizer.cpp | 43 ++++++++++++++++++++++++++++++++-------- src/tests/containerizer.hpp | 11 ++++++++++ 2 files changed, 46 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/37bb5ebc/src/tests/containerizer.cpp ---------------------------------------------------------------------- diff --git a/src/tests/containerizer.cpp b/src/tests/containerizer.cpp index 15c8b19..c6772ce 100644 --- a/src/tests/containerizer.cpp +++ b/src/tests/containerizer.cpp @@ -23,6 +23,7 @@ #include "tests/mesos.hpp" using std::map; +using std::shared_ptr; using std::string; using testing::_; @@ -31,12 +32,23 @@ using testing::Return; using namespace process; +using mesos::v1::executor::Mesos; + namespace mesos { namespace internal { namespace tests { TestContainerizer::TestContainerizer( + const ExecutorID& executorId, + const shared_ptr<MockV1HTTPExecutor>& executor) +{ + v1Executors[executorId] = executor; + setup(); +} + + +TestContainerizer::TestContainerizer( const hashmap<ExecutorID, Executor*>& _executors) : executors(_executors) { @@ -90,7 +102,8 @@ Future<bool> TestContainerizer::_launch( << "' of framework " << executorInfo.framework_id() << " because it is already launched"; - CHECK(executors.contains(executorInfo.executor_id())) + CHECK(executors.contains(executorInfo.executor_id()) || + v1Executors.contains(executorInfo.executor_id())) << "Failed to launch executor '" << executorInfo.executor_id() << "' of framework " << executorInfo.framework_id() << " because it is unknown to the containerizer"; @@ -101,8 +114,6 @@ Future<bool> TestContainerizer::_launch( executorInfo.executor_id()); containers_[key] = containerId; - Executor* executor = executors[executorInfo.executor_id()]; - // We need to synchronize all reads and writes to the environment as this is // global state. // TODO(jmlvanre): Even this is not sufficient, as other aspects of the code @@ -115,9 +126,6 @@ Future<bool> TestContainerizer::_launch( // Since the constructor for `MesosExecutorDriver` reads environment // variables to load flags, even it needs to be within this synchronization // section. - Owned<MesosExecutorDriver> driver(new MesosExecutorDriver(executor)); - drivers[containerId] = driver; - // Prepare additional environment variables for the executor. // TODO(benh): Need to get flags passed into the TestContainerizer // in order to properly use here. @@ -145,13 +153,28 @@ Future<bool> TestContainerizer::_launch( // code where we do this as well and it's likely we can do this once // in 'executorEnvironment()'. foreach (const Environment::Variable& variable, - executorInfo.command().environment().variables()) { + executorInfo.command().environment().variables()) { os::setenv(variable.name(), variable.value()); } os::setenv("MESOS_LOCAL", "1"); - driver->start(); + if (executors.contains(executorInfo.executor_id())) { + Executor* executor = executors[executorInfo.executor_id()]; + + Owned<MesosExecutorDriver> driver(new MesosExecutorDriver(executor)); + drivers[containerId] = driver; + + driver->start(); + } else { + shared_ptr<MockV1HTTPExecutor> executor = + v1Executors[executorInfo.executor_id()]; + + Owned<executor::TestV1Mesos> mesos( + new executor::TestV1Mesos(ContentType::PROTOBUF, executor)); + + v1Libraries[containerId] = mesos; + } os::unsetenv("MESOS_LOCAL"); @@ -234,6 +257,10 @@ void TestContainerizer::destroy(const ContainerID& containerId) drivers.erase(containerId); } + if (v1Libraries.contains(containerId)) { + v1Libraries.erase(containerId); + } + if (promises.contains(containerId)) { containerizer::Termination termination; termination.set_message("Killed executor"); http://git-wip-us.apache.org/repos/asf/mesos/blob/37bb5ebc/src/tests/containerizer.hpp ---------------------------------------------------------------------- diff --git a/src/tests/containerizer.hpp b/src/tests/containerizer.hpp index bd9ee2c..67fbe7f 100644 --- a/src/tests/containerizer.hpp +++ b/src/tests/containerizer.hpp @@ -20,6 +20,7 @@ #include <unistd.h> #include <map> +#include <memory> #include <string> #include <mesos/executor.hpp> @@ -27,6 +28,8 @@ #include <mesos/resources.hpp> #include <mesos/type_utils.hpp> +#include <mesos/v1/executor.hpp> + #include <process/dispatch.hpp> #include <process/future.hpp> #include <process/gmock.hpp> @@ -42,6 +45,8 @@ #include "slave/slave.hpp" #include "slave/state.hpp" +#include "tests/mesos.hpp" + namespace mesos { namespace internal { namespace tests { @@ -52,6 +57,10 @@ class MockExecutor; class TestContainerizer : public slave::Containerizer { public: + TestContainerizer( + const ExecutorID& executorId, + const std::shared_ptr<MockV1HTTPExecutor>& executor); + TestContainerizer(const hashmap<ExecutorID, Executor*>& executors); TestContainerizer(const ExecutorID& executorId, Executor* executor); @@ -124,9 +133,11 @@ private: const ContainerID& containerId); hashmap<ExecutorID, Executor*> executors; + hashmap<ExecutorID, std::shared_ptr<MockV1HTTPExecutor>> v1Executors; hashmap<std::pair<FrameworkID, ExecutorID>, ContainerID> containers_; hashmap<ContainerID, process::Owned<MesosExecutorDriver> > drivers; + hashmap<ContainerID, process::Owned<executor::TestV1Mesos> > v1Libraries; hashmap<ContainerID, process::Owned<process::Promise<containerizer::Termination> > > promises; };
