You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by tn...@apache.org on 2015/12/21 10:43:11 UTC

[1/2] mesos git commit: Added parsing `Env` specified in docker image returned from docker pull.

Repository: mesos
Updated Branches:
  refs/heads/master c4419735a -> 3c95c9b9c


Added parsing `Env` specified in docker image returned from docker pull.

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


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

Branch: refs/heads/master
Commit: b0e7cb1483fa3b7efa46bd82a89ed4dabfc5263a
Parents: c441973
Author: Gilbert Song <so...@gmail.com>
Authored: Sun Dec 20 23:57:47 2015 -0800
Committer: Timothy Chen <tn...@apache.org>
Committed: Sun Dec 20 23:58:11 2015 -0800

----------------------------------------------------------------------
 src/docker/docker.cpp | 74 +++++++++++++++++++++++++++++++++++++---------
 src/docker/docker.hpp |  9 ++++--
 2 files changed, 67 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/b0e7cb14/src/docker/docker.cpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
index 5dc4667..56fff4a 100755
--- a/src/docker/docker.cpp
+++ b/src/docker/docker.cpp
@@ -331,29 +331,75 @@ Try<Docker::Image> Docker::Image::create(const JSON::Object& json)
     return Error("Unable to find 'ContainerConfig.Entrypoint'");
   }
 
