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 e9de5e945843649ac2a7a2a08463b70760370e7a Author: Meng Zhu <[email protected]> AuthorDate: Wed Jul 17 15:35:05 2019 -0700 Added helpers to return resources allocated/reserved to a role subtree. Review: https://reviews.apache.org/r/71109 --- include/mesos/resources.hpp | 18 ++++++++++++++++++ include/mesos/v1/resources.hpp | 18 ++++++++++++++++++ src/common/resources.cpp | 35 +++++++++++++++++++++++++++++++++++ src/v1/resources.cpp | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+) diff --git a/include/mesos/resources.hpp b/include/mesos/resources.hpp index 3fc2c34..a6a052b 100644 --- a/include/mesos/resources.hpp +++ b/include/mesos/resources.hpp @@ -348,6 +348,16 @@ public: // Tests if the given Resource object is shared. static bool isShared(const Resource& resource); + // Returns true if the resource is allocated to the role subtree + // (i.e. either to the role itself or to its decedents). + static bool isAllocatedToRoleSubtree( + const Resource& resource, const std::string& role); + + // Returns true if the resource is reserved to the role subtree + // (i.e. either to the role itself or to its decedents). + static bool isReservedToRoleSubtree( + const Resource& resource, const std::string& role); + // Tests if the given Resource object has refined reservations. static bool hasRefinedReservations(const Resource& resource); @@ -480,6 +490,14 @@ public: // definition of 'allocatableTo'. Resources allocatableTo(const std::string& role) const; + // Returns resources that are allocated to the role subtree + // (i.e. either to the role itself or to its decedents). + Resources allocatedToRoleSubtree(const std::string& role) const; + + // Returns resources that are reserved to the role subtree + // (i.e. either to the role itself or to its decedents). + Resources reservedToRoleSubtree(const std::string& role) const; + // Returns the unreserved resources. Resources unreserved() const; diff --git a/include/mesos/v1/resources.hpp b/include/mesos/v1/resources.hpp index 39c0403..e43d1fb 100644 --- a/include/mesos/v1/resources.hpp +++ b/include/mesos/v1/resources.hpp @@ -348,6 +348,16 @@ public: // Tests if the given Resource object is shared. static bool isShared(const Resource& resource); + // Returns true if the resource is allocated to the role subtree + // (i.e. either to the role itself or to its decedents). + static bool isAllocatedToRoleSubtree( + const Resource& resource, const std::string& role); + + // Returns true if the resource is reserved to the role subtree + // (i.e. either to the role itself or to its decedents). + static bool isReservedToRoleSubtree( + const Resource& resource, const std::string& role); + // Tests if the given Resource object has refined reservations. static bool hasRefinedReservations(const Resource& resource); @@ -480,6 +490,14 @@ public: // definition of 'allocatableTo'. Resources allocatableTo(const std::string& role) const; + // Returns resources that are allocated to the role subtree + // (i.e. either to the role itself or to its decedents). + Resources allocatedToRoleSubtree(const std::string& role) const; + + // Returns resources that are reserved to the role subtree + // (i.e. either to the role itself or to its decedents). + Resources reservedToRoleSubtree(const std::string& role) const; + // Returns the unreserved resources. Resources unreserved() const; diff --git a/src/common/resources.cpp b/src/common/resources.cpp index 6e02d5c..fc7e86b 100644 --- a/src/common/resources.cpp +++ b/src/common/resources.cpp @@ -1260,6 +1260,29 @@ bool Resources::isShared(const Resource& resource) } +bool Resources::isAllocatedToRoleSubtree( + const Resource& resource, const string& role) +{ + CHECK(!resource.has_role()) << resource; + CHECK(!resource.has_reservation()) << resource; + + return resource.allocation_info().role() == role || + roles::isStrictSubroleOf(resource.allocation_info().role(), role); +} + + +bool Resources::isReservedToRoleSubtree( + const Resource& resource, const string& role) +{ + CHECK(!resource.has_role()) << resource; + CHECK(!resource.has_reservation()) << resource; + + return Resources::isReserved(resource) && + (Resources::reservationRole(resource) == role || + roles::isStrictSubroleOf(Resources::reservationRole(resource), role)); +} + + bool Resources::hasRefinedReservations(const Resource& resource) { CHECK(!resource.has_role()) << resource; @@ -1631,6 +1654,18 @@ Resources Resources::allocatableTo(const string& role) const } +Resources Resources::allocatedToRoleSubtree(const string& role) const +{ + return filter(lambda::bind(isAllocatedToRoleSubtree, lambda::_1, role)); +} + + +Resources Resources::reservedToRoleSubtree(const string& role) const +{ + return filter(lambda::bind(isReservedToRoleSubtree, lambda::_1, role)); +} + + Resources Resources::unreserved() const { return filter(isUnreserved); diff --git a/src/v1/resources.cpp b/src/v1/resources.cpp index 25fb213..88da0a1 100644 --- a/src/v1/resources.cpp +++ b/src/v1/resources.cpp @@ -1280,6 +1280,29 @@ bool Resources::isShared(const Resource& resource) } +bool Resources::isAllocatedToRoleSubtree( + const Resource& resource, const string& role) +{ + CHECK(!resource.has_role()) << resource; + CHECK(!resource.has_reservation()) << resource; + + return resource.allocation_info().role() == role || + roles::isStrictSubroleOf(resource.allocation_info().role(), role); +} + + +bool Resources::isReservedToRoleSubtree( + const Resource& resource, const string& role) +{ + CHECK(!resource.has_role()) << resource; + CHECK(!resource.has_reservation()) << resource; + + return Resources::isReserved(resource) && + (Resources::reservationRole(resource) == role || + roles::isStrictSubroleOf(Resources::reservationRole(resource), role)); +} + + bool Resources::hasRefinedReservations(const Resource& resource) { CHECK(!resource.has_role()) << resource; @@ -1649,6 +1672,18 @@ Resources Resources::allocatableTo(const string& role) const } +Resources Resources::allocatedToRoleSubtree(const string& role) const +{ + return filter(lambda::bind(isAllocatedToRoleSubtree, lambda::_1, role)); +} + + +Resources Resources::reservedToRoleSubtree(const string& role) const +{ + return filter(lambda::bind(isReservedToRoleSubtree, lambda::_1, role)); +} + + Resources Resources::unreserved() const { return filter(isUnreserved);
