You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by jo...@apache.org on 2016/01/15 22:34:49 UTC

[3/3] mesos git commit: Quota: Require role in set request explicitly.

Quota: Require role in set request explicitly.

A set quota request must provide a role, which now must be passed as
a top-level field in the request JSON and not in `Resource` objects.

Review: https://reviews.apache.org/r/41936/


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/f23129e1
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/f23129e1
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/f23129e1

Branch: refs/heads/master
Commit: f23129e117a08032015fc1966d8ed186ef2e4f68
Parents: 99f21af
Author: Alexander Rukletsov <ru...@gmail.com>
Authored: Fri Jan 15 15:56:25 2016 -0500
Committer: Joris Van Remoortere <jo...@gmail.com>
Committed: Fri Jan 15 16:34:35 2016 -0500

----------------------------------------------------------------------
 src/master/quota_handler.cpp     |  54 ++++++------
 src/tests/master_quota_tests.cpp | 152 +++++++++++++++++++---------------
 src/tests/role_tests.cpp         |   5 +-
 3 files changed, 113 insertions(+), 98 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/f23129e1/src/master/quota_handler.cpp
----------------------------------------------------------------------
diff --git a/src/master/quota_handler.cpp b/src/master/quota_handler.cpp
index 134a93b..fc66ba0 100644
--- a/src/master/quota_handler.cpp
+++ b/src/master/quota_handler.cpp
@@ -64,35 +64,16 @@ namespace internal {
 namespace master {
 
 // Creates a `QuotaInfo` protobuf from the quota request.
-static Try<QuotaInfo> createQuotaInfo(RepeatedPtrField<Resource> resources)
+static Try<QuotaInfo> createQuotaInfo(
+    const string& role,
+    const RepeatedPtrField<Resource>& resources)
 {
-  VLOG(1) << "Constructing QuotaInfo from resources protobuf";
+  VLOG(1) << "Constructing QuotaInfo for role \"" << role
+          << "\" from resources protobuf";
 
   QuotaInfo quota;
 
-  // Set the role if we have one. Since all roles must be the same, pick
-  // any, e.g. the first one.
-  if (resources.size() > 0) {
-     quota.set_role(resources.begin()->role());
-  }
-
-  // Check that all roles are set and equal.
-  // TODO(alexr): Remove this check as per MESOS-4058.
-  foreach (const Resource& resource, resources) {
-    if (resource.role() != quota.role()) {
-      return Error(
-          "Resources with different roles: '" + quota.role() + "', '" +
-          resource.role() + "'");
-    }
-  }
-
-  // Remove the role from each resource.
-  // TODO(alexr): Remove this as per MESOS-4058. Corresponding validation
-  // is in `internal::master::quota::validation::quotaInfo()`.
-  foreach (Resource& resource, resources) {
-    resource.clear_role();
-  }
-
+  quota.set_role(role);
   quota.mutable_guarantee()->CopyFrom(resources);
 
   return quota;
@@ -258,6 +239,27 @@ Future<http::Response> Master::QuotaHandler::set(
         parse.error());
   }
 
+  // Extract role from the request JSON.
+  Result<JSON::String> roleJSON = parse.get().find<JSON::String>("role");
+
+  if (roleJSON.isError()) {
+    // An `Error` usually indicates that a search string is malformed
+    // (which is not the case here), however it may also indicate that
+    // the `role` field is not a string.
+    return BadRequest(
+        "Failed to extract 'role' from set quota request JSON '" +
+        request.body + "': " + roleJSON.error());
+  }
+
+  if (roleJSON.isNone()) {
+    return BadRequest(
+        "Failed to extract 'role' from set quota request JSON '" +
+        request.body + "': Field is missing");
+  }
+
+  string role = roleJSON.get().value;
+
+  // Extract resources from the request JSON.
   Result<JSON::Array> resourcesJSON =
     parse.get().find<JSON::Array>("resources");
 
@@ -287,7 +289,7 @@ Future<http::Response> Master::QuotaHandler::set(
   }
 
   // Create the `QuotaInfo` protobuf message from the request JSON.
-  Try<QuotaInfo> create = createQuotaInfo(resources.get());
+  Try<QuotaInfo> create = createQuotaInfo(role, resources.get());
   if (create.isError()) {
     return BadRequest(
         "Failed to create 'QuotaInfo' from set quota request JSON '" +

http://git-wip-us.apache.org/repos/asf/mesos/blob/f23129e1/src/tests/master_quota_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/master_quota_tests.cpp b/src/tests/master_quota_tests.cpp
index 776a168..df9622f 100644
--- a/src/tests/master_quota_tests.cpp
+++ b/src/tests/master_quota_tests.cpp
@@ -113,18 +113,23 @@ protected:
     return info;
   }
 
-  // Generates a quota request from the specified resources.
-  string createRequestBody(const Resources& resources, bool force = false) const
+  // Generates a quota HTTP request body from the specified resources and role.
+  string createRequestBody(
+      const string& role,
+      const Resources& resources,
+      bool force = false) const
   {
     const string json =
         "{"
         "  %s"
+        "  \"role\":\"%s\","
         "  \"resources\":%s"
         "}";
 
     const string request = strings::format(
         json,
         force ? "\"force\":true," : "",
+        role,
         JSON::protobuf(
             static_cast<const RepeatedPtrField<Resource>&>(resources))).get();
 
@@ -161,15 +166,14 @@ TEST_F(MasterQuotaTest, NonExistentRole)
   // start looking at available resources.
 
   // We request quota for a portion of resources available on the agent.
-  Resources quotaResources =
-    Resources::parse("cpus:1;mem:512", "non-existent-role").get();
+  Resources quotaResources = Resources::parse("cpus:1;mem:512").get();
 
-  // Send a quota request for the specified role.
+  // Send a quota request for a non-existent role.
   Future<Response> response = process::http::post(
       master.get(),
       "quota",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(quotaResources));
+      createRequestBody("non-existent-role", quotaResources));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response)
     << response.get().body;
@@ -209,10 +213,30 @@ TEST_F(MasterQuotaTest, SetInvalidRequest)
       << response.get().body;
   }
 
+  // Tests whether a quota request with missing 'role' field fails.
+  {
+    const string badRequest =
+      "{"
+      "  \"resources\":["
+      "    {"
+      "      \"name\":\"cpus\","
+      "      \"type\":\"SCALAR\","
+      "      \"scalar\":{\"value\":1}"
+      "    }"
+      "  ]"
+      "}";
+
+    Future<Response> response = postQuota(badRequest);
+
+    AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response)
+      << response.get().body;
+  }
+
   // Tests whether a quota request with missing 'resource' field fails.
   {
     const string badRequest =
       "{"
+      "  \"role\":\"some-role\","
       "  \"unknownField\":\"unknownValue\""
       "}";
 
@@ -253,13 +277,13 @@ TEST_F(MasterQuotaTest, SetNonScalar)
 
   // Quota set request including non-scalar port resources.
   Resources quotaResources =
-    Resources::parse("cpus:1;mem:512;ports:[31000-31001]", ROLE1).get();
+    Resources::parse("cpus:1;mem:512;ports:[31000-31001]").get();
 
   Future<Response> response = process::http::post(
       master.get(),
       "quota",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(quotaResources));
+      createRequestBody(ROLE1, quotaResources));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response)
     << response.get().body;
