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 2017/04/07 00:09:25 UTC

mesos git commit: Added ResourceProviderID to Resource protos.

Repository: mesos
Updated Branches:
  refs/heads/master 362d09592 -> b92a46f06


Added ResourceProviderID to Resource protos.

This patch adds an optional resource provider id to resources. In
future changes we will introduce abstract providers of resources.
While currently agents are implicit resource providers, later on an
agent might use multiple resource providers. By having a provider id
in the resource we can unambigously detect which provider contributed
which resource.

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


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

Branch: refs/heads/master
Commit: b92a46f0633f5ffac528a57c99af80c519e9ae80
Parents: 362d095
Author: Benjamin Bannier <be...@mesosphere.io>
Authored: Thu Apr 6 17:02:35 2017 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Thu Apr 6 17:09:19 2017 -0700

----------------------------------------------------------------------
 include/mesos/mesos.proto     |  16 ++--
 include/mesos/v1/mesos.proto  |  16 ++--
 src/common/resources.cpp      |  18 +++++
 src/tests/resources_tests.cpp | 158 +++++++++++++++++++++++++++++++++++++
 src/v1/resources.cpp          |  18 +++++
 5 files changed, 212 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/b92a46f0/include/mesos/mesos.proto
----------------------------------------------------------------------
diff --git a/include/mesos/mesos.proto b/include/mesos/mesos.proto
index dd90465..a7689a1 100644
--- a/include/mesos/mesos.proto
+++ b/include/mesos/mesos.proto
@@ -876,19 +876,21 @@ message Attribute {
 
 
 /**
- * Describes a resource on a machine. The `name` field is a string
- * like "cpus" or "mem" that indicates which kind of resource this is;
- * the rest of the fields describe the properties of the resource. A
- * resource can take on one of three types: scalar (double), a list of
- * finite and discrete ranges (e.g., [1-10, 20-30]), or a set of
- * items. A resource is described using the standard protocol buffer
- * "union" trick.
+ * Describes a resource from a resource provider. The `name` field is
+ * a string like "cpus" or "mem" that indicates which kind of resource
+ * this is; the rest of the fields describe the properties of the
+ * resource. A resource can take on one of three types: scalar
+ * (double), a list of finite and discrete ranges (e.g., [1-10,
+ * 20-30]), or a set of items. A resource is described using the
+ * standard protocol buffer "union" trick.
  *
  * Note that "disk" and "mem" resources are scalar values expressed in
  * megabytes. Fractional "cpus" values are allowed (e.g., "0.5"),
  * which correspond to partial shares of a CPU.
  */
 message Resource {
+  optional ResourceProviderID provider_id = 12;
+
   required string name = 1;
   required Value.Type type = 2;
   optional Value.Scalar scalar = 3;

http://git-wip-us.apache.org/repos/asf/mesos/blob/b92a46f0/include/mesos/v1/mesos.proto
----------------------------------------------------------------------
diff --git a/include/mesos/v1/mesos.proto b/include/mesos/v1/mesos.proto
index 2286231..2a09b92 100644
--- a/include/mesos/v1/mesos.proto
+++ b/include/mesos/v1/mesos.proto
@@ -870,19 +870,21 @@ message Attribute {
 
 
 /**
- * Describes a resource on a machine. The `name` field is a string
- * like "cpus" or "mem" that indicates which kind of resource this is;
- * the rest of the fields describe the properties of the resource. A
- * resource can take on one of three types: scalar (double), a list of
- * finite and discrete ranges (e.g., [1-10, 20-30]), or a set of
- * items. A resource is described using the standard protocol buffer
- * "union" trick.
+ * Describes a resource from a resource provider. The `name` field is
+ * a string like "cpus" or "mem" that indicates which kind of resource
+ * this is; the rest of the fields describe the properties of the
+ * resource. A resource can take on one of three types: scalar
+ * (double), a list of finite and discrete ranges (e.g., [1-10,
+ * 20-30]), or a set of items. A resource is described using the
+ * standard protocol buffer "union" trick.
  *
  * Note that "disk" and "mem" resources are scalar values expressed in
  * megabytes. Fractional "cpus" values are allowed (e.g., "0.5"),
  * which correspond to partial shares of a CPU.
  */
 message Resource {
+  optional ResourceProviderID provider_id = 12;
+
   required string name = 1;
   required Value.Type type = 2;
   optional Value.Scalar scalar = 3;

http://git-wip-us.apache.org/repos/asf/mesos/blob/b92a46f0/src/common/resources.cpp
----------------------------------------------------------------------
diff --git a/src/common/resources.cpp b/src/common/resources.cpp
index c26e0f9..289df9e 100644
--- a/src/common/resources.cpp
+++ b/src/common/resources.cpp
@@ -336,6 +336,15 @@ static bool addable(const Resource& left, const Resource& right)
     return false;
   }
 
+  // Check ResourceProvider.
+  if (left.has_provider_id() != right.has_provider_id()) {
+    return false;
+  }
+
+  if (left.has_provider_id() && left.provider_id() != right.provider_id()) {
+    return false;
+  }
+
   return true;
 }
 
@@ -413,6 +422,15 @@ static bool subtractable(const Resource& left, const Resource& right)
     return false;
   }
 
+  // Check ResourceProvider.
+  if (left.has_provider_id() != right.has_provider_id()) {
+    return false;
+  }
+
+  if (left.has_provider_id() && left.provider_id() != right.provider_id()) {
+    return false;
+  }
+
   return true;
 }
 

