You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by bm...@apache.org on 2019/08/24 22:16:22 UTC

[mesos] branch master updated: Stripped metadata and non-scalars from GET_ROLES resources.

This is an automated email from the ASF dual-hosted git repository.

bmahler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git


The following commit(s) were added to refs/heads/master by this push:
     new 3ee3c5d  Stripped metadata and non-scalars from GET_ROLES resources.
3ee3c5d is described below

commit 3ee3c5d50bbf192fddfe6bd6d5a6df6cec9d4456
Author: Benjamin Mahler <bm...@apache.org>
AuthorDate: Mon Aug 19 16:05:27 2019 -0400

    Stripped metadata and non-scalars from GET_ROLES resources.
    
    This endpoint is meant to expose resource statistics, and only
    accidentally exposed the metadata and non-scalar resources. It
    does not make sense to expose non-scalar resources in this way.
    
    The `resources` field will be deprecated in favor of a breakdown
    between offered, allocated, and reserved resources (similar to
    the /roles endpoint).
    
    Review: https://reviews.apache.org/r/71310
---
 src/master/http.cpp             | 39 +++++++++++++++++++++++++--------------
 src/master/master.hpp           | 19 -------------------
 src/master/readonly_handler.cpp |  5 +++--
 src/tests/api_tests.cpp         | 10 +++++-----
 4 files changed, 33 insertions(+), 40 deletions(-)

diff --git a/src/master/http.cpp b/src/master/http.cpp
index 6400771..0987d93 100644
--- a/src/master/http.cpp
+++ b/src/master/http.cpp
@@ -2705,28 +2705,39 @@ Future<Response> Master::Http::getRoles(
           continue;
         }
 
-        mesos::Role role;
+        mesos::Role* role = getRoles->add_roles();
 
-        if (master->weights.contains(name)) {
-          role.set_weight(master->weights[name]);
-        } else {
-          role.set_weight(1.0);
-        }
+        role->set_name(name);
+
+        role->set_weight(master->weights.get(name).getOrElse(DEFAULT_WEIGHT));
 
-        if (master->roles.contains(name)) {
-          Role* role_ = master->roles.at(name);
+        RoleResourceBreakdown resourceBreakdown(master, name);
 
-          *role.mutable_resources() =
-            role_->allocatedAndOfferedResources();
+        ResourceQuantities allocatedAndOffered =
+          resourceBreakdown.allocated() + resourceBreakdown.offered();
 
-          foreachkey (const FrameworkID& frameworkId, role_->frameworks) {
-            role.add_frameworks()->CopyFrom(frameworkId);
+        // `resources` will be deprecated in favor of
+        // `offered`, `allocated`, `reserved`, and quota consumption.
+        // As a result, we don't bother trying to expose more
+        // than {cpus, mem, disk, gpus} since we don't know if
+        // anything outside this set is of type SCALAR.
+        foreach (const auto& quantity, allocatedAndOffered) {
+          if (quantity.first == "cpus" || quantity.first == "mem" ||
+              quantity.first == "disk" || quantity.first == "gpus") {
+            Resource* resource = role->add_resources();
+            resource->set_name(quantity.first);
+            resource->set_type(Value::SCALAR);
+            *resource->mutable_scalar() = quantity.second;
           }
         }
 
-        role.set_name(name);
+        Option<Role*> role_ = master->roles.get(name);
 
-        getRoles->add_roles()->CopyFrom(role);
+        if (role_.isSome()) {
+          foreachkey (const FrameworkID& frameworkId, (*role_)->frameworks) {
+            *role->add_frameworks() = frameworkId;
+          }
+        }
       }
 
       return OK(serialize(contentType, evolve(response)),
diff --git a/src/master/master.hpp b/src/master/master.hpp
index 09a70df..8d9ce3e 100644
--- a/src/master/master.hpp
+++ b/src/master/master.hpp
@@ -2778,25 +2778,6 @@ struct Role
     frameworks.erase(framework->id());
   }
 
-  Resources allocatedAndOfferedResources() const
-  {
-    Resources resources;
-
-    auto allocatedTo = [](const std::string& role) {
-      return [role](const Resource& resource) {
-        CHECK(resource.has_allocation_info());
-        return resource.allocation_info().role() == role;
-      };
-    };
-
-    foreachvalue (Framework* framework, frameworks) {
-      resources += framework->totalUsedResources.filter(allocatedTo(role));
-      resources += framework->totalOfferedResources.filter(allocatedTo(role));
-    }
-
-    return resources;
-  }
-
   const Master* master;
   const std::string role;
 
diff --git a/src/master/readonly_handler.cpp b/src/master/readonly_handler.cpp
index b226ae1..500ce3f 100644
--- a/src/master/readonly_handler.cpp
+++ b/src/master/readonly_handler.cpp
@@ -738,8 +738,9 @@ process::http::Response Master::ReadOnlyHandler::roles(
             writer->element([&](JSON::ObjectWriter* writer) {
               writer->field("name", name);
 
-              // Default weight is 1.0.
-              writer->field("weight", master->weights.get(name).getOrElse(1.0));
+              writer->field(
+                  "weight",
+                  master->weights.get(name).getOrElse(DEFAULT_WEIGHT));
 
               Option<Role*> role = master->roles.get(name);
 
diff --git a/src/tests/api_tests.cpp b/src/tests/api_tests.cpp
index e202cd3..a735a20 100644
--- a/src/tests/api_tests.cpp
+++ b/src/tests/api_tests.cpp
@@ -1150,11 +1150,11 @@ TEST_P(MasterAPITest, GetRoles)
   ASSERT_EQ(2, v1Response->get_roles().roles().size());
   EXPECT_EQ("role1", v1Response->get_roles().roles(1).name());
   EXPECT_EQ(2.5, v1Response->get_roles().roles(1).weight());
-  ASSERT_EQ(
-      allocatedResources(
-          devolve(v1::Resources::parse(slaveFlags.resources.get()).get()),
-          "role1"),
-      devolve(v1Response->get_roles().roles(1).resources()));
+
+  EXPECT_EQ(
+      CHECK_NOTERROR(v1::Resources::parse(
+          "cpus:0.5; disk:1024; mem:512")),
+      v1Response->get_roles().roles(1).resources());
 
   driver.stop();
   driver.join();