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 2014/12/17 02:21:53 UTC

mesos git commit: Added a Resources transformation for acquiring persistent disk.

Repository: mesos
Updated Branches:
  refs/heads/master bff02b0c1 -> 049a62108


Added a Resources transformation for acquiring persistent disk.

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


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

Branch: refs/heads/master
Commit: 049a62108df381cb463dc67bebaab00ecefa0167
Parents: bff02b0
Author: Jie Yu <yu...@gmail.com>
Authored: Tue Dec 16 15:51:02 2014 -0800
Committer: Jie Yu <yu...@gmail.com>
Committed: Tue Dec 16 17:20:54 2014 -0800

----------------------------------------------------------------------
 include/mesos/resources.hpp   | 14 +++++++
 src/common/resources.cpp      | 41 ++++++++++++++++++++
 src/tests/resources_tests.cpp | 79 ++++++++++++++++++--------------------
 3 files changed, 93 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/049a6210/include/mesos/resources.hpp
----------------------------------------------------------------------
diff --git a/include/mesos/resources.hpp b/include/mesos/resources.hpp
index a502459..16d0546 100644
--- a/include/mesos/resources.hpp
+++ b/include/mesos/resources.hpp
@@ -235,6 +235,20 @@ public:
     std::vector<Transformation*> transformations;
   };
 
+  // Acquires a persistent disk from a regular disk resource.
+  class AcquirePersistentDisk : public Transformation
+  {
+  public:
+    AcquirePersistentDisk(const Resource& _disk);
+
+  protected:
+    virtual Try<Resources> apply(const Resources& resources) const;
+
+  private:
+    // The target persistent disk resource to acquire.
+    Resource disk;
+  };
+
 private:
   bool contains(const Resource& that) const;
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/049a6210/src/common/resources.cpp
----------------------------------------------------------------------
diff --git a/src/common/resources.cpp b/src/common/resources.cpp
index 1cd885f..2bc2f0a 100644
--- a/src/common/resources.cpp
+++ b/src/common/resources.cpp
@@ -903,4 +903,45 @@ Try<Resources> Resources::CompositeTransformation::apply(
   return result;
 }
 
+
+Resources::AcquirePersistentDisk::AcquirePersistentDisk(const Resource& _disk)
+  : disk(_disk)
+{
+  CHECK(disk.has_disk());
+  CHECK(disk.disk().has_persistence());
+}
+
+
+Try<Resources> Resources::AcquirePersistentDisk::apply(
+    const Resources& resources) const
+{
+  foreach (const Resource& resource, resources) {
+    // TODO(jieyu): Non-persistent volumes are not supported for now.
+    // Persistent disk can only be be acquired from regular disk
+    // resources. Revisit this once we start to support non-persistent
+    // disk volumes.
+    if (resource.name() == "disk" &&
+        !resource.has_disk() &&
+        resource.role() == disk.role()) {
+      CHECK_EQ(resource.type(), Value::SCALAR);
+      CHECK_EQ(disk.type(), Value::SCALAR);
+
+      if (disk.scalar() <= resource.scalar()) {
+        // Strip the disk info so that we can subtract it from the
+        // original resources.
+        Resource stripped = disk;
+        stripped.clear_disk();
+
+        Resources result = resources;
+        result -= stripped;
+        result += disk;
+
+        return result;
+      }
+    }
+  }
+
+  return Error("Insufficient disk resources");
+}
+
 } // namespace mesos {

http://git-wip-us.apache.org/repos/asf/mesos/blob/049a6210/src/tests/resources_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/resources_tests.cpp b/src/tests/resources_tests.cpp
index bac092e..9fb5d6d 100644
--- a/src/tests/resources_tests.cpp
+++ b/src/tests/resources_tests.cpp
@@ -26,9 +26,12 @@
 
 #include "master/master.hpp"
 
+#include "tests/mesos.hpp"
+
 using namespace mesos;
 using namespace mesos::internal;
 using namespace mesos::internal::master;
+using namespace mesos::internal::tests;
 
 using std::ostringstream;
 using std::pair;
