diff options
Diffstat (limited to 'src/buildtool/serve_api/remote/configuration_client.cpp')
-rw-r--r-- | src/buildtool/serve_api/remote/configuration_client.cpp | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/src/buildtool/serve_api/remote/configuration_client.cpp b/src/buildtool/serve_api/remote/configuration_client.cpp index b4f74230..acb43886 100644 --- a/src/buildtool/serve_api/remote/configuration_client.cpp +++ b/src/buildtool/serve_api/remote/configuration_client.cpp @@ -14,8 +14,11 @@ #include "src/buildtool/serve_api/remote/configuration_client.hpp" +#include <optional> + #include "nlohmann/json.hpp" #include "src/buildtool/execution_api/remote/config.hpp" +#include "src/buildtool/serve_api/remote/config.hpp" auto ConfigurationClient::CheckServeRemoteExecution() -> bool { auto client_remote_address = RemoteExecutionConfig::RemoteAddress(); @@ -25,6 +28,13 @@ auto ConfigurationClient::CheckServeRemoteExecution() -> bool { "have been set."); return false; } + auto client_serve_address = RemoteServeConfig::RemoteAddress(); + if (!client_serve_address) { + logger_.Emit( + LogLevel::Error, + "Internal error: the serve endpoint should have been set."); + return false; + } grpc::ClientContext context; justbuild::just_serve::RemoteExecutionEndpointRequest request{}; @@ -36,16 +46,43 @@ auto ConfigurationClient::CheckServeRemoteExecution() -> bool { LogStatus(&logger_, LogLevel::Error, status); return false; } - auto serve_remote_endpoint = nlohmann::json::parse(response.address()); - if (serve_remote_endpoint != client_remote_address->ToJson()) { - Logger::Log(LogLevel::Error, - "Different execution endpoint detected.\nIn order to " - "correctly use just serve, its remote execution endpoint " - "must be the same used by the client.\nserve remote " - "endpoint: {}\nclient remote endpoint: {}", - serve_remote_endpoint.dump(), - client_remote_address->ToJson().dump()); - return false; + auto client_msg = client_remote_address->ToJson().dump(); + std::string serve_msg{}; + + if (response.address().empty()) { + // just serve acts as just execute, so from the server's perspective + // there is nothing to be checked and it's the client's job to ensure + // that its remote execution and serve endpoints match + // + // NOTE: This check might make sense to be removed altogether in the + // future, or updated to (at most) a warning. + if (client_remote_address->ToJson() == client_serve_address->ToJson()) { + return true; + } + serve_msg = client_serve_address->ToJson().dump(); + } + else { + nlohmann::json serve_remote_endpoint{}; + try { + serve_remote_endpoint = nlohmann::json::parse(response.address()); + } catch (std::exception const& ex) { + logger_.Emit( + LogLevel::Error, + "Parsing configured address from response failed with:\n{}", + ex.what()); + } + if (serve_remote_endpoint == client_remote_address->ToJson()) { + return true; + } + serve_msg = serve_remote_endpoint.dump(); } - return true; + // log any mismatch found + logger_.Emit( + LogLevel::Error, + "Different execution endpoint detected.\nIn order to correctly use " + "just serve, its remote execution endpoint must be the same used by " + "the client.\nserve remote endpoint: {}\nclient remote endpoint: {}", + serve_msg, + client_msg); + return false; } |