diff options
11 files changed, 87 insertions, 32 deletions
diff --git a/src/buildtool/execution_api/common/TARGETS b/src/buildtool/execution_api/common/TARGETS index 579412d9..2e5d14dd 100644 --- a/src/buildtool/execution_api/common/TARGETS +++ b/src/buildtool/execution_api/common/TARGETS @@ -50,6 +50,7 @@ ] , "private-deps": [ ["src/buildtool/execution_api/bazel_msg", "bazel_msg"] + , ["src/buildtool/execution_api/local", "config"] , ["src/buildtool/execution_api/local", "local"] , ["src/buildtool/execution_api/remote", "bazel"] ] diff --git a/src/buildtool/execution_api/common/api_bundle.cpp b/src/buildtool/execution_api/common/api_bundle.cpp index 933ac1f3..411fb02f 100644 --- a/src/buildtool/execution_api/common/api_bundle.cpp +++ b/src/buildtool/execution_api/common/api_bundle.cpp @@ -15,6 +15,7 @@ #include "src/buildtool/execution_api/common/api_bundle.hpp" #include "src/buildtool/execution_api/bazel_msg/bazel_common.hpp" +#include "src/buildtool/execution_api/local/config.hpp" #include "src/buildtool/execution_api/local/local_api.hpp" #include "src/buildtool/execution_api/remote/bazel/bazel_api.hpp" @@ -25,6 +26,7 @@ ApiBundle::ApiBundle(gsl::not_null<StorageConfig const*> const& storage_config, std::optional<ServerAddress> const& remote_address) : local{std::make_shared<LocalApi>(storage_config, storage, + &LocalExecutionConfig::Instance(), repo_config)}, // needed by remote auth{*authentication}, // needed by remote remote{CreateRemote(remote_address)} {} diff --git a/src/buildtool/execution_api/local/TARGETS b/src/buildtool/execution_api/local/TARGETS index da3e4432..2c848bf7 100644 --- a/src/buildtool/execution_api/local/TARGETS +++ b/src/buildtool/execution_api/local/TARGETS @@ -30,6 +30,7 @@ [ ["@", "fmt", "", "fmt"] , ["@", "gsl", "", "gsl"] , ["@", "grpc", "", "grpc++"] + , "config" , ["src/buildtool/common", "common"] , ["src/buildtool/common", "config"] , ["src/buildtool/storage", "storage"] @@ -51,7 +52,6 @@ , "private-deps": [ ["src/buildtool/file_system", "object_type"] , ["src/buildtool/system", "system_command"] - , "config" , ["src/buildtool/common", "bazel_types"] , ["src/buildtool/file_system", "file_system_manager"] , ["src/buildtool/execution_api/utils", "outputscheck"] diff --git a/src/buildtool/execution_api/local/local_action.cpp b/src/buildtool/execution_api/local/local_action.cpp index 955e6724..73d78e36 100644 --- a/src/buildtool/execution_api/local/local_action.cpp +++ b/src/buildtool/execution_api/local/local_action.cpp @@ -24,7 +24,6 @@ #include "src/buildtool/common/bazel_types.hpp" #include "src/buildtool/compatibility/native_support.hpp" #include "src/buildtool/execution_api/common/tree_reader.hpp" -#include "src/buildtool/execution_api/local/config.hpp" #include "src/buildtool/execution_api/local/local_cas_reader.hpp" #include "src/buildtool/execution_api/local/local_response.hpp" #include "src/buildtool/execution_api/utils/outputscheck.hpp" @@ -166,7 +165,7 @@ auto LocalAction::Run(bazel_re::Digest const& action_id) const noexcept return std::nullopt; } - auto cmdline = LocalExecutionConfig::GetLauncher(); + auto cmdline = exec_config_.GetLauncher(); std::copy(cmdline_.begin(), cmdline_.end(), std::back_inserter(cmdline)); SystemCommand system{"LocalExecution"}; diff --git a/src/buildtool/execution_api/local/local_action.hpp b/src/buildtool/execution_api/local/local_action.hpp index e62f209f..a9ffe959 100644 --- a/src/buildtool/execution_api/local/local_action.hpp +++ b/src/buildtool/execution_api/local/local_action.hpp @@ -28,6 +28,7 @@ #include "src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp" #include "src/buildtool/execution_api/common/execution_action.hpp" #include "src/buildtool/execution_api/common/execution_response.hpp" +#include "src/buildtool/execution_api/local/config.hpp" #include "src/buildtool/logging/logger.hpp" #include "src/buildtool/storage/config.hpp" #include "src/buildtool/storage/storage.hpp" @@ -65,6 +66,7 @@ class LocalAction final : public IExecutionAction { Logger logger_{"LocalExecution"}; StorageConfig const& storage_config_; Storage const& storage_; + LocalExecutionConfig const& exec_config_; ArtifactDigest const root_digest_{}; std::vector<std::string> const cmdline_{}; std::vector<std::string> output_files_{}; @@ -77,6 +79,7 @@ class LocalAction final : public IExecutionAction { explicit LocalAction( gsl::not_null<StorageConfig const*> storage_config, gsl::not_null<Storage const*> const& storage, + gsl::not_null<LocalExecutionConfig const*> const& exec_config, ArtifactDigest root_digest, std::vector<std::string> command, std::vector<std::string> output_files, @@ -85,6 +88,7 @@ class LocalAction final : public IExecutionAction { std::map<std::string, std::string> const& properties) noexcept : storage_config_{*storage_config}, storage_{*storage}, + exec_config_{*exec_config}, root_digest_{std::move(root_digest)}, cmdline_{std::move(command)}, output_files_{std::move(output_files)}, diff --git a/src/buildtool/execution_api/local/local_api.hpp b/src/buildtool/execution_api/local/local_api.hpp index bfa1d6c6..fc133835 100644 --- a/src/buildtool/execution_api/local/local_api.hpp +++ b/src/buildtool/execution_api/local/local_api.hpp @@ -43,6 +43,7 @@ #include "src/buildtool/execution_api/common/tree_reader.hpp" #include "src/buildtool/execution_api/execution_service/cas_utils.hpp" #include "src/buildtool/execution_api/git/git_api.hpp" +#include "src/buildtool/execution_api/local/config.hpp" #include "src/buildtool/execution_api/local/local_action.hpp" #include "src/buildtool/execution_api/local/local_cas_reader.hpp" #include "src/buildtool/file_system/file_system_manager.hpp" @@ -54,11 +55,14 @@ /// \brief API for local execution. class LocalApi final : public IExecutionApi { public: - explicit LocalApi(gsl::not_null<StorageConfig const*> const& storage_config, - gsl::not_null<Storage const*> const& storage, - RepositoryConfig const* repo_config = nullptr) noexcept + explicit LocalApi( + gsl::not_null<StorageConfig const*> const& storage_config, + gsl::not_null<Storage const*> const& storage, + gsl::not_null<LocalExecutionConfig const*> const& exec_config, + RepositoryConfig const* repo_config = nullptr) noexcept : storage_config_{*storage_config}, storage_{*storage}, + exec_config_{*exec_config}, repo_config_{repo_config} {} [[nodiscard]] auto CreateAction( @@ -71,6 +75,7 @@ class LocalApi final : public IExecutionApi { -> IExecutionAction::Ptr final { return IExecutionAction::Ptr{new LocalAction{&storage_config_, &storage_, + &exec_config_, root_digest, command, output_files, @@ -411,6 +416,7 @@ class LocalApi final : public IExecutionApi { private: StorageConfig const& storage_config_; Storage const& storage_; + LocalExecutionConfig const& exec_config_; RepositoryConfig const* const repo_config_ = nullptr; }; diff --git a/test/buildtool/execution_api/local/TARGETS b/test/buildtool/execution_api/local/TARGETS index 09b88419..41870428 100644 --- a/test/buildtool/execution_api/local/TARGETS +++ b/test/buildtool/execution_api/local/TARGETS @@ -25,6 +25,7 @@ , "private-deps": [ ["@", "catch2", "", "catch2"] , ["", "catch-main"] + , ["@", "src", "src/buildtool/execution_api/local", "config"] , ["@", "src", "src/buildtool/execution_api/local", "local"] , ["buildtool/execution_api/common", "api_test"] , ["utils", "test_storage_config"] diff --git a/test/buildtool/execution_api/local/local_api.test.cpp b/test/buildtool/execution_api/local/local_api.test.cpp index a2fee207..164226b9 100644 --- a/test/buildtool/execution_api/local/local_api.test.cpp +++ b/test/buildtool/execution_api/local/local_api.test.cpp @@ -16,6 +16,7 @@ #include <string> #include "catch2/catch_test_macros.hpp" +#include "src/buildtool/execution_api/local/config.hpp" #include "src/buildtool/execution_api/local/local_api.hpp" #include "src/buildtool/storage/config.hpp" #include "src/buildtool/storage/storage.hpp" @@ -27,16 +28,22 @@ class FactoryApi final { public: explicit FactoryApi( gsl::not_null<StorageConfig const*> const& storage_config, - gsl::not_null<Storage const*> const& storage) noexcept - : storage_config_{*storage_config}, storage_{*storage} {} + gsl::not_null<Storage const*> const& storage, + gsl::not_null<LocalExecutionConfig const*> const& + local_exec_config) noexcept + : storage_config_{*storage_config}, + storage_{*storage}, + local_exec_config_{*local_exec_config} {} [[nodiscard]] auto operator()() const -> IExecutionApi::Ptr { - return IExecutionApi::Ptr{new LocalApi{&storage_config_, &storage_}}; + return IExecutionApi::Ptr{ + new LocalApi{&storage_config_, &storage_, &local_exec_config_}}; } private: StorageConfig const& storage_config_; Storage const& storage_; + LocalExecutionConfig const& local_exec_config_; }; } // namespace @@ -44,7 +51,8 @@ class FactoryApi final { TEST_CASE("LocalAPI: No input, no output", "[execution_api]") { auto const storage_config = TestStorageConfig::Create(); auto const storage = Storage::Create(&storage_config.Get()); - FactoryApi api_factory(&storage_config.Get(), &storage); + FactoryApi api_factory( + &storage_config.Get(), &storage, &LocalExecutionConfig::Instance()); TestNoInputNoOutput(api_factory, {}, /*is_hermetic=*/true); } @@ -52,7 +60,8 @@ TEST_CASE("LocalAPI: No input, no output", "[execution_api]") { TEST_CASE("LocalAPI: No input, create output", "[execution_api]") { auto const storage_config = TestStorageConfig::Create(); auto const storage = Storage::Create(&storage_config.Get()); - FactoryApi api_factory(&storage_config.Get(), &storage); + FactoryApi api_factory( + &storage_config.Get(), &storage, &LocalExecutionConfig::Instance()); TestNoInputCreateOutput(api_factory, {}, /*is_hermetic=*/true); } @@ -60,7 +69,8 @@ TEST_CASE("LocalAPI: No input, create output", "[execution_api]") { TEST_CASE("LocalAPI: One input copied to output", "[execution_api]") { auto const storage_config = TestStorageConfig::Create(); auto const storage = Storage::Create(&storage_config.Get()); - FactoryApi api_factory(&storage_config.Get(), &storage); + FactoryApi api_factory( + &storage_config.Get(), &storage, &LocalExecutionConfig::Instance()); TestOneInputCopiedToOutput(api_factory, {}, /*is_hermetic=*/true); } @@ -68,7 +78,8 @@ TEST_CASE("LocalAPI: One input copied to output", "[execution_api]") { TEST_CASE("LocalAPI: Non-zero exit code, create output", "[execution_api]") { auto const storage_config = TestStorageConfig::Create(); auto const storage = Storage::Create(&storage_config.Get()); - FactoryApi api_factory(&storage_config.Get(), &storage); + FactoryApi api_factory( + &storage_config.Get(), &storage, &LocalExecutionConfig::Instance()); TestNonZeroExitCodeCreateOutput(api_factory, {}); } @@ -76,7 +87,8 @@ TEST_CASE("LocalAPI: Non-zero exit code, create output", "[execution_api]") { TEST_CASE("LocalAPI: Retrieve two identical trees to path", "[execution_api]") { auto const storage_config = TestStorageConfig::Create(); auto const storage = Storage::Create(&storage_config.Get()); - FactoryApi api_factory(&storage_config.Get(), &storage); + FactoryApi api_factory( + &storage_config.Get(), &storage, &LocalExecutionConfig::Instance()); TestRetrieveTwoIdenticalTreesToPath( api_factory, {}, "two_trees", /*is_hermetic=*/true); @@ -86,7 +98,8 @@ TEST_CASE("LocalAPI: Retrieve file and symlink with same content to path", "[execution_api]") { auto const storage_config = TestStorageConfig::Create(); auto const storage = Storage::Create(&storage_config.Get()); - FactoryApi api_factory(&storage_config.Get(), &storage); + FactoryApi api_factory( + &storage_config.Get(), &storage, &LocalExecutionConfig::Instance()); TestRetrieveFileAndSymlinkWithSameContentToPath( api_factory, {}, "file_and_symlink", /*is_hermetic=*/true); @@ -95,7 +108,8 @@ TEST_CASE("LocalAPI: Retrieve file and symlink with same content to path", TEST_CASE("LocalAPI: Retrieve mixed blobs and trees", "[execution_api]") { auto const storage_config = TestStorageConfig::Create(); auto const storage = Storage::Create(&storage_config.Get()); - FactoryApi api_factory(&storage_config.Get(), &storage); + FactoryApi api_factory( + &storage_config.Get(), &storage, &LocalExecutionConfig::Instance()); TestRetrieveMixedBlobsAndTrees( api_factory, {}, "blobs_and_trees", /*is_hermetic=*/true); @@ -104,7 +118,8 @@ TEST_CASE("LocalAPI: Retrieve mixed blobs and trees", "[execution_api]") { TEST_CASE("LocalAPI: Create directory prior to execution", "[execution_api]") { auto const storage_config = TestStorageConfig::Create(); auto const storage = Storage::Create(&storage_config.Get()); - FactoryApi api_factory(&storage_config.Get(), &storage); + FactoryApi api_factory( + &storage_config.Get(), &storage, &LocalExecutionConfig::Instance()); TestCreateDirPriorToExecution(api_factory, {}, /*is_hermetic=*/true); } diff --git a/test/buildtool/execution_api/local/local_execution.test.cpp b/test/buildtool/execution_api/local/local_execution.test.cpp index 4c2e309c..e8489b33 100644 --- a/test/buildtool/execution_api/local/local_execution.test.cpp +++ b/test/buildtool/execution_api/local/local_execution.test.cpp @@ -63,7 +63,10 @@ TEST_CASE("LocalExecution: No input, no output", "[execution_api]") { auto const storage = Storage::Create(&storage_config.Get()); RepositoryConfig repo_config{}; - auto api = LocalApi(&storage_config.Get(), &storage, &repo_config); + auto api = LocalApi(&storage_config.Get(), + &storage, + &LocalExecutionConfig::Instance(), + &repo_config); std::string test_content("test"); std::vector<std::string> const cmdline = {"echo", "-n", test_content}; @@ -111,7 +114,10 @@ TEST_CASE("LocalExecution: No input, no output, env variables used", auto const storage = Storage::Create(&storage_config.Get()); RepositoryConfig repo_config{}; - auto api = LocalApi(&storage_config.Get(), &storage, &repo_config); + auto api = LocalApi(&storage_config.Get(), + &storage, + &LocalExecutionConfig::Instance(), + &repo_config); std::string test_content("test from env var"); std::vector<std::string> const cmdline = { @@ -162,7 +168,10 @@ TEST_CASE("LocalExecution: No input, create output", "[execution_api]") { auto const storage = Storage::Create(&storage_config.Get()); RepositoryConfig repo_config{}; - auto api = LocalApi(&storage_config.Get(), &storage, &repo_config); + auto api = LocalApi(&storage_config.Get(), + &storage, + &LocalExecutionConfig::Instance(), + &repo_config); std::string test_content("test"); auto test_digest = ArtifactDigest::Create<ObjectType::File>(test_content); @@ -219,7 +228,10 @@ TEST_CASE("LocalExecution: One input copied to output", "[execution_api]") { auto const storage = Storage::Create(&storage_config.Get()); RepositoryConfig repo_config{}; - auto api = LocalApi(&storage_config.Get(), &storage, &repo_config); + auto api = LocalApi(&storage_config.Get(), + &storage, + &LocalExecutionConfig::Instance(), + &repo_config); std::string test_content("test"); auto test_digest = ArtifactDigest::Create<ObjectType::File>(test_content); @@ -289,7 +301,10 @@ TEST_CASE("LocalExecution: Cache failed action's result", "[execution_api]") { auto const storage = Storage::Create(&storage_config.Get()); RepositoryConfig repo_config{}; - auto api = LocalApi(&storage_config.Get(), &storage, &repo_config); + auto api = LocalApi(&storage_config.Get(), + &storage, + &LocalExecutionConfig::Instance(), + &repo_config); auto flag = GetTestDir() / "flag"; std::vector<std::string> const cmdline = { diff --git a/test/buildtool/execution_engine/executor/TARGETS b/test/buildtool/execution_engine/executor/TARGETS index 1bd82e69..26b4e9a8 100644 --- a/test/buildtool/execution_engine/executor/TARGETS +++ b/test/buildtool/execution_engine/executor/TARGETS @@ -45,6 +45,7 @@ [ "executor_api_tests" , ["@", "src", "src/buildtool/common", "common"] , ["@", "src", "src/buildtool/common", "config"] + , ["@", "src", "src/buildtool/execution_api/local", "config"] , ["@", "src", "src/buildtool/execution_api/local", "local"] , ["@", "src", "src/buildtool/execution_api/remote", "config"] , ["@", "src", "src/buildtool/execution_engine/executor", "executor"] diff --git a/test/buildtool/execution_engine/executor/executor_api_local.test.cpp b/test/buildtool/execution_engine/executor/executor_api_local.test.cpp index 5c423dea..d8e9fd96 100644 --- a/test/buildtool/execution_engine/executor/executor_api_local.test.cpp +++ b/test/buildtool/execution_engine/executor/executor_api_local.test.cpp @@ -17,6 +17,7 @@ #include "catch2/catch_test_macros.hpp" #include "src/buildtool/common/repository_config.hpp" #include "src/buildtool/common/statistics.hpp" +#include "src/buildtool/execution_api/local/config.hpp" #include "src/buildtool/execution_api/local/local_api.hpp" #include "src/buildtool/execution_api/remote/config.hpp" #include "src/buildtool/execution_engine/executor/executor.hpp" @@ -33,8 +34,10 @@ TEST_CASE("Executor<LocalApi>: Upload blob", "[executor]") { RepositoryConfig repo_config{}; TestBlobUpload(&repo_config, [&] { - return std::make_unique<LocalApi>( - &storage_config.Get(), &storage, &repo_config); + return std::make_unique<LocalApi>(&storage_config.Get(), + &storage, + &LocalExecutionConfig::Instance(), + &repo_config); }); } @@ -52,8 +55,10 @@ TEST_CASE("Executor<LocalApi>: Compile hello world", "[executor]") { &stats, &progress, [&] { - return std::make_unique<LocalApi>( - &storage_config.Get(), &storage, &repo_config); + return std::make_unique<LocalApi>(&storage_config.Get(), + &storage, + &LocalExecutionConfig::Instance(), + &repo_config); }, &*auth_config); } @@ -72,8 +77,10 @@ TEST_CASE("Executor<LocalApi>: Compile greeter", "[executor]") { &stats, &progress, [&] { - return std::make_unique<LocalApi>( - &storage_config.Get(), &storage, &repo_config); + return std::make_unique<LocalApi>(&storage_config.Get(), + &storage, + &LocalExecutionConfig::Instance(), + &repo_config); }, &*auth_config); } @@ -92,8 +99,10 @@ TEST_CASE("Executor<LocalApi>: Upload and download trees", "[executor]") { &stats, &progress, [&] { - return std::make_unique<LocalApi>( - &storage_config.Get(), &storage, &repo_config); + return std::make_unique<LocalApi>(&storage_config.Get(), + &storage, + &LocalExecutionConfig::Instance(), + &repo_config); }, &*auth_config); } @@ -112,8 +121,10 @@ TEST_CASE("Executor<LocalApi>: Retrieve output directories", "[executor]") { &stats, &progress, [&] { - return std::make_unique<LocalApi>( - &storage_config.Get(), &storage, &repo_config); + return std::make_unique<LocalApi>(&storage_config.Get(), + &storage, + &LocalExecutionConfig::Instance(), + &repo_config); }, &*auth_config); } |