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/05 02:28:09 UTC

mesos git commit: Fixed a problem of parsing v1Compatibility in Docker v2 image manifest.

Repository: mesos
Updated Branches:
  refs/heads/master add0e5fef -> 294460739


Fixed a problem of parsing v1Compatibility in Docker v2 image manifest.

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


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

Branch: refs/heads/master
Commit: 2944607395c626f3e7b3c90a194b793f26f51a65
Parents: add0e5f
Author: Jie Yu <yu...@gmail.com>
Authored: Sat Jan 2 22:23:22 2016 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Mon Jan 4 17:27:30 2016 -0800

----------------------------------------------------------------------
 src/docker/spec.cpp                             | 19 +++++++
 src/docker/v2.proto                             | 12 +++--
 .../provisioner/docker/registry_puller.cpp      |  6 ++-
 src/tests/containerizer/docker_spec_tests.cpp   | 30 +++--------
 .../containerizer/provisioner_docker_tests.cpp  | 54 ++++++++++----------
 5 files changed, 66 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/29446073/src/docker/spec.cpp
----------------------------------------------------------------------
diff --git a/src/docker/spec.cpp b/src/docker/spec.cpp
index 6c1d4b6..0188078 100644
--- a/src/docker/spec.cpp
+++ b/src/docker/spec.cpp
@@ -97,6 +97,25 @@ Try<ImageManifest> parse(const JSON::Object& json)
     return Error("Protobuf parse failed: " + manifest.error());
   }
 
