Skip to content

Commit

Permalink
add daemon gRPC boilerplate for AZs
Browse files Browse the repository at this point in the history
  • Loading branch information
andrei-toterman committed Feb 11, 2025
1 parent b97e0b4 commit e63104e
Show file tree
Hide file tree
Showing 7 changed files with 139 additions and 0 deletions.
33 changes: 33 additions & 0 deletions src/daemon/daemon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -579,6 +579,8 @@ auto connect_rpc(mp::DaemonRpc& rpc, mp::Daemon& daemon)
QObject::connect(&rpc, &mp::DaemonRpc::on_snapshot, &daemon, &mp::Daemon::snapshot);
QObject::connect(&rpc, &mp::DaemonRpc::on_restore, &daemon, &mp::Daemon::restore);
QObject::connect(&rpc, &mp::DaemonRpc::on_daemon_info, &daemon, &mp::Daemon::daemon_info);
QObject::connect(&rpc, &mp::DaemonRpc::on_zones, &daemon, &mp::Daemon::zones);
QObject::connect(&rpc, &mp::DaemonRpc::on_zones_state, &daemon, &mp::Daemon::zones_state);
}

enum class InstanceGroup
Expand Down Expand Up @@ -2800,6 +2802,37 @@ catch (const std::exception& e)
status_promise->set_value(grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, e.what(), ""));
}

void mp::Daemon::zones(const ZonesRequest* request,

Check warning on line 2805 in src/daemon/daemon.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon.cpp#L2805

Added line #L2805 was not covered by tests
grpc::ServerReaderWriterInterface<ZonesReply, ZonesRequest>* server,
std::promise<grpc::Status>* status_promise) // clang-format off
try // clang-format on
{
mpl::ClientLogger logger{mpl::level_from(request->verbosity_level()), *config->logger, server};

Check warning on line 2810 in src/daemon/daemon.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon.cpp#L2810

Added line #L2810 was not covered by tests

ZonesReply response{};

Check warning on line 2812 in src/daemon/daemon.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon.cpp#L2812

Added line #L2812 was not covered by tests

server->Write(response);
status_promise->set_value(grpc::Status{});

Check warning on line 2815 in src/daemon/daemon.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon.cpp#L2814-L2815

Added lines #L2814 - L2815 were not covered by tests
}
catch (const std::exception& e)

Check warning on line 2817 in src/daemon/daemon.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon.cpp#L2817

Added line #L2817 was not covered by tests
{
status_promise->set_value(grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, e.what(), ""));

Check warning on line 2819 in src/daemon/daemon.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon.cpp#L2819

Added line #L2819 was not covered by tests
}

void mp::Daemon::zones_state(const ZonesStateRequest* request,

Check warning on line 2822 in src/daemon/daemon.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon.cpp#L2822

Added line #L2822 was not covered by tests
grpc::ServerReaderWriterInterface<ZonesStateReply, ZonesStateRequest>* server,
std::promise<grpc::Status>* status_promise) // clang-format off
try // clang-format on
{
mpl::ClientLogger logger{mpl::level_from(request->verbosity_level()), *config->logger, server};

Check warning on line 2827 in src/daemon/daemon.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon.cpp#L2827

Added line #L2827 was not covered by tests

status_promise->set_value(grpc::Status{});

Check warning on line 2829 in src/daemon/daemon.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon.cpp#L2829

Added line #L2829 was not covered by tests
}
catch (const std::exception& e)

Check warning on line 2831 in src/daemon/daemon.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon.cpp#L2831

Added line #L2831 was not covered by tests
{
status_promise->set_value(grpc::Status(grpc::StatusCode::FAILED_PRECONDITION, e.what(), ""));

Check warning on line 2833 in src/daemon/daemon.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon.cpp#L2833

Added line #L2833 was not covered by tests
}

void mp::Daemon::on_shutdown()
{
}
Expand Down
6 changes: 6 additions & 0 deletions src/daemon/daemon.h
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,12 @@ public slots:
virtual void daemon_info(const DaemonInfoRequest* request,
grpc::ServerReaderWriterInterface<DaemonInfoReply, DaemonInfoRequest>* server,
std::promise<grpc::Status>* status_promise);
virtual void zones(const ZonesRequest* request,
grpc::ServerReaderWriterInterface<ZonesReply, ZonesRequest>* server,
std::promise<grpc::Status>* status_promise);
virtual void zones_state(const ZonesStateRequest* request,
grpc::ServerReaderWriterInterface<ZonesStateReply, ZonesStateRequest>* server,
std::promise<grpc::Status>* status_promise);

