You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by al...@apache.org on 2017/06/07 10:02:05 UTC

[1/3] mesos git commit: Made persistent volume endpoints tests independent from allocator.

Repository: mesos
Updated Branches:
  refs/heads/master 79daf9769 -> cae76904a


Made persistent volume endpoints tests independent from allocator.

The tests in the case often require an agent ID. To obtain the ID they
were using a mock allocator to grab agent ID, but not other operations
with the allocator were performed.

Instead we now just capture the SlaveRegisteredMessage in order to
learn an agent's ID.

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


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

Branch: refs/heads/master
Commit: 430998e942d3dd775eaa641f6b91943ef80bf1b3
Parents: 79daf97
Author: Benjamin Bannier <be...@mesosphere.io>
Authored: Wed Jun 7 11:11:21 2017 +0200
Committer: Alexander Rukletsov <al...@apache.org>
Committed: Wed Jun 7 11:11:21 2017 +0200

----------------------------------------------------------------------
 src/tests/persistent_volume_endpoints_tests.cpp | 454 ++++++++-----------
 1 file changed, 190 insertions(+), 264 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/430998e9/src/tests/persistent_volume_endpoints_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/persistent_volume_endpoints_tests.cpp b/src/tests/persistent_volume_endpoints_tests.cpp
index 8d0a797..1d76433 100644
--- a/src/tests/persistent_volume_endpoints_tests.cpp
+++ b/src/tests/persistent_volume_endpoints_tests.cpp
@@ -36,7 +36,6 @@
 #include "master/flags.hpp"
 #include "master/master.hpp"
 
-#include "tests/allocator.hpp"
 #include "tests/mesos.hpp"
 #include "tests/resources_utils.hpp"
 #include "tests/utils.hpp"
@@ -112,25 +111,22 @@ public:
 // statically reserved resources, and can then destroy that volume.
 TEST_F(PersistentVolumeEndpointsTest, StaticReservation)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(role1):1024";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Resources volume = createPersistentVolume(
       Megabytes(64),
       "role1",
@@ -144,7 +140,7 @@ TEST_F(PersistentVolumeEndpointsTest, StaticReservation)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, createResponse);
 
@@ -183,7 +179,7 @@ TEST_F(PersistentVolumeEndpointsTest, StaticReservation)
       master.get()->pid,
       "destroy-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, destroyResponse);
 
@@ -208,25 +204,22 @@ TEST_F(PersistentVolumeEndpointsTest, StaticReservation)
 // dynamically reserved resources, and can then destroy that volume.
 TEST_F(PersistentVolumeEndpointsTest, DynamicReservation)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(*):1024";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources unreserved = Resources::parse("disk:1024").get();
@@ -238,7 +231,7 @@ TEST_F(PersistentVolumeEndpointsTest, DynamicReservation)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "resources", dynamicallyReserved));
+      createRequestBody(slaveId, "resources", dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -287,7 +280,7 @@ TEST_F(PersistentVolumeEndpointsTest, DynamicReservation)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -312,7 +305,7 @@ TEST_F(PersistentVolumeEndpointsTest, DynamicReservation)
       master.get()->pid,
       "destroy-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -330,25 +323,22 @@ TEST_F(PersistentVolumeEndpointsTest, DynamicReservation)
 // the slave have been reserved by a different role.
 TEST_F(PersistentVolumeEndpointsTest, DynamicReservationRoleMismatch)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(*):1024";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources unreserved = Resources::parse("disk:1024").get();
@@ -360,7 +350,7 @@ TEST_F(PersistentVolumeEndpointsTest, DynamicReservationRoleMismatch)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "resources", dynamicallyReserved));
+      createRequestBody(slaveId, "resources", dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -399,7 +389,7 @@ TEST_F(PersistentVolumeEndpointsTest, DynamicReservationRoleMismatch)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Conflict().status, response);
 
@@ -412,25 +402,22 @@ TEST_F(PersistentVolumeEndpointsTest, DynamicReservationRoleMismatch)
 // persistent volume results in a 'Conflict' HTTP error.
 TEST_F(PersistentVolumeEndpointsTest, UnreserveVolumeResources)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(*):1024";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources unreserved = Resources::parse("disk:1024").get();
@@ -442,7 +429,7 @@ TEST_F(PersistentVolumeEndpointsTest, UnreserveVolumeResources)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "resources", dynamicallyReserved));
+      createRequestBody(slaveId, "resources", dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -459,7 +446,7 @@ TEST_F(PersistentVolumeEndpointsTest, UnreserveVolumeResources)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -467,7 +454,7 @@ TEST_F(PersistentVolumeEndpointsTest, UnreserveVolumeResources)
       master.get()->pid,
       "unreserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "resources", dynamicallyReserved));
+      createRequestBody(slaveId, "resources", dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Conflict().status, response);
 }
@@ -477,25 +464,21 @@ TEST_F(PersistentVolumeEndpointsTest, UnreserveVolumeResources)
 // invalid resource will receive a Bad Request response.
 TEST_F(PersistentVolumeEndpointsTest, InvalidVolume)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(role1):1024";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
-  AWAIT_READY(slaveId);
+
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
 
   // This volume has role "*", which is not allowed.
   Try<Resource> disk = Resources::parse("disk", "64", "*");
@@ -512,7 +495,7 @@ TEST_F(PersistentVolumeEndpointsTest, InvalidVolume)
   // function `createRequestBody` accepts `Resources`.
   string body = strings::format(
         "slaveId=%s&volumes=[%s]",
-        slaveId->value(),
+        slaveId.value(),
         JSON::protobuf(volume)).get();
 
   {
@@ -545,25 +528,22 @@ TEST_F(PersistentVolumeEndpointsTest, InvalidVolume)
 // reserved resources at the slave results in a 'Conflict' HTTP error.
 TEST_F(PersistentVolumeEndpointsTest, VolumeExceedsReservedSize)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(role1):1024";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Resources volume = createPersistentVolume(
       Megabytes(1025),
       "role1",
@@ -577,7 +557,7 @@ TEST_F(PersistentVolumeEndpointsTest, VolumeExceedsReservedSize)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Conflict().status, createResponse);
 }
@@ -587,25 +567,22 @@ TEST_F(PersistentVolumeEndpointsTest, VolumeExceedsReservedSize)
 // volume results in a 'BadRequest' HTTP error.
 TEST_F(PersistentVolumeEndpointsTest, DeleteNonExistentVolume)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(role1):1024";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Resources volume = createPersistentVolume(
       Megabytes(64),
       "role1",
@@ -619,7 +596,7 @@ TEST_F(PersistentVolumeEndpointsTest, DeleteNonExistentVolume)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, createResponse);
 
@@ -637,7 +614,7 @@ TEST_F(PersistentVolumeEndpointsTest, DeleteNonExistentVolume)
       master.get()->pid,
       "destroy-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", badVolumeId));
+      createRequestBody(slaveId, "volumes", badVolumeId));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, destroyResponse);
 
@@ -655,7 +632,7 @@ TEST_F(PersistentVolumeEndpointsTest, DeleteNonExistentVolume)
       master.get()->pid,
       "destroy-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", badRole));
+      createRequestBody(slaveId, "volumes", badRole));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, destroyResponse);
 
@@ -673,7 +650,7 @@ TEST_F(PersistentVolumeEndpointsTest, DeleteNonExistentVolume)
       master.get()->pid,
       "destroy-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", badSize));
+      createRequestBody(slaveId, "volumes", badSize));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, destroyResponse);
 
