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 {