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/01/28 22:48:25 UTC

mesos git commit: Exposed docker image manifest to mesos containerizer.

Repository: mesos
Updated Branches:
  refs/heads/master d5af57a64 -> ea3f05b86


Exposed docker image manifest to mesos containerizer.

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


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

Branch: refs/heads/master
Commit: ea3f05b868f4e07b0e37f9a98ca0629a65173a4f
Parents: d5af57a
Author: Gilbert Song <so...@gmail.com>
Authored: Thu Jan 28 13:47:04 2016 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Jan 28 13:48:17 2016 -0800

----------------------------------------------------------------------
 .../mesos/provisioner/docker/store.cpp          | 27 ++++++++++++++++----
 .../mesos/provisioner/provisioner.cpp           |  2 +-
 .../mesos/provisioner/provisioner.hpp           | 10 +++++---
 .../containerizer/mesos/provisioner/store.hpp   | 16 ++++--------
 .../containerizer/provisioner_docker_tests.cpp  | 23 +++++++++++------
 5 files changed, 50 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/ea3f05b8/src/slave/containerizer/mesos/provisioner/docker/store.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/provisioner/docker/store.cpp b/src/slave/containerizer/mesos/provisioner/docker/store.cpp
index 03425da..6327462 100644
--- a/src/slave/containerizer/mesos/provisioner/docker/store.cpp
+++ b/src/slave/containerizer/mesos/provisioner/docker/store.cpp
@@ -28,6 +28,8 @@
 #include <process/dispatch.hpp>
 #include <process/subprocess.hpp>
 
+#include <mesos/docker/spec.hpp>
+
 #include "common/status_utils.hpp"
 
 #include "slave/containerizer/mesos/provisioner/docker/metadata_manager.hpp"
@@ -214,6 +216,8 @@ Future<Image> StoreProcess::_get(
 
 Future<ImageInfo> StoreProcess::__get(const Image& image)
 {
+  CHECK_LT(0u, image.layer_ids_size());
+
   vector<string> layerDirectories;
   foreach (const string& layer, image.layer_ids()) {
     layerDirectories.push_back(
@@ -221,12 +225,25 @@ Future<ImageInfo> StoreProcess::__get(const Image& image)
             flags.docker_store_dir, layer));
   }
 
-  // TODO(gilbert): We should be able to support storing all image
-  // spec locally, and simply grab neccessary runtime config from
-  // local manifest.
-  Option<RuntimeConfig> runtimeConfig = None();
+  // Read the manifest from the last layer because all runtime config
+  // are merged at the leaf already.
+  Try<string> manifest = os::read(
+      paths::getImageLayerManifestPath(
+          flags.docker_store_dir,
+          image.layer_ids(image.layer_ids_size() - 1)));
+
+  if (manifest.isError()) {
+    return Failure("Failed to read manifest: " + manifest.error());
+  }
+
+  Try<::docker::spec::v1::ImageManifest> v1 =
+    ::docker::spec::v1::parse(manifest.get());
+
+  if (v1.isError()) {
+    return Failure("Failed to parse docker v1 manifest: " + v1.error());
+  }
 
-  return ImageInfo{layerDirectories, runtimeConfig};
+  return ImageInfo{layerDirectories, v1.get()};
 }
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/ea3f05b8/src/slave/containerizer/mesos/provisioner/provisioner.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/provisioner/provisioner.cpp b/src/slave/containerizer/mesos/provisioner/provisioner.cpp
index 023f736..8a4938e 100644
--- a/src/slave/containerizer/mesos/provisioner/provisioner.cpp
+++ b/src/slave/containerizer/mesos/provisioner/provisioner.cpp
@@ -295,7 +295,7 @@ Future<ProvisionInfo> ProvisionerProcess::_provision(
 
   return backends.get(backend).get()->provision(ImageInfo.layers, rootfs)
     .then([rootfs, ImageInfo]() -> Future<ProvisionInfo> {
-      return ProvisionInfo{rootfs, ImageInfo.runtimeConfig};
+      return ProvisionInfo{rootfs, ImageInfo.dockerManifest};
     });
 }
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/ea3f05b8/src/slave/containerizer/mesos/provisioner/provisioner.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/provisioner/provisioner.hpp b/src/slave/containerizer/mesos/provisioner/provisioner.hpp
index 4202f55..5c96e9f 100644
--- a/src/slave/containerizer/mesos/provisioner/provisioner.hpp
+++ b/src/slave/containerizer/mesos/provisioner/provisioner.hpp
@@ -21,6 +21,8 @@
 
 #include <mesos/resources.hpp>
 