private:
void release_resources(const std::string& instance);
Expand Down
22 changes: 22 additions & 0 deletions src/daemon/daemon_rpc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -418,6 +418,28 @@ grpc::Status mp::DaemonRpc::daemon_info(grpc::ServerContext* context,
client_cert_from(context));
}

grpc::Status mp::DaemonRpc::zones(grpc::ServerContext* context,

Check warning on line 421 in src/daemon/daemon_rpc.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon_rpc.cpp#L421

Added line #L421 was not covered by tests
grpc::ServerReaderWriter<ZonesReply, ZonesRequest>* server)
{
ZonesRequest request;
server->Read(&request);

Check warning on line 425 in src/daemon/daemon_rpc.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon_rpc.cpp#L424-L425

Added lines #L424 - L425 were not covered by tests

return verify_client_and_dispatch_operation(
std::bind(&DaemonRpc::on_zones, this, &request, server, std::placeholders::_1),
client_cert_from(context));

Check warning on line 429 in src/daemon/daemon_rpc.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon_rpc.cpp#L428-L429

Added lines #L428 - L429 were not covered by tests
}

grpc::Status mp::DaemonRpc::zones_state(grpc::ServerContext* context,

Check warning on line 432 in src/daemon/daemon_rpc.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon_rpc.cpp#L432

Added line #L432 was not covered by tests
grpc::ServerReaderWriter<ZonesStateReply, ZonesStateRequest>* server)
{
ZonesStateRequest request;
server->Read(&request);

Check warning on line 436 in src/daemon/daemon_rpc.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon_rpc.cpp#L435-L436

Added lines #L435 - L436 were not covered by tests

return verify_client_and_dispatch_operation(
std::bind(&DaemonRpc::on_zones_state, this, &request, server, std::placeholders::_1),
client_cert_from(context));

Check warning on line 440 in src/daemon/daemon_rpc.cpp

View check run for this annotation

Codecov / codecov/patch

src/daemon/daemon_rpc.cpp#L439-L440

Added lines #L439 - L440 were not covered by tests
}

template <typename OperationSignal>
grpc::Status mp::DaemonRpc::verify_client_and_dispatch_operation(OperationSignal signal, const std::string& client_cert)
{
Expand Down
10 changes: 10 additions & 0 deletions src/daemon/daemon_rpc.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,12 @@ class DaemonRpc : public QObject, public multipass::Rpc::Service, private Disabl
void on_daemon_info(const DaemonInfoRequest* request,
grpc::ServerReaderWriter<DaemonInfoReply, DaemonInfoRequest>* server,
std::promise<grpc::Status>* status_promise);
void on_zones(const ZonesRequest* request,
grpc::ServerReaderWriter<ZonesReply, ZonesRequest>* server,
std::promise<grpc::Status>* status_promise);
void on_zones_state(const ZonesStateRequest* request,
grpc::ServerReaderWriter<ZonesStateReply, ZonesStateRequest>* server,
std::promise<grpc::Status>* status_promise);

private:
template <typename OperationSignal>
Expand Down Expand Up @@ -167,6 +173,10 @@ class DaemonRpc : public QObject, public multipass::Rpc::Service, private Disabl
grpc::ServerReaderWriter<RestoreReply, RestoreRequest>* server) override;
grpc::Status daemon_info(grpc::ServerContext* context,
grpc::ServerReaderWriter<DaemonInfoReply, DaemonInfoRequest>* server) override;
grpc::Status zones(grpc::ServerContext* context,
grpc::ServerReaderWriter<ZonesReply, ZonesRequest>* server) override;
grpc::Status zones_state(grpc::ServerContext* context,
grpc::ServerReaderWriter<ZonesStateReply, ZonesStateRequest>* server) override;
};
} // namespace multipass
#endif // MULTIPASS_DAEMON_RPC_H
32 changes: 32 additions & 0 deletions src/rpc/multipass.proto
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ service Rpc {
rpc restore (stream RestoreRequest) returns (stream RestoreReply);
rpc clone (stream CloneRequest) returns (stream CloneReply);
rpc daemon_info (stream DaemonInfoRequest) returns (stream DaemonInfoReply);
rpc zones (stream ZonesRequest) returns (stream ZonesReply);
rpc zones_state (stream ZonesStateRequest) returns (stream ZonesStateReply);
}

