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 c7979930e7901b090ebed98baf1e525e9aea80fb
Author: Meng Zhu <[email protected]>
AuthorDate: Mon Aug 19 13:58:11 2019 -0700

    Added a test for RoleTree for basic add and remove operations.
    
    Review: https://reviews.apache.org/r/71313
---
 src/tests/sorter_tests.cpp | 91 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 91 insertions(+)

diff --git a/src/tests/sorter_tests.cpp b/src/tests/sorter_tests.cpp
index fc33971..97ab910 100644
--- a/src/tests/sorter_tests.cpp
+++ b/src/tests/sorter_tests.cpp
@@ -30,12 +30,17 @@
 #include "master/allocator/mesos/sorter/random/sorter.hpp"
 #include "master/allocator/mesos/sorter/random/utils.hpp"
 
+#include "master/allocator/mesos/hierarchical.hpp"
+
+#include "tests/allocator.hpp"
 #include "tests/mesos.hpp"
 #include "tests/resources_utils.hpp"
 
 using mesos::internal::master::allocator::DRFSorter;
 using mesos::internal::master::allocator::RandomSorter;
 
+using mesos::internal::master::allocator::internal::RoleTree;
+
 using std::cout;
 using std::endl;
 using std::pair;
@@ -2180,6 +2185,92 @@ TYPED_TEST(CommonSorterTest, BENCHMARK_HierarchyFullSort)
   }
 }
 
+
+TEST(RoleTreeTest, RolesTracking) {
+  RoleTree roleTree;
+
+  // Tracking by weights.
+
+  roleTree.updateWeight("a/b/c", 2.0);
+
+  EXPECT_SOME(roleTree.get("a"));
+  EXPECT_SOME(roleTree.get("a/b"));
+  EXPECT_SOME(roleTree.get("a/b/c"));
+
+  EXPECT_EQ(master::DEFAULT_WEIGHT, (*roleTree.get("a"))->weight());
+  EXPECT_EQ(master::DEFAULT_WEIGHT, (*roleTree.get("a/b"))->weight());
+  EXPECT_EQ(2.0, (*roleTree.get("a/b/c"))->weight());
+
+  roleTree.updateWeight("a/b/c", master::DEFAULT_WEIGHT);
+
+  EXPECT_NONE(roleTree.get("a/b/c"));
+  EXPECT_NONE(roleTree.get("a/b"));
+  EXPECT_NONE(roleTree.get("a"));
+
+  // Tracking by quota.
+
+  Quota quota = createQuota("cpus:1");
+  roleTree.updateQuota("a/b/c", quota);
+
+  EXPECT_SOME(roleTree.get("a"));
+  EXPECT_SOME(roleTree.get("a/b"));
+  EXPECT_SOME(roleTree.get("a/b/c"));
+
+  EXPECT_EQ(master::DEFAULT_QUOTA, (*roleTree.get("a"))->quota());
+  EXPECT_EQ(master::DEFAULT_QUOTA, (*roleTree.get("a/b"))->quota());
+  EXPECT_EQ(quota, (*roleTree.get("a/b/c"))->quota());
+
+  roleTree.updateQuota("a/b/c", master::DEFAULT_QUOTA);
+
+  EXPECT_NONE(roleTree.get("a/b/c"));
+  EXPECT_NONE(roleTree.get("a/b"));
+  EXPECT_NONE(roleTree.get("a"));
+
+  // Tracking by reservation.
+
+  Resources reserved = CHECK_NOTERROR(Resources::parse("cpus(a/b/c):1"));
+  ResourceQuantities quantities =
+    ResourceQuantities::fromScalarResources(reserved);
+
+  roleTree.trackReservations(reserved);
+
+  EXPECT_SOME(roleTree.get("a"));
+  EXPECT_SOME(roleTree.get("a/b"));
+  EXPECT_SOME(roleTree.get("a/b/c"));
+
+  EXPECT_EQ(quantities, (*roleTree.get("a"))->reservationScalarQuantities());
+  EXPECT_EQ(quantities, (*roleTree.get("a/b"))->reservationScalarQuantities());
+  EXPECT_EQ(
+      quantities, (*roleTree.get("a/b/c"))->reservationScalarQuantities());
+
+  roleTree.untrackReservations(reserved);
+
+  EXPECT_NONE(roleTree.get("a/b/c"));
+  EXPECT_NONE(roleTree.get("a/b"));
+  EXPECT_NONE(roleTree.get("a"));
+
+  // Tracking by frameworks.
+
+  FrameworkID frameworkId;
+  frameworkId.set_value("framework");
+  roleTree.trackFramework(frameworkId, "a/b/c");
+
+  EXPECT_SOME(roleTree.get("a"));
+  EXPECT_SOME(roleTree.get("a/b"));
+  EXPECT_SOME(roleTree.get("a/b/c"));
+
+  EXPECT_TRUE((*roleTree.get("a"))->frameworks().empty());
+  EXPECT_TRUE((*roleTree.get("a/b"))->frameworks().empty());
+  EXPECT_EQ(1u, (*roleTree.get("a/b/c"))->frameworks().size());
+
+  roleTree.untrackFramework(frameworkId, "a/b/c");
+
+  EXPECT_NONE(roleTree.get("a/b/c"));
+  EXPECT_NONE(roleTree.get("a/b"));
+  EXPECT_NONE(roleTree.get("a"));
+}
+
+
 } // namespace tests {
 } // namespace internal {
 } // namespace mesos {

Reply via email to