diff options
Diffstat (limited to 'src/buildtool/storage/config.hpp')
-rw-r--r-- | src/buildtool/storage/config.hpp | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/src/buildtool/storage/config.hpp b/src/buildtool/storage/config.hpp index 7c4be29d..39bb74ac 100644 --- a/src/buildtool/storage/config.hpp +++ b/src/buildtool/storage/config.hpp @@ -17,13 +17,21 @@ #include <cstddef> #include <filesystem> +#include <map> +#include <optional> #include <string> +#include <utility> +#include <vector> #include "gsl/gsl" +#include "src/buildtool/common/artifact_digest.hpp" +#include "src/buildtool/common/remote/remote_common.hpp" #include "src/buildtool/compatibility/compatibility.hpp" #include "src/buildtool/file_system/file_system_manager.hpp" +#include "src/buildtool/file_system/object_type.hpp" #include "src/buildtool/logging/log_level.hpp" #include "src/buildtool/logging/logger.hpp" +#include "src/buildtool/storage/backend_description.hpp" #include "src/utils/cpp/expected.hpp" #include "src/utils/cpp/gsl.hpp" #include "src/utils/cpp/tmp_dir.hpp" @@ -56,6 +64,9 @@ struct StorageConfig final { // Number of total storage generations (default: two generations). std::size_t const num_generations = 2; + // Hash of the execution backend description + std::string const backend_description_id = DefaultBackendDescriptionId(); + /// \brief Root directory of all storage generations. [[nodiscard]] auto CacheRoot() const noexcept -> std::filesystem::path { return build_root / "protocol-dependent"; @@ -121,6 +132,17 @@ struct StorageConfig final { bool is_compatible) -> std::filesystem::path { return dir / (is_compatible ? "compatible-sha256" : "git-sha1"); }; + + [[nodiscard]] static auto DefaultBackendDescriptionId() noexcept + -> std::string { + try { + return ArtifactDigest::Create<ObjectType::File>( + DescribeBackend(std::nullopt, {}, {}).value()) + .hash(); + } catch (...) { + return std::string(); + } + } }; class StorageConfig::Builder final { @@ -136,6 +158,17 @@ class StorageConfig::Builder final { return *this; } + auto SetRemoteExecutionArgs( + std::optional<ServerAddress> address, + std::map<std::string, std::string> properties, + std::vector<std::pair<std::map<std::string, std::string>, + ServerAddress>> dispatch) noexcept -> Builder& { + remote_address_ = std::move(address); + remote_platform_properties_ = std::move(properties); + remote_dispatch_ = std::move(dispatch); + return *this; + } + [[nodiscard]] auto Build() const noexcept -> expected<StorageConfig, std::string> { // To not duplicate default arguments of StorageConfig in builder, @@ -161,13 +194,33 @@ class StorageConfig::Builder final { } } - return StorageConfig{.build_root = std::move(build_root), - .num_generations = num_generations}; + // Hash the execution backend description + auto backend_description_id = default_config.backend_description_id; + auto desc = DescribeBackend( + remote_address_, remote_platform_properties_, remote_dispatch_); + if (desc) { + backend_description_id = + ArtifactDigest::Create<ObjectType::File>(*desc).hash(); + } + else { + return unexpected{desc.error()}; + } + + return StorageConfig{ + .build_root = std::move(build_root), + .num_generations = num_generations, + .backend_description_id = std::move(backend_description_id)}; } private: std::optional<std::filesystem::path> build_root_; std::optional<std::size_t> num_generations_; + + // Fields for computing remote execution backend description + std::optional<ServerAddress> remote_address_; + std::map<std::string, std::string> remote_platform_properties_; + std::vector<std::pair<std::map<std::string, std::string>, ServerAddress>> + remote_dispatch_; }; #endif // INCLUDED_SRC_BUILDTOOL_STORAGE_CONFIG_HPP |