message LaunchRequest {
Expand Down Expand Up @@ -73,6 +75,7 @@ message LaunchRequest {
bool permission_to_bridge = 13;
int32 timeout = 14;
string password = 15;
string zone = 16;
}

message LaunchError {
Expand All @@ -82,6 +85,8 @@ message LaunchError {
INVALID_DISK_SIZE = 2;
INVALID_HOSTNAME = 3;
INVALID_NETWORK = 4;
INVALID_ZONE = 5;
ZONE_UNAVAILABLE = 6;
}
repeated ErrorCodes error_codes = 1;
}
Expand Down Expand Up @@ -250,6 +255,8 @@ message DetailedInfoItem {
InstanceDetails instance_info = 7;
SnapshotDetails snapshot_info = 8;
}

Zone zone = 9;
}

message InfoReply {
Expand All @@ -271,6 +278,7 @@ message ListVMInstance {
repeated string ipv4 = 3;
repeated string ipv6 = 4;
string current_release = 5;
Zone zone = 6;
}

message ListVMSnapshot {
Expand Down Expand Up @@ -550,3 +558,27 @@ message DaemonInfoReply {
uint32 cpus = 3;
uint64 memory = 4;
}

message Zone {
string name = 1;
bool available = 2;
}

message ZonesRequest {
int32 verbosity_level = 1;
}

message ZonesReply {
string log_line = 1;
repeated Zone zones = 2;
}

message ZonesStateRequest {
int32 verbosity_level = 1;
bool available = 2;
repeated string zones = 3;
}

message ZonesStateReply {
string log_line = 1;
}
24 changes: 24 additions & 0 deletions tests/mock_client_rpc.h
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,30 @@ class MockRpcStub : public multipass::Rpc::StubInterface
PrepareAsyncdaemon_infoRaw,
(grpc::ClientContext * context, grpc::CompletionQueue* cq),
(override));
MOCK_METHOD((grpc::ClientReaderWriterInterface<multipass::ZonesRequest, multipass::ZonesReply>*),
zonesRaw,
(grpc::ClientContext * context),
(override));
MOCK_METHOD((grpc::ClientAsyncReaderWriterInterface<multipass::ZonesRequest, multipass::ZonesReply>*),
AsynczonesRaw,
(grpc::ClientContext * context, grpc::CompletionQueue* cq, void* tag),
(override));
MOCK_METHOD((grpc::ClientAsyncReaderWriterInterface<multipass::ZonesRequest, multipass::ZonesReply>*),
PrepareAsynczonesRaw,
(grpc::ClientContext * context, grpc::CompletionQueue* cq),
(override));
MOCK_METHOD((grpc::ClientReaderWriterInterface<multipass::ZonesStateRequest, multipass::ZonesStateReply>*),
zones_stateRaw,
(grpc::ClientContext * context),
(override));
MOCK_METHOD((grpc::ClientAsyncReaderWriterInterface<multipass::ZonesStateRequest, multipass::ZonesStateReply>*),
Asynczones_stateRaw,
(grpc::ClientContext * context, grpc::CompletionQueue* cq, void* tag),
(override));
MOCK_METHOD((grpc::ClientAsyncReaderWriterInterface<multipass::ZonesStateRequest, multipass::ZonesStateReply>*),
PrepareAsynczones_stateRaw,
(grpc::ClientContext * context, grpc::CompletionQueue* cq),
(override));
};
} // namespace multipass::test

Expand Down
12 changes: 12 additions & 0 deletions tests/mock_daemon.h
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,18 @@ struct MockDaemon : public Daemon
(grpc::ServerReaderWriterInterface<DaemonInfoReply, DaemonInfoRequest>*),
std::promise<grpc::Status>*),
(override));
MOCK_METHOD(void,
zones,
(const ZonesRequest*,
(grpc::ServerReaderWriterInterface<ZonesReply, ZonesRequest>*),
std::promise<grpc::Status>*),
(override));
MOCK_METHOD(void,
zones_state,
(const ZonesStateRequest*,
(grpc::ServerReaderWriterInterface<ZonesStateReply, ZonesStateRequest>*),
std::promise<grpc::Status>*),
(override));

template <typename Request, typename Reply>
void set_promise_value(const Request*, grpc::ServerReaderWriterInterface<Reply, Request>*,
Expand Down

0 comments on commit e63104e

Please sign in to comment.