@@ -827,50 +830,25 @@ TEST(ResourcesTest, Find)
 }
 
 
-class DiskResourcesTest : public ::testing::Test
+// Helper for creating a disk resource.
+static Resource createDiskResource(
+    const string& value,
+    const string& role,
+    const Option<string>& persistenceID,
+    const Option<string>& containerPath)
 {
-public:
-  Resource::DiskInfo createDiskInfo(
-      const Option<string>& persistenceID,
-      const Option<string>& containerPath)
-  {
-    Resource::DiskInfo info;
-
-    if (persistenceID.isSome()) {
-      Resource::DiskInfo::Persistence persistence;
-      persistence.set_id(persistenceID.get());
-      info.mutable_persistence()->CopyFrom(persistence);
-    }
+  Resource resource = Resources::parse("disk", value, role).get();
 
-    if (containerPath.isSome()) {
-      Volume volume;
-      volume.set_container_path(containerPath.get());
-      volume.set_mode(Volume::RW);
-      info.mutable_volume()->CopyFrom(volume);
-    }
-
-    return info;
+  if (persistenceID.isSome() || containerPath.isSome()) {
+    resource.mutable_disk()->CopyFrom(
+        createDiskInfo(persistenceID, containerPath));
   }
 
-  Resource createDiskResource(
-      const string& value,
-      const string& role,
-      const Option<string>& persistenceID,
-      const Option<string>& containerPath)
-  {
-    Resource resource = Resources::parse("disk", value, role).get();
-
-    if (persistenceID.isSome() || containerPath.isSome()) {
-      resource.mutable_disk()->CopyFrom(
-          createDiskInfo(persistenceID, containerPath));
-    }
-
-    return resource;
-  }
-};
+  return resource;
+}
 
 
-TEST_F(DiskResourcesTest, Validation)
+TEST(DiskResourcesTest, Validation)
 {
   Resource cpus = Resources::parse("cpus", "2", "*").get();
   cpus.mutable_disk()->CopyFrom(createDiskInfo("1", "path"));
@@ -889,7 +867,7 @@ TEST_F(DiskResourcesTest, Validation)
 }
 
 
-TEST_F(DiskResourcesTest, Equals)
+TEST(DiskResourcesTest, Equals)
 {
   Resources r1 = createDiskResource("10", "*", None(), None());
   Resources r2 = createDiskResource("10", "*", None(), "path1");
@@ -908,7 +886,7 @@ TEST_F(DiskResourcesTest, Equals)
 }
 
 
-TEST_F(DiskResourcesTest, Addition)
+TEST(DiskResourcesTest, Addition)
 {
   Resources r1 = createDiskResource("10", "role", None(), "path");
   Resources r2 = createDiskResource("10", "role", None(), None());
@@ -929,7 +907,7 @@ TEST_F(DiskResourcesTest, Addition)
 }
 
 
-TEST_F(DiskResourcesTest, Subtraction)
+TEST(DiskResourcesTest, Subtraction)
 {
   Resources r1 = createDiskResource("10", "role", None(), "path");
   Resources r2 = createDiskResource("10", "role", None(), None());
@@ -944,3 +922,22 @@ TEST_F(DiskResourcesTest, Subtraction)
   EXPECT_TRUE((r3 - r3).empty());
   EXPECT_TRUE((r4 - r5).empty());
 }
+
+
+TEST(ResourcesTransformationTest, AcquirePersistentDisk)
+{
+  Resources total = Resources::parse("cpus:1;mem:512;disk(role):1000").get();
+
+  Resource disk1 = createDiskResource("200", "role", "1", "path");
+  Resources::AcquirePersistentDisk acquire1(disk1);
+
+  EXPECT_SOME_EQ(
+      Resources::parse("cpus:1;mem:512;disk(role):800").get() + disk1,
+      acquire1(total));
+
+  // Check the case of insufficient disk resources.
+  Resource disk2 = createDiskResource("2000", "role", "1", "path");
+  Resources::AcquirePersistentDisk acquire2(disk2);
+
+  EXPECT_ERROR(acquire2(total));
+}