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 <[email protected]> Authored: Fri Aug 15 22:03:00 2014 -0700 Committer: Benjamin Hindman <[email protected]> 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"); }