@@ -268,8 +292,9 @@ TEST_F(MasterQuotaTest, SetNonScalar)
 }
 
 
-// A quota request with multiple roles should return a '400 Bad Request'.
-TEST_F(MasterQuotaTest, SetMultipleRoles)
+// A quota request with a role set in any of the `Resource` objects
+// should return a '400 Bad Request'.
+TEST_F(MasterQuotaTest, ResourcesSpecifyRole)
 {
   Try<PID<Master>> master = StartMaster();
   ASSERT_SOME(master);
@@ -277,15 +302,14 @@ TEST_F(MasterQuotaTest, SetMultipleRoles)
   // We do not need an agent since a request should be rejected before
   // we start looking at available resources.
 
-  // Create a quota request with resources belonging to different roles.
+  // Create a quota request with the 'role' field set in resources.
   Resources quotaResources = Resources::parse("cpus:1;mem:512;", ROLE1).get();
-  quotaResources += Resources::parse("cpus:1;mem:512;", ROLE2).get();
 
   Future<Response> response = process::http::post(
       master.get(),
       "quota",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(quotaResources));
+      createRequestBody(ROLE1, quotaResources));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response)
     << response.get().body;
@@ -317,14 +341,14 @@ TEST_F(MasterQuotaTest, SetExistingQuota)
   EXPECT_EQ(defaultAgentResources, agentTotalResources.get());
 
   // We request quota for a portion of resources available on the agent.