http://git-wip-us.apache.org/repos/asf/mesos/blob/b92a46f0/src/tests/resources_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/resources_tests.cpp b/src/tests/resources_tests.cpp
index 343cab2..4cf320d 100644
--- a/src/tests/resources_tests.cpp
+++ b/src/tests/resources_tests.cpp
@@ -1529,6 +1529,164 @@ TEST(ResourcesTest, Reservations)
 }
 
 
+TEST(ResourceProviderIDTest, Addition)
+{
+  ResourceProviderID resourceProviderId;
+  resourceProviderId.set_value("RESOURCE_PROVIDER_ID");
+
+  Resource cpus = Resources::parse("cpus", "4", "*").get();
+  cpus.mutable_provider_id()->CopyFrom(resourceProviderId);
+
+  Resource disk1 = createDiskResource("1", "*", None(), None());
+
+  Resource disk2 = disk1;
+  disk2.mutable_provider_id()->CopyFrom(resourceProviderId);
+
+  Resources r1;
+  r1 += cpus;
+  r1 += disk2;
+
+  EXPECT_FALSE(r1.empty());
+  EXPECT_EQ(2u, r1.size());
+  EXPECT_TRUE(r1.contains(cpus));
+  EXPECT_TRUE(r1.contains(disk2));
+  EXPECT_FALSE(r1.contains(disk1));
+  EXPECT_EQ(4, r1.get<Value::Scalar>("cpus")->value());
+  EXPECT_EQ(1, r1.get<Value::Scalar>("disk")->value());
+
+  Resources r2;
+  r2 += disk2;
+  r2 += disk2;
+
+  EXPECT_FALSE(r2.empty());
+  EXPECT_EQ(1u, r2.size());
+  EXPECT_TRUE(r2.contains(disk2));
+  EXPECT_EQ(2, r2.get<Value::Scalar>("disk")->value());
+
+  EXPECT_EQ(Resources(disk2) + disk2, r2);
+
+  Resources r3;
+  r3 += disk1;
+  r3 += disk2;
+
+  EXPECT_FALSE(r3.empty());
+  EXPECT_EQ(2u, r3.size());
+  EXPECT_TRUE(r3.contains(disk1));
+  EXPECT_TRUE(r3.contains(disk2));
+  EXPECT_EQ(2, r3.get<Value::Scalar>("disk")->value());
+
+  EXPECT_EQ(Resources(disk1) + disk2, r3);
+}
+
+
+TEST(ResourceProviderIDTest, Subtraction)
+{
+  ResourceProviderID resourceProviderId;
+  resourceProviderId.set_value("RESOURCE_PROVIDER_ID");
+
+  Resource cpus = Resources::parse("cpus", "4", "*").get();
+  cpus.mutable_provider_id()->CopyFrom(resourceProviderId);
+
+  Resource disk1 = createDiskResource("1", "*", None(), None());
+
+  Resource disk2 = disk1;
+  disk2.mutable_provider_id()->CopyFrom(resourceProviderId);
+
+  ASSERT_TRUE(Resources(cpus).contains(cpus));
+  EXPECT_TRUE((Resources(cpus) - cpus).empty());
+
+  EXPECT_FALSE(Resources(cpus).contains(disk1));
+  EXPECT_FALSE(Resources(cpus).contains(disk2));
+
+  Resources r0;
+  r0 += cpus;
+  r0 += disk1;
+
+  ASSERT_TRUE(r0.contains(cpus));
+  ASSERT_TRUE(r0.contains(disk1));
+  EXPECT_EQ(Resources(cpus), r0 - disk1);
+  EXPECT_EQ(Resources(disk1), r0 - cpus);
+
+  Resources r1;
+  r1 += cpus;
+  r1 += disk2;
+
+  ASSERT_TRUE(r1.contains(cpus));
+  ASSERT_TRUE(r1.contains(disk2));
+  EXPECT_EQ(Resources(cpus), r1 - disk2);
+  EXPECT_EQ(Resources(disk2), r1 - cpus);
+
+  Resources r2;
+  r2 += disk2;
+  r2 += disk2;
+
+  ASSERT_TRUE(r2.contains(disk2));
+  EXPECT_EQ(Resources(disk2), r2 - disk2);
+}
+
+
+TEST(ResourceProviderIDTest, Equals)
+{
+  ResourceProviderID resourceProviderId;
+  resourceProviderId.set_value("RESOURCE_PROVIDER_ID");
+
+  Resource cpus  = Resources::parse("cpus", "1", "*").get();
+  cpus.mutable_provider_id()->CopyFrom(resourceProviderId);
+
+  Resource disk1 = createDiskResource("1", "*", None(), None());
+
+  Resource disk2 = disk1;
+  disk2.mutable_provider_id()->CopyFrom(resourceProviderId);
+
+  Resources r1 = cpus;
+  Resources r2 = disk1;
+  Resources r3 = disk2;
+  Resources r4 = r1 + disk1;
+  Resources r5 = r1 + disk2;
+
+  EXPECT_EQ(r1, r1);
+  EXPECT_NE(r1, r2);
+  EXPECT_NE(r1, r3);
+  EXPECT_NE(r2, r3);
+  EXPECT_EQ(r2, r2);
+  EXPECT_EQ(r3, r3);
+
+  EXPECT_NE(r4, r5);
+  EXPECT_EQ(r4, r4);
+  EXPECT_EQ(r5, r5);
+}
+
+
+TEST(ResourceProviderIDTest, Contains) {
+  ResourceProviderID resourceProviderId;
+  resourceProviderId.set_value("RESOURCE_PROVIDER_ID");
+
+  Resource cpus = Resources::parse("cpus", "1", "*").get();
+
+  Resource disk1 = createDiskResource("1", "*", None(), None());
+
+  Resource disk2 = disk1;
+  disk2.mutable_provider_id()->CopyFrom(resourceProviderId);
+
+  Resources r1 = disk1;
+  Resources r2 = disk2;
+  Resources r3 = Resources(cpus) + disk1;
+  Resources r4 = Resources(cpus) + disk2;
+
+  EXPECT_FALSE(r1.contains(r2));
+  EXPECT_FALSE(r2.contains(r1));
+  EXPECT_TRUE(r2.contains(r2));
+
+  EXPECT_TRUE(r3.contains(r1));
+  EXPECT_FALSE(r3.contains(r2));
+  EXPECT_FALSE(r4.contains(r1));
+  EXPECT_TRUE(r4.contains(r2));
+
+  EXPECT_FALSE(r3.contains(r4));
+  EXPECT_TRUE(r4.contains(r4));
+}
+
+
 TEST(ResourcesTest, FlattenRoles)
 {
   Resource cpus1 = Resources::parse("cpus", "1", "role1").get();

http://git-wip-us.apache.org/repos/asf/mesos/blob/b92a46f0/src/v1/resources.cpp
----------------------------------------------------------------------
diff --git a/src/v1/resources.cpp b/src/v1/resources.cpp
index a53deaf..c6cb585 100644
--- a/src/v1/resources.cpp
+++ b/src/v1/resources.cpp
@@ -338,6 +338,15 @@ static bool addable(const Resource& left, const Resource& right)
     return false;
   }
 
+  // Check ResourceProvider.
+  if (left.has_provider_id() != right.has_provider_id()) {
+    return false;
+  }
+
+  if (left.has_provider_id() && left.provider_id() != right.provider_id()) {
+    return false;
+  }
+
   return true;
 }
 
@@ -415,6 +424,15 @@ static bool subtractable(const Resource& left, const Resource& right)
     return false;
   }
 
+  // Check ResourceProvider.
+  if (left.has_provider_id() != right.has_provider_id()) {
+    return false;
+  }
+
+  if (left.has_provider_id() && left.provider_id() != right.provider_id()) {
+    return false;
+  }
+
   return true;
 }