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);

Reply via email to