+#include <mesos/docker/v1.hpp>
+
 #include <mesos/slave/isolator.hpp> // For ContainerState.
 
 #include <stout/nothing.hpp>
@@ -48,12 +50,14 @@ class ProvisionerProcess;
 class Store;
 
 // Provision info struct includes root filesystem for the container
-// with specified image, all runtime configurations from the image
-// that will be passed to Mesos Containerizer.
+// with specified image, all image manifests that include runtime
+// configurations from the image will be passed to Mesos Containerizer.
 struct ProvisionInfo
 {
   std::string rootfs;
-  Option<RuntimeConfig> runtimeConfig;
+
+  // Docker v1 image manifest.
+  Option<::docker::spec::v1::ImageManifest> dockerManifest;
 };
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/ea3f05b8/src/slave/containerizer/mesos/provisioner/store.hpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/provisioner/store.hpp b/src/slave/containerizer/mesos/provisioner/store.hpp
index aec725f..1d477ef 100644
--- a/src/slave/containerizer/mesos/provisioner/store.hpp
+++ b/src/slave/containerizer/mesos/provisioner/store.hpp
@@ -22,6 +22,8 @@
 
 #include <mesos/mesos.hpp>
 
+#include <mesos/docker/v1.hpp>
+
 #include <process/future.hpp>
 #include <process/owned.hpp>
 
@@ -33,22 +35,14 @@ namespace mesos {
 namespace internal {
 namespace slave {
 
-// Runtime configuration struct includes execution configuration
-// which are specified in the image. Besides the root filesystem,
-// Docker and Appc images also contain runtime information as
-// well, such as environment variables, entrypoint, volumes, etc.
-struct RuntimeConfig
-{
-  // TODO(gilbert): Add more runtime configurations from image.
-};
-
-
 // Includes a vector of rootfs layers in topological order corresponding
 // to a specific image, and its runtime configuration.
 struct ImageInfo
 {
   std::vector<std::string> layers;
-  Option<RuntimeConfig> runtimeConfig;
+
+  // Docker v1 image manifest.
+  Option<::docker::spec::v1::ImageManifest> dockerManifest;
 };
 
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/ea3f05b8/src/tests/containerizer/provisioner_docker_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/provisioner_docker_tests.cpp b/src/tests/containerizer/provisioner_docker_tests.cpp
index 33df600..c809824 100644
--- a/src/tests/containerizer/provisioner_docker_tests.cpp
+++ b/src/tests/containerizer/provisioner_docker_tests.cpp
@@ -1252,20 +1252,27 @@ TEST_F(ProvisionerDockerLocalStoreTest, PullingSameImageSimutanuously)
   Future<slave::ImageInfo> imageInfo1 = store.get()->get(mesosImage);
   AWAIT_READY(pull);
 
-  const string rootfsPath1 = path::join(os::getcwd(), "rootfs1");
-  const string rootfsPath2 = path::join(os::getcwd(), "rootfs2");
+  // TODO(gilbert): Need a helper method to create test layers
+  // which will allow us to set manifest so that we can add
+  // checks here.
+  const string layerPath = path::join(os::getcwd(), "456");
 
-  Try<Nothing> mkdir1 = os::mkdir(rootfsPath1);
-  ASSERT_SOME(mkdir1);
-  Try<Nothing> mkdir2 = os::mkdir(rootfsPath2);
-  ASSERT_SOME(mkdir2);
+  Try<Nothing> mkdir = os::mkdir(layerPath);
+  ASSERT_SOME(mkdir);
+
+  JSON::Value manifest = JSON::parse(
+        "{"
+        "  \"parent\": \"\""
+        "}").get();
+
+  ASSERT_SOME(
+      os::write(path::join(layerPath, "json"), stringify(manifest)));
 
   ASSERT_TRUE(imageInfo1.isPending());
   Future<slave::ImageInfo> imageInfo2 = store.get()->get(mesosImage);
 
   const std::list<std::pair<std::string, std::string>> result =
-      {{"123", rootfsPath1},
-       {"456", rootfsPath2}};
+    {{"456", layerPath}};
 
   ASSERT_TRUE(imageInfo2.isPending());
   promise.set(result);