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