You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2014/08/16 17:26:49 UTC

[4/5] git commit: Validate Docker version since we require >= 1.0.0.

Validate Docker version since we require >= 1.0.0.

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


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

Branch: refs/heads/master
Commit: a7b706ae891709d4915951cb1ac714d436688be1
Parents: 337e955
Author: Benjamin Hindman <be...@gmail.com>
Authored: Fri Aug 15 22:03:00 2014 -0700
Committer: Benjamin Hindman <be...@gmail.com>
Committed: Sat Aug 16 08:25:39 2014 -0700

----------------------------------------------------------------------
 src/docker/docker.cpp | 39 +++++++++++++++++++++++++++++++++++----
 1 file changed, 35 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/a7b706ae/src/docker/docker.cpp
----------------------------------------------------------------------
diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp
index a4bad5b..73c62f9 100644
--- a/src/docker/docker.cpp
+++ b/src/docker/docker.cpp
@@ -106,13 +106,14 @@ Try<Docker> Docker::create(const string& path, bool validate)
                  "to mount cgroups manually!");
   }
 
-  std::string cmd = path + " info";
+  // Validate the version (and that we can use Docker at all).
+  string cmd = path + " version";
 
   Try<Subprocess> s = subprocess(
       cmd,
       Subprocess::PATH("/dev/null"),
-      Subprocess::PATH("/dev/null"),
-      Subprocess::PATH("/dev/null"));
+      Subprocess::PIPE(),
+      Subprocess::PIPE());
 
   if (s.isError()) {
     return Error(s.error());
@@ -134,7 +135,37 @@ Try<Docker> Docker::create(const string& path, bool validate)
     return Error(msg);
   }
 
-  return Docker(path);
+  CHECK_SOME(s.get().out());
+
+  Future<string> output = io::read(s.get().out().get());
+
+  if (!output.await(Seconds(5))) {
+    return Error("Timed out reading output from '" + cmd + "'");
+  } else if (output.isFailed()) {
+    return Error("Failed to read output from '" + cmd + "': " +
+                 output.failure());
+  }
+
+  foreach (string line, strings::split(output.get(), "\n")) {
+    line = strings::trim(line);
+    if (strings::startsWith(line, "Client version: ")) {
+      line = line.substr(strlen("Client version: "));
+      vector<string> version = strings::split(line, ".");
+      if (version.size() < 1) {
+        return Error("Failed to parse Docker version '" + line + "'");
+      }
+      Try<int> major = numify<int>(version[0]);
+      if (major.isError()) {
+        return Error("Failed to parse Docker major version '" +
+                     version[0] + "'");
+      } else if (major.get() < 1) {
+        break;
+      }
+      return Docker(path);
+    }
+  }
+
+  return Error("Insufficient version of Docker! Please upgrade to >= 1.0.0");
 }