@@ -693,7 +670,7 @@ TEST_F(PersistentVolumeEndpointsTest, DeleteNonExistentVolume)
       master.get()->pid,
       "destroy-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", differentPath));
+      createRequestBody(slaveId, "volumes", differentPath));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, destroyResponse);
 }
@@ -703,25 +680,22 @@ TEST_F(PersistentVolumeEndpointsTest, DeleteNonExistentVolume)
 // authorization header results in an 'Unauthorized' HTTP error.
 TEST_F(PersistentVolumeEndpointsTest, NoHeader)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(role1):1024";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources volume = createPersistentVolume(
@@ -737,7 +711,7 @@ TEST_F(PersistentVolumeEndpointsTest, NoHeader)
       master.get()->pid,
       "create-volumes",
       None(),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(
       Unauthorized({}).status,
@@ -747,7 +721,7 @@ TEST_F(PersistentVolumeEndpointsTest, NoHeader)
       master.get()->pid,
       "destroy-volumes",
       None(),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(
       Unauthorized({}).status,
@@ -759,25 +733,22 @@ TEST_F(PersistentVolumeEndpointsTest, NoHeader)
 // credentials results in an 'Unauthorized' HTTP error.
 TEST_F(PersistentVolumeEndpointsTest, BadCredentials)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(role1):1024";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Credential credential;
   credential.set_principal("bad-principal");
   credential.set_secret("bad-secret");
@@ -792,7 +763,7 @@ TEST_F(PersistentVolumeEndpointsTest, BadCredentials)
       DEFAULT_CREDENTIAL.principal());
 
   process::http::Headers headers = createBasicAuthHeaders(credential);
-  string body = createRequestBody(slaveId.get(), "volumes", volume);
+  string body = createRequestBody(slaveId, "volumes", volume);
 
   Future<Response> response =
     process::http::post(master.get()->pid, "create-volumes", headers, body);
@@ -817,7 +788,6 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateAndDestroyACL)
   // Pause the clock to gain control over the offer cycle.
   Clock::pause();
 
-  TestAllocator<> allocator;
   ACLs acls;
 
   // This ACL asserts that the principal of `DEFAULT_CREDENTIAL`
@@ -837,9 +807,7 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateAndDestroyACL)
   master::Flags masterFlags = CreateMasterFlags();
   masterFlags.acls = acls;
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
   // Create a slave. Disk resources are statically reserved to allow the
@@ -847,17 +815,19 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateAndDestroyACL)
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:1;mem:512;disk(role1):1024";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator), FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
-  // Advance clock to trigger agent registration befor we HTTP POST.
+  // Advance clock to trigger agent registration before we HTTP POST.
   Clock::advance(slaveFlags.registration_backoff_factor);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   process::http::Headers headers = createBasicAuthHeaders(DEFAULT_CREDENTIAL);
 
   Resources volume = createPersistentVolume(
@@ -873,7 +843,7 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateAndDestroyACL)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, createResponse);
 
@@ -915,7 +885,7 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateAndDestroyACL)
       master.get()->pid,
       "destroy-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, destroyResponse);
 
@@ -947,7 +917,6 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateACLMultipleRoles)
   const string AUTHORIZED_ROLE_1 = "potato_head";
   const string AUTHORIZED_ROLE_2 = "gumby";
 
-  TestAllocator<> allocator;
   ACLs acls;
 
   // This ACL asserts that the principal of `DEFAULT_CREDENTIAL`
@@ -960,9 +929,7 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateACLMultipleRoles)
   master::Flags masterFlags = CreateMasterFlags();
   masterFlags.acls = acls;
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
   // Create a slave. Disk resources are statically reserved to allow the
@@ -972,14 +939,16 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateACLMultipleRoles)
     "cpus:1;mem:512;disk(" + AUTHORIZED_ROLE_1 + "):1024;disk(" +
     AUTHORIZED_ROLE_2 + "):1024";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator), FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Resources volume1 = createPersistentVolume(
       Megabytes(64),
       AUTHORIZED_ROLE_1,
@@ -1004,7 +973,7 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateACLMultipleRoles)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volumesMultipleRoles));
+      createRequestBody(slaveId, "volumes", volumesMultipleRoles));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 }
@@ -1017,7 +986,6 @@ TEST_F(PersistentVolumeEndpointsTest, BadCreateAndDestroyACL)
   // Pause the clock to gain control over the offer cycle.
   Clock::pause();
 
-  TestAllocator<> allocator;
   ACLs acls;
 
   // This ACL asserts that the principal of `DEFAULT_CREDENTIAL_2`
@@ -1045,9 +1013,7 @@ TEST_F(PersistentVolumeEndpointsTest, BadCreateAndDestroyACL)
   master::Flags masterFlags = CreateMasterFlags();
   masterFlags.acls = acls;
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
   // Create a slave. Disk resources are statically reserved to allow the
@@ -1055,18 +1021,19 @@ TEST_F(PersistentVolumeEndpointsTest, BadCreateAndDestroyACL)
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:1;mem:512;disk(role1):1024";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
-  // Advance clock to trigger agent registration befor we HTTP POST.
+  // Advance clock to trigger agent registration before we HTTP POST.
   Clock::advance(slaveFlags.registration_backoff_factor);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   // The failed creation attempt.
   {
     Resources volume = createPersistentVolume(
@@ -1082,7 +1049,7 @@ TEST_F(PersistentVolumeEndpointsTest, BadCreateAndDestroyACL)
         master.get()->pid,
         "create-volumes",
         createBasicAuthHeaders(DEFAULT_CREDENTIAL_2),
-        createRequestBody(slaveId.get(), "volumes", volume));
+        createRequestBody(slaveId, "volumes", volume));
 
     AWAIT_EXPECT_RESPONSE_STATUS_EQ(Forbidden().status, response);
   }
@@ -1102,7 +1069,7 @@ TEST_F(PersistentVolumeEndpointsTest, BadCreateAndDestroyACL)
         master.get()->pid,
         "create-volumes",
         createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-        createRequestBody(slaveId.get(), "volumes", volume));
+        createRequestBody(slaveId, "volumes", volume));
 
     AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
   }
@@ -1138,7 +1105,7 @@ TEST_F(PersistentVolumeEndpointsTest, BadCreateAndDestroyACL)
       master.get()->pid,
       "destroy-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL_2),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Forbidden().status, destroyResponse);
 
@@ -1155,7 +1122,6 @@ TEST_F(PersistentVolumeEndpointsTest, BadCreateACLMultipleRoles)
   const string AUTHORIZED_ROLE = "potato_head";
   const string UNAUTHORIZED_ROLE = "gumby";
 
-  TestAllocator<> allocator;
   ACLs acls;
 
   // This ACL asserts that the principal of `DEFAULT_CREDENTIAL`
@@ -1174,9 +1140,7 @@ TEST_F(PersistentVolumeEndpointsTest, BadCreateACLMultipleRoles)
   master::Flags masterFlags = CreateMasterFlags();
   masterFlags.acls = acls;
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
   // Create a slave. Disk resources are statically reserved to allow the
@@ -1186,14 +1150,16 @@ TEST_F(PersistentVolumeEndpointsTest, BadCreateACLMultipleRoles)
     "cpus:1;mem:512;disk(" + AUTHORIZED_ROLE + "):1024;disk(" +
     UNAUTHORIZED_ROLE + "):1024";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator), FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Resources volume1 = createPersistentVolume(
       Megabytes(64),
       AUTHORIZED_ROLE,
@@ -1218,7 +1184,7 @@ TEST_F(PersistentVolumeEndpointsTest, BadCreateACLMultipleRoles)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volumesMultipleRoles));
+      createRequestBody(slaveId, "volumes", volumesMultipleRoles));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Forbidden().status, response);
 }
