diff options
Diffstat (limited to 'src/buildtool/execution_api/common')
-rw-r--r-- | src/buildtool/execution_api/common/TARGETS | 8 | ||||
-rw-r--r-- | src/buildtool/execution_api/common/execution_api.cpp | 56 | ||||
-rw-r--r-- | src/buildtool/execution_api/common/execution_api.hpp | 8 |
3 files changed, 69 insertions, 3 deletions
diff --git a/src/buildtool/execution_api/common/TARGETS b/src/buildtool/execution_api/common/TARGETS index 4a9c60e1..1d0431f0 100644 --- a/src/buildtool/execution_api/common/TARGETS +++ b/src/buildtool/execution_api/common/TARGETS @@ -7,18 +7,20 @@ , "execution_action.hpp" , "execution_response.hpp" ] + , "srcs": ["execution_api.cpp"] , "deps": [ ["@", "gsl", "", "gsl"] , ["src/buildtool/common", "common"] , ["src/buildtool/crypto", "hash_function"] , ["src/buildtool/execution_api/bazel_msg", "bazel_msg"] , ["src/buildtool/execution_api/bazel_msg", "bazel_msg_factory"] - , ["src/utils/cpp", "hex_string"] - , ["src/utils/cpp", "gsl"] + , ["src/buildtool/file_system", "file_system_manager"] + , ["src/buildtool/file_system", "object_type"] , ["src/buildtool/logging", "logging"] + , ["src/utils/cpp", "gsl"] + , ["src/utils/cpp", "hex_string"] ] , "stage": ["src", "buildtool", "execution_api", "common"] - , "private-deps": [["src/buildtool/file_system", "object_type"]] } , "bytestream-common": { "type": ["@", "rules", "CC", "library"] diff --git a/src/buildtool/execution_api/common/execution_api.cpp b/src/buildtool/execution_api/common/execution_api.cpp new file mode 100644 index 00000000..f91dee43 --- /dev/null +++ b/src/buildtool/execution_api/common/execution_api.cpp @@ -0,0 +1,56 @@ +// Copyright 2023 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/buildtool/execution_api/common/execution_api.hpp" + +#include "src/buildtool/execution_api/bazel_msg/bazel_blob_container.hpp" +#include "src/buildtool/file_system/file_system_manager.hpp" + +#include <gsl/gsl> + +[[nodiscard]] auto IExecutionApi::UploadFile( + std::filesystem::path const& file_path, + ObjectType type) noexcept -> bool { + auto data = FileSystemManager::ReadFile(file_path); + if (not data) { + return false; + } + ArtifactDigest digest{}; + switch (type) { + case ObjectType::File: + digest = ArtifactDigest::Create<ObjectType::File>(*data); + break; + case ObjectType::Executable: + digest = ArtifactDigest::Create<ObjectType::Executable>(*data); + break; + case ObjectType::Tree: + digest = ArtifactDigest::Create<ObjectType::Tree>(*data); + break; + case ObjectType::Symlink: + digest = ArtifactDigest::Create<ObjectType::Symlink>(*data); + break; + default: + Ensures(false); // unreachable + return false; + } + BlobContainer container{}; + try { + auto exec = IsExecutableObject(type); + container.Emplace(BazelBlob{digest, *data, exec}); + } catch (std::exception const& ex) { + Logger::Log(LogLevel::Error, "failed to emplace blob: ", ex.what()); + return false; + } + return Upload(container); +} diff --git a/src/buildtool/execution_api/common/execution_api.hpp b/src/buildtool/execution_api/common/execution_api.hpp index 37abd5ea..d6ec49fb 100644 --- a/src/buildtool/execution_api/common/execution_api.hpp +++ b/src/buildtool/execution_api/common/execution_api.hpp @@ -15,6 +15,7 @@ #ifndef INCLUDED_SRC_BUILDTOOL_EXECUTION_API_COMMON_EXECUTION_APIHPP #define INCLUDED_SRC_BUILDTOOL_EXECUTION_API_COMMON_EXECUTION_APIHPP +#include <filesystem> #include <map> #include <memory> #include <optional> @@ -27,6 +28,7 @@ #include "src/buildtool/execution_api/bazel_msg/bazel_blob_container.hpp" #include "src/buildtool/execution_api/bazel_msg/bazel_msg_factory.hpp" #include "src/buildtool/execution_api/common/execution_action.hpp" +#include "src/buildtool/file_system/object_type.hpp" /// \brief Abstract remote execution API /// Can be used to create actions. @@ -116,6 +118,12 @@ class IExecutionApi { bool skip_find_missing = false) noexcept -> bool = 0; + /// \brief Upload a file to CAS as an object of the specified type. + /// It may be assumed that the file is owned entirely by the build process. + [[nodiscard]] virtual auto UploadFile( + std::filesystem::path const& file_path, + ObjectType type) noexcept -> bool; + [[nodiscard]] virtual auto UploadTree( std::vector<DependencyGraph::NamedArtifactNodePtr> const& artifacts) noexcept -> std::optional<ArtifactDigest> = 0; |