Repository: mesos
Updated Branches:
  refs/heads/master 4085b8607 -> 79ac35626


Updated the fetcher subprocess to pass in the environment explicitly.

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


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

Branch: refs/heads/master
Commit: 79ac3562681707da9cfff26793d0cee8c404a2aa
Parents: 4085b86
Author: Dominic Hamon <dha...@twopensource.com>
Authored: Tue Apr 8 14:37:08 2014 -0700
Committer: Benjamin Mahler <bmah...@twitter.com>
Committed: Tue Apr 8 14:37:08 2014 -0700

----------------------------------------------------------------------
 src/slave/containerizer/mesos_containerizer.cpp |  28 +++--
 src/tests/containerizer_tests.cpp               | 105 ++++++++++---------
 2 files changed, 67 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/79ac3562/src/slave/containerizer/mesos_containerizer.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos_containerizer.cpp 
b/src/slave/containerizer/mesos_containerizer.cpp
index c819c97..1ce41d7 100644
--- a/src/slave/containerizer/mesos_containerizer.cpp
+++ b/src/slave/containerizer/mesos_containerizer.cpp
@@ -53,8 +53,8 @@ using state::RunState;
 Future<Nothing> _nothing() { return Nothing(); }
 
 
-// Helper method to build the command sent to the fetcher.
-std::string buildCommand(
+// Helper method to build the environment map used to launch fetcher.
+map<string, string> fetcherEnvironment(
     const CommandInfo& commandInfo,
     const std::string& directory,
     const Option<std::string>& user,
@@ -70,23 +70,20 @@ std::string buildCommand(
   // Remove extra space at the end.
   uris = strings::trim(uris);
 
-  // Use /usr/bin/env to set the environment variables for the fetcher
-  // subprocess because we cannot pollute the slave's environment.
-  // TODO(idownes): Remove this once Subprocess accepts environment variables.
-  string command = "/usr/bin/env";
-  command += " MESOS_EXECUTOR_URIS=\"" + uris + "\"";
-  command += " MESOS_WORK_DIRECTORY=" + directory;
+  map<string, string> environment;
+  environment["MESOS_EXECUTOR_URIS"] = uris;
+  environment["MESOS_WORK_DIRECTORY"] = directory;
   if (user.isSome()) {
-    command += " MESOS_USER=" + user.get();
+    environment["MESOS_USER"] = user.get();
   }
   if (!flags.frameworks_home.empty()) {
-    command += " MESOS_FRAMEWORKS_HOME=" + flags.frameworks_home;
+    environment["MESOS_FRAMEWORKS_HOME"] = flags.frameworks_home;
   }
   if (!flags.hadoop_home.empty()) {
-    command += " HADOOP_HOME=" + flags.hadoop_home;
+    environment["HADOOP_HOME"] = flags.hadoop_home;
   }
 
-  return command;
+  return environment;
 }
 
 
@@ -501,15 +498,16 @@ Future<Nothing> MesosContainerizerProcess::fetch(
     return Failure("Could not fetch URIs: failed to find mesos-fetcher");
   }
 
-  string command = buildCommand(commandInfo, directory, user, flags);
+  map<string, string> environment =
+    fetcherEnvironment(commandInfo, directory, user, flags);
 
   // Now the actual mesos-fetcher command.
-  command += " " + realpath.get();
+  string command = realpath.get();
 
   LOG(INFO) << "Fetching URIs for container '" << containerId
             << "' using command '" << command << "'";
 
-  Try<Subprocess> fetcher = subprocess(command);
+  Try<Subprocess> fetcher = subprocess(command, environment);
   if (fetcher.isError()) {
     return Failure("Failed to execute mesos-fetcher: " + fetcher.error());
   }

http://git-wip-us.apache.org/repos/asf/mesos/blob/79ac3562/src/tests/containerizer_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer_tests.cpp 
b/src/tests/containerizer_tests.cpp
index b539070..6c48146 100644
--- a/src/tests/containerizer_tests.cpp
+++ b/src/tests/containerizer_tests.cpp
@@ -16,6 +16,7 @@
  * limitations under the License.
  */
 
+#include <map>
 #include <string>
 #include <vector>
 
@@ -23,13 +24,15 @@
 
 #include <mesos/mesos.hpp>
 
-#include <slave/containerizer/mesos_containerizer.hpp>
-#include <slave/flags.hpp>
+#include "slave/flags.hpp"
+
+#include "slave/containerizer/mesos_containerizer.hpp"
 
 using namespace mesos;
 using namespace mesos::internal;
 using namespace mesos::internal::slave;
 
+using std::map;
 using std::string;
 using std::vector;
 
@@ -38,7 +41,7 @@ namespace internal {
 namespace slave {
 
 // Forward declaration.
-string buildCommand(
+map<string, string> fetcherEnvironment(
     const CommandInfo& commandInfo,
     const string& directory,
     const Option<string>& user,
@@ -51,7 +54,8 @@ string buildCommand(
 class MesosContainerizerProcessTest : public ::testing::Test {};
 
 
-TEST_F(MesosContainerizerProcessTest, Simple) {
+TEST_F(MesosContainerizerProcessTest, Simple)
+{
   CommandInfo commandInfo;
   CommandInfo::URI uri;
   uri.set_value("hdfs:///uri");
@@ -65,20 +69,19 @@ TEST_F(MesosContainerizerProcessTest, Simple) {
   flags.frameworks_home = "/tmp/frameworks";
   flags.hadoop_home = "/tmp/hadoop";
 
-  string command = buildCommand(commandInfo, directory, user, flags);
-
-  EXPECT_STREQ(
-      "/usr/bin/env "
-      "MESOS_EXECUTOR_URIS=\"hdfs:///uri+0\" "
-      "MESOS_WORK_DIRECTORY=/tmp/directory "
-      "MESOS_USER=user "
-      "MESOS_FRAMEWORKS_HOME=/tmp/frameworks "
-      "HADOOP_HOME=/tmp/hadoop",
-      command.c_str());
+  map<string, string> environment =
+    fetcherEnvironment(commandInfo, directory, user, flags);
+  EXPECT_EQ(5u, environment.size());
+  EXPECT_EQ("hdfs:///uri+0", environment["MESOS_EXECUTOR_URIS"]);
+  EXPECT_EQ(directory, environment["MESOS_WORK_DIRECTORY"]);
+  EXPECT_EQ(user.get(), environment["MESOS_USER"]);
+  EXPECT_EQ(flags.frameworks_home, environment["MESOS_FRAMEWORKS_HOME"]);
+  EXPECT_EQ(flags.hadoop_home, environment["HADOOP_HOME"]);
 }
 
 
-TEST_F(MesosContainerizerProcessTest, MultipleURIs) {
+TEST_F(MesosContainerizerProcessTest, MultipleURIs)
+{
   CommandInfo commandInfo;
   CommandInfo::URI uri;
   uri.set_value("hdfs:///uri1");
@@ -95,20 +98,21 @@ TEST_F(MesosContainerizerProcessTest, MultipleURIs) {
   flags.frameworks_home = "/tmp/frameworks";
   flags.hadoop_home = "/tmp/hadoop";
 
-  string command = buildCommand(commandInfo, directory, user, flags);
+  map<string, string> environment =
+    fetcherEnvironment(commandInfo, directory, user, flags);
 
-  EXPECT_STREQ(
-      "/usr/bin/env "
-      "MESOS_EXECUTOR_URIS=\"hdfs:///uri1+0 hdfs:///uri2+1\" "
-      "MESOS_WORK_DIRECTORY=/tmp/directory "
-      "MESOS_USER=user "
-      "MESOS_FRAMEWORKS_HOME=/tmp/frameworks "
-      "HADOOP_HOME=/tmp/hadoop",
-      command.c_str());
+  EXPECT_EQ(5u, environment.size());
+  EXPECT_EQ(
+      "hdfs:///uri1+0 hdfs:///uri2+1", environment["MESOS_EXECUTOR_URIS"]);
+  EXPECT_EQ(directory, environment["MESOS_WORK_DIRECTORY"]);
+  EXPECT_EQ(user.get(), environment["MESOS_USER"]);
+  EXPECT_EQ(flags.frameworks_home, environment["MESOS_FRAMEWORKS_HOME"]);
+  EXPECT_EQ(flags.hadoop_home, environment["HADOOP_HOME"]);
 }
 
 
-TEST_F(MesosContainerizerProcessTest, NoUser) {
+TEST_F(MesosContainerizerProcessTest, NoUser)
+{
   CommandInfo commandInfo;
   CommandInfo::URI uri;
   uri.set_value("hdfs:///uri");
@@ -121,19 +125,19 @@ TEST_F(MesosContainerizerProcessTest, NoUser) {
   flags.frameworks_home = "/tmp/frameworks";
   flags.hadoop_home = "/tmp/hadoop";
 
-  string command = buildCommand(commandInfo, directory, None(), flags);
+  map<string, string> environment =
+    fetcherEnvironment(commandInfo, directory, None(), flags);
 
-  EXPECT_STREQ(
-      "/usr/bin/env "
-      "MESOS_EXECUTOR_URIS=\"hdfs:///uri+0\" "
-      "MESOS_WORK_DIRECTORY=/tmp/directory "
-      "MESOS_FRAMEWORKS_HOME=/tmp/frameworks "
-      "HADOOP_HOME=/tmp/hadoop",
-      command.c_str());
+  EXPECT_EQ(4u, environment.size());
+  EXPECT_EQ("hdfs:///uri+0", environment["MESOS_EXECUTOR_URIS"]);
+  EXPECT_EQ(directory, environment["MESOS_WORK_DIRECTORY"]);
+  EXPECT_EQ(flags.frameworks_home, environment["MESOS_FRAMEWORKS_HOME"]);
+  EXPECT_EQ(flags.hadoop_home, environment["HADOOP_HOME"]);
 }
 
 
-TEST_F(MesosContainerizerProcessTest, EmptyHadoop) {
+TEST_F(MesosContainerizerProcessTest, EmptyHadoop)
+{
   CommandInfo commandInfo;
   CommandInfo::URI uri;
   uri.set_value("hdfs:///uri");
@@ -147,19 +151,19 @@ TEST_F(MesosContainerizerProcessTest, EmptyHadoop) {
   flags.frameworks_home = "/tmp/frameworks";
   flags.hadoop_home = "";
 
-  string command = buildCommand(commandInfo, directory, user, flags);
+  map<string, string> environment =
+    fetcherEnvironment(commandInfo, directory, user, flags);
 
-  EXPECT_STREQ(
-      "/usr/bin/env "
-      "MESOS_EXECUTOR_URIS=\"hdfs:///uri+0\" "
-      "MESOS_WORK_DIRECTORY=/tmp/directory "
-      "MESOS_USER=user "
-      "MESOS_FRAMEWORKS_HOME=/tmp/frameworks",
-      command.c_str());
+  EXPECT_EQ(4u, environment.size());
+  EXPECT_EQ("hdfs:///uri+0", environment["MESOS_EXECUTOR_URIS"]);
+  EXPECT_EQ(directory, environment["MESOS_WORK_DIRECTORY"]);
+  EXPECT_EQ(user.get(), environment["MESOS_USER"]);
+  EXPECT_EQ(flags.frameworks_home, environment["MESOS_FRAMEWORKS_HOME"]);
 }
 
 
-TEST_F(MesosContainerizerProcessTest, NoHadoop) {
+TEST_F(MesosContainerizerProcessTest, NoHadoop)
+{
   CommandInfo commandInfo;
   CommandInfo::URI uri;
   uri.set_value("hdfs:///uri");
@@ -172,13 +176,12 @@ TEST_F(MesosContainerizerProcessTest, NoHadoop) {
   Flags flags;
   flags.frameworks_home = "/tmp/frameworks";
 
-  string command = buildCommand(commandInfo, directory, user, flags);
+  map<string, string> environment =
+    fetcherEnvironment(commandInfo, directory, user, flags);
 
-  EXPECT_STREQ(
-      "/usr/bin/env "
-      "MESOS_EXECUTOR_URIS=\"hdfs:///uri+0\" "
-      "MESOS_WORK_DIRECTORY=/tmp/directory "
-      "MESOS_USER=user "
-      "MESOS_FRAMEWORKS_HOME=/tmp/frameworks",
-      command.c_str());
+  EXPECT_EQ(4u, environment.size());
+  EXPECT_EQ("hdfs:///uri+0", environment["MESOS_EXECUTOR_URIS"]);
+  EXPECT_EQ(directory, environment["MESOS_WORK_DIRECTORY"]);
+  EXPECT_EQ(user.get(), environment["MESOS_USER"]);
+  EXPECT_EQ(flags.frameworks_home, environment["MESOS_FRAMEWORKS_HOME"]);
 }

Reply via email to