@@ -1238,7 +1204,6 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateAndDestroyACLBadCredential)
   failedCredential.set_principal("awesome-principal");
   failedCredential.set_secret("super-secret-secret");
 
-  TestAllocator<> allocator;
   ACLs acls;
 
   // This ACL asserts that the principal of `failedCredential`
@@ -1264,9 +1229,7 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateAndDestroyACLBadCredential)
   master::Flags masterFlags = CreateMasterFlags();
   masterFlags.acls = acls;
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
   // Create a slave. Disk resources are statically reserved to allow the
@@ -1274,18 +1237,19 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateAndDestroyACLBadCredential)
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:1;mem:512;disk(role1):1024";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
-  // Advance clock to trigger agent registration befor we HTTP POST.
+  // Advance clock to trigger agent registration before we HTTP POST.
   Clock::advance(slaveFlags.registration_backoff_factor);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Resources volume = createPersistentVolume(
       Megabytes(64),
       "role1",
@@ -1300,7 +1264,7 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateAndDestroyACLBadCredential)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(failedCredential),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(
       Unauthorized({}).status,
@@ -1311,7 +1275,7 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateAndDestroyACLBadCredential)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, createResponse);
 
@@ -1346,7 +1310,7 @@ TEST_F(PersistentVolumeEndpointsTest, GoodCreateAndDestroyACLBadCredential)
       master.get()->pid,
       "destroy-volumes",
       createBasicAuthHeaders(failedCredential),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(
       Unauthorized({}).status,
@@ -1366,15 +1330,11 @@ TEST_F(PersistentVolumeEndpointsTest, NoAuthentication)
 {
   const string TEST_ROLE = "role1";
 
-  TestAllocator<> allocator;
-
   // Create master flags that will disable authentication.
   master::Flags masterFlags = CreateMasterFlags();
   masterFlags.authenticate_http_readwrite = false;
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
   // Create an agent with statically reserved disk resources to allow the
@@ -1382,15 +1342,15 @@ TEST_F(PersistentVolumeEndpointsTest, NoAuthentication)
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:1;mem:512;disk(" + TEST_ROLE + "):1024";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator), FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
-  AWAIT_READY(slaveId);
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
 
   Resources volume = createPersistentVolume(
       Megabytes(64),
@@ -1407,7 +1367,7 @@ TEST_F(PersistentVolumeEndpointsTest, NoAuthentication)
         master.get()->pid,
         "create-volumes",
         None(),
-        createRequestBody(slaveId.get(), "volumes", volume));
+        createRequestBody(slaveId, "volumes", volume));
 
     AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
   }
@@ -1418,7 +1378,7 @@ TEST_F(PersistentVolumeEndpointsTest, NoAuthentication)
         master.get()->pid,
         "destroy-volumes",
         None(),
-        createRequestBody(slaveId.get(), "volumes", volume));
+        createRequestBody(slaveId, "volumes", volume));
 
     AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
   }
@@ -1429,25 +1389,22 @@ TEST_F(PersistentVolumeEndpointsTest, NoAuthentication)
 // 'slaveId' results in a 'BadRequest' HTTP error.
 TEST_F(PersistentVolumeEndpointsTest, NoSlaveId)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(role1):1024";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Resources volume = createPersistentVolume(
       Megabytes(64),
       "role1",
@@ -1473,7 +1430,7 @@ TEST_F(PersistentVolumeEndpointsTest, NoSlaveId)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -1488,17 +1445,11 @@ TEST_F(PersistentVolumeEndpointsTest, NoSlaveId)
 // the 'volumes' parameter results in a 'BadRequest' HTTP error.
 TEST_F(PersistentVolumeEndpointsTest, NoVolumes)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(role1):1024";
@@ -1507,8 +1458,11 @@ TEST_F(PersistentVolumeEndpointsTest, NoVolumes)
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   process::http::Headers headers = createBasicAuthHeaders(DEFAULT_CREDENTIAL);
-  string body = "slaveId=" + slaveId->value();
+  string body = "slaveId=" + slaveId.value();
 
   Future<Response> response =
     process::http::post(master.get()->pid, "create-volumes", headers, body);
@@ -1529,7 +1483,7 @@ TEST_F(PersistentVolumeEndpointsTest, NoVolumes)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -1545,25 +1499,22 @@ TEST_F(PersistentVolumeEndpointsTest, NoVolumes)
 // using the HTTP endpoints.
 TEST_F(PersistentVolumeEndpointsTest, OfferCreateThenEndpointRemove)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(*):1024";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   MockScheduler sched;
@@ -1576,8 +1527,6 @@ TEST_F(PersistentVolumeEndpointsTest, OfferCreateThenEndpointRemove)
       frameworkInfo.role(),
       createReservationInfo(DEFAULT_CREDENTIAL.principal())).get();
 
-  EXPECT_CALL(allocator, addFramework(_, _, _, _, _));
-
   EXPECT_CALL(sched, registered(_, _, _));
 
   Future<vector<Offer>> offers;
@@ -1592,7 +1541,7 @@ TEST_F(PersistentVolumeEndpointsTest, OfferCreateThenEndpointRemove)
   ASSERT_EQ(1u, offers->size());
   Offer offer = offers.get()[0];
 
-  EXPECT_EQ(offer.slave_id(), slaveId.get());
+  EXPECT_EQ(offer.slave_id(), slaveId);
 
   // We use the filter explicitly here so that the resources will not
   // be filtered for 5 seconds (the default).
@@ -1652,7 +1601,7 @@ TEST_F(PersistentVolumeEndpointsTest, OfferCreateThenEndpointRemove)
       master.get()->pid,
       "destroy-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, destroyResponse);
 
@@ -1679,7 +1628,7 @@ TEST_F(PersistentVolumeEndpointsTest, OfferCreateThenEndpointRemove)
       master.get()->pid,
       "unreserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "resources", dynamicallyReserved));
+      createRequestBody(slaveId, "resources", dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, unreserveResponse);
 
@@ -1705,25 +1654,22 @@ TEST_F(PersistentVolumeEndpointsTest, OfferCreateThenEndpointRemove)
 // offer cycle.
 TEST_F(PersistentVolumeEndpointsTest, EndpointCreateThenOfferRemove)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "disk(*):1024";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   // Make a dynamic reservation for 512MB of disk.
@@ -1736,7 +1682,7 @@ TEST_F(PersistentVolumeEndpointsTest, EndpointCreateThenOfferRemove)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "resources", dynamicallyReserved));
+      createRequestBody(slaveId, "resources", dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -1754,7 +1700,7 @@ TEST_F(PersistentVolumeEndpointsTest, EndpointCreateThenOfferRemove)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -1827,31 +1773,24 @@ TEST_F(PersistentVolumeEndpointsTest, EndpointCreateThenOfferRemove)
 // correctly. See MESOS-5698 for context.
 TEST_F(PersistentVolumeEndpointsTest, ReserveAndSlaveRemoval)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
 
-  Future<SlaveID> slave1Id;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slave1Id)));
+  Future<SlaveRegisteredMessage> slave1RegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   slave::Flags slave1Flags = CreateSlaveFlags();
   slave1Flags.resources = "cpus:4";
   Try<Owned<cluster::Slave>> slave1 = StartSlave(detector.get(), slave1Flags);
 
   ASSERT_SOME(slave1);