-  Resources quotaResources = Resources::parse("cpus:1;mem:512;", ROLE1).get();
-  EXPECT_TRUE(agentTotalResources.get().contains(quotaResources.flatten()));
+  Resources quotaResources = Resources::parse("cpus:1;mem:512;").get();
+  EXPECT_TRUE(agentTotalResources.get().contains(quotaResources));
 
   Future<Response> response = process::http::post(
       master.get(),
       "quota",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(quotaResources));
+      createRequestBody(ROLE1, quotaResources));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response) << response.get().body;
 
@@ -333,7 +357,7 @@ TEST_F(MasterQuotaTest, SetExistingQuota)
       master.get(),
       "quota",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(quotaResources));
+      createRequestBody(ROLE1, quotaResources));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response)
     << response.get().body;
@@ -357,7 +381,7 @@ TEST_F(MasterQuotaTest, SetInvalidResourceInfos)
   // Create a quota set request with `DiskInfo` and check that the
   // request returns a '400 Bad Request' return code.
   {
-    Resources quotaResources = Resources::parse("cpus:1;mem:512", ROLE1).get();
+    Resources quotaResources = Resources::parse("cpus:1;mem:512").get();
 
     Resource volume = Resources::parse("disk", "128", ROLE1).get();
     volume.mutable_disk()->CopyFrom(createDiskInfo("id1", "path1"));
@@ -367,7 +391,7 @@ TEST_F(MasterQuotaTest, SetInvalidResourceInfos)
         master.get(),
         "quota",
         createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-        createRequestBody(quotaResources));
+        createRequestBody(ROLE1, quotaResources));
 
     AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response)
       << response.get().body;
@@ -376,9 +400,9 @@ TEST_F(MasterQuotaTest, SetInvalidResourceInfos)
   // Create a quota set request with `RevocableInfo` and check that
   // the request returns a '400 Bad Request' return code.
   {
-    Resources quotaResources = Resources::parse("cpus:1;mem:512", ROLE1).get();
+    Resources quotaResources = Resources::parse("cpus:1;mem:512").get();
 
-    Resource revocable = Resources::parse("cpus", "1", ROLE1).get();
+    Resource revocable = Resources::parse("cpus", "1", "*").get();
     revocable.mutable_revocable();
     quotaResources += revocable;
 
@@ -386,7 +410,7 @@ TEST_F(MasterQuotaTest, SetInvalidResourceInfos)
         master.get(),
         "quota",
         createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-        createRequestBody(quotaResources));
+        createRequestBody(ROLE1, quotaResources));
 
     AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response)
       << response.get().body;
