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/04/05 19:41:11 UTC
[1/2] mesos git commit: Supported image name specified with private
registry prefix.
Repository: mesos
Updated Branches:
refs/heads/master 9ed142bbf -> 9d49885bb
Supported image name specified with private registry prefix.
Review: https://reviews.apache.org/r/44674/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/7f0b2318
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/7f0b2318
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/7f0b2318
Branch: refs/heads/master
Commit: 7f0b23187a4b0845bee0986e4508e723b9431c9c
Parents: 9ed142b
Author: Gilbert Song <so...@gmail.com>
Authored: Tue Apr 5 10:40:55 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Tue Apr 5 10:40:55 2016 -0700
----------------------------------------------------------------------
include/mesos/docker/spec.hpp | 18 ++++++++
src/docker/spec.cpp | 47 ++++++++++++++++++++
.../provisioner/docker/registry_puller.cpp | 35 ++++++++++++---
3 files changed, 94 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/7f0b2318/include/mesos/docker/spec.hpp
----------------------------------------------------------------------
diff --git a/include/mesos/docker/spec.hpp b/include/mesos/docker/spec.hpp
index 5fb6647..2ebacc7 100644
--- a/include/mesos/docker/spec.hpp
+++ b/include/mesos/docker/spec.hpp
@@ -54,6 +54,24 @@ Try<ImageReference> parseImageReference(const std::string& s);
std::ostream& operator<<(std::ostream& stream, const ImageReference& reference);
+/**
+ * Returns the port of a docker registry.
+ */
+Result<int> getRegistryPort(const std::string& registry);
+
+
+/**
+ * Returns the scheme of a docker registry.
+ */
+Try<std::string> getRegistryScheme(const std::string& registry);
+
+
+/**
+ * Returns the host of a docker registry.
+ */
+std::string getRegistryHost(const std::string& registry);
+
+
namespace v1 {
/**
http://git-wip-us.apache.org/repos/asf/mesos/blob/7f0b2318/src/docker/spec.cpp
----------------------------------------------------------------------
diff --git a/src/docker/spec.cpp b/src/docker/spec.cpp
index 07c0b87..ac28331 100644
--- a/src/docker/spec.cpp
+++ b/src/docker/spec.cpp
@@ -98,6 +98,53 @@ ostream& operator<<(ostream& stream, const ImageReference& reference)
}
+Result<int> getRegistryPort(const string& registry)
+{
+ if (registry.empty()) {
+ return None();
+ }
+
+ Option<int> port;
+
+ vector<string> split = strings::split(registry, ":", 2);
+ if (split.size() != 1) {
+ Try<int> numified = numify<int>(split[1]);
+ if (numified.isError()) {
+ return Error("Failed to numify '" + split[1] + "'");
+ }
+
+ port = numified.get();
+ }
+
+ return port;
+}
+
+
+Try<string> getRegistryScheme(const string& registry)
+{
+ Result<int> port = getRegistryPort(registry);
+ if (port.isError()) {
+ return Error("Failed to get registry port: " + port.error());
+ } else if (port.isSome() && port.get() == 80) {
+ return "http";
+ }
+
+ return "https";
+}
+
+
+string getRegistryHost(const string& registry)
+{
+ if (registry.empty()) {
+ return "";
+ }
+
+ vector<string> split = strings::split(registry, ":", 2);
+
+ return split[0];
+}
+
+
namespace v1 {
Option<Error> validate(const ImageManifest& manifest)
http://git-wip-us.apache.org/repos/asf/mesos/blob/7f0b2318/src/slave/containerizer/mesos/provisioner/docker/registry_puller.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/provisioner/docker/registry_puller.cpp b/src/slave/containerizer/mesos/provisioner/docker/registry_puller.cpp
index d3eccd9..6545a6d 100644
--- a/src/slave/containerizer/mesos/provisioner/docker/registry_puller.cpp
+++ b/src/slave/containerizer/mesos/provisioner/docker/registry_puller.cpp
@@ -199,12 +199,22 @@ Future<vector<string>> RegistryPullerProcess::pull(
URI manifestUri;
if (reference.has_registry()) {
- // TODO(jieyu): The user specified registry might contain port. We
- // need to parse it and set the 'scheme' and 'port' accordingly.
+ Result<int> port = spec::getRegistryPort(reference.registry());
+ if (port.isError()) {
+ return Failure("Failed to get registry port: " + port.error());
+ }
+
+ Try<string> scheme = spec::getRegistryScheme(reference.registry());
+ if (scheme.isError()) {
+ return Failure("Failed to get registry scheme: " + scheme.error());
+ }
+
manifestUri = uri::docker::manifest(
reference.repository(),
(reference.has_tag() ? reference.tag() : "latest"),
- reference.registry());
+ spec::getRegistryHost(reference.registry()),
+ scheme.get(),
+ port.isSome() ? port.get() : Option<int>());
} else {
const string registry = defaultRegistryUrl.domain.isSome()
? defaultRegistryUrl.domain.get()
@@ -368,12 +378,25 @@ Future<hashset<string>> RegistryPullerProcess::fetchBlobs(
URI blobUri;
if (reference.has_registry()) {
- // TODO(jieyu): The user specified registry might contain port. We
- // need to parse it and set the 'scheme' and 'port' accordingly.
+ Result<int> port = spec::getRegistryPort(reference.registry());
+ if (port.isError()) {
+ return Failure("Failed to get registry port: " + port.error());
+ }
+
+ Try<string> scheme = spec::getRegistryScheme(reference.registry());
+ if (scheme.isError()) {
+ return Failure("Failed to get registry scheme: " + scheme.error());
+ }
+
+ // If users want to use the registry specified in '--docker_image',
+ // an URL scheme must be specified in '--docker_registry', because
+ // there is no scheme allowed in docker image name.
blobUri = uri::docker::blob(
reference.repository(),
blobSum,
- reference.registry());
+ spec::getRegistryHost(reference.registry()),
+ scheme.get(),
+ port.isSome() ? port.get() : Option<int>());
} else {
const string registry = defaultRegistryUrl.domain.isSome()
? defaultRegistryUrl.domain.get()
[2/2] mesos git commit: Added tests for docker spec helpers.
Posted by ji...@apache.org.
Added tests for docker spec helpers.
Review: https://reviews.apache.org/r/45621/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/9d49885b
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/9d49885b
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/9d49885b
Branch: refs/heads/master
Commit: 9d49885bb842d2fff09c59bab7e92a069c4437ba
Parents: 7f0b231
Author: Gilbert Song <so...@gmail.com>
Authored: Tue Apr 5 10:40:59 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Tue Apr 5 10:40:59 2016 -0700
----------------------------------------------------------------------
src/tests/containerizer/docker_spec_tests.cpp | 69 ++++++++++++++++++++++
1 file changed, 69 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/9d49885b/src/tests/containerizer/docker_spec_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/docker_spec_tests.cpp b/src/tests/containerizer/docker_spec_tests.cpp
index a0de305..796b020 100644
--- a/src/tests/containerizer/docker_spec_tests.cpp
+++ b/src/tests/containerizer/docker_spec_tests.cpp
@@ -23,6 +23,8 @@
namespace spec = docker::spec;
+using std::string;
+
namespace mesos {
namespace internal {
namespace tests {
@@ -99,6 +101,73 @@ TEST_F(DockerSpecTest, ParseImageReference)
}
+TEST_F(DockerSpecTest, GetRegistrySpec)
+{
+ string registry = "";
+ Result<int> port = spec::getRegistryPort(registry);
+ Try<string> scheme = spec::getRegistryScheme(registry);
+ string host = spec::getRegistryHost(registry);
+
+ ASSERT_NONE(port);
+ EXPECT_SOME_EQ("https", scheme);
+ EXPECT_TRUE(host.empty());
+
+ registry = ":";
+ port = spec::getRegistryPort(registry);
+ scheme = spec::getRegistryScheme(registry);
+ host = spec::getRegistryHost(registry);
+
+ ASSERT_ERROR(port);
+ ASSERT_ERROR(scheme);
+ EXPECT_TRUE(host.empty());
+
+ registry = "invalid_port:x80";
+ port = spec::getRegistryPort(registry);
+ scheme = spec::getRegistryScheme(registry);
+ host = spec::getRegistryHost(registry);
+
+ ASSERT_ERROR(port);
+ ASSERT_ERROR(scheme);
+ EXPECT_EQ("invalid_port", host);
+
+ registry = "invalid_port:80:80";
+ port = spec::getRegistryPort(registry);
+ scheme = spec::getRegistryScheme(registry);
+ host = spec::getRegistryHost(registry);
+
+ ASSERT_ERROR(port);
+ ASSERT_ERROR(scheme);
+ EXPECT_EQ("invalid_port", host);
+
+ registry = "index.docker.io";
+ port = spec::getRegistryPort(registry);
+ scheme = spec::getRegistryScheme(registry);
+ host = spec::getRegistryHost(registry);
+
+ ASSERT_NONE(port);
+ EXPECT_SOME_EQ("https", scheme);
+ EXPECT_EQ("index.docker.io", host);
+
+ registry = "localhost:80";
+ port = spec::getRegistryPort(registry);
+ scheme = spec::getRegistryScheme(registry);
+ host = spec::getRegistryHost(registry);
+
+ EXPECT_SOME_EQ(80, port);
+ EXPECT_SOME_EQ("http", scheme);
+ EXPECT_EQ("localhost", host);
+
+ registry = "registry-1.docker.io:443";
+ port = spec::getRegistryPort(registry);
+ scheme = spec::getRegistryScheme(registry);
+ host = spec::getRegistryHost(registry);
+
+ EXPECT_SOME_EQ(443, port);
+ EXPECT_SOME_EQ("https", scheme);
+ EXPECT_EQ("registry-1.docker.io", host);
+}
+
+
TEST_F(DockerSpecTest, ParseV1ImageManifest)
{
Try<JSON::Object> json = JSON::parse<JSON::Object>(