-  AWAIT_READY(slave1Id);
+  AWAIT_READY(slave1RegisteredMessage);
+  const SlaveID& slaveId1 = slave1RegisteredMessage->slave_id();
 
-  Future<SlaveID> slave2Id;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slave2Id)));
+  Future<SlaveRegisteredMessage> slave2RegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   // Each slave needs its own flags to ensure work_dirs are unique.
   slave::Flags slave2Flags = CreateSlaveFlags();
@@ -1859,7 +1798,8 @@ TEST_F(PersistentVolumeEndpointsTest, ReserveAndSlaveRemoval)
   Try<Owned<cluster::Slave>> slave2 = StartSlave(detector.get(), slave2Flags);
 
   ASSERT_SOME(slave2);
-  AWAIT_READY(slave2Id);
+  AWAIT_READY(slave2RegisteredMessage);
+  const SlaveID& slaveId2 = slave2RegisteredMessage->slave_id();
 
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
@@ -1873,7 +1813,7 @@ TEST_F(PersistentVolumeEndpointsTest, ReserveAndSlaveRemoval)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slave1Id.get(), "resources", slave1Reserved));
+      createRequestBody(slaveId1, "resources", slave1Reserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -1881,8 +1821,6 @@ TEST_F(PersistentVolumeEndpointsTest, ReserveAndSlaveRemoval)
   MesosSchedulerDriver driver(
       &sched, frameworkInfo, master.get()->pid, DEFAULT_CREDENTIAL);
 
-  EXPECT_CALL(allocator, addFramework(_, _, _, _, _));
-
   EXPECT_CALL(sched, registered(_, _, _));
 
   Future<vector<Offer>> offers;
@@ -1912,10 +1850,10 @@ TEST_F(PersistentVolumeEndpointsTest, ReserveAndSlaveRemoval)
     const Offer& offer = offers.get()[i];
     const SlaveID& offeredSlaveId = offer.slave_id();
 
-    ASSERT_TRUE(offeredSlaveId == slave1Id.get() ||
-                offeredSlaveId == slave2Id.get());
+    ASSERT_TRUE(offeredSlaveId == slaveId1 ||
+                offeredSlaveId == slaveId2);
 
-    if (offeredSlaveId == slave2Id.get()) {
+    if (offeredSlaveId == slaveId2) {
       driver.acceptOffers({offer.id()}, {RESERVE(slave2Reserved)});
       break;
     }
@@ -1926,11 +1864,6 @@ TEST_F(PersistentVolumeEndpointsTest, ReserveAndSlaveRemoval)
             slave2Reserved);
 
   // Shutdown `slave2` with an explicit shutdown message.
-  Future<Nothing> removeSlave;
-  EXPECT_CALL(allocator, removeSlave(_))
-    .WillOnce(DoAll(InvokeRemoveSlave(&allocator),
-                    FutureSatisfy(&removeSlave)));
-
   EXPECT_CALL(sched, offerRescinded(_, _));
 
   Future<Nothing> slaveLost;
@@ -1939,22 +1872,18 @@ TEST_F(PersistentVolumeEndpointsTest, ReserveAndSlaveRemoval)
 
   slave2.get()->shutdown();
 
-  AWAIT_READY(removeSlave);
-
   AWAIT_READY(slaveLost);
 
   response = process::http::post(
       master.get()->pid,
       "unreserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slave1Id.get(), "resources", slave1Reserved));
+      createRequestBody(slaveId1, "resources", slave1Reserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
   driver.stop();
   driver.join();
-
-  EXPECT_CALL(allocator, removeSlave(_));
 }
 
 
@@ -1962,25 +1891,22 @@ TEST_F(PersistentVolumeEndpointsTest, ReserveAndSlaveRemoval)
 // volumes are reflected in the "/slaves" master endpoint.
 TEST_F(PersistentVolumeEndpointsTest, SlavesEndpointFullResources)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:4;gpus:0;mem:2048;disk:4096";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources unreserved = Resources::parse("cpus:1;mem:512;disk:1024").get();
@@ -1992,7 +1918,7 @@ TEST_F(PersistentVolumeEndpointsTest, SlavesEndpointFullResources)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "resources", dynamicallyReserved));
+      createRequestBody(slaveId, "resources", dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -2009,7 +1935,7 @@ TEST_F(PersistentVolumeEndpointsTest, SlavesEndpointFullResources)
       master.get()->pid,
       "create-volumes",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), "volumes", volume));
+      createRequestBody(slaveId, "volumes", volume));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 


[2/3] mesos git commit: Made reservation endpoints tests independent from allocator.

Posted by al...@apache.org.
Made reservation endpoints tests independent from allocator.

The tests in the case often require an agent ID. To obtain the ID they
were using a mock allocator to grab agent ID, but not other operations
with the allocator were performed.

Instead we now just capture the SlaveRegisteredMessage in order to
learn an agent's ID.

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


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

Branch: refs/heads/master
Commit: 9ef28fe706b8df74434aac807d4b2c101c15f675
Parents: 430998e
Author: Benjamin Bannier <be...@mesosphere.io>
Authored: Wed Jun 7 11:11:36 2017 +0200
Committer: Alexander Rukletsov <al...@apache.org>
Committed: Wed Jun 7 11:11:36 2017 +0200

----------------------------------------------------------------------
 src/tests/reservation_endpoints_tests.cpp | 460 ++++++++++---------------
 1 file changed, 178 insertions(+), 282 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/9ef28fe7/src/tests/reservation_endpoints_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/reservation_endpoints_tests.cpp b/src/tests/reservation_endpoints_tests.cpp
index 505c542..62fc60e 100644
--- a/src/tests/reservation_endpoints_tests.cpp
+++ b/src/tests/reservation_endpoints_tests.cpp
@@ -106,22 +106,19 @@ public:
 // This tests that an operator can reserve/unreserve available resources.
 TEST_F(ReservationEndpointsTest, AvailableResources)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get());
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources unreserved = Resources::parse("cpus:1;mem:512").get();
@@ -133,7 +130,7 @@ TEST_F(ReservationEndpointsTest, AvailableResources)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -158,11 +155,6 @@ TEST_F(ReservationEndpointsTest, AvailableResources)
   EXPECT_TRUE(Resources(offer.resources()).contains(
       allocatedResources(dynamicallyReserved, frameworkInfo.role())));
 
-  Future<Nothing> recoverResources;
-  EXPECT_CALL(allocator, recoverResources(_, _, _, _))
-    .WillOnce(DoAll(InvokeRecoverResources(&allocator),
-                    FutureSatisfy(&recoverResources)));
-
   // The filter to decline the offer "forever".
   Filters filtersForever;
   filtersForever.set_refuse_seconds(1000);
@@ -170,8 +162,6 @@ TEST_F(ReservationEndpointsTest, AvailableResources)
   // Decline the offer "forever" in order to deallocate resources.
   driver.declineOffer(offer.id(), filtersForever);
 
-  AWAIT_READY(recoverResources);
-
   EXPECT_CALL(sched, resourceOffers(&driver, _))
     .WillOnce(FutureArg<1>(&offers));
 
