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 <[email protected]> Authored: Thu Apr 6 17:02:35 2017 -0700 Committer: Jie Yu <[email protected]> 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; }
