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>(