@@ -179,7 +169,7 @@ TEST_F(ReservationEndpointsTest, AvailableResources)
       master.get()->pid,
       "unreserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -191,11 +181,6 @@ TEST_F(ReservationEndpointsTest, AvailableResources)
   EXPECT_TRUE(Resources(offer.resources()).contains(
       allocatedResources(unreserved, frameworkInfo.role())));
 
-  // Ignore subsequent `recoverResources` calls triggered from recovering the
-  // resources that this framework is currently holding onto.
-  EXPECT_CALL(allocator, recoverResources(_, _, _, _))
-    .WillRepeatedly(DoDefault());
-
   driver.stop();
   driver.join();
 }
@@ -205,22 +190,19 @@ TEST_F(ReservationEndpointsTest, AvailableResources)
 // outstanding offers.
 TEST_F(ReservationEndpointsTest, ReserveOfferedResources)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get());
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources unreserved = Resources::parse("cpus:1;mem:512").get();
@@ -259,7 +241,7 @@ TEST_F(ReservationEndpointsTest, ReserveOfferedResources)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -280,22 +262,19 @@ TEST_F(ReservationEndpointsTest, ReserveOfferedResources)
 // outstanding offers.
 TEST_F(ReservationEndpointsTest, UnreserveOfferedResources)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get());
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources unreserved = Resources::parse("cpus:1;mem:512").get();
@@ -307,7 +286,7 @@ TEST_F(ReservationEndpointsTest, UnreserveOfferedResources)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -342,7 +321,7 @@ TEST_F(ReservationEndpointsTest, UnreserveOfferedResources)
       master.get()->pid,
       "unreserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -363,26 +342,23 @@ TEST_F(ReservationEndpointsTest, UnreserveOfferedResources)
 // resources by rescinding the outstanding offers.
 TEST_F(ReservationEndpointsTest, ReserveAvailableAndOfferedResources)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
   master::Flags masterFlags = CreateMasterFlags();
   // Turn off allocation. We're doing it manually.
   masterFlags.allocation_interval = Seconds(1000);
 
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get());
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources available = Resources::parse("cpus:1;mem:128").get();
@@ -432,20 +408,15 @@ TEST_F(ReservationEndpointsTest, ReserveAvailableAndOfferedResources)
   Future<Nothing> _statusUpdateAcknowledgement =
     FUTURE_DISPATCH(_, &Slave::_statusUpdateAcknowledgement);
 
-  Future<Nothing> recoverUnusedResources;
-  EXPECT_CALL(allocator, recoverResources(_, _, _, _))
-    .WillOnce(DoAll(InvokeRecoverResources(&allocator),
-                    FutureSatisfy(&recoverUnusedResources)));
-
   driver.acceptOffers({offer.id()}, {LAUNCH({taskInfo})});
 
-  // Wait for TASK_RUNNING update ack and for the resources to be recovered.
+  // Wait for TASK_RUNNING update ack.
   AWAIT_READY(_statusUpdateAcknowledgement);
-  AWAIT_READY(recoverUnusedResources);
 
   // Summon an offer to receive the 'offered' resources.
   EXPECT_CALL(sched, resourceOffers(&driver, _))
-    .WillOnce(FutureArg<1>(&offers));
+    .WillOnce(FutureArg<1>(&offers))
+    .WillRepeatedly(Return()); // Ignore subsequent offers.
 
   driver.reviveOffers();
 
@@ -458,34 +429,28 @@ TEST_F(ReservationEndpointsTest, ReserveAvailableAndOfferedResources)
       allocatedResources(offered, frameworkInfo.role())));
 
   // Kill the task running on 'available' resources to make it available.
-  EXPECT_CALL(sched, statusUpdate(_, _));
-
-  // Wait for the used resources to be recovered.
-  Future<Resources> availableResources;
-  EXPECT_CALL(allocator, recoverResources(_, _, _, _))
-    .WillOnce(DoAll(InvokeRecoverResources(&allocator),
-                    FutureArg<2>(&availableResources)));
+  Future<TaskStatus> statusUpdate;
+  EXPECT_CALL(sched, statusUpdate(_, _))
+    .WillOnce(FutureArg<1>(&statusUpdate));
 
   // Send a KillTask message to the master.
   driver.killTask(taskInfo.task_id());
 
-  AWAIT_READY(availableResources);
-  EXPECT_TRUE(availableResources->contains(
-      allocatedResources(available, frameworkInfo.role())));
+  AWAIT_READY(statusUpdate);
+  ASSERT_EQ(TaskState::TASK_KILLED, statusUpdate->state());
 
   // At this point, we have 'available' resources in the allocator, and
   // 'offered' resources offered to the framework.
 
-  // Expect an offer to be rescinded and recovered!
-  EXPECT_CALL(sched, offerRescinded(_, _));
-  EXPECT_CALL(allocator, recoverResources(_, _, _, _))
-    .WillOnce(DoDefault());
+  // Expect offers to be rescinded and recovered!
+  EXPECT_CALL(sched, offerRescinded(_, _))
+    .WillRepeatedly(Return());
 
   Future<Response> response = process::http::post(
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -503,11 +468,6 @@ TEST_F(ReservationEndpointsTest, ReserveAvailableAndOfferedResources)
   EXPECT_TRUE(Resources(offer.resources()).contains(
       allocatedResources(dynamicallyReserved, frameworkInfo.role())));
 
-  // Ignore subsequent `recoverResources` calls triggered from recovering the
-  // resources that this framework is currently holding onto.
-  EXPECT_CALL(allocator, recoverResources(_, _, _, _))
-    .WillRepeatedly(DoDefault());
-
   driver.stop();
   driver.join();
 }
@@ -517,26 +477,23 @@ TEST_F(ReservationEndpointsTest, ReserveAvailableAndOfferedResources)
 // resources by rescinding the outstanding offers.
 TEST_F(ReservationEndpointsTest, UnreserveAvailableAndOfferedResources)
 {
-  TestAllocator<> allocator;
-
   master::Flags masterFlags = CreateMasterFlags();
   // Turn off allocation. We're doing it manually.
   masterFlags.allocation_interval = Seconds(1000);
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get());
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources available = Resources::parse("cpus:1;mem:128").get();
@@ -556,7 +513,7 @@ TEST_F(ReservationEndpointsTest, UnreserveAvailableAndOfferedResources)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), total));
+      createRequestBody(slaveId, total));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -568,7 +525,8 @@ TEST_F(ReservationEndpointsTest, UnreserveAvailableAndOfferedResources)
 
   Future<vector<Offer>> offers;
   EXPECT_CALL(sched, resourceOffers(&driver, _))
-    .WillOnce(FutureArg<1>(&offers));
+    .WillOnce(FutureArg<1>(&offers))
+    .WillRepeatedly(Return()); // Ignore subsequent offers.
 
   driver.start();
 
@@ -599,16 +557,10 @@ TEST_F(ReservationEndpointsTest, UnreserveAvailableAndOfferedResources)
   Future<Nothing> _statusUpdateAcknowledgement =
     FUTURE_DISPATCH(_, &Slave::_statusUpdateAcknowledgement);
 
-  Future<Nothing> recoverUnusedResources;
-  EXPECT_CALL(allocator, recoverResources(_, _, _, _))
-    .WillOnce(DoAll(InvokeRecoverResources(&allocator),
-                    FutureSatisfy(&recoverUnusedResources)));
-
   driver.acceptOffers({offer.id()}, {LAUNCH({taskInfo})});
 
-  // Wait for TASK_RUNNING update ack and for the resources to be recovered.
+  // Wait for TASK_RUNNING update ack.
   AWAIT_READY(_statusUpdateAcknowledgement);
