summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buildtool/execution_api/common/api_bundle.cpp35
-rw-r--r--src/buildtool/execution_api/common/api_bundle.hpp10
-rw-r--r--src/buildtool/graph_traverser/graph_traverser.hpp6
-rw-r--r--src/buildtool/main/main.cpp18
-rw-r--r--src/buildtool/serve_api/serve_service/target.cpp4
-rw-r--r--src/other_tools/just_mr/fetch.cpp6
-rw-r--r--src/other_tools/just_mr/setup.cpp6
7 files changed, 53 insertions, 32 deletions
diff --git a/src/buildtool/execution_api/common/api_bundle.cpp b/src/buildtool/execution_api/common/api_bundle.cpp
index 15e84440..8808e5d8 100644
--- a/src/buildtool/execution_api/common/api_bundle.cpp
+++ b/src/buildtool/execution_api/common/api_bundle.cpp
@@ -18,16 +18,33 @@
#include "src/buildtool/execution_api/local/local_api.hpp"
#include "src/buildtool/execution_api/remote/bazel/bazel_api.hpp"
-ApiBundle::ApiBundle(gsl::not_null<LocalContext const*> const& local_context,
- gsl::not_null<RemoteContext const*> const& remote_context,
- RepositoryConfig const* repo_config)
- : hash_function{local_context->storage_config->hash_function},
- local{std::make_shared<LocalApi>(local_context, repo_config)},
- remote{CreateRemote(remote_context->exec_config->remote_address,
- remote_context->auth,
- remote_context->retry_config)} {}
+/// \note Some logic from MakeRemote is duplicated here as that method cannot
+/// be used without the hash_function field being set prior to the call.
+auto ApiBundle::Create(
+ gsl::not_null<LocalContext const*> const& local_context,
+ gsl::not_null<RemoteContext const*> const& remote_context,
+ RepositoryConfig const* repo_config) -> ApiBundle {
+ auto const hash_fct = local_context->storage_config->hash_function;
+ IExecutionApi::Ptr local_api =
+ std::make_shared<LocalApi>(local_context, repo_config);
+ IExecutionApi::Ptr remote_api = local_api;
+ if (auto const address = remote_context->exec_config->remote_address) {
+ ExecutionConfiguration config;
+ config.skip_cache_lookup = false;
+ remote_api = std::make_shared<BazelApi>("remote-execution",
+ address->host,
+ address->port,
+ remote_context->auth,
+ remote_context->retry_config,
+ config,
+ hash_fct);
+ }
+ return ApiBundle{.hash_function = hash_fct,
+ .local = std::move(local_api),
+ .remote = std::move(remote_api)};
+}
-auto ApiBundle::CreateRemote(
+auto ApiBundle::MakeRemote(
std::optional<ServerAddress> const& address,
gsl::not_null<Auth const*> const& authentication,
gsl::not_null<RetryConfig const*> const& retry_config) const
diff --git a/src/buildtool/execution_api/common/api_bundle.hpp b/src/buildtool/execution_api/common/api_bundle.hpp
index 17c64d1e..28595010 100644
--- a/src/buildtool/execution_api/common/api_bundle.hpp
+++ b/src/buildtool/execution_api/common/api_bundle.hpp
@@ -29,10 +29,13 @@
/// same time. If the remote api cannot be instantiated, it falls back to
/// exactly the same instance that local api is (&*remote == & *local).
struct ApiBundle final {
- explicit ApiBundle(
+ /// \brief Create an ApiBundle instance.
+ /// \note A creator method is used instead of a constructor to allow for
+ /// tests to instantiate ApiBundles with own implementations of the APIs.
+ [[nodiscard]] static auto Create(
gsl::not_null<LocalContext const*> const& local_context,
gsl::not_null<RemoteContext const*> const& remote_context,
- RepositoryConfig const* repo_config);
+ RepositoryConfig const* repo_config) -> ApiBundle;
/// \brief Create a Remote object based on the given arguments.
/// \param address The endpoint address.
@@ -40,13 +43,12 @@ struct ApiBundle final {
/// \param retry_config The retry strategy configuration.
/// \returns A configured api: BazelApi if a remote address is given,
/// otherwise fall back to the already configured LocalApi instance.
- [[nodiscard]] auto CreateRemote(
+ [[nodiscard]] auto MakeRemote(
std::optional<ServerAddress> const& address,
gsl::not_null<Auth const*> const& authentication,
gsl::not_null<RetryConfig const*> const& retry_config) const
-> gsl::not_null<IExecutionApi::Ptr>;
- // Needed to be set before creating the remote (via CreateRemote)
HashFunction const hash_function;
// 7 bytes of alignment.
diff --git a/src/buildtool/graph_traverser/graph_traverser.hpp b/src/buildtool/graph_traverser/graph_traverser.hpp
index a63f7d8c..301ef722 100644
--- a/src/buildtool/graph_traverser/graph_traverser.hpp
+++ b/src/buildtool/graph_traverser/graph_traverser.hpp
@@ -385,9 +385,9 @@ class GraphTraverser {
std::vector<ArtifactIdentifier> const& artifact_ids) const -> bool {
// setup rebuilder with api for cache endpoint
auto api_cached =
- apis_.CreateRemote(remote_context_.exec_config->cache_address,
- remote_context_.auth,
- remote_context_.retry_config);
+ apis_.MakeRemote(remote_context_.exec_config->cache_address,
+ remote_context_.auth,
+ remote_context_.retry_config);
Rebuilder executor{repo_config_,
&*apis_.local,
&*apis_.remote,
diff --git a/src/buildtool/main/main.cpp b/src/buildtool/main/main.cpp
index 18caa871..e97b5a27 100644
--- a/src/buildtool/main/main.cpp
+++ b/src/buildtool/main/main.cpp
@@ -822,9 +822,10 @@ auto main(int argc, char* argv[]) -> int {
.retry_config = &retry_config,
.exec_config = &remote_exec_config};
- ApiBundle const exec_apis{&local_context,
- &remote_context,
- /*repo_config=*/nullptr};
+ auto const exec_apis =
+ ApiBundle::Create(&local_context,
+ &remote_context,
+ /*repo_config=*/nullptr);
return execution_server->Run(&local_context,
&remote_context,
@@ -888,9 +889,10 @@ auto main(int argc, char* argv[]) -> int {
.retry_config = &*retry_config,
.exec_config = &*remote_exec_config};
- ApiBundle const serve_apis{&local_context,
- &remote_context,
- /*repo_config=*/nullptr};
+ auto const serve_apis =
+ ApiBundle::Create(&local_context,
+ &remote_context,
+ /*repo_config=*/nullptr);
auto serve = ServeApi::Create(*serve_config,
&local_context,
&remote_context,
@@ -988,8 +990,8 @@ auto main(int argc, char* argv[]) -> int {
.retry_config = &*retry_config,
.exec_config = &*remote_exec_config};
- ApiBundle const main_apis{
- &local_context, &remote_context, &repo_config};
+ auto const main_apis =
+ ApiBundle::Create(&local_context, &remote_context, &repo_config);
GraphTraverser const traverser{
{jobs,
std::move(arguments.build),
diff --git a/src/buildtool/serve_api/serve_service/target.cpp b/src/buildtool/serve_api/serve_service/target.cpp
index ec8ff458..9ad1520b 100644
--- a/src/buildtool/serve_api/serve_service/target.cpp
+++ b/src/buildtool/serve_api/serve_service/target.cpp
@@ -501,8 +501,8 @@ auto TargetService::ServeTarget(
// Use a new ApiBundle that knows about local repository config and
// dispatch endpoint for traversing
- ApiBundle const local_apis{
- &local_context_, &dispatch_context, &repository_config};
+ auto const local_apis = ApiBundle::Create(
+ &local_context_, &dispatch_context, &repository_config);
GraphTraverser const traverser{
std::move(traverser_args),
diff --git a/src/other_tools/just_mr/fetch.cpp b/src/other_tools/just_mr/fetch.cpp
index 088c9ace..d236b7e8 100644
--- a/src/other_tools/just_mr/fetch.cpp
+++ b/src/other_tools/just_mr/fetch.cpp
@@ -440,9 +440,9 @@ auto MultiRepoFetch(std::shared_ptr<Configuration> const& config,
.exec_config = &*remote_exec_config};
// setup the APIs for archive fetches; only happens if in native mode
- ApiBundle const apis{&local_context,
- &remote_context,
- /*repo_config=*/nullptr};
+ auto const apis = ApiBundle::Create(&local_context,
+ &remote_context,
+ /*repo_config=*/nullptr);
bool const has_remote_api =
apis.local != apis.remote and not common_args.compatible;
diff --git a/src/other_tools/just_mr/setup.cpp b/src/other_tools/just_mr/setup.cpp
index 9f9e09bd..ba5e39b4 100644
--- a/src/other_tools/just_mr/setup.cpp
+++ b/src/other_tools/just_mr/setup.cpp
@@ -161,9 +161,9 @@ auto MultiRepoSetup(std::shared_ptr<Configuration> const& config,
.retry_config = &*retry_config,
.exec_config = &*remote_exec_config};
- ApiBundle const apis{&local_context,
- &remote_context,
- /*repo_config=*/nullptr};
+ auto const apis = ApiBundle::Create(&local_context,
+ &remote_context,
+ /*repo_config=*/nullptr);
bool const has_remote_api =
apis.local != apis.remote and not common_args.compatible;