@@ -395,7 +419,7 @@ TEST_F(MasterQuotaTest, SetInvalidResourceInfos)
   // Create a quota set request with `ReservationInfo` and check that
   // the request returns a '400 Bad Request' return code.
   {
-    Resources quotaResources = Resources::parse("cpus:4;mem:512", ROLE1).get();
+    Resources quotaResources = Resources::parse("cpus:4;mem:512").get();
 
     Resource volume = Resources::parse("disk", "128", ROLE1).get();
     volume.mutable_reservation()->CopyFrom(
@@ -407,7 +431,7 @@ TEST_F(MasterQuotaTest, SetInvalidResourceInfos)
         master.get(),
         "quota",
         createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-        createRequestBody(quotaResources));
+        createRequestBody(ROLE1, quotaResources));
 
     AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response)
       << response.get().body;
@@ -466,14 +490,14 @@ TEST_F(MasterQuotaTest, RemoveSingleQuota)
   // Ensure we can remove the quota we have requested before.
   {
     // Request quota for a portion of the resources available on the agent.
-    Resources quotaResources = Resources::parse("cpus:1;mem:512", ROLE1).get();
-    EXPECT_TRUE(agentTotalResources.get().contains(quotaResources.flatten()));
+    Resources quotaResources = Resources::parse("cpus:1;mem:512").get();
+    EXPECT_TRUE(agentTotalResources.get().contains(quotaResources));
 
     Future<Response> response = process::http::post(
         master.get(),
         "quota",
         createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-        createRequestBody(quotaResources));
+        createRequestBody(ROLE1, quotaResources));
 
     AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response)
       << response.get().body;
@@ -555,16 +579,16 @@ TEST_F(MasterQuotaTest, StatusSingleQuota)
   EXPECT_EQ(defaultAgentResources, agentTotalResources.get());
 
   // We request quota for a portion of resources available on the agents.
-  Resources quotaResources = Resources::parse("cpus:1;mem:512", ROLE1).get();
+  Resources quotaResources = Resources::parse("cpus:1;mem:512").get();
 
-  EXPECT_TRUE(agentTotalResources.get().contains(quotaResources.flatten()));
+  EXPECT_TRUE(agentTotalResources.get().contains(quotaResources));
 
   // Send a quota request for the specified role.
   Future<Response> response = process::http::post(
       master.get(),
       "quota",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(quotaResources));
+      createRequestBody(ROLE1, quotaResources));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response) << response.get().body;
 
@@ -590,7 +614,7 @@ TEST_F(MasterQuotaTest, StatusSingleQuota)
   ASSERT_FALSE(status.isError());
 
   ASSERT_EQ(1, status.get().infos().size());
-  EXPECT_EQ(quotaResources.flatten(), status.get().infos(0).guarantee());
+  EXPECT_EQ(quotaResources, status.get().infos(0).guarantee());
 
   Shutdown();
 }
@@ -645,15 +669,13 @@ TEST_F(MasterQuotaTest, InsufficientResourcesSingleAgent)
         }) +
     Resources::parse("cpus:1;mem:1024").get();
 
-  quotaResources = quotaResources.flatten(ROLE1);
-
-  EXPECT_FALSE(agentTotalResources.get().contains(quotaResources.flatten()));
+  EXPECT_FALSE(agentTotalResources.get().contains(quotaResources));
 
   Future<Response> response = process::http::post(
       master.get(),
       "quota",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(quotaResources));
+      createRequestBody(ROLE1, quotaResources));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Conflict().status, response)
     << response.get().body;
@@ -692,15 +714,13 @@ TEST_F(MasterQuotaTest, InsufficientResourcesForce)
         }) +
     Resources::parse("cpus:1;mem:1024").get();
 
-  quotaResources = quotaResources.flatten(ROLE1);
-
-  EXPECT_FALSE(agentTotalResources.get().contains(quotaResources.flatten()));
+  EXPECT_FALSE(agentTotalResources.get().contains(quotaResources));
 
   Future<Response> response = process::http::post(
       master.get(),
       "quota",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(quotaResources, true));
+      createRequestBody(ROLE1, quotaResources, true));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response)
     << response.get().body;
@@ -754,15 +774,14 @@ TEST_F(MasterQuotaTest, InsufficientResourcesMultipleAgents)
     }) +
     Resources::parse("cpus:1;mem:1024").get();
 