-  AWAIT_READY(recoverUnusedResources);
 
   // Summon an offer to receive the 'offered' resources.
   EXPECT_CALL(sched, resourceOffers(&driver, _))
@@ -625,34 +577,28 @@ TEST_F(ReservationEndpointsTest, UnreserveAvailableAndOfferedResources)
       allocatedResources(offered, frameworkInfo.role())));
 
   // Kill the task running on 'available' resources to make it available.
-  EXPECT_CALL(sched, statusUpdate(_, _));
-
-  // Wait for the used resources to be recovered.
-  Future<Resources> availableResources;
-  EXPECT_CALL(allocator, recoverResources(_, _, _, _))
-    .WillOnce(DoAll(InvokeRecoverResources(&allocator),
-                    FutureArg<2>(&availableResources)));
+  Future<TaskStatus> statusUpdate;
+  EXPECT_CALL(sched, statusUpdate(_, _))
+    .WillOnce(FutureArg<1>(&statusUpdate));
 
   // Send a KillTask message to the master.
   driver.killTask(taskInfo.task_id());
 
-  AWAIT_READY(availableResources);
-  EXPECT_TRUE(availableResources->contains(
-      allocatedResources(available, frameworkInfo.role())));
+  AWAIT_READY(statusUpdate);
+  ASSERT_EQ(TaskState::TASK_KILLED, statusUpdate->state());
 
   // At this point, we have 'available' resources in the allocator, and
   // 'offered' resources offered to the framework.
 
-  // Expect an offer to be rescinded and recovered!
-  EXPECT_CALL(sched, offerRescinded(_, _));
-  EXPECT_CALL(allocator, recoverResources(_, _, _, _))
-    .WillOnce(DoDefault());
+  // Expect offers to be rescinded and recovered!
+  EXPECT_CALL(sched, offerRescinded(_, _))
+    .WillRepeatedly(Return());
 
   response = process::http::post(
       master.get()->pid,
       "unreserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), total));
+      createRequestBody(slaveId, total));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -670,11 +616,6 @@ TEST_F(ReservationEndpointsTest, UnreserveAvailableAndOfferedResources)
   EXPECT_TRUE(Resources(offer.resources()).contains(
       allocatedResources(unreserved, frameworkInfo.role())));
 
-  // Ignore subsequent `recoverResources` calls triggered from recovering the
-  // resources that this framework is currently holding onto.
-  EXPECT_CALL(allocator, recoverResources(_, _, _, _))
-    .WillRepeatedly(DoDefault());
-
   driver.stop();
   driver.join();
 }
@@ -684,11 +625,7 @@ TEST_F(ReservationEndpointsTest, UnreserveAvailableAndOfferedResources)
 // behave as expected.
 TEST_F(ReservationEndpointsTest, LabeledResources)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
   slave::Flags slaveFlags = CreateSlaveFlags();
@@ -696,15 +633,16 @@ TEST_F(ReservationEndpointsTest, LabeledResources)
   Resources totalSlaveResources =
     Resources::parse(slaveFlags.resources.get()).get();
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Labels labels1;
@@ -726,7 +664,7 @@ TEST_F(ReservationEndpointsTest, LabeledResources)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), labeledResources1));
+      createRequestBody(slaveId, labeledResources1));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -734,7 +672,7 @@ TEST_F(ReservationEndpointsTest, LabeledResources)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), labeledResources2));
+      createRequestBody(slaveId, labeledResources2));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -773,7 +711,7 @@ TEST_F(ReservationEndpointsTest, LabeledResources)
       master.get()->pid,
       "unreserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), labeledResources1));
+      createRequestBody(slaveId, labeledResources1));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -798,7 +736,7 @@ TEST_F(ReservationEndpointsTest, LabeledResources)
       master.get()->pid,
       "unreserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), labeledResources1));
+      createRequestBody(slaveId, labeledResources1));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Conflict().status, response);
 
@@ -813,7 +751,7 @@ TEST_F(ReservationEndpointsTest, LabeledResources)
       master.get()->pid,
       "unreserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), labeledResources2));
+      createRequestBody(slaveId, labeledResources2));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -831,11 +769,6 @@ TEST_F(ReservationEndpointsTest, LabeledResources)
   EXPECT_FALSE(offeredResources.contains(
       allocatedResources(labeledResources2, frameworkInfo.role())));
 
-  // Ignore subsequent `recoverResources` calls triggered from recovering the
-  // resources that this framework is currently holding onto.
-  EXPECT_CALL(allocator, recoverResources(_, _, _, _))
-    .WillRepeatedly(DoDefault());
-
   driver.stop();
   driver.join();
 }
@@ -845,22 +778,19 @@ TEST_F(ReservationEndpointsTest, LabeledResources)
 // return a Bad Request response.
 TEST_F(ReservationEndpointsTest, InvalidResource)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get());
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   // This resource is marked for the default "*" role and it also has a
@@ -877,7 +807,7 @@ TEST_F(ReservationEndpointsTest, InvalidResource)
   // function `createRequestBody` accepts `Resources`.
   string body = strings::format(
         "slaveId=%s&resources=[%s]",
-        slaveId->value(),
+        slaveId.value(),
         JSON::protobuf(resource.get())).get();
 
   {
@@ -904,22 +834,19 @@ TEST_F(ReservationEndpointsTest, InvalidResource)
 // results in a 'Conflict' HTTP error.
 TEST_F(ReservationEndpointsTest, InsufficientResources)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get());
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources unreserved = Resources::parse("cpus:4;mem:4096").get();
@@ -928,7 +855,7 @@ TEST_F(ReservationEndpointsTest, InsufficientResources)
       createReservationInfo(DEFAULT_CREDENTIAL.principal())).get();
 
   process::http::Headers headers = createBasicAuthHeaders(DEFAULT_CREDENTIAL);
-  string body = createRequestBody(slaveId.get(), dynamicallyReserved);
+  string body = createRequestBody(slaveId, dynamicallyReserved);
 
   Future<Response> response =
     process::http::post(master.get()->pid, "reserve", headers, body);
@@ -945,22 +872,19 @@ TEST_F(ReservationEndpointsTest, InsufficientResources)
 // an 'Unauthorized' HTTP error.
 TEST_F(ReservationEndpointsTest, NoHeader)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get());
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources unreserved = Resources::parse("cpus:1;mem:512").get();
@@ -972,7 +896,7 @@ TEST_F(ReservationEndpointsTest, NoHeader)
       master.get()->pid,
       "reserve",
       None(),
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(
       Unauthorized({}).status,
@@ -982,7 +906,7 @@ TEST_F(ReservationEndpointsTest, NoHeader)
       master.get()->pid,
       "unreserve",
       None(),
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(
       Unauthorized({}).status,
@@ -994,22 +918,19 @@ TEST_F(ReservationEndpointsTest, NoHeader)
 // 'Unauthorized' HTTP error.
 TEST_F(ReservationEndpointsTest, BadCredentials)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get());
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Credential credential;
   credential.set_principal("bad-principal");
   credential.set_secret("bad-secret");
@@ -1019,7 +940,7 @@ TEST_F(ReservationEndpointsTest, BadCredentials)
       "role", createReservationInfo(DEFAULT_CREDENTIAL.principal())).get();
 
   process::http::Headers headers = createBasicAuthHeaders(credential);
-  string body = createRequestBody(slaveId.get(), dynamicallyReserved);
+  string body = createRequestBody(slaveId, dynamicallyReserved);
 
   Future<Response> response =
     process::http::post(master.get()->pid, "reserve", headers, body);
