You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by jo...@apache.org on 2015/09/18 21:21:27 UTC
mesos git commit: Maintenance Primitives: Replaced MachineIDs with
RepeatedPtrField>.
Repository: mesos
Updated Branches:
refs/heads/master 05543cf29 -> cc0a84790
Maintenance Primitives: Replaced MachineIDs with RepeatedPtrField<T>>.
This removes the MachineIDs protobuf and changes it to instead use the
RepeatedFieldPtr.
This also changes the maintenance primitives (alpha) API for
/machine/up and /machine/down, which both take an array instead of an
object now.
Review: https://reviews.apache.org/r/38011
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/cc0a8479
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/cc0a8479
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/cc0a8479
Branch: refs/heads/master
Commit: cc0a847904510b80c72b9de70af9191b3d5b6c22
Parents: 05543cf
Author: Joseph Wu <jo...@mesosphere.io>
Authored: Fri Sep 18 13:07:38 2015 -0400
Committer: Joris Van Remoortere <jo...@gmail.com>
Committed: Fri Sep 18 15:21:12 2015 -0400
----------------------------------------------------------------------
include/mesos/mesos.proto | 11 -----
include/mesos/v1/mesos.proto | 11 -----
src/common/protobuf_utils.cpp | 9 ++--
src/common/protobuf_utils.hpp | 6 +--
src/master/http.cpp | 42 +++++++++----------
src/master/maintenance.cpp | 16 ++++----
src/master/maintenance.hpp | 6 +--
src/tests/master_maintenance_tests.cpp | 64 ++++++++++++++++++-----------
src/tests/registrar_tests.cpp | 16 ++++++--
9 files changed, 91 insertions(+), 90 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/cc0a8479/include/mesos/mesos.proto
----------------------------------------------------------------------
diff --git a/include/mesos/mesos.proto b/include/mesos/mesos.proto
index c9b310d..4a16be1 100644
--- a/include/mesos/mesos.proto
+++ b/include/mesos/mesos.proto
@@ -168,17 +168,6 @@ message MachineID {
/**
- * A list of machines.
- *
- * TODO(josephw): Remove this when https://reviews.apache.org/r/37826/
- * is submitted.
- */
-message MachineIDs {
- repeated MachineID values = 1;
-}
-
-
-/**
* Holds information about a single machine, its `mode`, and any other
* relevant information which may affect the behavior of the machine.
*/
http://git-wip-us.apache.org/repos/asf/mesos/blob/cc0a8479/include/mesos/v1/mesos.proto
----------------------------------------------------------------------
diff --git a/include/mesos/v1/mesos.proto b/include/mesos/v1/mesos.proto
index bcce340..58e5a6b 100644
--- a/include/mesos/v1/mesos.proto
+++ b/include/mesos/v1/mesos.proto
@@ -168,17 +168,6 @@ message MachineID {
/**
- * A list of machines.
- *
- * TODO(josephw): Remove this when https://reviews.apache.org/r/37826/
- * is submitted.
- */
-message MachineIDs {
- repeated MachineID values = 1;
-}
-
-
-/**
* Holds information about a single machine, its `mode`, and any other
* relevant information which may affect the behavior of the machine.
*/
http://git-wip-us.apache.org/repos/asf/mesos/blob/cc0a8479/src/common/protobuf_utils.cpp
----------------------------------------------------------------------
diff --git a/src/common/protobuf_utils.cpp b/src/common/protobuf_utils.cpp
index c8e6211..4dc58fe 100644
--- a/src/common/protobuf_utils.cpp
+++ b/src/common/protobuf_utils.cpp
@@ -33,6 +33,8 @@
using std::string;
+using google::protobuf::RepeatedPtrField;
+
using mesos::slave::ContainerLimitation;
using mesos::slave::ContainerState;
@@ -267,12 +269,13 @@ Unavailability createUnavailability(
}
-MachineIDs createMachineList(std::initializer_list<MachineID> ids)
+RepeatedPtrField<MachineID> createMachineList(
+ std::initializer_list<MachineID> ids)
{
- MachineIDs array;
+ RepeatedPtrField<MachineID> array;
foreach (const MachineID& id, ids) {
- array.add_values()->CopyFrom(id);
+ array.Add()->CopyFrom(id);
}
return array;
http://git-wip-us.apache.org/repos/asf/mesos/blob/cc0a8479/src/common/protobuf_utils.hpp
----------------------------------------------------------------------
diff --git a/src/common/protobuf_utils.hpp b/src/common/protobuf_utils.hpp
index 86474ea..3817c6a 100644
--- a/src/common/protobuf_utils.hpp
+++ b/src/common/protobuf_utils.hpp
@@ -111,11 +111,9 @@ Unavailability createUnavailability(
/**
* Helper for constructing a list of `MachineID`.
- *
- * TODO(josephw): Remove this when https://reviews.apache.org/r/37826/
- * is submitted.
*/
-MachineIDs createMachineList(std::initializer_list<MachineID> ids);
+google::protobuf::RepeatedPtrField<MachineID> createMachineList(
+ std::initializer_list<MachineID> ids);
/**
http://git-wip-us.apache.org/repos/asf/mesos/blob/cc0a8479/src/master/http.cpp
----------------------------------------------------------------------
diff --git a/src/master/http.cpp b/src/master/http.cpp
index 8bde4c7..8bb5935 100644
--- a/src/master/http.cpp
+++ b/src/master/http.cpp
@@ -69,6 +69,8 @@
#include "mesos/mesos.hpp"
#include "mesos/resources.hpp"
+using google::protobuf::RepeatedPtrField;
+
using process::Clock;
using process::DESCRIPTION;
using process::Future;
@@ -1550,29 +1552,26 @@ Future<Response> Master::Http::machineDown(const Request& request) const
}
// Parse the POST body as JSON.
- Try<JSON::Object> jsonIds = JSON::parse<JSON::Object>(request.body);
+ Try<JSON::Array> jsonIds = JSON::parse<JSON::Array>(request.body);
if (jsonIds.isError()) {
return BadRequest(jsonIds.error());
}
// Convert the machines to a protobuf.
- Try<MachineIDs> protoIds =
- ::protobuf::parse<MachineIDs>(jsonIds.get());
-
- if (protoIds.isError()) {
- return BadRequest(protoIds.error());
+ auto ids = ::protobuf::parse<RepeatedPtrField<MachineID>>(jsonIds.get());
+ if (ids.isError()) {
+ return BadRequest(ids.error());
}
// Validate every machine in the list.
- MachineIDs ids = protoIds.get();
- Try<Nothing> isValid = maintenance::validation::machines(ids);
+ Try<Nothing> isValid = maintenance::validation::machines(ids.get());
if (isValid.isError()) {
return BadRequest(isValid.error());
}
// Check that all machines are part of a maintenance schedule.
// TODO(josephw): Allow a transition from `UP` to `DOWN`.
- foreach (const MachineID& id, ids.values()) {
+ foreach (const MachineID& id, ids.get()) {
if (!master->machines.contains(id)) {
return BadRequest(
"Machine '" + stringify(JSON::Protobuf(id)) +
@@ -1587,7 +1586,7 @@ Future<Response> Master::Http::machineDown(const Request& request) const
}
return master->registrar->apply(Owned<Operation>(
- new maintenance::StartMaintenance(ids)))
+ new maintenance::StartMaintenance(ids.get())))
.then(defer(master->self(), [=](bool result) -> Future<Response> {
// See the top comment in "master/maintenance.hpp" for why this check
// is here, and is appropriate.
@@ -1599,7 +1598,7 @@ Future<Response> Master::Http::machineDown(const Request& request) const
// for all the tasks that were running on the slave and `LostSlaveMessage`
// messages to the framework. This guards against the slave having dropped
// the `ShutdownMessage`.
- foreach (const MachineID& machineId, ids.values()) {
+ foreach (const MachineID& machineId, ids.get()) {
// The machine may not be in machines. This means no slaves are
// currently registered on that machine so this is a no-op.
if (master->machines.contains(machineId)) {
@@ -1625,7 +1624,7 @@ Future<Response> Master::Http::machineDown(const Request& request) const
}
// Update the master's local state with the downed machines.
- foreach (const MachineID& id, ids.values()) {
+ foreach (const MachineID& id, ids.get()) {
master->machines[id].info.set_mode(MachineInfo::DOWN);
}
@@ -1652,28 +1651,25 @@ Future<Response> Master::Http::machineUp(const Request& request) const
}
// Parse the POST body as JSON.
- Try<JSON::Object> jsonIds = JSON::parse<JSON::Object>(request.body);
+ Try<JSON::Array> jsonIds = JSON::parse<JSON::Array>(request.body);
if (jsonIds.isError()) {
return BadRequest(jsonIds.error());
}
// Convert the machines to a protobuf.
- Try<MachineIDs> protoIds =
- ::protobuf::parse<MachineIDs>(jsonIds.get());
-
- if (protoIds.isError()) {
- return BadRequest(protoIds.error());
+ auto ids = ::protobuf::parse<RepeatedPtrField<MachineID>>(jsonIds.get());
+ if (ids.isError()) {
+ return BadRequest(ids.error());
}
// Validate every machine in the list.
- MachineIDs ids = protoIds.get();
- Try<Nothing> isValid = maintenance::validation::machines(ids);
+ Try<Nothing> isValid = maintenance::validation::machines(ids.get());
if (isValid.isError()) {
return BadRequest(isValid.error());
}
// Check that all machines are part of a maintenance schedule.
- foreach (const MachineID& id, ids.values()) {
+ foreach (const MachineID& id, ids.get()) {
if (!master->machines.contains(id)) {
return BadRequest(
"Machine '" + stringify(JSON::Protobuf(id)) +
@@ -1688,7 +1684,7 @@ Future<Response> Master::Http::machineUp(const Request& request) const
}
return master->registrar->apply(Owned<Operation>(
- new maintenance::StopMaintenance(ids)))
+ new maintenance::StopMaintenance(ids.get())))
.then(defer(master->self(), [=](bool result) -> Future<Response> {
// See the top comment in "master/maintenance.hpp" for why this check
// is here, and is appropriate.
@@ -1696,7 +1692,7 @@ Future<Response> Master::Http::machineUp(const Request& request) const
// Update the master's local state with the reactivated machines.
hashset<MachineID> updated;
- foreach (const MachineID& id, ids.values()) {
+ foreach (const MachineID& id, ids.get()) {
master->machines[id].info.set_mode(MachineInfo::UP);
master->machines[id].info.clear_unavailability();
updated.insert(id);
http://git-wip-us.apache.org/repos/asf/mesos/blob/cc0a8479/src/master/maintenance.cpp
----------------------------------------------------------------------
diff --git a/src/master/maintenance.cpp b/src/master/maintenance.cpp
index 7d7d40b..5fe9358 100644
--- a/src/master/maintenance.cpp
+++ b/src/master/maintenance.cpp
@@ -38,6 +38,8 @@ namespace maintenance {
using namespace mesos::maintenance;
+using google::protobuf::RepeatedPtrField;
+
UpdateSchedule::UpdateSchedule(
const maintenance::Schedule& _schedule)
: schedule(_schedule) {}
@@ -114,9 +116,9 @@ Try<bool> UpdateSchedule::perform(
StartMaintenance::StartMaintenance(
- const MachineIDs& _ids)
+ const RepeatedPtrField<MachineID>& _ids)
{
- foreach (const MachineID& id, _ids.values()) {
+ foreach (const MachineID& id, _ids) {
ids.insert(id);
}
}
@@ -144,9 +146,9 @@ Try<bool> StartMaintenance::perform(
StopMaintenance::StopMaintenance(
- const MachineIDs& _ids)
+ const RepeatedPtrField<MachineID>& _ids)
{
- foreach (const MachineID& id, _ids.values()) {
+ foreach (const MachineID& id, _ids) {
ids.insert(id);
}
}
@@ -265,15 +267,15 @@ Try<Nothing> unavailability(const Unavailability& unavailability)
}
-Try<Nothing> machines(const MachineIDs& ids)
+Try<Nothing> machines(const RepeatedPtrField<MachineID>& ids)
{
- if (ids.values().size() <= 0) {
+ if (ids.size() <= 0) {
return Error("List of machines is empty");
}
// Verify that the machine has at least one non-empty field value.
hashset<MachineID> uniques;
- foreach (const MachineID& id, ids.values()) {
+ foreach (const MachineID& id, ids) {
// Validate the single machine.
Try<Nothing> validId = validation::machine(id);
if (validId.isError()) {
http://git-wip-us.apache.org/repos/asf/mesos/blob/cc0a8479/src/master/maintenance.hpp
----------------------------------------------------------------------
diff --git a/src/master/maintenance.hpp b/src/master/maintenance.hpp
index 8d134aa..a37412f 100644
--- a/src/master/maintenance.hpp
+++ b/src/master/maintenance.hpp
@@ -77,7 +77,7 @@ class StartMaintenance : public Operation
{
public:
explicit StartMaintenance(
- const MachineIDs& _ids);
+ const google::protobuf::RepeatedPtrField<MachineID>& _ids);
protected:
Try<bool> perform(
@@ -100,7 +100,7 @@ class StopMaintenance : public Operation
{
public:
explicit StopMaintenance(
- const MachineIDs& _ids);
+ const google::protobuf::RepeatedPtrField<MachineID>& _ids);
protected:
Try<bool> perform(
@@ -139,7 +139,7 @@ Try<Nothing> unavailability(
* - The list is non-empty.
* - All checks in the `machine` method below.
*/
-Try<Nothing> machines(const MachineIDs& ids);
+Try<Nothing> machines(const google::protobuf::RepeatedPtrField<MachineID>& ids);
/**
http://git-wip-us.apache.org/repos/asf/mesos/blob/cc0a8479/src/tests/master_maintenance_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/master_maintenance_tests.cpp b/src/tests/master_maintenance_tests.cpp
index 4478505..45112f1 100644
--- a/src/tests/master_maintenance_tests.cpp
+++ b/src/tests/master_maintenance_tests.cpp
@@ -16,6 +16,7 @@
* limitations under the License.
*/
+#include <initializer_list>
#include <string>
#include <mesos/maintenance/maintenance.hpp>
@@ -53,6 +54,8 @@
#include "tests/mesos.hpp"
#include "tests/utils.hpp"
+using google::protobuf::RepeatedPtrField;
+
using mesos::internal::master::Master;
using mesos::internal::slave::Slave;
@@ -71,7 +74,6 @@ using process::http::BadRequest;
using process::http::OK;
using process::http::Response;
-using mesos::internal::protobuf::maintenance::createMachineList;
using mesos::internal::protobuf::maintenance::createSchedule;
using mesos::internal::protobuf::maintenance::createUnavailability;
using mesos::internal::protobuf::maintenance::createWindow;
@@ -86,6 +88,20 @@ namespace mesos {
namespace internal {
namespace tests {
+JSON::Array createMachineList(std::initializer_list<MachineID> _ids)
+{
+ RepeatedPtrField<MachineID> ids =
+ internal::protobuf::maintenance::createMachineList(_ids);
+
+ JSON::Array array;
+ foreach (const MachineID& id, ids) {
+ array.values.emplace_back(JSON::Protobuf(id));
+ }
+
+ return array;
+}
+
+
class MasterMaintenanceTest : public MesosTest
{
public:
@@ -314,12 +330,12 @@ TEST_F(MasterMaintenanceTest, FailToUnscheduleDeactivatedMachines)
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
// Deactivate machine1.
- MachineIDs machines = createMachineList({machine1});
+ JSON::Array machines = createMachineList({machine1});
response = process::http::post(
master.get(),
"machine/down",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
@@ -340,7 +356,7 @@ TEST_F(MasterMaintenanceTest, FailToUnscheduleDeactivatedMachines)
master.get(),
"machine/up",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
}
@@ -657,7 +673,7 @@ TEST_F(MasterMaintenanceTest, EnterMaintenanceMode)
master.get(),
"machine/down",
headers,
- stringify(JSON::Protobuf(createMachineList({machine}))));
+ stringify(createMachineList({machine})));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
@@ -695,7 +711,7 @@ TEST_F(MasterMaintenanceTest, EnterMaintenanceMode)
master.get(),
"machine/up",
headers,
- stringify(JSON::Protobuf(createMachineList({machine}))));
+ stringify(createMachineList({machine})));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
@@ -728,12 +744,12 @@ TEST_F(MasterMaintenanceTest, BringDownMachines)
MachineID badMachine;
// Try to start maintenance on an unscheduled machine.
- MachineIDs machines = createMachineList({machine1, machine2});
+ JSON::Array machines = createMachineList({machine1, machine2});
Future<Response> response = process::http::post(
master.get(),
"machine/down",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response);
@@ -743,7 +759,7 @@ TEST_F(MasterMaintenanceTest, BringDownMachines)
master.get(),
"machine/down",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response);
@@ -753,7 +769,7 @@ TEST_F(MasterMaintenanceTest, BringDownMachines)
master.get(),
"machine/down",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response);
@@ -775,7 +791,7 @@ TEST_F(MasterMaintenanceTest, BringDownMachines)
master.get(),
"machine/down",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
@@ -784,7 +800,7 @@ TEST_F(MasterMaintenanceTest, BringDownMachines)
master.get(),
"machine/down",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response);
@@ -794,7 +810,7 @@ TEST_F(MasterMaintenanceTest, BringDownMachines)
master.get(),
"machine/down",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response);
@@ -804,7 +820,7 @@ TEST_F(MasterMaintenanceTest, BringDownMachines)
master.get(),
"machine/down",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
}
@@ -818,12 +834,12 @@ TEST_F(MasterMaintenanceTest, BringUpMachines)
ASSERT_SOME(master);
// Try to bring up an unscheduled machine.
- MachineIDs machines = createMachineList({machine1, machine2});
+ JSON::Array machines = createMachineList({machine1, machine2});
Future<Response> response = process::http::post(
master.get(),
"machine/up",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response);
@@ -846,7 +862,7 @@ TEST_F(MasterMaintenanceTest, BringUpMachines)
master.get(),
"machine/up",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(BadRequest().status, response);
@@ -856,7 +872,7 @@ TEST_F(MasterMaintenanceTest, BringUpMachines)
master.get(),
"machine/down",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
@@ -865,7 +881,7 @@ TEST_F(MasterMaintenanceTest, BringUpMachines)
master.get(),
"machine/up",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
@@ -894,7 +910,7 @@ TEST_F(MasterMaintenanceTest, BringUpMachines)
master.get(),
"machine/down",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
@@ -903,7 +919,7 @@ TEST_F(MasterMaintenanceTest, BringUpMachines)
master.get(),
"machine/up",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
@@ -962,12 +978,12 @@ TEST_F(MasterMaintenanceTest, MachineStatus)
ASSERT_EQ(0, statuses.get().down_machines().size());
// Deactivate machine1.
- MachineIDs machines = createMachineList({machine1});
+ JSON::Array machines = createMachineList({machine1});
response = process::http::post(
master.get(),
"machine/down",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
@@ -992,7 +1008,7 @@ TEST_F(MasterMaintenanceTest, MachineStatus)
master.get(),
"machine/up",
headers,
- stringify(JSON::Protobuf(machines)));
+ stringify(machines));
AWAIT_EXPECT_RESPONSE_STATUS_EQ(OK().status, response);
http://git-wip-us.apache.org/repos/asf/mesos/blob/cc0a8479/src/tests/registrar_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/registrar_tests.cpp b/src/tests/registrar_tests.cpp
index aa49c86..5131b57 100644
--- a/src/tests/registrar_tests.cpp
+++ b/src/tests/registrar_tests.cpp
@@ -72,6 +72,8 @@ using std::vector;
using process::Clock;
+using google::protobuf::RepeatedPtrField;
+
using mesos::internal::protobuf::maintenance::createMachineList;
using mesos::internal::protobuf::maintenance::createSchedule;
using mesos::internal::protobuf::maintenance::createUnavailability;
@@ -530,7 +532,8 @@ TEST_P(RegistrarTest, StartMaintenance)
Owned<Operation>(new UpdateSchedule(schedule))));
// Transition machine two into `DOWN` mode.
- MachineIDs machines = createMachineList({machine2});
+ RepeatedPtrField<MachineID> machines = createMachineList({machine2});
+
AWAIT_READY(registrar.apply(
Owned<Operation>(new StartMaintenance(machines))));
}
@@ -558,7 +561,9 @@ TEST_P(RegistrarTest, StartMaintenance)
Owned<Operation>(new UpdateSchedule(schedule))));
// Deactivate the two `DRAINING` machines.
- MachineIDs machines = createMachineList({machine1, machine3});
+ RepeatedPtrField<MachineID> machines =
+ createMachineList({machine1, machine3});
+
AWAIT_READY(registrar.apply(
Owned<Operation>(new StartMaintenance(machines))));
}
@@ -615,7 +620,8 @@ TEST_P(RegistrarTest, StopMaintenance)
Owned<Operation>(new UpdateSchedule(schedule))));
// Transition machine three into `DOWN` mode.
- MachineIDs machines = createMachineList({machine3});
+ RepeatedPtrField<MachineID> machines = createMachineList({machine3});
+
AWAIT_READY(registrar.apply(
Owned<Operation>(new StartMaintenance(machines))));
@@ -643,7 +649,9 @@ TEST_P(RegistrarTest, StopMaintenance)
registry.get().machines().machines(1).info().mode());
// Transition machine one and two into `DOWN` mode.
- MachineIDs machines = createMachineList({machine1, machine2});
+ RepeatedPtrField<MachineID> machines =
+ createMachineList({machine1, machine2});
+
AWAIT_READY(registrar.apply(
Owned<Operation>(new StartMaintenance(machines))));