summaryrefslogtreecommitdiff
path: root/src/buildtool/execution_api/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildtool/execution_api/common')
-rw-r--r--src/buildtool/execution_api/common/bytestream_utils.cpp53
-rw-r--r--src/buildtool/execution_api/common/bytestream_utils.hpp37
2 files changed, 90 insertions, 0 deletions
diff --git a/src/buildtool/execution_api/common/bytestream_utils.cpp b/src/buildtool/execution_api/common/bytestream_utils.cpp
index cd1f0d19..f1b53f05 100644
--- a/src/buildtool/execution_api/common/bytestream_utils.cpp
+++ b/src/buildtool/execution_api/common/bytestream_utils.cpp
@@ -102,3 +102,56 @@ auto ByteStreamUtils::ReadRequest::GetDigest() const noexcept
-> bazel_re::Digest {
return ToBazelDigest(hash_, size_);
}
+
+ByteStreamUtils::WriteRequest::WriteRequest(
+ std::string instance_name,
+ std::string uuid,
+ bazel_re::Digest const& digest) noexcept
+ : instance_name_{std::move(instance_name)},
+ uuid_{std::move(uuid)},
+ hash_{digest.hash()},
+ size_{digest.size_bytes()} {}
+
+auto ByteStreamUtils::WriteRequest::ToString() && noexcept -> std::string {
+ return fmt::format("{}/{}/{}/{}/{}/{}",
+ std::move(instance_name_),
+ ByteStreamUtils::kUploads,
+ std::move(uuid_),
+ ByteStreamUtils::kBlobs,
+ std::move(hash_),
+ size_);
+}
+
+auto ByteStreamUtils::WriteRequest::FromString(
+ std::string const& request) noexcept -> std::optional<WriteRequest> {
+ static constexpr std::size_t kInstanceNameIndex = 0U;
+ static constexpr std::size_t kUploadsIndex = 1U;
+ static constexpr std::size_t kUUIDIndex = 2U;
+ static constexpr std::size_t kBlobsIndex = 3U;
+ static constexpr std::size_t kHashIndex = 4U;
+ static constexpr std::size_t kSizeIndex = 5U;
+ static constexpr std::size_t kWriteRequestPartsCount = 6U;
+
+ auto const parts = ::SplitRequest(request);
+ if (parts.size() != kWriteRequestPartsCount or
+ parts.at(kUploadsIndex).compare(ByteStreamUtils::kUploads) != 0 or
+ parts.at(kBlobsIndex).compare(ByteStreamUtils::kBlobs) != 0) {
+ return std::nullopt;
+ }
+
+ WriteRequest result;
+ result.instance_name_ = std::string(parts.at(kInstanceNameIndex));
+ result.uuid_ = std::string(parts.at(kUUIDIndex));
+ result.hash_ = std::string(parts.at(kHashIndex));
+ try {
+ result.size_ = std::stoi(std::string(parts.at(kSizeIndex)));
+ } catch (...) {
+ return std::nullopt;
+ }
+ return result;
+}
+
+auto ByteStreamUtils::WriteRequest::GetDigest() const noexcept
+ -> bazel_re::Digest {
+ return ToBazelDigest(hash_, size_);
+}
diff --git a/src/buildtool/execution_api/common/bytestream_utils.hpp b/src/buildtool/execution_api/common/bytestream_utils.hpp
index 9b46073f..672ae017 100644
--- a/src/buildtool/execution_api/common/bytestream_utils.hpp
+++ b/src/buildtool/execution_api/common/bytestream_utils.hpp
@@ -27,6 +27,7 @@ namespace bazel_re = build::bazel::remote::execution::v2;
class ByteStreamUtils final {
static constexpr auto* kBlobs = "blobs";
+ static constexpr auto* kUploads = "uploads";
public:
// Chunk size for uploads (default size used by BuildBarn)
@@ -61,6 +62,42 @@ class ByteStreamUtils final {
ReadRequest() = default;
};
+
+ /// \brief Create a write request for the bytestream service to be
+ /// transferred over the net. Handles serialization/deserialization on its
+ /// own. The pattern is:
+ /// "{instance_name}/{kUploads}/{uuid}/{kBlobs}/{digest.hash()}/{digest.size_bytes()}".
+ /// "instance_name_example/uploads/c4f03510-7d56-4490-8934-01bce1b1288e/blobs/62183d7a696acf7e69e218efc82c93135f8c85f895/4424712"
+ class WriteRequest final {
+ public:
+ explicit WriteRequest(std::string instance_name,
+ std::string uuid,
+ bazel_re::Digest const& digest) noexcept;
+
+ [[nodiscard]] auto ToString() && noexcept -> std::string;
+
+ [[nodiscard]] static auto FromString(
+ std::string const& request) noexcept -> std::optional<WriteRequest>;
+
+ [[nodiscard]] auto GetInstanceName() const noexcept
+ -> std::string const& {
+ return instance_name_;
+ }
+
+ [[nodiscard]] auto GetUUID() const noexcept -> std::string const& {
+ return uuid_;
+ }
+
+ [[nodiscard]] auto GetDigest() const noexcept -> bazel_re::Digest;
+
+ private:
+ std::string instance_name_;
+ std::string uuid_;
+ std::string hash_;
+ std::int64_t size_ = 0;
+
+ WriteRequest() = default;
+ };
};
#endif // INCLUDED_SRC_BUILDTOOL_EXECUTION_API_COMMON_BYTESTREAM_UTILS_HPP