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