@@ -1040,7 +961,6 @@ TEST_F(ReservationEndpointsTest, BadCredentials)
 // the operator to perform reserve/unreserve operations successfully.
 TEST_F(ReservationEndpointsTest, GoodReserveAndUnreserveACL)
 {
-  TestAllocator<> allocator;
   ACLs acls;
 
   // This ACL asserts that the principal of `DEFAULT_CREDENTIAL`
@@ -1065,24 +985,23 @@ TEST_F(ReservationEndpointsTest, GoodReserveAndUnreserveACL)
   masterFlags.allocation_interval = Milliseconds(50);
   masterFlags.roles = frameworkInfo.role();
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
   // Create a slave.
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:1;mem:512";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   process::http::Headers headers = createBasicAuthHeaders(DEFAULT_CREDENTIAL);
 
   Resources unreserved = Resources::parse("cpus:1;mem:512").get();
@@ -1095,7 +1014,7 @@ TEST_F(ReservationEndpointsTest, GoodReserveAndUnreserveACL)
       master.get()->pid,
       "reserve",
       headers,
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -1104,7 +1023,7 @@ TEST_F(ReservationEndpointsTest, GoodReserveAndUnreserveACL)
       master.get()->pid,
       "unreserve",
       headers,
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 }
@@ -1114,7 +1033,6 @@ TEST_F(ReservationEndpointsTest, GoodReserveAndUnreserveACL)
 // to perform reserve operations for multiple roles successfully.
 TEST_F(ReservationEndpointsTest, GoodReserveACLMultipleRoles)
 {
-  TestAllocator<> allocator;
   ACLs acls;
 
   // This ACL asserts that the principal of `DEFAULT_CREDENTIAL`
@@ -1127,24 +1045,23 @@ TEST_F(ReservationEndpointsTest, GoodReserveACLMultipleRoles)
   master::Flags masterFlags = CreateMasterFlags();
   masterFlags.acls = acls;
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
   // Create a slave.
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:2;mem:1024";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Resources unreserved = Resources::parse("cpus:1;mem:512").get();
   Resources dynamicallyReserved1 = unreserved.flatten(
       "jedi_master",
@@ -1160,7 +1077,7 @@ TEST_F(ReservationEndpointsTest, GoodReserveACLMultipleRoles)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), dynamicallyReservedMultipleRoles));
+      createRequestBody(slaveId, dynamicallyReservedMultipleRoles));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 }
@@ -1170,7 +1087,6 @@ TEST_F(ReservationEndpointsTest, GoodReserveACLMultipleRoles)
 // operator from performing reserve operations.
 TEST_F(ReservationEndpointsTest, BadReserveACL)
 {
-  TestAllocator<> allocator;
   ACLs acls;
 
   // This ACL asserts that ANY principal can reserve NONE,
@@ -1188,24 +1104,23 @@ TEST_F(ReservationEndpointsTest, BadReserveACL)
   masterFlags.allocation_interval = Milliseconds(50);
   masterFlags.roles = frameworkInfo.role();
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
   // Create a slave.
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:1;mem:512";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   process::http::Headers headers = createBasicAuthHeaders(DEFAULT_CREDENTIAL);
 
   Resources unreserved = Resources::parse("cpus:1;mem:512").get();
@@ -1218,7 +1133,7 @@ TEST_F(ReservationEndpointsTest, BadReserveACL)
       master.get()->pid,
       "reserve",
       headers,
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   // Expect a failed authorization.
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Forbidden().status, response);
@@ -1229,7 +1144,6 @@ TEST_F(ReservationEndpointsTest, BadReserveACL)
 // operator from performing unreserve operations.
 TEST_F(ReservationEndpointsTest, BadUnreserveACL)
 {
-  TestAllocator<> allocator;
   ACLs acls;
 
   // This ACL asserts that ANY principal can unreserve NONE,
@@ -1247,24 +1161,23 @@ TEST_F(ReservationEndpointsTest, BadUnreserveACL)
   masterFlags.allocation_interval = Milliseconds(50);
   masterFlags.roles = frameworkInfo.role();
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
   // Create a slave.
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:1;mem:512";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   process::http::Headers headers = createBasicAuthHeaders(DEFAULT_CREDENTIAL);
 
   Resources unreserved = Resources::parse("cpus:1;mem:512").get();
@@ -1277,7 +1190,7 @@ TEST_F(ReservationEndpointsTest, BadUnreserveACL)
       master.get()->pid,
       "reserve",
       headers,
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -1286,7 +1199,7 @@ TEST_F(ReservationEndpointsTest, BadUnreserveACL)
       master.get()->pid,
       "unreserve",
       headers,
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   // Expect a failed authorization.
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Forbidden().status, response);
@@ -1301,7 +1214,6 @@ TEST_F(ReservationEndpointsTest, BadReserveACLMultipleRoles)
   const string AUTHORIZED_ROLE = "panda";
   const string UNAUTHORIZED_ROLE = "giraffe";
 
-  TestAllocator<> allocator;
   ACLs acls;
 
   // This ACL asserts that the principal of `DEFAULT_CREDENTIAL`
@@ -1320,24 +1232,23 @@ TEST_F(ReservationEndpointsTest, BadReserveACLMultipleRoles)
   master::Flags masterFlags = CreateMasterFlags();
   masterFlags.acls = acls;
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
   // Create a slave.
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:2;mem:1024";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Resources unreserved = Resources::parse("cpus:1;mem:512").get();
   Resources dynamicallyReserved1 = unreserved.flatten(
       AUTHORIZED_ROLE,
@@ -1353,7 +1264,7 @@ TEST_F(ReservationEndpointsTest, BadReserveACLMultipleRoles)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), dynamicallyReservedMultipleRoles));
+      createRequestBody(slaveId, dynamicallyReservedMultipleRoles));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Forbidden().status, response);
 }
@@ -1395,24 +1306,21 @@ TEST_F(ReservationEndpointsTest, NoSlaveId)
 // 'BadRequest' HTTP error.
 TEST_F(ReservationEndpointsTest, NoResources)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get());
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   process::http::Headers headers = createBasicAuthHeaders(DEFAULT_CREDENTIAL);
-  string body = "slaveId=" + slaveId->value();
+  string body = "slaveId=" + slaveId.value();
 
   Future<Response> response =
     process::http::post(master.get()->pid, "reserve", headers, body);
@@ -1429,22 +1337,19 @@ TEST_F(ReservationEndpointsTest, NoResources)
 // in a 'BadRequest' HTTP error.
 TEST_F(ReservationEndpointsTest, NonMatchingPrincipal)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get());
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Resources unreserved = Resources::parse("cpus:1;mem:512").get();
   Resources dynamicallyReserved =
     unreserved.flatten("role", createReservationInfo("badPrincipal")).get();
@@ -1453,7 +1358,7 @@ TEST_F(ReservationEndpointsTest, NonMatchingPrincipal)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), dynamicallyReserved));
+      createRequestBody(slaveId, dynamicallyReserved));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response);
 }
@@ -1467,8 +1372,6 @@ TEST_F(ReservationEndpointsTest, ReserveAndUnreserveNoAuthentication)
   // control the timing of the offer cycle.
   Clock::pause();
 
-  TestAllocator<> allocator;
-
   FrameworkInfo frameworkInfo = DEFAULT_FRAMEWORK_INFO;
   frameworkInfo.set_role("role");
 