-  quotaResources = quotaResources.flatten(ROLE1);
   EXPECT_FALSE((agent1TotalResources.get() + agent2TotalResources.get())
-    .contains(quotaResources.flatten()));
+    .contains(quotaResources));
 
   Future<Response> response = process::http::post(
       master.get(),
       "quota",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(quotaResources));
+      createRequestBody(ROLE1, quotaResources));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Conflict().status, response)
     << response.get().body;
@@ -794,8 +813,8 @@ TEST_F(MasterQuotaTest, AvailableResourcesSingleAgent)
   EXPECT_EQ(defaultAgentResources, agentTotalResources.get());
 
   // We request quota for a portion of resources available on the agent.
-  Resources quotaResources = Resources::parse("cpus:1;mem:512", ROLE1).get();
-  EXPECT_TRUE(agentTotalResources.get().contains(quotaResources.flatten()));
+  Resources quotaResources = Resources::parse("cpus:1;mem:512").get();
+  EXPECT_TRUE(agentTotalResources.get().contains(quotaResources));
 
   // Send a quota request for the specified role.
   Future<QuotaInfo> receivedQuotaRequest;
@@ -807,7 +826,7 @@ TEST_F(MasterQuotaTest, AvailableResourcesSingleAgent)
       master.get(),
       "quota",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(quotaResources));
+      createRequestBody(ROLE1, quotaResources));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response) << response.get().body;
 
@@ -816,8 +835,7 @@ TEST_F(MasterQuotaTest, AvailableResourcesSingleAgent)
   AWAIT_READY(receivedQuotaRequest);
 
   EXPECT_EQ(ROLE1, receivedQuotaRequest.get().role());
-  EXPECT_EQ(quotaResources.flatten(),
-            Resources(receivedQuotaRequest.get().guarantee()));
+  EXPECT_EQ(quotaResources, Resources(receivedQuotaRequest.get().guarantee()));
 
   Shutdown();
 }
@@ -867,8 +885,6 @@ TEST_F(MasterQuotaTest, AvailableResourcesMultipleAgents)
       return (resource.name() == "cpus" || resource.name() == "mem");
     });
 
-  quotaResources = quotaResources.flatten(ROLE1);
-
   // Send a quota request for the specified role.
   Future<QuotaInfo> receivedQuotaRequest;
   EXPECT_CALL(allocator, setQuota(Eq(ROLE1), _))
@@ -879,7 +895,7 @@ TEST_F(MasterQuotaTest, AvailableResourcesMultipleAgents)
       master.get(),
       "quota",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(quotaResources));
+      createRequestBody(ROLE1, quotaResources));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response) << response.get().body;
 
@@ -888,8 +904,7 @@ TEST_F(MasterQuotaTest, AvailableResourcesMultipleAgents)
   AWAIT_READY(receivedQuotaRequest);
 
   EXPECT_EQ(ROLE1, receivedQuotaRequest.get().role());
-  EXPECT_EQ(quotaResources.flatten(),
-            Resources(receivedQuotaRequest.get().guarantee()));
+  EXPECT_EQ(quotaResources, Resources(receivedQuotaRequest.get().guarantee()));
 
   Shutdown();
 }
@@ -1009,7 +1024,7 @@ TEST_F(MasterQuotaTest, AvailableResourcesAfterRescinding)
 
   // We request quota for a portion of resources which is smaller than
   // the total cluster capacity and can fit into any single agent.
-  Resources quotaResources = Resources::parse("cpus:1;mem:512", ROLE2).get();
+  Resources quotaResources = Resources::parse("cpus:1;mem:512").get();
 
   // Once the quota request reaches the master, it should trigger a series
   // of rescinds. Even though quota request resources can be satisfied with
@@ -1028,7 +1043,7 @@ TEST_F(MasterQuotaTest, AvailableResourcesAfterRescinding)
       master.get(),
       "quota",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(quotaResources));
