diff options
Diffstat (limited to 'src/buildtool/execution_api/local/local_action.hpp')
-rw-r--r-- | src/buildtool/execution_api/local/local_action.hpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/buildtool/execution_api/local/local_action.hpp b/src/buildtool/execution_api/local/local_action.hpp new file mode 100644 index 00000000..3bf49fd2 --- /dev/null +++ b/src/buildtool/execution_api/local/local_action.hpp @@ -0,0 +1,122 @@ +#ifndef INCLUDED_SRC_BUILDTOOL_EXECUTION_API_LOCAL_LOCAL_ACTION_HPP +#define INCLUDED_SRC_BUILDTOOL_EXECUTION_API_LOCAL_LOCAL_ACTION_HPP + +#include <chrono> +#include <map> +#include <memory> +#include <string> +#include <vector> + +#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/execution_api/local/local_storage.hpp" + +class LocalApi; + +/// \brief Action for local execution. +class LocalAction final : public IExecutionAction { + friend class LocalApi; + + public: + struct Output { + bazel_re::ActionResult action{}; + bool is_cached{}; + }; + + auto Execute(Logger const* logger) noexcept + -> IExecutionResponse::Ptr final; + + void SetCacheFlag(CacheFlag flag) noexcept final { cache_flag_ = flag; } + + void SetTimeout(std::chrono::milliseconds timeout) noexcept final { + timeout_ = timeout; + } + + private: + Logger logger_{"LocalExecution"}; + std::shared_ptr<LocalStorage> storage_; + std::shared_ptr<LocalTreeMap> tree_map_; + ArtifactDigest root_digest_{}; + std::vector<std::string> cmdline_{}; + std::vector<std::string> output_files_{}; + std::vector<std::string> output_dirs_{}; + std::map<std::string, std::string> env_vars_{}; + std::vector<bazel_re::Platform_Property> properties_; + std::chrono::milliseconds timeout_{kDefaultTimeout}; + CacheFlag cache_flag_{CacheFlag::CacheOutput}; + + LocalAction(std::shared_ptr<LocalStorage> storage, + std::shared_ptr<LocalTreeMap> tree_map, + ArtifactDigest root_digest, + std::vector<std::string> command, + std::vector<std::string> output_files, + std::vector<std::string> output_dirs, + std::map<std::string, std::string> env_vars, + std::map<std::string, std::string> const& properties) noexcept + : storage_{std::move(storage)}, + tree_map_{std::move(tree_map)}, + root_digest_{std::move(root_digest)}, + cmdline_{std::move(command)}, + output_files_{std::move(output_files)}, + output_dirs_{std::move(output_dirs)}, + env_vars_{std::move(env_vars)}, + properties_{BazelMsgFactory::CreateMessageVectorFromMap< + bazel_re::Platform_Property>(properties)} { + std::sort(output_files_.begin(), output_files_.end()); + std::sort(output_dirs_.begin(), output_dirs_.end()); + } + + [[nodiscard]] auto CreateActionDigest(bazel_re::Digest const& exec_dir, + bool do_not_cache) + -> bazel_re::Digest { + return BazelMsgFactory::CreateActionDigestFromCommandLine( + cmdline_, + exec_dir, + output_files_, + output_dirs_, + {} /*FIXME output node properties*/, + BazelMsgFactory::CreateMessageVectorFromMap< + bazel_re::Command_EnvironmentVariable>(env_vars_), + properties_, + do_not_cache, + timeout_); + } + + [[nodiscard]] auto Run(bazel_re::Digest const& action_id) const noexcept + -> std::optional<Output>; + + [[nodiscard]] auto StageFile(std::filesystem::path const& target_path, + Artifact::ObjectInfo const& info) const + -> bool; + + /// \brief Stage input artifacts to the execution directory. + /// Stage artifacts and their parent directory structure from CAS to the + /// specified execution directory. The execution directory may no exist. + /// \param[in] exec_path Absolute path to the execution directory. + /// \returns Success indicator. + [[nodiscard]] auto StageInputFiles( + std::filesystem::path const& exec_path) const noexcept -> bool; + + [[nodiscard]] auto CreateDirectoryStructure( + std::filesystem::path const& exec_path) const noexcept -> bool; + + [[nodiscard]] auto CollectOutputFile(std::filesystem::path const& exec_path, + std::string const& local_path) + const noexcept -> std::optional<bazel_re::OutputFile>; + + [[nodiscard]] auto CollectOutputDir(std::filesystem::path const& exec_path, + std::string const& local_path) + const noexcept -> std::optional<bazel_re::OutputDirectory>; + + [[nodiscard]] auto CollectAndStoreOutputs( + bazel_re::ActionResult* result, + std::filesystem::path const& exec_path) const noexcept -> bool; + + /// \brief Store file from path in file CAS and return pointer to digest. + [[nodiscard]] auto DigestFromFile(std::filesystem::path const& file_path) + const noexcept -> gsl::owner<bazel_re::Digest*>; +}; + +#endif // INCLUDED_SRC_BUILDTOOL_EXECUTION_API_LOCAL_LOCAL_ACTION_HPP |