@@ -1477,19 +1380,15 @@ TEST_F(ReservationEndpointsTest, ReserveAndUnreserveNoAuthentication)
   masterFlags.authenticate_frameworks = false;
   masterFlags.authenticate_http_readwrite = false;
 
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator, masterFlags);
+  Try<Owned<cluster::Master>> master = StartMaster(masterFlags);
   ASSERT_SOME(master);
 
   // Create an agent.
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:1;mem:512";
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
 
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
@@ -1500,6 +1399,9 @@ TEST_F(ReservationEndpointsTest, ReserveAndUnreserveNoAuthentication)
   Clock::advance(slaveFlags.registration_backoff_factor);
   Clock::advance(masterFlags.allocation_interval);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Resources unreserved = Resources::parse("cpus:1;mem:512").get();
 
   Resources dynamicallyReservedWithNoPrincipal = unreserved.flatten(
@@ -1512,7 +1414,7 @@ TEST_F(ReservationEndpointsTest, ReserveAndUnreserveNoAuthentication)
       master.get()->pid,
       "reserve",
       None(),
-      createRequestBody(slaveId.get(), dynamicallyReservedWithNoPrincipal));
+      createRequestBody(slaveId, dynamicallyReservedWithNoPrincipal));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -1522,7 +1424,7 @@ TEST_F(ReservationEndpointsTest, ReserveAndUnreserveNoAuthentication)
       master.get()->pid,
       "unreserve",
       None(),
-      createRequestBody(slaveId.get(), dynamicallyReservedWithNoPrincipal));
+      createRequestBody(slaveId, dynamicallyReservedWithNoPrincipal));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -1536,7 +1438,7 @@ TEST_F(ReservationEndpointsTest, ReserveAndUnreserveNoAuthentication)
       master.get()->pid,
       "reserve",
       None(),
-      createRequestBody(slaveId.get(), dynamicallyReservedWithPrincipal));
+      createRequestBody(slaveId, dynamicallyReservedWithPrincipal));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -1546,7 +1448,7 @@ TEST_F(ReservationEndpointsTest, ReserveAndUnreserveNoAuthentication)
       master.get()->pid,
       "unreserve",
       None(),
-      createRequestBody(slaveId.get(), dynamicallyReservedWithPrincipal));
+      createRequestBody(slaveId, dynamicallyReservedWithPrincipal));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 }
@@ -1557,25 +1459,22 @@ TEST_F(ReservationEndpointsTest, ReserveAndUnreserveNoAuthentication)
 // into a single reserved resource.
 TEST_F(ReservationEndpointsTest, DifferentPrincipalsSameRole)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:2;mem:1024";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(slave);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   FrameworkInfo frameworkInfo = createFrameworkInfo();
 
   Resources unreserved = Resources::parse("cpus:1;mem:512").get();
@@ -1591,7 +1490,7 @@ TEST_F(ReservationEndpointsTest, DifferentPrincipalsSameRole)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-      createRequestBody(slaveId.get(), dynamicallyReserved1));
+      createRequestBody(slaveId, dynamicallyReserved1));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -1599,7 +1498,7 @@ TEST_F(ReservationEndpointsTest, DifferentPrincipalsSameRole)
       master.get()->pid,
       "reserve",
       createBasicAuthHeaders(DEFAULT_CREDENTIAL_2),
-      createRequestBody(slaveId.get(), dynamicallyReserved2));
+      createRequestBody(slaveId, dynamicallyReserved2));
 
   AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
 
@@ -1638,25 +1537,22 @@ TEST_F(ReservationEndpointsTest, DifferentPrincipalsSameRole)
 // it matches the master's versions.
 TEST_F(ReservationEndpointsTest, AgentStateEndpointResources)
 {
-  TestAllocator<> allocator;
-
-  EXPECT_CALL(allocator, initialize(_, _, _, _, _));
-
-  Try<Owned<cluster::Master>> master = StartMaster(&allocator);
+  Try<Owned<cluster::Master>> master = StartMaster();
   ASSERT_SOME(master);
 
-  Future<SlaveID> slaveId;
-  EXPECT_CALL(allocator, addSlave(_, _, _, _, _, _))
-    .WillOnce(DoAll(InvokeAddSlave(&allocator),
-                    FutureArg<0>(&slaveId)));
-
   slave::Flags slaveFlags = CreateSlaveFlags();
   slaveFlags.resources = "cpus:4;mem:2048;disk:4096";
 
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), master.get()->pid, _);
+
   Owned<MasterDetector> detector = master.get()->createDetector();
   Try<Owned<cluster::Slave>> agent = StartSlave(detector.get(), slaveFlags);
   ASSERT_SOME(agent);
 
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID& slaveId = slaveRegisteredMessage->slave_id();
+
   Resources unreserved = Resources::parse("cpus:1;mem:512;disk:1024").get();
   Resources dynamicallyReserved = unreserved.flatten(
       "role1",
@@ -1670,7 +1566,7 @@ TEST_F(ReservationEndpointsTest, AgentStateEndpointResources)
         master.get()->pid,
         "reserve",
         createBasicAuthHeaders(DEFAULT_CREDENTIAL),
-        createRequestBody(slaveId.get(), dynamicallyReserved));
+        createRequestBody(slaveId, dynamicallyReserved));
 
     AWAIT_EXPECT_RESPONSE_STATUS_EQ(Accepted().status, response);
   }


[3/3] mesos git commit: Removed some unused includes and using declarations.

Posted by al...@apache.org.
Removed some unused includes and using declarations.


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

Branch: refs/heads/master
Commit: cae76904aee17db579993c8918f102f553c20b50
Parents: 9ef28fe
Author: Alexander Rukletsov <al...@apache.org>
Authored: Wed Jun 7 12:00:59 2017 +0200
Committer: Alexander Rukletsov <al...@apache.org>
Committed: Wed Jun 7 12:00:59 2017 +0200

----------------------------------------------------------------------
 src/tests/persistent_volume_endpoints_tests.cpp | 2 --
 src/tests/reservation_endpoints_tests.cpp       | 2 --
 2 files changed, 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/cae76904/src/tests/persistent_volume_endpoints_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/persistent_volume_endpoints_tests.cpp b/src/tests/persistent_volume_endpoints_tests.cpp
index 1d76433..80501e6 100644
--- a/src/tests/persistent_volume_endpoints_tests.cpp
+++ b/src/tests/persistent_volume_endpoints_tests.cpp
@@ -63,8 +63,6 @@ using process::http::Response;
 using process::http::Unauthorized;
 
 using testing::_;
-using testing::DoAll;
-using testing::Eq;
 using testing::Return;
 
 namespace mesos {

http://git-wip-us.apache.org/repos/asf/mesos/blob/cae76904/src/tests/reservation_endpoints_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/reservation_endpoints_tests.cpp b/src/tests/reservation_endpoints_tests.cpp
index 62fc60e..ba283ee 100644
--- a/src/tests/reservation_endpoints_tests.cpp
+++ b/src/tests/reservation_endpoints_tests.cpp
@@ -34,7 +34,6 @@
 #include "master/flags.hpp"
 #include "master/master.hpp"
 
-#include "tests/allocator.hpp"
 #include "tests/mesos.hpp"
 #include "tests/resources_utils.hpp"
 #include "tests/utils.hpp"
@@ -64,7 +63,6 @@ using process::http::Response;
 using process::http::Unauthorized;
 
 using testing::_;
-using testing::DoAll;
 
 namespace mesos {
 namespace internal {