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 {

Reply via email to