This is an automated email from the ASF dual-hosted git repository. mzhu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 00dae795c477f8bc2afad9a596263326ed3edd49 Author: Meng Zhu <[email protected]> AuthorDate: Tue Mar 12 19:06:49 2019 -0700 Added a method to check `ResourceLimits::contains(ResourceQuantities)`. Also added tests. Review: https://reviews.apache.org/r/70201 --- src/common/resource_quantities.cpp | 14 ++++++++++ src/common/resource_quantities.hpp | 2 ++ src/tests/resource_quantities_tests.cpp | 45 +++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) diff --git a/src/common/resource_quantities.cpp b/src/common/resource_quantities.cpp index 95fcbca..d9042e9 100644 --- a/src/common/resource_quantities.cpp +++ b/src/common/resource_quantities.cpp @@ -412,6 +412,20 @@ bool ResourceLimits::contains(const ResourceLimits& right) const } +bool ResourceLimits::contains(const ResourceQuantities& quantities) const +{ + foreachpair (const string& name, const Value::Scalar& quantity, quantities) { + Option<Value::Scalar> limit = get(name); + + if (limit.isSome() && *limit < quantity) { + return false; + } + } + + return true; +} + + void ResourceLimits::set( const std::string& name, const Value::Scalar& scalar) { diff --git a/src/common/resource_quantities.hpp b/src/common/resource_quantities.hpp index f774f70..e85ff4f 100644 --- a/src/common/resource_quantities.hpp +++ b/src/common/resource_quantities.hpp @@ -199,6 +199,8 @@ public: // `[("cpu":1)]` will not contain `[("cpu":2)]`. bool contains(const ResourceLimits& right) const; + bool contains(const ResourceQuantities& quantities) const; + private: // Set the limit of the resource with `name` to `scalar`. // Note, the existing limit of the resource will be overwritten. diff --git a/src/tests/resource_quantities_tests.cpp b/src/tests/resource_quantities_tests.cpp index 0f27df7..441b489 100644 --- a/src/tests/resource_quantities_tests.cpp +++ b/src/tests/resource_quantities_tests.cpp @@ -429,6 +429,51 @@ TEST(LimitsTest, Contains) } +TEST(LimitsTest, ContainsQuantities) +{ + ResourceLimits noLimit{}; + ResourceQuantities emptyQuantity{}; + EXPECT_TRUE(noLimit.contains(emptyQuantity)); + + ResourceLimits limits = CHECK_NOTERROR(ResourceLimits::fromString("cpus:1")); + EXPECT_TRUE(limits.contains(emptyQuantity)); + + limits = CHECK_NOTERROR(ResourceLimits::fromString("cpus:1;mem:1")); + ResourceQuantities quantities = + CHECK_NOTERROR(ResourceQuantities::fromString("cpus:1;mem:1")); + EXPECT_TRUE(limits.contains(quantities)); + + // Superset and subset. + limits = CHECK_NOTERROR(ResourceLimits::fromString("cpus:1;mem:1;disk:1")); + quantities = CHECK_NOTERROR(ResourceQuantities::fromString("cpus:1;mem:1")); + EXPECT_TRUE(limits.contains(quantities)); + + limits = CHECK_NOTERROR(ResourceLimits::fromString("cpus:1;mem:1")); + quantities = + CHECK_NOTERROR(ResourceQuantities::fromString("cpus:1;mem:1;disk:1")); + EXPECT_TRUE(limits.contains(quantities)); + + // Intersected sets. + limits = CHECK_NOTERROR(ResourceLimits::fromString("cpus:1;mem:1")); + quantities = CHECK_NOTERROR(ResourceQuantities::fromString("cpus:1;disk:1")); + EXPECT_TRUE(limits.contains(quantities)); + + // Sets with no intersection. + limits = CHECK_NOTERROR(ResourceLimits::fromString("cpus:1;mem:1")); + quantities = CHECK_NOTERROR(ResourceQuantities::fromString("gpu:1;disk:1")); + EXPECT_TRUE(limits.contains(quantities)); + + // Same name, different scalars. + limits = CHECK_NOTERROR(ResourceLimits::fromString("cpus:2;mem:2")); + quantities = CHECK_NOTERROR(ResourceQuantities::fromString("cpus:2;mem:1")); + EXPECT_TRUE(limits.contains(quantities)); + + limits = CHECK_NOTERROR(ResourceLimits::fromString("cpus:2;mem:1")); + quantities = CHECK_NOTERROR(ResourceQuantities::fromString("cpus:2;mem:2")); + EXPECT_FALSE(limits.contains(quantities)); +} + + } // namespace tests { } // namespace internal { } // namespace mesos {