+      createRequestBody(ROLE2, quotaResources));
 
   // At some point before the response is sent, offers are rescinded,
   // but resources are not yet allocated. At this moment the cluster
@@ -1047,8 +1062,7 @@ TEST_F(MasterQuotaTest, AvailableResourcesAfterRescinding)
   // got lost in-between.
   AWAIT_READY(receivedQuotaRequest);
   EXPECT_EQ(ROLE2, receivedQuotaRequest.get().role());
-  EXPECT_EQ(quotaResources.flatten(),
-            Resources(receivedQuotaRequest.get().guarantee()));
+  EXPECT_EQ(quotaResources, Resources(receivedQuotaRequest.get().guarantee()));
 
   Shutdown();
 }
@@ -1121,8 +1135,8 @@ TEST_F(MasterQuotaTest, NoAuthenticationNoAuthorization)
   // Check whether quota can be set.
   {
     // Request quota for a portion of the resources available on the agent.
-    Resources quotaResources = Resources::parse("cpus:1;mem:512", ROLE1).get();
-    EXPECT_TRUE(agentTotalResources.get().contains(quotaResources.flatten()));
+    Resources quotaResources = Resources::parse("cpus:1;mem:512").get();
+    EXPECT_TRUE(agentTotalResources.get().contains(quotaResources));
 
     Future<QuotaInfo> receivedSetRequest;
     EXPECT_CALL(allocator, setQuota(Eq(ROLE1), _))
@@ -1134,7 +1148,7 @@ TEST_F(MasterQuotaTest, NoAuthenticationNoAuthorization)
         master.get(),
         "quota",
         None(),
-        createRequestBody(quotaResources));
+        createRequestBody(ROLE1, quotaResources));
 
     // Quota request succeeds and reaches the allocator.
     AWAIT_READY(receivedSetRequest);
@@ -1176,7 +1190,7 @@ TEST_F(MasterQuotaTest, UnauthenticatedQuotaRequest)
 
   // A request can contain any amount of resources because it will be rejected
   // before we start looking at available resources.
-  Resources quotaResources = Resources::parse("cpus:1;mem:512", ROLE1).get();
+  Resources quotaResources = Resources::parse("cpus:1;mem:512").get();
 
   // The master is configured so that only requests from `DEFAULT_CREDENTIAL`
   // are authenticated.
@@ -1188,7 +1202,7 @@ TEST_F(MasterQuotaTest, UnauthenticatedQuotaRequest)
       master.get(),
       "quota",
       createBasicAuthHeaders(credential),
-      createRequestBody(quotaResources));
+      createRequestBody(ROLE1, quotaResources));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(
       Unauthorized(vector<string>()).status, response1) << response1.get().body;
@@ -1198,7 +1212,7 @@ TEST_F(MasterQuotaTest, UnauthenticatedQuotaRequest)
       master.get(),
       "quota",
       None(),
-      createRequestBody(quotaResources));
+      createRequestBody(ROLE1, quotaResources));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(
       Unauthorized(vector<string>()).status, response2) << response2.get().body;
@@ -1247,7 +1261,7 @@ TEST_F(MasterQuotaTest, AuthorizeQuotaRequests)
     // As we don't care about the enforcement of quota but only the
     // authorization of the quota request we set the force flag in the post
     // request below to override the capacity heuristic check.
-    Resources quotaResources = Resources::parse("cpus:1;mem:512;", ROLE1).get();
+    Resources quotaResources = Resources::parse("cpus:1;mem:512;").get();
 
     // Note that we set the force flag because we are setting a quota that
     // cannot currently be satisfied by the resources in the cluster (because
@@ -1256,7 +1270,7 @@ TEST_F(MasterQuotaTest, AuthorizeQuotaRequests)
         master.get(),
         "quota",
         createBasicAuthHeaders(DEFAULT_CREDENTIAL_2),
