Repository: mesos Updated Branches: refs/heads/master 2eaa7d361 -> 8682569df
Added option to force pull docker image. Review: https://reviews.apache.org/r/28190 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/8682569d Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/8682569d Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/8682569d Branch: refs/heads/master Commit: 8682569df528717ff5efb64da26b1b49c39c4efd Parents: 2eaa7d3 Author: Timothy Chen <[email protected]> Authored: Tue Nov 18 10:52:08 2014 -0800 Committer: Timothy Chen <[email protected]> Committed: Thu Nov 20 14:54:38 2014 -0800 ---------------------------------------------------------------------- include/mesos/mesos.proto | 5 +++++ src/docker/docker.cpp | 26 +++++++++++++++++++++----- src/docker/docker.hpp | 11 +++++++++-- src/slave/containerizer/docker.cpp | 11 ++++++++--- src/slave/containerizer/docker.hpp | 12 +++++++++++- src/tests/docker_containerizer_tests.cpp | 15 +++++++++------ 6 files changed, 63 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/8682569d/include/mesos/mesos.proto ---------------------------------------------------------------------- diff --git a/include/mesos/mesos.proto b/include/mesos/mesos.proto index 17dd04f..f7acf35 100644 --- a/include/mesos/mesos.proto +++ b/include/mesos/mesos.proto @@ -956,6 +956,11 @@ message ContainerInfo { // to be supported moving forward, as we might move away from // the docker CLI. repeated Parameter parameters = 5; + + // With this flag set to true, the docker containerizer will + // pull the docker image from the registry even if the image + // is already downloaded on the slave. + optional bool force_pull_image = 6; } required Type type = 1; http://git-wip-us.apache.org/repos/asf/mesos/blob/8682569d/src/docker/docker.cpp ---------------------------------------------------------------------- diff --git a/src/docker/docker.cpp b/src/docker/docker.cpp index f2730a7..3a485a2 100644 --- a/src/docker/docker.cpp +++ b/src/docker/docker.cpp @@ -776,7 +776,8 @@ Future<list<Docker::Container> > Docker::__ps( Future<Docker::Image> Docker::pull( const string& directory, - const string& image) const + const string& image, + bool force) const { vector<string> argv; @@ -793,6 +794,11 @@ Future<Docker::Image> Docker::pull( dockerImage += ":latest"; } + if (force) { + // Skip inspect and docker pull the image. + return Docker::__pull(*this, directory, image, path); + } + argv.push_back(path); argv.push_back("inspect"); argv.push_back(dockerImage); @@ -836,9 +842,19 @@ Future<Docker::Image> Docker::_pull( Option<int> status = s.status().get(); if (status.isSome() && status.get() == 0) { return io::read(s.out().get()) - .then(lambda::bind(&Docker::___pull, lambda::_1)); + .then(lambda::bind(&Docker::____pull, lambda::_1)); } + return Docker::__pull(docker, directory, image, path); +} + + +Future<Docker::Image> Docker::__pull( + const Docker& docker, + const string& directory, + const string& image, + const string& path) +{ vector<string> argv; argv.push_back(path); argv.push_back("pull"); @@ -871,7 +887,7 @@ Future<Docker::Image> Docker::_pull( // process. return s_.get().status() .then(lambda::bind( - &Docker::__pull, + &Docker::___pull, docker, s_.get(), cmd, @@ -888,7 +904,7 @@ void Docker::pullDiscarded(const Subprocess& s, const string& cmd) } -Future<Docker::Image> Docker::__pull( +Future<Docker::Image> Docker::___pull( const Docker& docker, const Subprocess& s, const string& cmd, @@ -912,7 +928,7 @@ Future<Docker::Image> Docker::__pull( } -Future<Docker::Image> Docker::___pull( +Future<Docker::Image> Docker::____pull( const string& output) { Try<JSON::Array> parse = JSON::parse<JSON::Array>(output); http://git-wip-us.apache.org/repos/asf/mesos/blob/8682569d/src/docker/docker.hpp ---------------------------------------------------------------------- diff --git a/src/docker/docker.hpp b/src/docker/docker.hpp index f004879..3ebbc1f 100644 --- a/src/docker/docker.hpp +++ b/src/docker/docker.hpp @@ -127,7 +127,8 @@ public: virtual process::Future<Image> pull( const std::string& directory, - const std::string& image) const; + const std::string& image, + bool force = false) const; protected: // Uses the specified path to the Docker CLI tool. @@ -169,12 +170,18 @@ private: static process::Future<Image> __pull( const Docker& docker, + const std::string& directory, + const std::string& image, + const std::string& path); + + static process::Future<Image> ___pull( + const Docker& docker, const process::Subprocess& s, const std::string& cmd, const std::string& directory, const std::string& image); - static process::Future<Image> ___pull( + static process::Future<Image> ____pull( const std::string& output); static void pullDiscarded( http://git-wip-us.apache.org/repos/asf/mesos/blob/8682569d/src/slave/containerizer/docker.cpp ---------------------------------------------------------------------- diff --git a/src/slave/containerizer/docker.cpp b/src/slave/containerizer/docker.cpp index 6213198..19a6ea2 100644 --- a/src/slave/containerizer/docker.cpp +++ b/src/slave/containerizer/docker.cpp @@ -250,9 +250,10 @@ Future<Nothing> DockerContainerizerProcess::fetch( Future<Nothing> DockerContainerizerProcess::pull( const ContainerID& containerId, const string& directory, - const string& image) + const string& image, + bool forcePullImage) { - Future<Docker::Image> future = docker->pull(directory, image); + Future<Docker::Image> future = docker->pull(directory, image, forcePullImage); containers_[containerId]->pull = future; return future.then(defer(self(), &Self::_pull, image)); } @@ -615,7 +616,11 @@ Future<Nothing> DockerContainerizerProcess::_launch( container->state = Container::PULLING; - return pull(containerId, container->directory, container->image()); + return pull( + containerId, + container->directory, + container->image(), + container->forcePullImage()); } http://git-wip-us.apache.org/repos/asf/mesos/blob/8682569d/src/slave/containerizer/docker.hpp ---------------------------------------------------------------------- diff --git a/src/slave/containerizer/docker.hpp b/src/slave/containerizer/docker.hpp index f9f3ffb..28ebc62 100644 --- a/src/slave/containerizer/docker.hpp +++ b/src/slave/containerizer/docker.hpp @@ -155,7 +155,8 @@ public: virtual process::Future<Nothing> pull( const ContainerID& containerId, const std::string& directory, - const std::string& image); + const std::string& image, + bool forcePullImage); virtual process::Future<hashset<ContainerID>> containers(); @@ -311,6 +312,15 @@ private: return executor.container().docker().image(); } + bool forcePullImage() const + { + if (task.isSome()) { + return task.get().container().docker().force_pull_image(); + } + + return executor.container().docker().force_pull_image(); + } + ContainerInfo container() const { if (task.isSome()) { http://git-wip-us.apache.org/repos/asf/mesos/blob/8682569d/src/tests/docker_containerizer_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/docker_containerizer_tests.cpp b/src/tests/docker_containerizer_tests.cpp index 59c2beb..bed2d10 100644 --- a/src/tests/docker_containerizer_tests.cpp +++ b/src/tests/docker_containerizer_tests.cpp @@ -291,7 +291,7 @@ public: EXPECT_CALL(*this, fetch(_)) .WillRepeatedly(Invoke(this, &MockDockerContainerizerProcess::_fetch)); - EXPECT_CALL(*this, pull(_, _, _)) + EXPECT_CALL(*this, pull(_, _, _, _)) .WillRepeatedly(Invoke(this, &MockDockerContainerizerProcess::_pull)); } @@ -299,12 +299,13 @@ public: fetch, process::Future<Nothing>(const ContainerID& containerId)); - MOCK_METHOD3( + MOCK_METHOD4( pull, process::Future<Nothing>( const ContainerID& containerId, const std::string& directory, - const std::string& image)); + const std::string& image, + bool forcePullImage)); process::Future<Nothing> _fetch(const ContainerID& containerId) { @@ -314,12 +315,14 @@ public: process::Future<Nothing> _pull( const ContainerID& containerId, const std::string& directory, - const std::string& image) + const std::string& image, + bool forcePullImage) { return DockerContainerizerProcess::pull( containerId, directory, - image); + image, + forcePullImage); } }; @@ -2474,7 +2477,7 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_DestroyWhilePulling) Promise<Nothing> promise; // We want to pause the fetch call to simulate a long fetch time. - EXPECT_CALL(*process, pull(_, _, _)) + EXPECT_CALL(*process, pull(_, _, _, _)) .WillOnce(Return(promise.future())); Try<PID<Slave> > slave = StartSlave(&dockerContainerizer);