-  if (entrypoint.get().is<JSON::Null>()) {
-    return Docker::Image(None());
-  }
+  Option<vector<string>> entrypointOption = None();
+
+  if (!entrypoint.get().is<JSON::Null>()) {
+    if (!entrypoint.get().is<JSON::Array>()) {
+      return Error("Unexpected type found for 'ContainerConfig.Entrypoint'");
+    }
 
-  if (!entrypoint.get().is<JSON::Array>()) {
-    return Error("Unexpected type found for 'ContainerConfig.Entrypoint'");
+    const vector<JSON::Value>& values =
+        entrypoint.get().as<JSON::Array>().values;
+    if (values.size() != 0) {
+      vector<string> result;
+
+      foreach (const JSON::Value& value, values) {
+        if (!value.is<JSON::String>()) {
+          return Error("Expecting entrypoint value to be type string");
+        }
+        result.push_back(value.as<JSON::String>().value);
+      }
+
+      entrypointOption = result;
+    }
   }
 
-  const vector<JSON::Value>& values = entrypoint.get().as<JSON::Array>().values;
-  if (values.size() == 0) {
-    return Docker::Image(None());
+  Result<JSON::Value> env =
+    json.find<JSON::Value>("ContainerConfig.Env");
+
+  if (env.isError()) {
+    return Error("Failed to find 'ContainerConfig.Env': " +
+                 env.error());
+  } else if (env.isNone()) {
+    return Error("Unable to find 'ContainerConfig.Env'");
   }
 
-  vector<string> result;
+  Option<map<string, string>> envOption = None();
+
+  if (!env.get().is<JSON::Null>()) {
+    if (!env.get().is<JSON::Array>()) {
+      return Error("Unexpected type found for 'ContainerConfig.Env'");
+    }
+
+    const vector<JSON::Value>& values = env.get().as<JSON::Array>().values;
+    if (values.size() != 0) {
+      map<string, string> result;
+
+      foreach (const JSON::Value& value, values) {
+        if (!value.is<JSON::String>()) {
+          return Error("Expecting environment value to be type string");
+        }
+
+        const std::vector<std::string> tokens =
+            strings::tokenize(value.as<JSON::String>().value, "=");
+
+        if (tokens.size() != 2) {
+          return Error("Unexpected Env format for 'ContainerConfig.Env'");
+        }
+
+        if (result.count(tokens[0])) {
+          return Error("Unexpected duplicate environment variables '"
+                        + tokens[0] + "'");
+        }
+
+        result[tokens[0]] = tokens[1];
+      }
 
-  foreach (const JSON::Value& value, values) {
-    if (!value.is<JSON::String>()) {
-      return Error("Expecting 'ContainerConfig.EntryPoint' array of strings");
+      envOption = result;
     }
-    result.push_back(value.as<JSON::String>().value);
   }
 
-  return Docker::Image(result);
+  return Docker::Image(entrypointOption, envOption);
 }
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/b0e7cb14/src/docker/docker.hpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.hpp b/src/docker/docker.hpp
index 33d6fb3..4cb7a4e 100644
--- a/src/docker/docker.hpp
+++ b/src/docker/docker.hpp
@@ -18,6 +18,7 @@
 #define __DOCKER_HPP__
 
 #include <list>
+#include <map>
 #include <string>
 
 #include <process/future.hpp>
@@ -99,9 +100,13 @@ public:
 
     Option<std::vector<std::string>> entrypoint;
 
+    Option<std::map<std::string, std::string>> environment;
+
   private:
-    Image(const Option<std::vector<std::string>>& _entrypoint)
-      : entrypoint(_entrypoint) {}
+    Image(const Option<std::vector<std::string>>& _entrypoint,
+          const Option<std::map<std::string, std::string>>& _environment)
+      : entrypoint(_entrypoint),
+        environment(_environment) {}
   };
 
   // Performs 'docker run IMAGE'.


[2/2] mesos git commit: Added test case for Docker Image Create.

Posted by tn...@apache.org.
Added test case for Docker Image Create.

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


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

Branch: refs/heads/master
Commit: 3c95c9b9cffd2301d570e87ea7483b0c577a4007
Parents: b0e7cb1
Author: Gilbert Song <so...@gmail.com>
Authored: Mon Dec 21 01:27:19 2015 -0800
Committer: Timothy Chen <tn...@apache.org>
Committed: Mon Dec 21 01:27:19 2015 -0800

----------------------------------------------------------------------
 src/tests/containerizer/docker_tests.cpp | 112 ++++++++++++++++++++++++++
 1 file changed, 112 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/3c95c9b9/src/tests/containerizer/docker_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/docker_tests.cpp b/src/tests/containerizer/docker_tests.cpp
index d9e1345..83eceac 100644
--- a/src/tests/containerizer/docker_tests.cpp
+++ b/src/tests/containerizer/docker_tests.cpp
@@ -455,6 +455,118 @@ TEST_F(DockerTest, ROOT_DOCKER_MountAbsolute)
 }
 
 
+class DockerImageTest : public MesosTest {};
+
+// This test verifies that docker image constructor is able to read
+// entrypoint and environment from a docker inspect JSON object.
+TEST_F(DockerImageTest, ParseInspectonImage)
+{
+  JSON::Value inspect = JSON::parse(
+    "{"
+    "    \"Id\": "
+    "\"0a8ee093d995e48aa8af626b8a4c48fe3949e474b0ccca9be9d5cf08abd9eda1\","
+    "    \"Parent\": "
+    "\"6fbfa9a156a7655f1bbc2b3ca3624850d373fa403555ae42ed05fe5b478588fa\","
+    "    \"Comment\": \"\","
+    "    \"Created\": \"2015-10-01T13:24:42.549270714Z\","
+    "    \"Container\": "
+    "\"d87a718e07e151623b0310d82b27d2f0acdb1376755ce4aea7a26313cdab379a\","
+    "    \"ContainerConfig\": {"
+    "        \"Hostname\": \"7b840bf4fc5e\","
+    "        \"Domainname\": \"\","
+    "        \"User\": \"\","
+    "        \"AttachStdin\": false,"
+    "        \"AttachStdout\": false,"
+    "        \"AttachStderr\": false,"
+    "        \"PortSpecs\": null,"
+    "        \"ExposedPorts\": null,"
+    "        \"Tty\": false,"
+    "        \"OpenStdin\": false,"
+    "        \"StdinOnce\": false,"
+    "        \"Env\": ["
+    "            \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:"
+    "/sbin:/bin\","
+    "            \"LANG=C.UTF-8\","
+    "            \"JAVA_VERSION=8u66\","
+    "            \"JAVA_DEBIAN_VERSION=8u66-b01-1~bpo8+1\","
+    "            \"CA_CERTIFICATES_JAVA_VERSION=20140324\""
+    "        ],"
+    "        \"Cmd\": ["
+    "            \"/bin/sh\","
+    "            \"-c\","
+    "            \"#(nop) ENTRYPOINT \\u0026{[\\\"./bin/start\\\"]}\""
+    "        ],"
+    "        \"Image\": "
+    "\"6fbfa9a156a7655f1bbc2b3ca3624850d373fa403555ae42ed05fe5b478588fa\","
+    "        \"Volumes\": null,"
+    "        \"VolumeDriver\": \"\","
+    "        \"WorkingDir\": \"/marathon\","
+    "        \"Entrypoint\": ["
+    "            \"./bin/start\""
+    "        ],"
+    "        \"NetworkDisabled\": false,"
+    "        \"MacAddress\": \"\","
+    "        \"OnBuild\": [],"
+    "        \"Labels\": {}"
+    "    },"
+    "    \"DockerVersion\": \"1.8.3-rc1\","
+    "    \"Author\": \"\","
+    "    \"Config\": {"
+    "        \"Hostname\": \"7b840bf4fc5e\","
+    "        \"Domainname\": \"\","
+    "        \"User\": \"\","
+    "        \"AttachStdin\": false,"
+    "        \"AttachStdout\": false,"
+    "        \"AttachStderr\": false,"
+    "        \"PortSpecs\": null,"
+    "        \"ExposedPorts\": null,"
+    "        \"Tty\": false,"
+    "        \"OpenStdin\": false,"
+    "        \"StdinOnce\": false,"
+    "        \"Env\": ["
+    "            \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:"
+    "/sbin:/bin\","
+    "            \"LANG=C.UTF-8\","
+    "            \"JAVA_VERSION=8u66\","
+    "            \"JAVA_DEBIAN_VERSION=8u66-b01-1~bpo8+1\","
+    "            \"CA_CERTIFICATES_JAVA_VERSION=20140324\""
+    "        ],"
+    "        \"Cmd\": null,"
+    "        \"Image\": "
+    "\"6fbfa9a156a7655f1bbc2b3ca3624850d373fa403555ae42ed05fe5b478588fa\","
+    "        \"Volumes\": null,"
+    "        \"VolumeDriver\": \"\","
+    "        \"WorkingDir\": \"/marathon\","
+    "        \"Entrypoint\": ["
+    "            \"./bin/start\""
+    "        ],"
+    "        \"NetworkDisabled\": false,"
+    "        \"MacAddress\": \"\","
+    "        \"OnBuild\": [],"
+    "        \"Labels\": {}"
+    "    },"
+    "    \"Architecture\": \"amd64\","
+    "    \"Os\": \"linux\","
+    "    \"Size\": 0,"
+    "    \"VirtualSize\": 977664708"
+    "}").get();
+
+  Try<JSON::Object> json = JSON::parse<JSON::Object>(stringify(inspect));
+  ASSERT_SOME(json);
+
+  Try<Docker::Image> image = Docker::Image::create(json.get());
+  ASSERT_SOME(image);
+
+  EXPECT_EQ("./bin/start", image.get().entrypoint.get().front());
+  EXPECT_EQ("C.UTF-8", image.get().environment.get().at("LANG"));
+  EXPECT_EQ("8u66", image.get().environment.get().at("JAVA_VERSION"));
+  EXPECT_EQ("8u66-b01-1~bpo8+1",
+            image.get().environment.get().at("JAVA_DEBIAN_VERSION"));
+  EXPECT_EQ("20140324",
+            image.get().environment.get().at("CA_CERTIFICATES_JAVA_VERSION"));
+}
+
+
 } // namespace tests {
 } // namespace internal {
 } // namespace mesos {