-        createRequestBody(quotaResources, true));
+        createRequestBody(ROLE1, quotaResources, true));
 
     AWAIT_EXPECT_RESPONSE_STATUS_EQ(
         Unauthorized("Mesos master").status, response) << response.get().body;
@@ -1267,7 +1281,7 @@ TEST_F(MasterQuotaTest, AuthorizeQuotaRequests)
     // As we don't care about the enforcement of quota but only the
     // authorization of the quota request we set the force flag in the post
     // request below to override the capacity heuristic check.
-    Resources quotaResources = Resources::parse("cpus:1;mem:512;", ROLE1).get();
+    Resources quotaResources = Resources::parse("cpus:1;mem:512;").get();
 
     Future<QuotaInfo> quotaInfo;
     EXPECT_CALL(allocator, setQuota(Eq(ROLE1), _))
@@ -1281,7 +1295,7 @@ TEST_F(MasterQuotaTest, AuthorizeQuotaRequests)
         master.get(),
         "quota",
         createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-        createRequestBody(quotaResources, true));
+        createRequestBody(ROLE1, quotaResources, true));
 
     AWAIT_EXPECT_RESPONSE_STATUS_EQ(
         OK().status, response) << response.get().body;
@@ -1295,7 +1309,7 @@ TEST_F(MasterQuotaTest, AuthorizeQuotaRequests)
 
     EXPECT_EQ(ROLE1, quotaInfo.get().role());
     EXPECT_EQ(principal, quotaInfo.get().principal());
-    EXPECT_EQ(quotaResources.flatten(), quotaInfo.get().guarantee());
+    EXPECT_EQ(quotaResources, quotaInfo.get().guarantee());
   }
 
   // Try to remove the previously requested quota using a principal that is
@@ -1366,7 +1380,7 @@ TEST_F(MasterQuotaTest, AuthorizeQuotaRequestsWithoutPrincipal)
     // As we don't care about the enforcement of quota but only the
     // authorization of the quota request we set the force flag in the post
     // request below to override the capacity heuristic check.
-    Resources quotaResources = Resources::parse("cpus:1;mem:512;", ROLE1).get();
+    Resources quotaResources = Resources::parse("cpus:1;mem:512;").get();
 
     // Create a HTTP request without authorization headers. Note that we set the
     // force flag because we are setting a quota that cannot currently be
@@ -1375,7 +1389,7 @@ TEST_F(MasterQuotaTest, AuthorizeQuotaRequestsWithoutPrincipal)
         master.get(),
         "quota",
         None(),
-        createRequestBody(quotaResources, true));
+        createRequestBody(ROLE1, quotaResources, true));
 
     AWAIT_EXPECT_RESPONSE_STATUS_EQ(
         OK().status, response) << response.get().body;

http://git-wip-us.apache.org/repos/asf/mesos/blob/f23129e1/src/tests/role_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/role_tests.cpp b/src/tests/role_tests.cpp
index e081abf..9793913 100644
--- a/src/tests/role_tests.cpp
+++ b/src/tests/role_tests.cpp
@@ -477,8 +477,7 @@ TEST_F(RoleTest, EndpointImplicitRolesQuotas)
   Try<PID<Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Resources quotaResources =
-    Resources::parse("cpus:1;mem:512", "non-existent-role").get();
+  Resources quotaResources = Resources::parse("cpus:1;mem:512").get();
   const RepeatedPtrField<Resource>& jsonQuotaResources =
     static_cast<const RepeatedPtrField<Resource>&>(quotaResources);
 
@@ -487,7 +486,7 @@ TEST_F(RoleTest, EndpointImplicitRolesQuotas)
   // currently be satisfied by the resources in the cluster (because
   // there are no slaves registered).
   string quotaRequestBody = strings::format(
-      "{\"resources\":%s,\"force\":true}",
+      "{\"role\":\"non-existent-role\",\"resources\":%s,\"force\":true}",
       JSON::protobuf(jsonQuotaResources)).get();
 
   Future<Response> quotaResponse = process::http::post(