+  for (int i = 0; i < manifest.get().history_size(); i++) {
+    Try<JSON::Object> v1Compatibility = JSON::parse<JSON::Object>(
+        manifest.get().history(i).v1compatibility());
+
+    if (v1Compatibility.isError()) {
+      return Error("Parsing v1Compatibility JSON failed: " +
+                   v1Compatibility.error());
+    }
+
+    Try<v1::ImageManifest> v1 = v1::parse(v1Compatibility.get());
+    if (v1.isError()) {
+      return Error("Parsing v1Compatibility protobuf failed: " + v1.error());
+    }
+
+    CHECK(!manifest.get().history(i).has_v1());
+
+    manifest->mutable_history(i)->mutable_v1()->CopyFrom(v1.get());
+  }
+
   Option<Error> error = validate(manifest.get());
   if (error.isSome()) {
     return Error("Docker v2 image manifest validation failed: " +

http://git-wip-us.apache.org/repos/asf/mesos/blob/29446073/src/docker/v2.proto
----------------------------------------------------------------------
diff --git a/src/docker/v2.proto b/src/docker/v2.proto
index a1c3563..5d10bd3 100644
--- a/src/docker/v2.proto
+++ b/src/docker/v2.proto
@@ -16,6 +16,8 @@
 
 package docker.spec.v2;
 
+import "docker/v1.proto";
+
 /**
  * Protobuf for the Docker v2 image manifest JSON schema:
  * https://github.com/docker/distribution/blob/master/docs/spec/manifest-v2-1.md
@@ -32,12 +34,12 @@ message ImageManifest {
   repeated FsLayer fsLayers = 4;
 
   message History {
-    message V1Compatibility {
-      required string id = 1;
-      required string parent = 2;
-    }
+    required string v1Compatibility = 1;
 
-    required V1Compatibility v1Compatibility = 1;
+    // NOTE: This field does not exist in the Docker v2 image manifest
+    // specification. It is the parsed version of 'v1Compatibility'
+    // above (which is a raw JSON).
+    optional v1.ImageManifest v1 = 2;
   }
 
   repeated History history = 5;

http://git-wip-us.apache.org/repos/asf/mesos/blob/29446073/src/slave/containerizer/mesos/provisioner/docker/registry_puller.cpp
----------------------------------------------------------------------
diff --git a/src/slave/containerizer/mesos/provisioner/docker/registry_puller.cpp b/src/slave/containerizer/mesos/provisioner/docker/registry_puller.cpp
index bd2c836..623c54e 100644
--- a/src/slave/containerizer/mesos/provisioner/docker/registry_puller.cpp
+++ b/src/slave/containerizer/mesos/provisioner/docker/registry_puller.cpp
@@ -255,12 +255,16 @@ Future<list<pair<string, string>>> RegistryPullerProcess::downloadLayers(
 {
   list<Future<pair<string, string>>> downloadFutures;
 
+  CHECK_EQ(manifest.fslayers_size(), manifest.history_size());
+
   for (int i = 0; i < manifest.fslayers_size(); i++) {
+    CHECK(manifest.history(i).has_v1());
+
     downloadFutures.push_back(
         downloadLayer(imageName,
                       directory,
                       manifest.fslayers(i).blobsum(),
-                      manifest.history(i).v1compatibility().id()));
+                      manifest.history(i).v1().id()));
   }
 
   // TODO(jojy): Delete downloaded files in the directory on discard and

http://git-wip-us.apache.org/repos/asf/mesos/blob/29446073/src/tests/containerizer/docker_spec_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/docker_spec_tests.cpp b/src/tests/containerizer/docker_spec_tests.cpp
index d4ec2cf..aa4faf9 100644
--- a/src/tests/containerizer/docker_spec_tests.cpp
+++ b/src/tests/containerizer/docker_spec_tests.cpp
@@ -167,28 +167,16 @@ TEST_F(DockerSpecTest, ParseV2ImageManifest)
         ],
         "history": [
           {
-            "v1Compatibility": {
-              "id": "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea",
-              "parent": "cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff"
-            }
+            "v1Compatibility": "{\"id\": \"2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\",\"parent\": \"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\"}"
           },
           {
-            "v1Compatibility": {
-              "id": "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea",
-              "parent": "cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff"
-            }
+            "v1Compatibility": "{\"id\": \"2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\",\"parent\": \"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\"}"
           },
           {
-            "v1Compatibility": {
-              "id": "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea",
-              "parent": "cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff"
-            }
+            "v1Compatibility": "{\"id\": \"2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\",\"parent\": \"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\"}"
           },
           {
-            "v1Compatibility": {
-              "id": "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea",
-              "parent": "cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff"
-            }
+            "v1Compatibility": "{\"id\": \"2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\",\"parent\": \"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\"}"
           }
         ],
         "schemaVersion": 1,
@@ -235,13 +223,11 @@ TEST_F(DockerSpecTest, ParseV2ImageManifest)
       manifest.get().fslayers(3).blobsum(),
       "sha256:2a7812e636235448785062100bb9103096aa6655a8f6bb9ac9b13fe8290f66df"); // NOLINT(whitespace/line_length)
 
-  EXPECT_EQ(
-      manifest.get().history(1).v1compatibility().id(),
-      "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea");
+  EXPECT_EQ(manifest.get().history(1).v1().id(),
+          "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea");
 
-  EXPECT_EQ(
-      manifest.get().history(2).v1compatibility().parent(),
-      "cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff");
+  EXPECT_EQ(manifest.get().history(2).v1().parent(),
+            "cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff");
 
   EXPECT_EQ(manifest.get().schemaversion(), 1u);
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/29446073/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 959540f..8635eee 100644
--- a/src/tests/containerizer/provisioner_docker_tests.cpp
+++ b/src/tests/containerizer/provisioner_docker_tests.cpp
@@ -542,30 +542,30 @@ TEST_F(RegistryClientTest, SimpleGetManifest)
     "   \"history\": ["
     "      {"
     "         \"v1Compatibility\": "
-    "           {"
-    "             \"id\": "
-    "\"1ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\","
-    "             \"parent\": "
-    "\"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\""
-    "           }"
+    "           \"{"
+    "             \\\"id\\\": "
+    "\\\"1ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\\\","
+    "             \\\"parent\\\": "
+    "\\\"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\\\""
+    "           }\""
     "      },"
     "      {"
     "         \"v1Compatibility\": "
-    "           {"
-    "             \"id\": "
-    "\"2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\","
-    "             \"parent\": "
-    "\"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\""
-    "           }"
+    "           \"{"
+    "             \\\"id\\\": "
+    "\\\"2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\\\","
+    "             \\\"parent\\\": "
+    "\\\"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\\\""
+    "           }\""
     "      },"
     "      {"
     "         \"v1Compatibility\": "
-    "           {"
-    "             \"id\": "
-    "\"3ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\","
-    "             \"parent\": "
-    "\"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\""
-    "           }"
+    "           \"{"
+    "             \\\"id\\\": "
+    "\\\"3ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\\\","
+    "             \\\"parent\\\": "
+    "\\\"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\\\""
+    "           }\""
     "      }"
     "   ],"
     "   \"signatures\": ["
@@ -604,15 +604,15 @@ TEST_F(RegistryClientTest, SimpleGetManifest)
   AWAIT_ASSERT_READY(manifestResponse);
 
   EXPECT_EQ(
-      manifestResponse.get().history(2).v1compatibility().id(),
+      manifestResponse.get().history(2).v1().id(),
       "1ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea");
 
   EXPECT_EQ(
-      manifestResponse.get().history(1).v1compatibility().id(),
+      manifestResponse.get().history(1).v1().id(),
       "2ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea");
 
   EXPECT_EQ(
-      manifestResponse.get().history(0).v1compatibility().id(),
+      manifestResponse.get().history(0).v1().id(),
       "3ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea");
 }
 
@@ -879,12 +879,12 @@ TEST_F(RegistryClientTest, SimpleRegistryPuller)
     "   \"history\": ["
     "      {"
     "         \"v1Compatibility\": "
-    "           {"
-    "             \"id\": "
-    "\"1ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\","
-    "             \"parent\": "
-    "\"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\""
-    "           }"
+    "           \"{"
+    "             \\\"id\\\": "
+    "\\\"1ce2e90b0bc7224de3db1f0d646fe8e2c4dd37f1793928287f6074bc451a57ea\\\","
+    "             \\\"parent\\\": "
+    "\\\"cf2616975b4a3cba083ca99bc3f0bf25f5f528c3c52be1596b30f60b0b1c37ff\\\""
+    "           }\""
     "      }"
     "   ],"
     "   \"signatures\": ["