diff options
author | Dan Willemsen <dwillemsen@google.com> | 2024-04-29 18:29:17 -0400 |
---|---|---|
committer | Dan Willemsen <dwillemsen@google.com> | 2024-04-29 18:29:17 -0400 |
commit | 0f60a196f4ef1ff7a116ef704260c79ca4b3b804 (patch) | |
tree | 507cfb1fee5dfdfaba962996f00d84f7d403e3c6 | |
parent | 4c36890ed9652e25946c94b67f910b77bc01b359 (diff) | |
parent | 1f36c310b28d762b258ea577ed08e8203274efae (diff) | |
download | bazelbuild-remote-apis-0f60a196f4ef1ff7a116ef704260c79ca4b3b804.tar.gz |
Upgrade remote-apis to 1f36c310b28d762b258ea577ed08e8203274efae
This project was upgraded with external_updater.
Usage: tools/external_updater/updater.sh update external/bazelbuild-remote-apis
For more info, check https://cs.android.com/android/platform/superproject/+/main:tools/external_updater/README.md
Test: TreeHugger
Change-Id: I0050def086d535476e499619f141e88039e0830f
41 files changed, 12409 insertions, 282 deletions
diff --git a/.bazelrc b/.bazelrc new file mode 100644 index 0000000..936a7e8 --- /dev/null +++ b/.bazelrc @@ -0,0 +1,2 @@ +# Include comments in generated code for godoc. +build --experimental_proto_descriptor_sets_include_source_info diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..87cbcde --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,26 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + + - name: Install bazelisk + run: | + curl -LO https://github.com/bazelbuild/bazelisk/releases/download/v1.7.4/bazelisk-linux-amd64 + mkdir -p "${HOME}/bin" + mv bazelisk-linux-amd64 "${HOME}/bin/bazel" + chmod +x "${HOME}/bin/bazel" + + - name: Check bindings generation + run: | + set -e + PATH=${HOME}/bin:$PATH ./hooks/pre-commit diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/BUILD.bazel @@ -1,13 +1,19 @@ -name: "remote-apis" -description: - "An API for caching and execution of actions on a remote system." +# This project was upgraded with external_updater. +# Usage: tools/external_updater/updater.sh update external/bazelbuild-remote-apis +# For more info, check https://cs.android.com/android/platform/superproject/+/main:tools/external_updater/README.md +name: "remote-apis" +description: "An API for caching and execution of actions on a remote system." third_party { - url { - type: GIT + license_type: NOTICE + last_upgrade_date { + year: 2024 + month: 4 + day: 29 + } + identifier { + type: "Git" value: "https://github.com/bazelbuild/remote-apis" + version: "1f36c310b28d762b258ea577ed08e8203274efae" } - version: "6a5a17b77bca5e70417746fd0616db3849731619" - last_upgrade_date { year: 2019 month: 4 day: 9 } - license_type: NOTICE } @@ -1,12 +1,38 @@ -# Remote Execution API +# remote-apis -The Remote Execution API is an API that, at its most general, allows clients to -request execution of binaries on a remote system. It is intended primarily for -use by build systems, such as [Bazel](bazel.build), to distribute build and test -actions through a worker pool, and also provide a central cache of build -results. This allows builds to execute faster, both by reusing results already -built by other clients and by allowing many actions to be executed in parallel, -in excess of the resource limits of the machine running the build. +This repository contains a collection of APIs which work together to enable +large scale distributed execution and caching on source code and other inputs. +It describes how to upload inputs, request the execution, monitor for results, +and cache those results. It's overall aim is to enable large scale parallel executions +that wouldn't be feasible on a single system, while minimizing the amount of uploads +and executions needed by storing data in a content-addressable format and caching results. + +### [Remote Execution API](build/bazel/remote/execution/v2/remote_execution.proto) + +The Remote Execution API is an API that, at its most general, allows clients to request +execution of binaries on a remote system. It is intended primarily for use by build systems, +such as [Bazel](bazel.build), to distribute build and test actions through a worker pool, +and also provide a central cache of build results. This allows builds to execute +faster, both by reusing results already built by other clients and by allowing many +actions to be executed in parallel, in excess of the resource limits of the machine +running the build. + +### [Remote Asset API](build/bazel/remote/asset/v1/remote_asset.proto) + +The Remote Asset API is an API to associate Qualifiers and URIs to Digests stored in +Content Addressable Storage. It is primary intended to allow clients to use semantically +relevant identifiers, such as a git repository or tarball location, to get the corresponding +Digest. This mapping may be pushed by a client directly, or dynamically resolved and added +to CAS by the asset server when fetched by a client. + +### [Remote Logstream API](build/bazel/remote/logstream/v1/remote_logstream.proto) + +The Remote Logstream API is an API supporting ordered reads and writes of `LogStream` +resources. It is intented primarily for streaming the stdout and stderr of ongoing Action +executions, enabling clients to view them while the Action is executing instead of waiting +for it's completion. + +## API users There are a number of clients and services using these APIs, they are listed below. @@ -15,20 +41,60 @@ below. These tools use the Remote Execution API to distribute builds to workers. * [Bazel](https://bazel.build) +* [Buck2](https://github.com/facebook/buck2) * [BuildStream](https://buildstream.build/) +* [Goma Server](https://chromium.googlesource.com/infra/goma/server/) +* [Justbuild](https://github.com/just-buildsystem/justbuild) (via `--compatible`) * [Pants](https://www.pantsbuild.org) +* [Please](https://please.build) * [Recc](https://gitlab.com/bloomberg/recc) +* [Reclient](https://github.com/bazelbuild/reclient) +* [Siso](https://chromium.googlesource.com/infra/infra/+/refs/heads/main/go/src/infra/build/siso/) ### Servers -These applications implement the Remote Execution API to server build requests -from the clients above. These are then distributed to workers; some of these -workers implement the Remote Worker API. +These applications implement the Remote Execution API to serve build requests +from the clients above. + +* [bazel-remote](https://github.com/buchgr/bazel-remote) (open source, cache only) +* [Buildbarn](https://github.com/buildbarn) (open source) +* [BuildBuddy](https://www.buildbuddy.io/) (commercial & open source) +* [Buildfarm](https://github.com/bazelbuild/bazel-buildfarm) (open source) +* [BuildGrid](https://buildgrid.build/) (open source) +* [EngFlow](https://www.engflow.com/) (commercial) +* [Flare Build Execution](https://flare.build/products/flare-build-execution) (commercial) +* [Justbuild](https://github.com/just-buildsystem/justbuild/blob/master/doc/tutorial/just-execute.org) (via `--compatible`, open source) +* [Kajiya](https://chromium.googlesource.com/infra/infra/+/refs/heads/main/go/src/infra/build/kajiya/) (open source) +* [NativeLink](https://github.com/TraceMachina/nativelink) (open source) +* [Scoot](https://github.com/twitter/scoot) (open source) + +### Workers +Servers generally distribute work to a fleet of workers. +The [Remote Worker API](https://docs.google.com/document/d/1s_AzRRD2mdyktKUj2HWBn99rMg_3tcPvdjx3MPbFidU) +defines a generic protocol for worker and server communication, although, +this API is considered too heavyweight for most use-cases. Because of that, +many implementations have designed their own protocols. Links to these APIs +are provided as a reference below. +*Adhering to any one of these protocols is not a requirement.* + +* [Buildfarm Operation Queues](https://bazelbuild.github.io/bazel-buildfarm/docs/architecture/queues/) + * Uses sets of queues for managing different payload requirements. +* [Buildbarn Remote Worker](https://github.com/buildbarn/bb-remote-execution/blob/master/pkg/proto/remoteworker/remoteworker.proto) + * Uses a custom protocol for workers to connect to a scheduler and receive instructions. +* [BuildGrid Bots](https://buildgrid.build/developer/data_model.html#rwapi) + * A server implementation of the Remote Workers API. +* [Buildbox Worker](https://gitlab.com/BuildGrid/buildbox/buildbox-worker) + * A worker implementation of the Remote Workers API. + +## API Community -* [Buildbarn](https://github.com/EdSchouten/bazel-buildbarn) -* [Buildfarm](https://github.com/bazelbuild/bazel-buildfarm) -* [BuildGrid](https://buildgrid.build/) -* [Remote Build Execution (Alpha)](https://blog.bazel.build/2018/10/05/remote-build-execution.html) -* [Scoot](https://github.com/twitter/scoot) +The [Remote Execution APIs +group](https://groups.google.com/forum/#!forum/remote-execution-apis) hosts +discussions related to the APIs in this repository. + +Interested parties meet monthly via VC to discuss issues related to the APIs, +and several contributors have organized occasional meetups, hack-a-thons, and +summits. Joining the email discussion group will automatically add you to the +Google Calendar invite for the monthly meeting. ## Dependencies @@ -48,3 +114,28 @@ Bazel, you will possibly want to declare `cc_proto_library`, Other build systems will have to run protoc on the protobuf files, and link in the googleapis and well-known proto types, manually. + +### Go (for non-Bazel build systems) + +This repository contains the generated Go code for interacting with the API via +gRPC. Get it with: + +``` +go get github.com/bazelbuild/remote-apis +``` + +Import it with, for example: + +``` +repb "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2" +``` + +## Development + +Enable the git hooks to automatically generate Go proto code on commit: + +``` +git config core.hooksPath hooks/ +``` + +This is a local setting, so applies only to this repository. @@ -2,49 +2,81 @@ workspace(name = "bazel_remote_apis") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -# Needed for protobuf. http_archive( name = "bazel_skylib", - # Commit f83cb8dd6f5658bc574ccd873e25197055265d1c of 2018-11-26 - sha256 = "ba5d15ca230efca96320085d8e4d58da826d1f81b444ef8afccd8b23e0799b52", - strip_prefix = "bazel-skylib-f83cb8dd6f5658bc574ccd873e25197055265d1c", + sha256 = "66ffd9315665bfaafc96b52278f57c7e2dd09f5ede279ea6d39b2be471e7e3aa", urls = [ - "https://github.com/bazelbuild/bazel-skylib/archive/f83cb8dd6f5658bc574ccd873e25197055265d1c.tar.gz", + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.4.2/bazel-skylib-1.4.2.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.4.2/bazel-skylib-1.4.2.tar.gz", ], ) -# Needed for "well-known protos" and protoc. +load("@bazel_skylib//:workspace.bzl", "bazel_skylib_workspace") + +bazel_skylib_workspace() + +# Pull in go rules, which we need in order to selectively pull in Go dependencies. http_archive( - name = "com_google_protobuf", - sha256 = "3e933375ecc58d01e52705479b82f155aea2d02cc55d833f8773213e74f88363", - strip_prefix = "protobuf-3.7.0", - urls = ["https://github.com/protocolbuffers/protobuf/releases/download/v3.7.0/protobuf-all-3.7.0.tar.gz"], + name = "io_bazel_rules_go", + sha256 = "d6ab6b57e48c09523e93050f13698f708428cfd5e619252e369d377af6597707", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.43.0/rules_go-v0.43.0.zip", + "https://github.com/bazelbuild/rules_go/releases/download/v0.43.0/rules_go-v0.43.0.zip", + ], ) -# Needed for the googleapis protos. +# Gazelle, which we need in order to selectively pull in Gazelle dependencies for Go. http_archive( - name = "googleapis", - build_file = "BUILD.googleapis", - sha256 = "7b6ea252f0b8fb5cd722f45feb83e115b689909bbb6a393a873b6cbad4ceae1d", - strip_prefix = "googleapis-143084a2624b6591ee1f9d23e7f5241856642f4d", - urls = ["https://github.com/googleapis/googleapis/archive/143084a2624b6591ee1f9d23e7f5241856642f4d.zip"], + name = "bazel_gazelle", + sha256 = "b7387f72efb59f876e4daae42f1d3912d0d45563eac7cb23d1de0b094ab588cf", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-gazelle/releases/download/v0.34.0/bazel-gazelle-v0.34.0.tar.gz", + "https://github.com/bazelbuild/bazel-gazelle/releases/download/v0.34.0/bazel-gazelle-v0.34.0.tar.gz", + ], ) +# Needed for protobuf. +http_archive( + name = "com_google_protobuf", + sha256 = "535fbf566d372ccf3a097c374b26896fa044bf4232aef9cab37bd1cc1ba4e850", + strip_prefix = "protobuf-3.15.0", + urls = ["https://github.com/protocolbuffers/protobuf/archive/v3.15.0.zip"], +) + +load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps") + +protobuf_deps() + # Needed for C++ gRPC. http_archive( name = "com_github_grpc_grpc", - strip_prefix = "grpc-1.17.2", - urls = [ - "https://github.com/grpc/grpc/archive/v1.17.2.tar.gz", - "https://mirror.bazel.build/github.com/grpc/grpc/archive/v1.17.2.tar.gz", - ], - sha256 = "34ed95b727e7c6fcbf85e5eb422e962788e21707b712fdb4caf931553c2c6dbc", + sha256 = "b391a327429279f6f29b9ae7e5317cd80d5e9d49cc100e6d682221af73d984a6", + strip_prefix = "grpc-93e8830070e9afcbaa992c75817009ee3f4b63a0", # v1.24.3 with fixes + urls = ["https://github.com/grpc/grpc/archive/93e8830070e9afcbaa992c75817009ee3f4b63a0.zip"], ) # Pull in all gRPC dependencies. load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps") + grpc_deps() +# More gRPC dependencies. grpc_extra_deps does not work out of the box. +load("@upb//bazel:workspace_deps.bzl", "upb_deps") +load("@build_bazel_rules_apple//apple:repositories.bzl", "apple_rules_dependencies") +load("@build_bazel_apple_support//lib:repositories.bzl", "apple_support_dependencies") + +upb_deps() + +apple_rules_dependencies() + +apple_support_dependencies() + +load("@upb//bazel:repository_defs.bzl", "bazel_version_repository") + +bazel_version_repository( + name = "bazel_version", +) + bind( name = "grpc_cpp_plugin", actual = "@com_github_grpc_grpc//:grpc_cpp_plugin", @@ -54,3 +86,21 @@ bind( name = "grpc_lib", actual = "@com_github_grpc_grpc//:grpc++", ) + +load("//:remote_apis_deps.bzl", "remote_apis_go_deps") + +remote_apis_go_deps() + +# Needed for the googleapis protos. +http_archive( + name = "googleapis", + sha256 = "b28c13e99001664eac5f1fb81b44d912d19fbc041e30772263251da131f6573c", + strip_prefix = "googleapis-bb964feba5980ed70c9fb8f84fe6e86694df65b0", + urls = ["https://github.com/googleapis/googleapis/archive/bb964feba5980ed70c9fb8f84fe6e86694df65b0.zip"], +) + +load("@googleapis//:repository_rules.bzl", "switched_rules_by_language") + +switched_rules_by_language( + name = "com_google_googleapis_imports", +) diff --git a/build/bazel/remote/asset/v1/BUILD b/build/bazel/remote/asset/v1/BUILD new file mode 100644 index 0000000..f360b4f --- /dev/null +++ b/build/bazel/remote/asset/v1/BUILD @@ -0,0 +1,38 @@ +package(default_visibility = ["//visibility:public"]) + +load("@rules_proto//proto:defs.bzl", "proto_library") + +licenses(["notice"]) + +proto_library( + name = "remote_asset_proto", + srcs = ["remote_asset.proto"], + deps = [ + "//build/bazel/remote/execution/v2:remote_execution_proto", + "@com_google_protobuf//:duration_proto", + "@com_google_protobuf//:timestamp_proto", + "@googleapis//google/api:annotations_proto", + "@googleapis//google/api:http_proto", + "@googleapis//google/rpc:status_proto", + ], +) + +alias( + name = "remote_asset_java_proto", + actual = "//build/bazel/remote/asset/v1/java:remote_asset_java_proto", +) + +alias( + name = "remote_asset_cc_proto", + actual = "//build/bazel/remote/asset/v1/cc:remote_asset_cc_grpc", +) + +alias( + name = "remote_asset_go_proto", + actual = "//build/bazel/remote/asset/v1/go:remote_asset_go_proto", +) + +alias( + name = "go_default_library", + actual = "//build/bazel/remote/asset/v1/go:go_default_library", +) diff --git a/build/bazel/remote/asset/v1/cc/BUILD b/build/bazel/remote/asset/v1/cc/BUILD new file mode 100644 index 0000000..f4bcddb --- /dev/null +++ b/build/bazel/remote/asset/v1/cc/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//build/bazel/remote/asset/v1:__pkg__"]) + +load("//internal:cc_grpc_library.bzl", "cc_grpc_codegen") + +cc_proto_library( + name = "remote_asset_cc_proto", + deps = ["//build/bazel/remote/asset/v1:remote_asset_proto"], +) + +cc_grpc_codegen( + name = "remote_asset_cc_grpc_codegen", + proto = "//build/bazel/remote/asset/v1:remote_asset_proto", +) + +cc_library( + name = "remote_asset_cc_grpc", + srcs = [":remote_asset_cc_grpc_codegen"], + hdrs = [":remote_asset_cc_grpc_codegen"], + include_prefix = "build/bazel/remote/asset/v1", + strip_include_prefix = "/" + package_name(), + deps = [ + ":remote_asset_cc_proto", + "@com_github_grpc_grpc//:grpc++_codegen_proto", + ], +) diff --git a/build/bazel/remote/asset/v1/go/BUILD b/build/bazel/remote/asset/v1/go/BUILD new file mode 100644 index 0000000..f1b1d26 --- /dev/null +++ b/build/bazel/remote/asset/v1/go/BUILD @@ -0,0 +1,22 @@ +package(default_visibility = ["//build/bazel/remote/asset/v1:__pkg__"]) + +load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library") + +go_proto_library( + name = "remote_asset_go_proto", + compilers = ["@io_bazel_rules_go//proto:go_grpc"], + importpath = "github.com/bazelbuild/remote-apis/build/bazel/remote/asset/v1", + proto = "//build/bazel/remote/asset/v1:remote_asset_proto", + deps = [ + "//build/bazel/remote/execution/v2:remote_execution_go_proto", + "@org_golang_google_genproto//googleapis/api/annotations", + "@org_golang_google_genproto//googleapis/rpc/status", + ], +) + +go_library( + name = "go_default_library", + embed = [":remote_asset_go_proto"], + importpath = "github.com/bazelbuild/remote-apis/build/bazel/remote/asset/v1", +) diff --git a/build/bazel/remote/asset/v1/java/BUILD b/build/bazel/remote/asset/v1/java/BUILD new file mode 100644 index 0000000..6346656 --- /dev/null +++ b/build/bazel/remote/asset/v1/java/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//build/bazel/remote/asset/v1:__pkg__"]) + +java_proto_library( + name = "remote_asset_java_proto", + deps = ["//build/bazel/remote/asset/v1:remote_asset_proto"], +) diff --git a/build/bazel/remote/asset/v1/qualifiers.md b/build/bazel/remote/asset/v1/qualifiers.md new file mode 100644 index 0000000..65fb655 --- /dev/null +++ b/build/bazel/remote/asset/v1/qualifiers.md @@ -0,0 +1,104 @@ +# Qualifier Lexicon + +This lexicon defines standard qualifier names that servers +**MAY** support in the `Qualifier` message to facilitate interoperability. + +The following standard qualifier `name`s are defined: + +* `resource_type`: This describes the type of resource. + + File assests should use an existing [media type](https://www.iana.org/assignments/media-types/media-types.xhtml). + + Git repositories should use `application/x-git`. + + Example: + ```json + // (FetchDirectoryRequest proto) + { + "uris": [ + "https://github.com/bazelbuild/remote-apis.git" + ], + "qualifiers": [ + { + "name": "resource_type", + "value": "application/x-git" + } + ] + } + ``` + +* `checksum.sri`: The value represents a [Subresource Integrity](https://www.w3.org/TR/SRI/) + checksum of the content. + + Example: + ```json + // (FetchBlobRequest proto) + { + "uris": [ + "https://github.com/bazelbuild/remote-apis/archive/v2.0.0.tar.gz" + ], + "qualifiers": [ + { + "name": "checksum.sri", + "value": "sha384-G9d9sKLNRfeFfGn1mnVXeJzXSbkCsYt11kl5hJnHpdzfVuLIuruIDnrs/lZyB4Gs" + } + ] + } + ``` + +* `directory`: This is the relative path of a subdirectory of the resource. There should + be no trailing `/`. + + Example: + ```json + // (FetchDirectoryRequest proto) + { + "uris": [ + "https://github.com/bazelbuild/remote-apis.git" + ], + "qualifiers": [ + { + "name": "directory", + "value": "build/bazel/remote/execution/v2" + } + ] + } + ``` + +* `vcs.branch`: This is the name of the branch under source control management + + Example: + ```json + // (FetchDirectoryRequest proto) + { + "uris": [ + "https://github.com/bazelbuild/remote-apis.git" + ], + "qualifiers": [ + { + "name": "vcs.branch", + "value": "master" + } + ] + } + ``` + +* `vcs.commit`: The value is the identity of a specific version of the content + under source control management. For git this is a commit-ish, for subversion + this is a revision, for example. + + Example: + ```json + // (FetchDirectoryRequest proto) + { + "uris": [ + "https://github.com/bazelbuild/remote-apis.git" + ], + "qualifiers": [ + { + "name": "vcs.commit", + "value": "b5123b1bb2853393c7b9aa43236db924d7e32d61" + } + ] + } + ``` diff --git a/build/bazel/remote/asset/v1/remote_asset.pb.go b/build/bazel/remote/asset/v1/remote_asset.pb.go new file mode 100644 index 0000000..8c0c360 --- /dev/null +++ b/build/bazel/remote/asset/v1/remote_asset.pb.go @@ -0,0 +1,1689 @@ +// Copyright 2020 The Bazel Authors. +// +// 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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v3.15.0 +// source: build/bazel/remote/asset/v1/remote_asset.proto + +package remoteasset + +import ( + context "context" + v2 "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2" + _ "google.golang.org/genproto/googleapis/api/annotations" + status "google.golang.org/genproto/googleapis/rpc/status" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status1 "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Qualifiers are used to disambiguate or sub-select content that shares a URI. +// This may include specifying a particular commit or branch, in the case of +// URIs referencing a repository; they could also be used to specify a +// particular subdirectory of a repository or tarball. Qualifiers may also be +// used to ensure content matches what the client expects, even when there is +// no ambiguity to be had - for example, a qualifier specifying a checksum +// value. +// +// In cases where the semantics of the request are not immediately clear from +// the URL and/or qualifiers - e.g. dictated by URL scheme - it is recommended +// to use an additional qualifier to remove the ambiguity. The `resource_type` +// qualifier is recommended for this purpose. +// +// Qualifiers may be supplied in any order. +type Qualifier struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The "name" of the qualifier, for example "resource_type". + // No separation is made between 'standard' and 'nonstandard' + // qualifiers, in accordance with https://tools.ietf.org/html/rfc6648, + // however implementers *SHOULD* take care to avoid ambiguity. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The "value" of the qualifier. Semantics will be dictated by the name. + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *Qualifier) Reset() { + *x = Qualifier{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Qualifier) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Qualifier) ProtoMessage() {} + +func (x *Qualifier) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Qualifier.ProtoReflect.Descriptor instead. +func (*Qualifier) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{0} +} + +func (x *Qualifier) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Qualifier) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +// A request message for +// [Fetch.FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob]. +type FetchBlobRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + // The timeout for the underlying fetch, if content needs to be retrieved from + // origin. + // + // If unset, the server *MAY* apply an implementation-defined timeout. + // + // If set, and the user-provided timeout exceeds the RPC deadline, the server + // *SHOULD* keep the fetch going after the RPC completes, to be made + // available for future Fetch calls. The server may also enforce (via clamping + // and/or an INVALID_ARGUMENT error) implementation-defined minimum and + // maximum timeout values. + // + // If this timeout is exceeded on an attempt to retrieve content from origin + // the client will receive DEADLINE_EXCEEDED in [FetchBlobResponse.status]. + Timeout *durationpb.Duration `protobuf:"bytes,2,opt,name=timeout,proto3" json:"timeout,omitempty"` + // The oldest content the client is willing to accept, as measured from the + // time it was Push'd or when the underlying retrieval from origin was + // started. + // Upon retries of Fetch requests that cannot be completed within a single + // RPC, clients *SHOULD* provide the same value for subsequent requests as the + // original, to simplify combining the request with the previous attempt. + // + // If unset, the client *SHOULD* accept content of any age. + OldestContentAccepted *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=oldest_content_accepted,json=oldestContentAccepted,proto3" json:"oldest_content_accepted,omitempty"` + // The URI(s) of the content to fetch. These may be resources that the server + // can directly fetch from origin, in which case multiple URIs *SHOULD* + // represent the same content available at different locations (such as an + // origin and secondary mirrors). These may also be URIs for content known to + // the server through other mechanisms, e.g. pushed via the [Push][build.bazel.remote.asset.v1.Push] + // service. + // + // Clients *MUST* supply at least one URI. Servers *MAY* match any one of the + // supplied URIs. + Uris []string `protobuf:"bytes,4,rep,name=uris,proto3" json:"uris,omitempty"` + // Qualifiers sub-specifying the content to fetch - see comments on + // [Qualifier][build.bazel.remote.asset.v1.Qualifier]. + // The same qualifiers apply to all URIs. + // + // Specified qualifier names *MUST* be unique. + Qualifiers []*Qualifier `protobuf:"bytes,5,rep,name=qualifiers,proto3" json:"qualifiers,omitempty"` +} + +func (x *FetchBlobRequest) Reset() { + *x = FetchBlobRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FetchBlobRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchBlobRequest) ProtoMessage() {} + +func (x *FetchBlobRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchBlobRequest.ProtoReflect.Descriptor instead. +func (*FetchBlobRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{1} +} + +func (x *FetchBlobRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *FetchBlobRequest) GetTimeout() *durationpb.Duration { + if x != nil { + return x.Timeout + } + return nil +} + +func (x *FetchBlobRequest) GetOldestContentAccepted() *timestamppb.Timestamp { + if x != nil { + return x.OldestContentAccepted + } + return nil +} + +func (x *FetchBlobRequest) GetUris() []string { + if x != nil { + return x.Uris + } + return nil +} + +func (x *FetchBlobRequest) GetQualifiers() []*Qualifier { + if x != nil { + return x.Qualifiers + } + return nil +} + +// A response message for +// [Fetch.FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob]. +type FetchBlobResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // If the status has a code other than `OK`, it indicates that the operation + // was unable to be completed for reasons outside the servers' control. + // The possible fetch errors include: + // - `DEADLINE_EXCEEDED`: The operation could not be completed within the + // specified timeout. + // - `NOT_FOUND`: The requested asset was not found at the specified location. + // - `PERMISSION_DENIED`: The request was rejected by a remote server, or + // requested an asset from a disallowed origin. + // - `ABORTED`: The operation could not be completed, typically due to a + // failed consistency check. + // - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to + // perform the requested operation. The client may retry after a delay. + Status *status.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + // The uri from the request that resulted in a successful retrieval, or from + // which the error indicated in `status` was obtained. + Uri string `protobuf:"bytes,2,opt,name=uri,proto3" json:"uri,omitempty"` + // Any qualifiers known to the server and of interest to clients. + Qualifiers []*Qualifier `protobuf:"bytes,3,rep,name=qualifiers,proto3" json:"qualifiers,omitempty"` + // A minimum timestamp the content is expected to be available through. + // Servers *MAY* omit this field, if not known with confidence. + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + // The result of the fetch, if the status had code `OK`. + // The digest of the file's contents, available for download through the CAS. + BlobDigest *v2.Digest `protobuf:"bytes,5,opt,name=blob_digest,json=blobDigest,proto3" json:"blob_digest,omitempty"` +} + +func (x *FetchBlobResponse) Reset() { + *x = FetchBlobResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FetchBlobResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchBlobResponse) ProtoMessage() {} + +func (x *FetchBlobResponse) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchBlobResponse.ProtoReflect.Descriptor instead. +func (*FetchBlobResponse) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{2} +} + +func (x *FetchBlobResponse) GetStatus() *status.Status { + if x != nil { + return x.Status + } + return nil +} + +func (x *FetchBlobResponse) GetUri() string { + if x != nil { + return x.Uri + } + return "" +} + +func (x *FetchBlobResponse) GetQualifiers() []*Qualifier { + if x != nil { + return x.Qualifiers + } + return nil +} + +func (x *FetchBlobResponse) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +func (x *FetchBlobResponse) GetBlobDigest() *v2.Digest { + if x != nil { + return x.BlobDigest + } + return nil +} + +// A request message for +// [Fetch.FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory]. +type FetchDirectoryRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + // The timeout for the underlying fetch, if content needs to be retrieved from + // origin. This value is allowed to exceed the RPC deadline, in which case the + // server *SHOULD* keep the fetch going after the RPC completes, to be made + // available for future Fetch calls. + // + // If this timeout is exceeded on an attempt to retrieve content from origin + // the client will receive DEADLINE_EXCEEDED in [FetchDirectoryResponse.status]. + Timeout *durationpb.Duration `protobuf:"bytes,2,opt,name=timeout,proto3" json:"timeout,omitempty"` + // The oldest content the client is willing to accept, as measured from the + // time it was Push'd or when the underlying retrieval from origin was + // started. + // Upon retries of Fetch requests that cannot be completed within a single + // RPC, clients *SHOULD* provide the same value for subsequent requests as the + // original, to simplify combining the request with the previous attempt. + // + // If unset, the client *SHOULD* accept content of any age. + OldestContentAccepted *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=oldest_content_accepted,json=oldestContentAccepted,proto3" json:"oldest_content_accepted,omitempty"` + // The URI(s) of the content to fetch. These may be resources that the server + // can directly fetch from origin, in which case multiple URIs *SHOULD* + // represent the same content available at different locations (such as an + // origin and secondary mirrors). These may also be URIs for content known to + // the server through other mechanisms, e.g. pushed via the [Push][build.bazel.remote.asset.v1.Push] + // service. + // + // Clients *MUST* supply at least one URI. Servers *MAY* match any one of the + // supplied URIs. + Uris []string `protobuf:"bytes,4,rep,name=uris,proto3" json:"uris,omitempty"` + // Qualifiers sub-specifying the content to fetch - see comments on + // [Qualifier][build.bazel.remote.asset.v1.Qualifier]. + // The same qualifiers apply to all URIs. + // + // Specified qualifier names *MUST* be unique. + Qualifiers []*Qualifier `protobuf:"bytes,5,rep,name=qualifiers,proto3" json:"qualifiers,omitempty"` +} + +func (x *FetchDirectoryRequest) Reset() { + *x = FetchDirectoryRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FetchDirectoryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchDirectoryRequest) ProtoMessage() {} + +func (x *FetchDirectoryRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchDirectoryRequest.ProtoReflect.Descriptor instead. +func (*FetchDirectoryRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{3} +} + +func (x *FetchDirectoryRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *FetchDirectoryRequest) GetTimeout() *durationpb.Duration { + if x != nil { + return x.Timeout + } + return nil +} + +func (x *FetchDirectoryRequest) GetOldestContentAccepted() *timestamppb.Timestamp { + if x != nil { + return x.OldestContentAccepted + } + return nil +} + +func (x *FetchDirectoryRequest) GetUris() []string { + if x != nil { + return x.Uris + } + return nil +} + +func (x *FetchDirectoryRequest) GetQualifiers() []*Qualifier { + if x != nil { + return x.Qualifiers + } + return nil +} + +// A response message for +// [Fetch.FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory]. +type FetchDirectoryResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // If the status has a code other than `OK`, it indicates that the operation + // was unable to be completed for reasons outside the servers' control. + // The possible fetch errors include: + // - `DEADLINE_EXCEEDED`: The operation could not be completed within the + // specified timeout. + // - `NOT_FOUND`: The requested asset was not found at the specified location. + // - `PERMISSION_DENIED`: The request was rejected by a remote server, or + // requested an asset from a disallowed origin. + // - `ABORTED`: The operation could not be completed, typically due to a + // failed consistency check. + // - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to + // perform the requested operation. The client may retry after a delay. + Status *status.Status `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + // The uri from the request that resulted in a successful retrieval, or from + // which the error indicated in `status` was obtained. + Uri string `protobuf:"bytes,2,opt,name=uri,proto3" json:"uri,omitempty"` + // Any qualifiers known to the server and of interest to clients. + Qualifiers []*Qualifier `protobuf:"bytes,3,rep,name=qualifiers,proto3" json:"qualifiers,omitempty"` + // A minimum timestamp the content is expected to be available through. + // Servers *MAY* omit this field, if not known with confidence. + ExpiresAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"` + // The result of the fetch, if the status had code `OK`. + // the root digest of a directory tree, suitable for fetching via + // [ContentAddressableStorage.GetTree]. + RootDirectoryDigest *v2.Digest `protobuf:"bytes,5,opt,name=root_directory_digest,json=rootDirectoryDigest,proto3" json:"root_directory_digest,omitempty"` +} + +func (x *FetchDirectoryResponse) Reset() { + *x = FetchDirectoryResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FetchDirectoryResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FetchDirectoryResponse) ProtoMessage() {} + +func (x *FetchDirectoryResponse) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FetchDirectoryResponse.ProtoReflect.Descriptor instead. +func (*FetchDirectoryResponse) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{4} +} + +func (x *FetchDirectoryResponse) GetStatus() *status.Status { + if x != nil { + return x.Status + } + return nil +} + +func (x *FetchDirectoryResponse) GetUri() string { + if x != nil { + return x.Uri + } + return "" +} + +func (x *FetchDirectoryResponse) GetQualifiers() []*Qualifier { + if x != nil { + return x.Qualifiers + } + return nil +} + +func (x *FetchDirectoryResponse) GetExpiresAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpiresAt + } + return nil +} + +func (x *FetchDirectoryResponse) GetRootDirectoryDigest() *v2.Digest { + if x != nil { + return x.RootDirectoryDigest + } + return nil +} + +// A request message for +// [Push.PushBlob][build.bazel.remote.asset.v1.Push.PushBlob]. +type PushBlobRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + // The URI(s) of the content to associate. If multiple URIs are specified, the + // pushed content will be available to fetch by specifying any of them. + Uris []string `protobuf:"bytes,2,rep,name=uris,proto3" json:"uris,omitempty"` + // Qualifiers sub-specifying the content that is being pushed - see comments + // on [Qualifier][build.bazel.remote.asset.v1.Qualifier]. + // The same qualifiers apply to all URIs. + Qualifiers []*Qualifier `protobuf:"bytes,3,rep,name=qualifiers,proto3" json:"qualifiers,omitempty"` + // A time after which this content should stop being returned via [FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob]. + // Servers *MAY* expire content early, e.g. due to storage pressure. + ExpireAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expire_at,json=expireAt,proto3" json:"expire_at,omitempty"` + // The blob to associate. + BlobDigest *v2.Digest `protobuf:"bytes,5,opt,name=blob_digest,json=blobDigest,proto3" json:"blob_digest,omitempty"` + // Referenced blobs or directories that need to not expire before expiration + // of this association, in addition to `blob_digest` itself. + // These fields are hints - clients *MAY* omit them, and servers *SHOULD* + // respect them, at the risk of increased incidents of Fetch responses + // indirectly referencing unavailable blobs. + ReferencesBlobs []*v2.Digest `protobuf:"bytes,6,rep,name=references_blobs,json=referencesBlobs,proto3" json:"references_blobs,omitempty"` + ReferencesDirectories []*v2.Digest `protobuf:"bytes,7,rep,name=references_directories,json=referencesDirectories,proto3" json:"references_directories,omitempty"` +} + +func (x *PushBlobRequest) Reset() { + *x = PushBlobRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PushBlobRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PushBlobRequest) ProtoMessage() {} + +func (x *PushBlobRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PushBlobRequest.ProtoReflect.Descriptor instead. +func (*PushBlobRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{5} +} + +func (x *PushBlobRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *PushBlobRequest) GetUris() []string { + if x != nil { + return x.Uris + } + return nil +} + +func (x *PushBlobRequest) GetQualifiers() []*Qualifier { + if x != nil { + return x.Qualifiers + } + return nil +} + +func (x *PushBlobRequest) GetExpireAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpireAt + } + return nil +} + +func (x *PushBlobRequest) GetBlobDigest() *v2.Digest { + if x != nil { + return x.BlobDigest + } + return nil +} + +func (x *PushBlobRequest) GetReferencesBlobs() []*v2.Digest { + if x != nil { + return x.ReferencesBlobs + } + return nil +} + +func (x *PushBlobRequest) GetReferencesDirectories() []*v2.Digest { + if x != nil { + return x.ReferencesDirectories + } + return nil +} + +// A response message for +// [Push.PushBlob][build.bazel.remote.asset.v1.Push.PushBlob]. +type PushBlobResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *PushBlobResponse) Reset() { + *x = PushBlobResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PushBlobResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PushBlobResponse) ProtoMessage() {} + +func (x *PushBlobResponse) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PushBlobResponse.ProtoReflect.Descriptor instead. +func (*PushBlobResponse) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{6} +} + +// A request message for +// [Push.PushDirectory][build.bazel.remote.asset.v1.Push.PushDirectory]. +type PushDirectoryRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + // The URI(s) of the content to associate. If multiple URIs are specified, the + // pushed content will be available to fetch by specifying any of them. + Uris []string `protobuf:"bytes,2,rep,name=uris,proto3" json:"uris,omitempty"` + // Qualifiers sub-specifying the content that is being pushed - see comments + // on [Qualifier][build.bazel.remote.asset.v1.Qualifier]. + // The same qualifiers apply to all URIs. + Qualifiers []*Qualifier `protobuf:"bytes,3,rep,name=qualifiers,proto3" json:"qualifiers,omitempty"` + // A time after which this content should stop being returned via + // [FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory]. + // Servers *MAY* expire content early, e.g. due to storage pressure. + ExpireAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expire_at,json=expireAt,proto3" json:"expire_at,omitempty"` + // Directory to associate + RootDirectoryDigest *v2.Digest `protobuf:"bytes,5,opt,name=root_directory_digest,json=rootDirectoryDigest,proto3" json:"root_directory_digest,omitempty"` + // Referenced blobs or directories that need to not expire before expiration + // of this association, in addition to `root_directory_digest` itself. + // These fields are hints - clients *MAY* omit them, and servers *SHOULD* + // respect them, at the risk of increased incidents of Fetch responses + // indirectly referencing unavailable blobs. + ReferencesBlobs []*v2.Digest `protobuf:"bytes,6,rep,name=references_blobs,json=referencesBlobs,proto3" json:"references_blobs,omitempty"` + ReferencesDirectories []*v2.Digest `protobuf:"bytes,7,rep,name=references_directories,json=referencesDirectories,proto3" json:"references_directories,omitempty"` +} + +func (x *PushDirectoryRequest) Reset() { + *x = PushDirectoryRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PushDirectoryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PushDirectoryRequest) ProtoMessage() {} + +func (x *PushDirectoryRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PushDirectoryRequest.ProtoReflect.Descriptor instead. +func (*PushDirectoryRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{7} +} + +func (x *PushDirectoryRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *PushDirectoryRequest) GetUris() []string { + if x != nil { + return x.Uris + } + return nil +} + +func (x *PushDirectoryRequest) GetQualifiers() []*Qualifier { + if x != nil { + return x.Qualifiers + } + return nil +} + +func (x *PushDirectoryRequest) GetExpireAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpireAt + } + return nil +} + +func (x *PushDirectoryRequest) GetRootDirectoryDigest() *v2.Digest { + if x != nil { + return x.RootDirectoryDigest + } + return nil +} + +func (x *PushDirectoryRequest) GetReferencesBlobs() []*v2.Digest { + if x != nil { + return x.ReferencesBlobs + } + return nil +} + +func (x *PushDirectoryRequest) GetReferencesDirectories() []*v2.Digest { + if x != nil { + return x.ReferencesDirectories + } + return nil +} + +// A response message for +// [Push.PushDirectory][build.bazel.remote.asset.v1.Push.PushDirectory]. +type PushDirectoryResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *PushDirectoryResponse) Reset() { + *x = PushDirectoryResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PushDirectoryResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PushDirectoryResponse) ProtoMessage() {} + +func (x *PushDirectoryResponse) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PushDirectoryResponse.ProtoReflect.Descriptor instead. +func (*PushDirectoryResponse) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP(), []int{8} +} + +var File_build_bazel_remote_asset_v1_remote_asset_proto protoreflect.FileDescriptor + +var file_build_bazel_remote_asset_v1_remote_asset_proto_rawDesc = []byte{ + 0x0a, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x12, 0x1b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x1a, 0x36, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x32, 0x2f, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, + 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x35, 0x0a, + 0x09, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0x9c, 0x02, 0x0a, 0x10, 0x46, 0x65, 0x74, 0x63, 0x68, 0x42, 0x6c, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x33, + 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x52, 0x0a, 0x17, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x15, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41, + 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x72, 0x69, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x69, 0x73, 0x12, 0x46, 0x0a, 0x0a, 0x71, + 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, + 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x73, 0x22, 0x9e, 0x02, 0x0a, 0x11, 0x46, 0x65, 0x74, 0x63, 0x68, 0x42, 0x6c, 0x6f, + 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x46, 0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x52, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, + 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x12, 0x48, 0x0a, 0x0b, 0x62, 0x6c, + 0x6f, 0x62, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, 0x6c, 0x6f, 0x62, 0x44, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x02, 0x0a, 0x15, 0x46, 0x65, 0x74, 0x63, 0x68, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, + 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x52, 0x0a, 0x17, 0x6f, 0x6c, 0x64, 0x65, + 0x73, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x70, + 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x15, 0x6f, 0x6c, 0x64, 0x65, 0x73, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x75, 0x72, 0x69, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x69, 0x73, + 0x12, 0x46, 0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, + 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x71, 0x75, + 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0xb6, 0x02, 0x0a, 0x16, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, + 0x69, 0x12, 0x46, 0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, + 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x71, + 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, + 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x73, 0x41, 0x74, 0x12, 0x5b, 0x0a, 0x15, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, + 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x13, 0x72, 0x6f, + 0x6f, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x22, 0xc9, 0x03, 0x0a, 0x0f, 0x50, 0x75, 0x73, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x72, + 0x69, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, 0x72, 0x69, 0x73, 0x12, 0x46, + 0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x0a, 0x71, 0x75, 0x61, 0x6c, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x41, 0x74, 0x12, + 0x48, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, + 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x62, + 0x6c, 0x6f, 0x62, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x52, 0x0a, 0x10, 0x72, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, + 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0f, 0x72, 0x65, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x5e, 0x0a, + 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, + 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x15, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x12, 0x0a, + 0x10, 0x50, 0x75, 0x73, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xe1, 0x03, 0x0a, 0x14, 0x50, 0x75, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x72, 0x69, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x75, + 0x72, 0x69, 0x73, 0x12, 0x46, 0x0a, 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, + 0x0a, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x09, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x65, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x65, 0x41, 0x74, 0x12, 0x5b, 0x0a, 0x15, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, + 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x13, 0x72, 0x6f, + 0x6f, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x12, 0x52, 0x0a, 0x10, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x5f, + 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x52, 0x0f, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x5e, 0x0a, 0x16, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, + 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x15, + 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x69, 0x65, 0x73, 0x22, 0x17, 0x0a, 0x15, 0x50, 0x75, 0x73, 0x68, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xdd, + 0x02, 0x0a, 0x05, 0x46, 0x65, 0x74, 0x63, 0x68, 0x12, 0x9e, 0x01, 0x0a, 0x09, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, + 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, + 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, + 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x3a, + 0x66, 0x65, 0x74, 0x63, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x12, 0xb2, 0x01, 0x0a, 0x0e, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x32, 0x2e, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x33, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, + 0x65, 0x74, 0x63, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x3a, 0x01, 0x2a, + 0x22, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x3a, + 0x66, 0x65, 0x74, 0x63, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x32, 0xd4, + 0x02, 0x0a, 0x04, 0x50, 0x75, 0x73, 0x68, 0x12, 0x9a, 0x01, 0x0a, 0x08, 0x50, 0x75, 0x73, 0x68, + 0x42, 0x6c, 0x6f, 0x62, 0x12, 0x2c, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, + 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x75, 0x73, 0x68, 0x42, 0x6c, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76, + 0x31, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x3a, 0x70, 0x75, 0x73, 0x68, + 0x42, 0x6c, 0x6f, 0x62, 0x12, 0xae, 0x01, 0x0a, 0x0d, 0x50, 0x75, 0x73, 0x68, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, + 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x75, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x3a, 0x01, 0x2a, 0x22, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, + 0x2f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x3a, 0x70, 0x75, 0x73, 0x68, 0x44, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x9f, 0x01, 0x0a, 0x1b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x2e, 0x76, 0x31, 0x42, 0x10, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, + 0x61, 0x73, 0x73, 0x65, 0x74, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x61, + 0x73, 0x73, 0x65, 0x74, 0xa2, 0x02, 0x02, 0x52, 0x41, 0xaa, 0x02, 0x1b, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x42, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x2e, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescOnce sync.Once + file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescData = file_build_bazel_remote_asset_v1_remote_asset_proto_rawDesc +) + +func file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescGZIP() []byte { + file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescOnce.Do(func() { + file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescData = protoimpl.X.CompressGZIP(file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescData) + }) + return file_build_bazel_remote_asset_v1_remote_asset_proto_rawDescData +} + +var file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_build_bazel_remote_asset_v1_remote_asset_proto_goTypes = []interface{}{ + (*Qualifier)(nil), // 0: build.bazel.remote.asset.v1.Qualifier + (*FetchBlobRequest)(nil), // 1: build.bazel.remote.asset.v1.FetchBlobRequest + (*FetchBlobResponse)(nil), // 2: build.bazel.remote.asset.v1.FetchBlobResponse + (*FetchDirectoryRequest)(nil), // 3: build.bazel.remote.asset.v1.FetchDirectoryRequest + (*FetchDirectoryResponse)(nil), // 4: build.bazel.remote.asset.v1.FetchDirectoryResponse + (*PushBlobRequest)(nil), // 5: build.bazel.remote.asset.v1.PushBlobRequest + (*PushBlobResponse)(nil), // 6: build.bazel.remote.asset.v1.PushBlobResponse + (*PushDirectoryRequest)(nil), // 7: build.bazel.remote.asset.v1.PushDirectoryRequest + (*PushDirectoryResponse)(nil), // 8: build.bazel.remote.asset.v1.PushDirectoryResponse + (*durationpb.Duration)(nil), // 9: google.protobuf.Duration + (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp + (*status.Status)(nil), // 11: google.rpc.Status + (*v2.Digest)(nil), // 12: build.bazel.remote.execution.v2.Digest +} +var file_build_bazel_remote_asset_v1_remote_asset_proto_depIdxs = []int32{ + 9, // 0: build.bazel.remote.asset.v1.FetchBlobRequest.timeout:type_name -> google.protobuf.Duration + 10, // 1: build.bazel.remote.asset.v1.FetchBlobRequest.oldest_content_accepted:type_name -> google.protobuf.Timestamp + 0, // 2: build.bazel.remote.asset.v1.FetchBlobRequest.qualifiers:type_name -> build.bazel.remote.asset.v1.Qualifier + 11, // 3: build.bazel.remote.asset.v1.FetchBlobResponse.status:type_name -> google.rpc.Status + 0, // 4: build.bazel.remote.asset.v1.FetchBlobResponse.qualifiers:type_name -> build.bazel.remote.asset.v1.Qualifier + 10, // 5: build.bazel.remote.asset.v1.FetchBlobResponse.expires_at:type_name -> google.protobuf.Timestamp + 12, // 6: build.bazel.remote.asset.v1.FetchBlobResponse.blob_digest:type_name -> build.bazel.remote.execution.v2.Digest + 9, // 7: build.bazel.remote.asset.v1.FetchDirectoryRequest.timeout:type_name -> google.protobuf.Duration + 10, // 8: build.bazel.remote.asset.v1.FetchDirectoryRequest.oldest_content_accepted:type_name -> google.protobuf.Timestamp + 0, // 9: build.bazel.remote.asset.v1.FetchDirectoryRequest.qualifiers:type_name -> build.bazel.remote.asset.v1.Qualifier + 11, // 10: build.bazel.remote.asset.v1.FetchDirectoryResponse.status:type_name -> google.rpc.Status + 0, // 11: build.bazel.remote.asset.v1.FetchDirectoryResponse.qualifiers:type_name -> build.bazel.remote.asset.v1.Qualifier + 10, // 12: build.bazel.remote.asset.v1.FetchDirectoryResponse.expires_at:type_name -> google.protobuf.Timestamp + 12, // 13: build.bazel.remote.asset.v1.FetchDirectoryResponse.root_directory_digest:type_name -> build.bazel.remote.execution.v2.Digest + 0, // 14: build.bazel.remote.asset.v1.PushBlobRequest.qualifiers:type_name -> build.bazel.remote.asset.v1.Qualifier + 10, // 15: build.bazel.remote.asset.v1.PushBlobRequest.expire_at:type_name -> google.protobuf.Timestamp + 12, // 16: build.bazel.remote.asset.v1.PushBlobRequest.blob_digest:type_name -> build.bazel.remote.execution.v2.Digest + 12, // 17: build.bazel.remote.asset.v1.PushBlobRequest.references_blobs:type_name -> build.bazel.remote.execution.v2.Digest + 12, // 18: build.bazel.remote.asset.v1.PushBlobRequest.references_directories:type_name -> build.bazel.remote.execution.v2.Digest + 0, // 19: build.bazel.remote.asset.v1.PushDirectoryRequest.qualifiers:type_name -> build.bazel.remote.asset.v1.Qualifier + 10, // 20: build.bazel.remote.asset.v1.PushDirectoryRequest.expire_at:type_name -> google.protobuf.Timestamp + 12, // 21: build.bazel.remote.asset.v1.PushDirectoryRequest.root_directory_digest:type_name -> build.bazel.remote.execution.v2.Digest + 12, // 22: build.bazel.remote.asset.v1.PushDirectoryRequest.references_blobs:type_name -> build.bazel.remote.execution.v2.Digest + 12, // 23: build.bazel.remote.asset.v1.PushDirectoryRequest.references_directories:type_name -> build.bazel.remote.execution.v2.Digest + 1, // 24: build.bazel.remote.asset.v1.Fetch.FetchBlob:input_type -> build.bazel.remote.asset.v1.FetchBlobRequest + 3, // 25: build.bazel.remote.asset.v1.Fetch.FetchDirectory:input_type -> build.bazel.remote.asset.v1.FetchDirectoryRequest + 5, // 26: build.bazel.remote.asset.v1.Push.PushBlob:input_type -> build.bazel.remote.asset.v1.PushBlobRequest + 7, // 27: build.bazel.remote.asset.v1.Push.PushDirectory:input_type -> build.bazel.remote.asset.v1.PushDirectoryRequest + 2, // 28: build.bazel.remote.asset.v1.Fetch.FetchBlob:output_type -> build.bazel.remote.asset.v1.FetchBlobResponse + 4, // 29: build.bazel.remote.asset.v1.Fetch.FetchDirectory:output_type -> build.bazel.remote.asset.v1.FetchDirectoryResponse + 6, // 30: build.bazel.remote.asset.v1.Push.PushBlob:output_type -> build.bazel.remote.asset.v1.PushBlobResponse + 8, // 31: build.bazel.remote.asset.v1.Push.PushDirectory:output_type -> build.bazel.remote.asset.v1.PushDirectoryResponse + 28, // [28:32] is the sub-list for method output_type + 24, // [24:28] is the sub-list for method input_type + 24, // [24:24] is the sub-list for extension type_name + 24, // [24:24] is the sub-list for extension extendee + 0, // [0:24] is the sub-list for field type_name +} + +func init() { file_build_bazel_remote_asset_v1_remote_asset_proto_init() } +func file_build_bazel_remote_asset_v1_remote_asset_proto_init() { + if File_build_bazel_remote_asset_v1_remote_asset_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Qualifier); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FetchBlobRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FetchBlobResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FetchDirectoryRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FetchDirectoryResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PushBlobRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PushBlobResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PushDirectoryRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PushDirectoryResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_build_bazel_remote_asset_v1_remote_asset_proto_rawDesc, + NumEnums: 0, + NumMessages: 9, + NumExtensions: 0, + NumServices: 2, + }, + GoTypes: file_build_bazel_remote_asset_v1_remote_asset_proto_goTypes, + DependencyIndexes: file_build_bazel_remote_asset_v1_remote_asset_proto_depIdxs, + MessageInfos: file_build_bazel_remote_asset_v1_remote_asset_proto_msgTypes, + }.Build() + File_build_bazel_remote_asset_v1_remote_asset_proto = out.File + file_build_bazel_remote_asset_v1_remote_asset_proto_rawDesc = nil + file_build_bazel_remote_asset_v1_remote_asset_proto_goTypes = nil + file_build_bazel_remote_asset_v1_remote_asset_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// FetchClient is the client API for Fetch service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type FetchClient interface { + // Resolve or fetch referenced assets, making them available to the caller and + // other consumers in the [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. + // + // Servers *MAY* fetch content that they do not already have cached, for any + // URLs they support. + // + // Servers *SHOULD* ensure that referenced files are present in the CAS at the + // time of the response, and (if supported) that they will remain available + // for a reasonable period of time. The lifetimes of the referenced blobs *SHOULD* + // be increased if necessary and applicable. + // In the event that a client receives a reference to content that is no + // longer present, it *MAY* re-issue the request with + // `oldest_content_accepted` set to a more recent timestamp than the original + // attempt, to induce a re-fetch from origin. + // + // Servers *MAY* cache fetched content and reuse it for subsequent requests, + // subject to `oldest_content_accepted`. + // + // Servers *MAY* support the complementary [Push][build.bazel.remote.asset.v1.Push] + // API and allow content to be directly inserted for use in future fetch + // responses. + // + // Servers *MUST* ensure Fetch'd content matches all the specified + // qualifiers except in the case of previously Push'd resources, for which + // the server *MAY* trust the pushing client to have set the qualifiers + // correctly, without validation. + // + // Servers not implementing the complementary [Push][build.bazel.remote.asset.v1.Push] + // API *MUST* reject requests containing qualifiers it does not support. + // + // Servers *MAY* transform assets as part of the fetch. For example a + // tarball fetched by [FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory] + // might be unpacked, or a Git repository + // fetched by [FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob] + // might be passed through `git-archive`. + // + // Errors handling the requested assets will be returned as gRPC Status errors + // here; errors outside the server's control will be returned inline in the + // `status` field of the response (see comment there for details). + // The possible RPC errors include: + // - `INVALID_ARGUMENT`: One or more arguments were invalid, such as a + // qualifier that is not supported by the server. + // - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to + // perform the requested operation. The client may retry after a delay. + // - `UNAVAILABLE`: Due to a transient condition the operation could not be + // completed. The client should retry. + // - `INTERNAL`: An internal error occurred while performing the operation. + // The client should retry. + // - `DEADLINE_EXCEEDED`: The fetch could not be completed within the given + // RPC deadline. The client should retry for at least as long as the value + // provided in `timeout` field of the request. + // + // In the case of unsupported qualifiers, the server *SHOULD* additionally + // send a [BadRequest][google.rpc.BadRequest] error detail where, for each + // unsupported qualifier, there is a `FieldViolation` with a `field` of + // `qualifiers.name` and a `description` of `"{qualifier}" not supported` + // indicating the name of the unsupported qualifier. + FetchBlob(ctx context.Context, in *FetchBlobRequest, opts ...grpc.CallOption) (*FetchBlobResponse, error) + FetchDirectory(ctx context.Context, in *FetchDirectoryRequest, opts ...grpc.CallOption) (*FetchDirectoryResponse, error) +} + +type fetchClient struct { + cc grpc.ClientConnInterface +} + +func NewFetchClient(cc grpc.ClientConnInterface) FetchClient { + return &fetchClient{cc} +} + +func (c *fetchClient) FetchBlob(ctx context.Context, in *FetchBlobRequest, opts ...grpc.CallOption) (*FetchBlobResponse, error) { + out := new(FetchBlobResponse) + err := c.cc.Invoke(ctx, "/build.bazel.remote.asset.v1.Fetch/FetchBlob", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *fetchClient) FetchDirectory(ctx context.Context, in *FetchDirectoryRequest, opts ...grpc.CallOption) (*FetchDirectoryResponse, error) { + out := new(FetchDirectoryResponse) + err := c.cc.Invoke(ctx, "/build.bazel.remote.asset.v1.Fetch/FetchDirectory", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// FetchServer is the server API for Fetch service. +type FetchServer interface { + // Resolve or fetch referenced assets, making them available to the caller and + // other consumers in the [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. + // + // Servers *MAY* fetch content that they do not already have cached, for any + // URLs they support. + // + // Servers *SHOULD* ensure that referenced files are present in the CAS at the + // time of the response, and (if supported) that they will remain available + // for a reasonable period of time. The lifetimes of the referenced blobs *SHOULD* + // be increased if necessary and applicable. + // In the event that a client receives a reference to content that is no + // longer present, it *MAY* re-issue the request with + // `oldest_content_accepted` set to a more recent timestamp than the original + // attempt, to induce a re-fetch from origin. + // + // Servers *MAY* cache fetched content and reuse it for subsequent requests, + // subject to `oldest_content_accepted`. + // + // Servers *MAY* support the complementary [Push][build.bazel.remote.asset.v1.Push] + // API and allow content to be directly inserted for use in future fetch + // responses. + // + // Servers *MUST* ensure Fetch'd content matches all the specified + // qualifiers except in the case of previously Push'd resources, for which + // the server *MAY* trust the pushing client to have set the qualifiers + // correctly, without validation. + // + // Servers not implementing the complementary [Push][build.bazel.remote.asset.v1.Push] + // API *MUST* reject requests containing qualifiers it does not support. + // + // Servers *MAY* transform assets as part of the fetch. For example a + // tarball fetched by [FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory] + // might be unpacked, or a Git repository + // fetched by [FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob] + // might be passed through `git-archive`. + // + // Errors handling the requested assets will be returned as gRPC Status errors + // here; errors outside the server's control will be returned inline in the + // `status` field of the response (see comment there for details). + // The possible RPC errors include: + // - `INVALID_ARGUMENT`: One or more arguments were invalid, such as a + // qualifier that is not supported by the server. + // - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to + // perform the requested operation. The client may retry after a delay. + // - `UNAVAILABLE`: Due to a transient condition the operation could not be + // completed. The client should retry. + // - `INTERNAL`: An internal error occurred while performing the operation. + // The client should retry. + // - `DEADLINE_EXCEEDED`: The fetch could not be completed within the given + // RPC deadline. The client should retry for at least as long as the value + // provided in `timeout` field of the request. + // + // In the case of unsupported qualifiers, the server *SHOULD* additionally + // send a [BadRequest][google.rpc.BadRequest] error detail where, for each + // unsupported qualifier, there is a `FieldViolation` with a `field` of + // `qualifiers.name` and a `description` of `"{qualifier}" not supported` + // indicating the name of the unsupported qualifier. + FetchBlob(context.Context, *FetchBlobRequest) (*FetchBlobResponse, error) + FetchDirectory(context.Context, *FetchDirectoryRequest) (*FetchDirectoryResponse, error) +} + +// UnimplementedFetchServer can be embedded to have forward compatible implementations. +type UnimplementedFetchServer struct { +} + +func (*UnimplementedFetchServer) FetchBlob(context.Context, *FetchBlobRequest) (*FetchBlobResponse, error) { + return nil, status1.Errorf(codes.Unimplemented, "method FetchBlob not implemented") +} +func (*UnimplementedFetchServer) FetchDirectory(context.Context, *FetchDirectoryRequest) (*FetchDirectoryResponse, error) { + return nil, status1.Errorf(codes.Unimplemented, "method FetchDirectory not implemented") +} + +func RegisterFetchServer(s *grpc.Server, srv FetchServer) { + s.RegisterService(&_Fetch_serviceDesc, srv) +} + +func _Fetch_FetchBlob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(FetchBlobRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FetchServer).FetchBlob(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/build.bazel.remote.asset.v1.Fetch/FetchBlob", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FetchServer).FetchBlob(ctx, req.(*FetchBlobRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Fetch_FetchDirectory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(FetchDirectoryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FetchServer).FetchDirectory(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/build.bazel.remote.asset.v1.Fetch/FetchDirectory", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FetchServer).FetchDirectory(ctx, req.(*FetchDirectoryRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Fetch_serviceDesc = grpc.ServiceDesc{ + ServiceName: "build.bazel.remote.asset.v1.Fetch", + HandlerType: (*FetchServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "FetchBlob", + Handler: _Fetch_FetchBlob_Handler, + }, + { + MethodName: "FetchDirectory", + Handler: _Fetch_FetchDirectory_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "build/bazel/remote/asset/v1/remote_asset.proto", +} + +// PushClient is the client API for Push service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type PushClient interface { + // These APIs associate the identifying information of a resource, as + // indicated by URI and optionally Qualifiers, with content available in the + // CAS. For example, associating a repository url and a commit id with a + // Directory Digest. + // + // Servers *SHOULD* only allow trusted clients to associate content, and *MAY* + // only allow certain URIs to be pushed. + // + // Clients *MUST* ensure associated content is available in CAS prior to + // pushing. + // + // Clients *MUST* ensure the Qualifiers listed correctly match the contents, + // and Servers *MAY* trust these values without validation. + // Fetch servers *MAY* require exact match of all qualifiers when returning + // content previously pushed, or allow fetching content with only a subset of + // the qualifiers specified on Push. + // + // Clients can specify expiration information that the server *SHOULD* + // respect. Subsequent requests can be used to alter the expiration time. + // + // A minimal compliant Fetch implementation may support only Push'd content + // and return `NOT_FOUND` for any resource that was not pushed first. + // Alternatively, a compliant implementation may choose to not support Push + // and only return resources that can be Fetch'd from origin. + // + // Errors will be returned as gRPC Status errors. + // The possible RPC errors include: + // - `INVALID_ARGUMENT`: One or more arguments to the RPC were invalid. + // - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to + // perform the requested operation. The client may retry after a delay. + // - `UNAVAILABLE`: Due to a transient condition the operation could not be + // completed. The client should retry. + // - `INTERNAL`: An internal error occurred while performing the operation. + // The client should retry. + PushBlob(ctx context.Context, in *PushBlobRequest, opts ...grpc.CallOption) (*PushBlobResponse, error) + PushDirectory(ctx context.Context, in *PushDirectoryRequest, opts ...grpc.CallOption) (*PushDirectoryResponse, error) +} + +type pushClient struct { + cc grpc.ClientConnInterface +} + +func NewPushClient(cc grpc.ClientConnInterface) PushClient { + return &pushClient{cc} +} + +func (c *pushClient) PushBlob(ctx context.Context, in *PushBlobRequest, opts ...grpc.CallOption) (*PushBlobResponse, error) { + out := new(PushBlobResponse) + err := c.cc.Invoke(ctx, "/build.bazel.remote.asset.v1.Push/PushBlob", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *pushClient) PushDirectory(ctx context.Context, in *PushDirectoryRequest, opts ...grpc.CallOption) (*PushDirectoryResponse, error) { + out := new(PushDirectoryResponse) + err := c.cc.Invoke(ctx, "/build.bazel.remote.asset.v1.Push/PushDirectory", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// PushServer is the server API for Push service. +type PushServer interface { + // These APIs associate the identifying information of a resource, as + // indicated by URI and optionally Qualifiers, with content available in the + // CAS. For example, associating a repository url and a commit id with a + // Directory Digest. + // + // Servers *SHOULD* only allow trusted clients to associate content, and *MAY* + // only allow certain URIs to be pushed. + // + // Clients *MUST* ensure associated content is available in CAS prior to + // pushing. + // + // Clients *MUST* ensure the Qualifiers listed correctly match the contents, + // and Servers *MAY* trust these values without validation. + // Fetch servers *MAY* require exact match of all qualifiers when returning + // content previously pushed, or allow fetching content with only a subset of + // the qualifiers specified on Push. + // + // Clients can specify expiration information that the server *SHOULD* + // respect. Subsequent requests can be used to alter the expiration time. + // + // A minimal compliant Fetch implementation may support only Push'd content + // and return `NOT_FOUND` for any resource that was not pushed first. + // Alternatively, a compliant implementation may choose to not support Push + // and only return resources that can be Fetch'd from origin. + // + // Errors will be returned as gRPC Status errors. + // The possible RPC errors include: + // - `INVALID_ARGUMENT`: One or more arguments to the RPC were invalid. + // - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to + // perform the requested operation. The client may retry after a delay. + // - `UNAVAILABLE`: Due to a transient condition the operation could not be + // completed. The client should retry. + // - `INTERNAL`: An internal error occurred while performing the operation. + // The client should retry. + PushBlob(context.Context, *PushBlobRequest) (*PushBlobResponse, error) + PushDirectory(context.Context, *PushDirectoryRequest) (*PushDirectoryResponse, error) +} + +// UnimplementedPushServer can be embedded to have forward compatible implementations. +type UnimplementedPushServer struct { +} + +func (*UnimplementedPushServer) PushBlob(context.Context, *PushBlobRequest) (*PushBlobResponse, error) { + return nil, status1.Errorf(codes.Unimplemented, "method PushBlob not implemented") +} +func (*UnimplementedPushServer) PushDirectory(context.Context, *PushDirectoryRequest) (*PushDirectoryResponse, error) { + return nil, status1.Errorf(codes.Unimplemented, "method PushDirectory not implemented") +} + +func RegisterPushServer(s *grpc.Server, srv PushServer) { + s.RegisterService(&_Push_serviceDesc, srv) +} + +func _Push_PushBlob_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PushBlobRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PushServer).PushBlob(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/build.bazel.remote.asset.v1.Push/PushBlob", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PushServer).PushBlob(ctx, req.(*PushBlobRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Push_PushDirectory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PushDirectoryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(PushServer).PushDirectory(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/build.bazel.remote.asset.v1.Push/PushDirectory", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(PushServer).PushDirectory(ctx, req.(*PushDirectoryRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Push_serviceDesc = grpc.ServiceDesc{ + ServiceName: "build.bazel.remote.asset.v1.Push", + HandlerType: (*PushServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "PushBlob", + Handler: _Push_PushBlob_Handler, + }, + { + MethodName: "PushDirectory", + Handler: _Push_PushDirectory_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "build/bazel/remote/asset/v1/remote_asset.proto", +} diff --git a/build/bazel/remote/asset/v1/remote_asset.proto b/build/bazel/remote/asset/v1/remote_asset.proto new file mode 100644 index 0000000..c896ec4 --- /dev/null +++ b/build/bazel/remote/asset/v1/remote_asset.proto @@ -0,0 +1,495 @@ +// Copyright 2020 The Bazel Authors. +// +// 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. + +syntax = "proto3"; + +package build.bazel.remote.asset.v1; + +import "build/bazel/remote/execution/v2/remote_execution.proto"; +import "google/api/annotations.proto"; +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; +import "google/rpc/status.proto"; + +option csharp_namespace = "Build.Bazel.Remote.Asset.v1"; +option go_package = "github.com/bazelbuild/remote-apis/build/bazel/remote/asset/v1;remoteasset"; +option java_multiple_files = true; +option java_outer_classname = "RemoteAssetProto"; +option java_package = "build.bazel.remote.asset.v1"; +option objc_class_prefix = "RA"; + +// The Remote Asset API provides a mapping from a URI and Qualifiers to +// Digests. +// +// Multiple URIs may be used to refer to the same content. For example, the +// same tarball may exist at multiple mirrors and thus be retrievable from +// multiple URLs. When URLs are used, these should refer to actual content as +// Fetch service implementations may choose to fetch the content directly +// from the origin. For example, the HEAD of a git repository's active branch +// can be referred to as: +// +// uri: https://github.com/bazelbuild/remote-apis.git +// +// URNs may be used to strongly identify content, for instance by using the +// uuid namespace identifier: urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6. +// This is most applicable to named content that is Push'd, where the URN +// serves as an agreed-upon key, but carries no other inherent meaning. +// +// Service implementations may choose to support only URLs, only URNs for +// Push'd content, only other URIs for which the server and client agree upon +// semantics of, or any mixture of the above. + +// Qualifiers are used to disambiguate or sub-select content that shares a URI. +// This may include specifying a particular commit or branch, in the case of +// URIs referencing a repository; they could also be used to specify a +// particular subdirectory of a repository or tarball. Qualifiers may also be +// used to ensure content matches what the client expects, even when there is +// no ambiguity to be had - for example, a qualifier specifying a checksum +// value. +// +// In cases where the semantics of the request are not immediately clear from +// the URL and/or qualifiers - e.g. dictated by URL scheme - it is recommended +// to use an additional qualifier to remove the ambiguity. The `resource_type` +// qualifier is recommended for this purpose. +// +// Qualifiers may be supplied in any order. +message Qualifier { + // The "name" of the qualifier, for example "resource_type". + // No separation is made between 'standard' and 'nonstandard' + // qualifiers, in accordance with https://tools.ietf.org/html/rfc6648, + // however implementers *SHOULD* take care to avoid ambiguity. + string name = 1; + + // The "value" of the qualifier. Semantics will be dictated by the name. + string value = 2; +} + +// The Fetch service resolves or fetches assets referenced by URI and +// Qualifiers, returning a Digest for the content in +// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. +// +// As with other services in the Remote Execution API, any call may return an +// error with a [RetryInfo][google.rpc.RetryInfo] error detail providing +// information about when the client should retry the request; clients SHOULD +// respect the information provided. +service Fetch { + // Resolve or fetch referenced assets, making them available to the caller and + // other consumers in the [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. + // + // Servers *MAY* fetch content that they do not already have cached, for any + // URLs they support. + // + // Servers *SHOULD* ensure that referenced files are present in the CAS at the + // time of the response, and (if supported) that they will remain available + // for a reasonable period of time. The lifetimes of the referenced blobs *SHOULD* + // be increased if necessary and applicable. + // In the event that a client receives a reference to content that is no + // longer present, it *MAY* re-issue the request with + // `oldest_content_accepted` set to a more recent timestamp than the original + // attempt, to induce a re-fetch from origin. + // + // Servers *MAY* cache fetched content and reuse it for subsequent requests, + // subject to `oldest_content_accepted`. + // + // Servers *MAY* support the complementary [Push][build.bazel.remote.asset.v1.Push] + // API and allow content to be directly inserted for use in future fetch + // responses. + // + // Servers *MUST* ensure Fetch'd content matches all the specified + // qualifiers except in the case of previously Push'd resources, for which + // the server *MAY* trust the pushing client to have set the qualifiers + // correctly, without validation. + // + // Servers not implementing the complementary [Push][build.bazel.remote.asset.v1.Push] + // API *MUST* reject requests containing qualifiers it does not support. + // + // Servers *MAY* transform assets as part of the fetch. For example a + // tarball fetched by [FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory] + // might be unpacked, or a Git repository + // fetched by [FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob] + // might be passed through `git-archive`. + // + // Errors handling the requested assets will be returned as gRPC Status errors + // here; errors outside the server's control will be returned inline in the + // `status` field of the response (see comment there for details). + // The possible RPC errors include: + // * `INVALID_ARGUMENT`: One or more arguments were invalid, such as a + // qualifier that is not supported by the server. + // * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to + // perform the requested operation. The client may retry after a delay. + // * `UNAVAILABLE`: Due to a transient condition the operation could not be + // completed. The client should retry. + // * `INTERNAL`: An internal error occurred while performing the operation. + // The client should retry. + // * `DEADLINE_EXCEEDED`: The fetch could not be completed within the given + // RPC deadline. The client should retry for at least as long as the value + // provided in `timeout` field of the request. + // + // In the case of unsupported qualifiers, the server *SHOULD* additionally + // send a [BadRequest][google.rpc.BadRequest] error detail where, for each + // unsupported qualifier, there is a `FieldViolation` with a `field` of + // `qualifiers.name` and a `description` of `"{qualifier}" not supported` + // indicating the name of the unsupported qualifier. + rpc FetchBlob(FetchBlobRequest) returns (FetchBlobResponse) { + option (google.api.http) = { post: "/v1/{instance_name=**}/assets:fetchBlob" body: "*" }; + } + rpc FetchDirectory(FetchDirectoryRequest) returns (FetchDirectoryResponse) { + option (google.api.http) = { post: "/v1/{instance_name=**}/assets:fetchDirectory" body: "*" }; + } +} + +// A request message for +// [Fetch.FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob]. +message FetchBlobRequest { + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + string instance_name = 1; + + // The timeout for the underlying fetch, if content needs to be retrieved from + // origin. + // + // If unset, the server *MAY* apply an implementation-defined timeout. + // + // If set, and the user-provided timeout exceeds the RPC deadline, the server + // *SHOULD* keep the fetch going after the RPC completes, to be made + // available for future Fetch calls. The server may also enforce (via clamping + // and/or an INVALID_ARGUMENT error) implementation-defined minimum and + // maximum timeout values. + // + // If this timeout is exceeded on an attempt to retrieve content from origin + // the client will receive DEADLINE_EXCEEDED in [FetchBlobResponse.status]. + google.protobuf.Duration timeout = 2; + + // The oldest content the client is willing to accept, as measured from the + // time it was Push'd or when the underlying retrieval from origin was + // started. + // Upon retries of Fetch requests that cannot be completed within a single + // RPC, clients *SHOULD* provide the same value for subsequent requests as the + // original, to simplify combining the request with the previous attempt. + // + // If unset, the client *SHOULD* accept content of any age. + google.protobuf.Timestamp oldest_content_accepted = 3; + + // The URI(s) of the content to fetch. These may be resources that the server + // can directly fetch from origin, in which case multiple URIs *SHOULD* + // represent the same content available at different locations (such as an + // origin and secondary mirrors). These may also be URIs for content known to + // the server through other mechanisms, e.g. pushed via the [Push][build.bazel.remote.asset.v1.Push] + // service. + // + // Clients *MUST* supply at least one URI. Servers *MAY* match any one of the + // supplied URIs. + repeated string uris = 4; + + // Qualifiers sub-specifying the content to fetch - see comments on + // [Qualifier][build.bazel.remote.asset.v1.Qualifier]. + // The same qualifiers apply to all URIs. + // + // Specified qualifier names *MUST* be unique. + repeated Qualifier qualifiers = 5; + + // The digest function the server must use to compute the digest. + // + // If unset, the server SHOULD default to SHA256. + build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 6; +} + +// A response message for +// [Fetch.FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob]. +message FetchBlobResponse { + // If the status has a code other than `OK`, it indicates that the operation + // was unable to be completed for reasons outside the servers' control. + // The possible fetch errors include: + // * `DEADLINE_EXCEEDED`: The operation could not be completed within the + // specified timeout. + // * `NOT_FOUND`: The requested asset was not found at the specified location. + // * `PERMISSION_DENIED`: The request was rejected by a remote server, or + // requested an asset from a disallowed origin. + // * `ABORTED`: The operation could not be completed, typically due to a + // failed consistency check. + // * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to + // perform the requested operation. The client may retry after a delay. + google.rpc.Status status = 1; + + // The uri from the request that resulted in a successful retrieval, or from + // which the error indicated in `status` was obtained. + string uri = 2; + + // Any qualifiers known to the server and of interest to clients. + repeated Qualifier qualifiers = 3; + + // A minimum timestamp the content is expected to be available through. + // Servers *MAY* omit this field, if not known with confidence. + google.protobuf.Timestamp expires_at = 4; + + // The result of the fetch, if the status had code `OK`. + // The digest of the file's contents, available for download through the CAS. + build.bazel.remote.execution.v2.Digest blob_digest = 5; + + // This field SHOULD be set to the digest function that was used by the server + // to compute [FetchBlobResponse.blob_digest]. + // Clients could use this to determine whether the server honors + // [FetchBlobRequest.digest_function] that was set in the request. + // + // If unset, clients SHOULD default to use SHA256 regardless of the requested + // [FetchBlobRequest.digest_function]. + build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 6; +} + +// A request message for +// [Fetch.FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory]. +message FetchDirectoryRequest { + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + string instance_name = 1; + + // The timeout for the underlying fetch, if content needs to be retrieved from + // origin. This value is allowed to exceed the RPC deadline, in which case the + // server *SHOULD* keep the fetch going after the RPC completes, to be made + // available for future Fetch calls. + // + // If this timeout is exceeded on an attempt to retrieve content from origin + // the client will receive DEADLINE_EXCEEDED in [FetchDirectoryResponse.status]. + google.protobuf.Duration timeout = 2; + + // The oldest content the client is willing to accept, as measured from the + // time it was Push'd or when the underlying retrieval from origin was + // started. + // Upon retries of Fetch requests that cannot be completed within a single + // RPC, clients *SHOULD* provide the same value for subsequent requests as the + // original, to simplify combining the request with the previous attempt. + // + // If unset, the client *SHOULD* accept content of any age. + google.protobuf.Timestamp oldest_content_accepted = 3; + + // The URI(s) of the content to fetch. These may be resources that the server + // can directly fetch from origin, in which case multiple URIs *SHOULD* + // represent the same content available at different locations (such as an + // origin and secondary mirrors). These may also be URIs for content known to + // the server through other mechanisms, e.g. pushed via the [Push][build.bazel.remote.asset.v1.Push] + // service. + // + // Clients *MUST* supply at least one URI. Servers *MAY* match any one of the + // supplied URIs. + repeated string uris = 4; + + // Qualifiers sub-specifying the content to fetch - see comments on + // [Qualifier][build.bazel.remote.asset.v1.Qualifier]. + // The same qualifiers apply to all URIs. + // + // Specified qualifier names *MUST* be unique. + repeated Qualifier qualifiers = 5; + + // The digest function the server must use to compute the digest. + // + // If unset, the server SHOULD default to SHA256. + build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 6; +} + +// A response message for +// [Fetch.FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory]. +message FetchDirectoryResponse { + // If the status has a code other than `OK`, it indicates that the operation + // was unable to be completed for reasons outside the servers' control. + // The possible fetch errors include: + // * `DEADLINE_EXCEEDED`: The operation could not be completed within the + // specified timeout. + // * `NOT_FOUND`: The requested asset was not found at the specified location. + // * `PERMISSION_DENIED`: The request was rejected by a remote server, or + // requested an asset from a disallowed origin. + // * `ABORTED`: The operation could not be completed, typically due to a + // failed consistency check. + // * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to + // perform the requested operation. The client may retry after a delay. + google.rpc.Status status = 1; + + // The uri from the request that resulted in a successful retrieval, or from + // which the error indicated in `status` was obtained. + string uri = 2; + + // Any qualifiers known to the server and of interest to clients. + repeated Qualifier qualifiers = 3; + + // A minimum timestamp the content is expected to be available through. + // Servers *MAY* omit this field, if not known with confidence. + google.protobuf.Timestamp expires_at = 4; + + // The result of the fetch, if the status had code `OK`. + // the root digest of a directory tree, suitable for fetching via + // [ContentAddressableStorage.GetTree]. + build.bazel.remote.execution.v2.Digest root_directory_digest = 5; + + // This field SHOULD be set to the digest function that was used by the server + // to compute [FetchBlobResponse.root_directory_digest]. + // Clients could use this to determine whether the server honors + // [FetchDirectoryRequest.digest_function] that was set in the request. + // + // If unset, clients SHOULD default to use SHA256 regardless of the requested + // [FetchDirectoryRequest.digest_function]. + build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 6; +} + +// The Push service is complementary to the Fetch, and allows for +// associating contents of URLs to be returned in future Fetch API calls. +// +// As with other services in the Remote Execution API, any call may return an +// error with a [RetryInfo][google.rpc.RetryInfo] error detail providing +// information about when the client should retry the request; clients SHOULD +// respect the information provided. +service Push { + // These APIs associate the identifying information of a resource, as + // indicated by URI and optionally Qualifiers, with content available in the + // CAS. For example, associating a repository url and a commit id with a + // Directory Digest. + // + // Servers *SHOULD* only allow trusted clients to associate content, and *MAY* + // only allow certain URIs to be pushed. + // + // Clients *MUST* ensure associated content is available in CAS prior to + // pushing. + // + // Clients *MUST* ensure the Qualifiers listed correctly match the contents, + // and Servers *MAY* trust these values without validation. + // Fetch servers *MAY* require exact match of all qualifiers when returning + // content previously pushed, or allow fetching content with only a subset of + // the qualifiers specified on Push. + // + // Clients can specify expiration information that the server *SHOULD* + // respect. Subsequent requests can be used to alter the expiration time. + // + // A minimal compliant Fetch implementation may support only Push'd content + // and return `NOT_FOUND` for any resource that was not pushed first. + // Alternatively, a compliant implementation may choose to not support Push + // and only return resources that can be Fetch'd from origin. + // + // Errors will be returned as gRPC Status errors. + // The possible RPC errors include: + // * `INVALID_ARGUMENT`: One or more arguments to the RPC were invalid. + // * `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to + // perform the requested operation. The client may retry after a delay. + // * `UNAVAILABLE`: Due to a transient condition the operation could not be + // completed. The client should retry. + // * `INTERNAL`: An internal error occurred while performing the operation. + // The client should retry. + rpc PushBlob(PushBlobRequest) returns (PushBlobResponse) { + option (google.api.http) = { post: "/v1/{instance_name=**}/assets:pushBlob" body: "*" }; + } + + rpc PushDirectory(PushDirectoryRequest) returns (PushDirectoryResponse) { + option (google.api.http) = { post: "/v1/{instance_name=**}/assets:pushDirectory" body: "*" }; + } +} + +// A request message for +// [Push.PushBlob][build.bazel.remote.asset.v1.Push.PushBlob]. +message PushBlobRequest { + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + string instance_name = 1; + + // The URI(s) of the content to associate. If multiple URIs are specified, the + // pushed content will be available to fetch by specifying any of them. + repeated string uris = 2; + + // Qualifiers sub-specifying the content that is being pushed - see comments + // on [Qualifier][build.bazel.remote.asset.v1.Qualifier]. + // The same qualifiers apply to all URIs. + repeated Qualifier qualifiers = 3; + + // A time after which this content should stop being returned via [FetchBlob][build.bazel.remote.asset.v1.Fetch.FetchBlob]. + // Servers *MAY* expire content early, e.g. due to storage pressure. + google.protobuf.Timestamp expire_at = 4; + + // The blob to associate. + build.bazel.remote.execution.v2.Digest blob_digest = 5; + + // Referenced blobs or directories that need to not expire before expiration + // of this association, in addition to `blob_digest` itself. + // These fields are hints - clients *MAY* omit them, and servers *SHOULD* + // respect them, at the risk of increased incidents of Fetch responses + // indirectly referencing unavailable blobs. + repeated build.bazel.remote.execution.v2.Digest references_blobs = 6; + repeated build.bazel.remote.execution.v2.Digest references_directories = 7; + + // The digest function that was used to compute the blob digest. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the action digest hash and the digest functions announced + // in the server's capabilities. + build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 8; +} + +// A response message for +// [Push.PushBlob][build.bazel.remote.asset.v1.Push.PushBlob]. +message PushBlobResponse { /* empty */ } + +// A request message for +// [Push.PushDirectory][build.bazel.remote.asset.v1.Push.PushDirectory]. +message PushDirectoryRequest { + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + string instance_name = 1; + + // The URI(s) of the content to associate. If multiple URIs are specified, the + // pushed content will be available to fetch by specifying any of them. + repeated string uris = 2; + + // Qualifiers sub-specifying the content that is being pushed - see comments + // on [Qualifier][build.bazel.remote.asset.v1.Qualifier]. + // The same qualifiers apply to all URIs. + repeated Qualifier qualifiers = 3; + + // A time after which this content should stop being returned via + // [FetchDirectory][build.bazel.remote.asset.v1.Fetch.FetchDirectory]. + // Servers *MAY* expire content early, e.g. due to storage pressure. + google.protobuf.Timestamp expire_at = 4; + + // Directory to associate + build.bazel.remote.execution.v2.Digest root_directory_digest = 5; + + // Referenced blobs or directories that need to not expire before expiration + // of this association, in addition to `root_directory_digest` itself. + // These fields are hints - clients *MAY* omit them, and servers *SHOULD* + // respect them, at the risk of increased incidents of Fetch responses + // indirectly referencing unavailable blobs. + repeated build.bazel.remote.execution.v2.Digest references_blobs = 6; + repeated build.bazel.remote.execution.v2.Digest references_directories = 7; + + // The digest function that was used to compute blob digests. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the action digest hash and the digest functions announced + // in the server's capabilities. + build.bazel.remote.execution.v2.DigestFunction.Value digest_function = 8; +} + +// A response message for +// [Push.PushDirectory][build.bazel.remote.asset.v1.Push.PushDirectory]. +message PushDirectoryResponse { /* empty */ } diff --git a/build/bazel/remote/execution/v2/BUILD b/build/bazel/remote/execution/v2/BUILD index 34a509c..e8edcf0 100644 --- a/build/bazel/remote/execution/v2/BUILD +++ b/build/bazel/remote/execution/v2/BUILD @@ -1,5 +1,6 @@ package(default_visibility = ["//visibility:public"]) -load("@com_github_grpc_grpc//bazel:cc_grpc_library.bzl", "cc_grpc_library") + +load("@rules_proto//proto:defs.bzl", "proto_library") licenses(["notice"]) @@ -8,32 +9,33 @@ proto_library( srcs = ["remote_execution.proto"], deps = [ "//build/bazel/semver:semver_proto", + "@com_google_protobuf//:any_proto", "@com_google_protobuf//:duration_proto", "@com_google_protobuf//:timestamp_proto", - "@googleapis//:google_api_annotations_proto", - "@googleapis//:google_api_http_proto", - "@googleapis//:google_longrunning_operations_proto", - "@googleapis//:google_rpc_status_proto", + "@com_google_protobuf//:wrappers_proto", + "@googleapis//google/api:annotations_proto", + "@googleapis//google/api:http_proto", + "@googleapis//google/longrunning:operations_proto", + "@googleapis//google/rpc:status_proto", ], ) -java_proto_library( +alias( name = "remote_execution_java_proto", - deps = [":remote_execution_proto"], + actual = "//build/bazel/remote/execution/v2/java:remote_execution_java_proto", ) -cc_grpc_library( +alias( name = "remote_execution_cc_proto", - srcs = ["remote_execution.proto"], - deps = [ - "//build/bazel/semver:semver_cc_proto", - "@googleapis//:google_api_annotations_cc_proto", - "@googleapis//:google_api_http_cc_proto", - "@googleapis//:google_longrunning_operations_cc_proto", - "@googleapis//:google_rpc_status_cc_proto", - ], - proto_only = False, - well_known_protos = True, - use_external = False, + actual = "//build/bazel/remote/execution/v2/cc:remote_execution_cc_grpc", ) +alias( + name = "remote_execution_go_proto", + actual = "//build/bazel/remote/execution/v2/go:remote_execution_go_proto", +) + +alias( + name = "go_default_library", + actual = "//build/bazel/remote/execution/v2/go:go_default_library", +) diff --git a/build/bazel/remote/execution/v2/cc/BUILD b/build/bazel/remote/execution/v2/cc/BUILD new file mode 100644 index 0000000..541b645 --- /dev/null +++ b/build/bazel/remote/execution/v2/cc/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//build/bazel/remote/execution/v2:__pkg__"]) + +load("//internal:cc_grpc_library.bzl", "cc_grpc_codegen") + +cc_proto_library( + name = "remote_execution_cc_proto", + deps = ["//build/bazel/remote/execution/v2:remote_execution_proto"], +) + +cc_grpc_codegen( + name = "remote_execution_cc_grpc_codegen", + proto = "//build/bazel/remote/execution/v2:remote_execution_proto", +) + +cc_library( + name = "remote_execution_cc_grpc", + srcs = [":remote_execution_cc_grpc_codegen"], + hdrs = [":remote_execution_cc_grpc_codegen"], + include_prefix = "build/bazel/remote/execution/v2", + strip_include_prefix = "/" + package_name(), + deps = [ + ":remote_execution_cc_proto", + "@com_github_grpc_grpc//:grpc++_codegen_proto", + ], +) diff --git a/build/bazel/remote/execution/v2/go/BUILD b/build/bazel/remote/execution/v2/go/BUILD new file mode 100644 index 0000000..24cc7a0 --- /dev/null +++ b/build/bazel/remote/execution/v2/go/BUILD @@ -0,0 +1,23 @@ +package(default_visibility = ["//build/bazel/remote/execution/v2:__pkg__"]) + +load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library") + +go_proto_library( + name = "remote_execution_go_proto", + compilers = ["@io_bazel_rules_go//proto:go_grpc"], + importpath = "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2", + proto = "//build/bazel/remote/execution/v2:remote_execution_proto", + deps = [ + "//build/bazel/semver:semver_go_proto", + "@org_golang_google_genproto//googleapis/api/annotations", + "@org_golang_google_genproto//googleapis/longrunning", + "@org_golang_google_genproto//googleapis/rpc/status", + ], +) + +go_library( + name = "go_default_library", + embed = [":remote_execution_go_proto"], + importpath = "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2", +) diff --git a/build/bazel/remote/execution/v2/java/BUILD b/build/bazel/remote/execution/v2/java/BUILD new file mode 100644 index 0000000..e6bb022 --- /dev/null +++ b/build/bazel/remote/execution/v2/java/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//build/bazel/remote/execution/v2:__pkg__"]) + +java_proto_library( + name = "remote_execution_java_proto", + deps = ["//build/bazel/remote/execution/v2:remote_execution_proto"], +) diff --git a/build/bazel/remote/execution/v2/platform.md b/build/bazel/remote/execution/v2/platform.md new file mode 100644 index 0000000..56a11af --- /dev/null +++ b/build/bazel/remote/execution/v2/platform.md @@ -0,0 +1,126 @@ +# Platform Lexicon + +This lexicon defines standard platform property names and values that servers +MAY support in the `Platform` message to facilitate interoperability. New +values can be added by submitting a PR against this repository, which requires +signing the [Google CLA](https://opensource.google/documentation/reference/cla). +If signing the Google CLA is undesirable, you may submit an issue instead. + +The following standard property `name`s are defined: + +* `OSFamily`: This describes the operating system family. Multiple values + are not allowed and an exact match is required. + + The following standard values are defined: + + - `aix` + - `freebsd` + - `linux` + - `macos` + - `sunos` + - `windows` + + Additional values may be defined by the server. For other POSIX systems + the recommendation is to use the output of `uname -s` in lower case. + +* `ISA`: This describes the instruction set architecture including + instruction set extensions and versions. Multiple values are allowed. If + multiple values are specified, they are AND-ed together: the worker is + required to support all of the listed values. + + The following standard instruction set architecture values are defined: + + - `arm-a32` (little endian) + - `arm-a32-be` (big endian) + - `arm-a64` (little endian) + - `arm-a64-be` (big endian) + - `arm-t32` (little endian) + - `arm-t32-be` (big endian) + - `la64v100` (little endian) + - `power-isa-be` (big endian) + - `power-isa-le` (little endian) + - `rv32g` (little endian) + - `rv64g` (little endian) + - `sparc-v9` (big endian) + - `x86-32` + - `x86-64` + + The following standard instruction set extension and version values are + defined: + + - `arm-neon` + - `arm-sve` + - `arm-vfpv3` + - `arm-vfpv4` + - `armv6` + - `armv7` + - `armv8` + - `x86-avx` + - `x86-avx2` + - `x86-avx-512` + - `x86-sse4.1` + - `x86-sse4.2` + + Additional values may be defined by the server. Vendor-neutral names are + recommended. + + Clients SHOULD NOT request instruction set extensions or versions without + requesting an instruction set architecture. + + Examples with multiple values: + + ```json + // (Platform proto) + { + "properties": [ + { + "name": "ISA", + "value": "x86-64" + }, + { + "name": "ISA", + "value": "x86-avx2" + } + ] + } + ``` + + ```json + // (Platform proto) + { + "properties": [ + { + "name": "ISA", + "value": "arm-a64" + }, + { + "name": "ISA", + "value": "armv8" + }, + { + "name": "ISA", + "value": "arm-sve" + } + ] + } + ``` + + ```json + // (Platform proto) + { + "properties": [ + { + "name": "ISA", + "value": "arm-a32" + }, + { + "name": "ISA", + "value": "armv7" + }, + { + "name": "ISA", + "value": "arm-vfpv4" + } + ] + } + ``` diff --git a/build/bazel/remote/execution/v2/remote_execution.pb.go b/build/bazel/remote/execution/v2/remote_execution.pb.go new file mode 100755 index 0000000..3dad0e1 --- /dev/null +++ b/build/bazel/remote/execution/v2/remote_execution.pb.go @@ -0,0 +1,7560 @@ +// Copyright 2018 The Bazel Authors. +// +// 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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v3.15.0 +// source: build/bazel/remote/execution/v2/remote_execution.proto + +package remoteexecution + +import ( + context "context" + semver "github.com/bazelbuild/remote-apis/build/bazel/semver" + _ "google.golang.org/genproto/googleapis/api/annotations" + longrunning "google.golang.org/genproto/googleapis/longrunning" + status "google.golang.org/genproto/googleapis/rpc/status" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status1 "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + anypb "google.golang.org/protobuf/types/known/anypb" + durationpb "google.golang.org/protobuf/types/known/durationpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Command_OutputDirectoryFormat int32 + +const ( + // The client is only interested in receiving output directories in + // the form of a single Tree object, using the `tree_digest` field. + Command_TREE_ONLY Command_OutputDirectoryFormat = 0 + // The client is only interested in receiving output directories in + // the form of a hierarchy of separately stored Directory objects, + // using the `root_directory_digest` field. + Command_DIRECTORY_ONLY Command_OutputDirectoryFormat = 1 + // The client is interested in receiving output directories both in + // the form of a single Tree object and a hierarchy of separately + // stored Directory objects, using both the `tree_digest` and + // `root_directory_digest` fields. + Command_TREE_AND_DIRECTORY Command_OutputDirectoryFormat = 2 +) + +// Enum value maps for Command_OutputDirectoryFormat. +var ( + Command_OutputDirectoryFormat_name = map[int32]string{ + 0: "TREE_ONLY", + 1: "DIRECTORY_ONLY", + 2: "TREE_AND_DIRECTORY", + } + Command_OutputDirectoryFormat_value = map[string]int32{ + "TREE_ONLY": 0, + "DIRECTORY_ONLY": 1, + "TREE_AND_DIRECTORY": 2, + } +) + +func (x Command_OutputDirectoryFormat) Enum() *Command_OutputDirectoryFormat { + p := new(Command_OutputDirectoryFormat) + *p = x + return p +} + +func (x Command_OutputDirectoryFormat) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Command_OutputDirectoryFormat) Descriptor() protoreflect.EnumDescriptor { + return file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[0].Descriptor() +} + +func (Command_OutputDirectoryFormat) Type() protoreflect.EnumType { + return &file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[0] +} + +func (x Command_OutputDirectoryFormat) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Command_OutputDirectoryFormat.Descriptor instead. +func (Command_OutputDirectoryFormat) EnumDescriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{1, 0} +} + +type ExecutionStage_Value int32 + +const ( + // Invalid value. + ExecutionStage_UNKNOWN ExecutionStage_Value = 0 + // Checking the result against the cache. + ExecutionStage_CACHE_CHECK ExecutionStage_Value = 1 + // Currently idle, awaiting a free machine to execute. + ExecutionStage_QUEUED ExecutionStage_Value = 2 + // Currently being executed by a worker. + ExecutionStage_EXECUTING ExecutionStage_Value = 3 + // Finished execution. + ExecutionStage_COMPLETED ExecutionStage_Value = 4 +) + +// Enum value maps for ExecutionStage_Value. +var ( + ExecutionStage_Value_name = map[int32]string{ + 0: "UNKNOWN", + 1: "CACHE_CHECK", + 2: "QUEUED", + 3: "EXECUTING", + 4: "COMPLETED", + } + ExecutionStage_Value_value = map[string]int32{ + "UNKNOWN": 0, + "CACHE_CHECK": 1, + "QUEUED": 2, + "EXECUTING": 3, + "COMPLETED": 4, + } +) + +func (x ExecutionStage_Value) Enum() *ExecutionStage_Value { + p := new(ExecutionStage_Value) + *p = x + return p +} + +func (x ExecutionStage_Value) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ExecutionStage_Value) Descriptor() protoreflect.EnumDescriptor { + return file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[1].Descriptor() +} + +func (ExecutionStage_Value) Type() protoreflect.EnumType { + return &file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[1] +} + +func (x ExecutionStage_Value) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ExecutionStage_Value.Descriptor instead. +func (ExecutionStage_Value) EnumDescriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{21, 0} +} + +type DigestFunction_Value int32 + +const ( + // It is an error for the server to return this value. + DigestFunction_UNKNOWN DigestFunction_Value = 0 + // The SHA-256 digest function. + DigestFunction_SHA256 DigestFunction_Value = 1 + // The SHA-1 digest function. + DigestFunction_SHA1 DigestFunction_Value = 2 + // The MD5 digest function. + DigestFunction_MD5 DigestFunction_Value = 3 + // The Microsoft "VSO-Hash" paged SHA256 digest function. + // See https://github.com/microsoft/BuildXL/blob/master/Documentation/Specs/PagedHash.md . + DigestFunction_VSO DigestFunction_Value = 4 + // The SHA-384 digest function. + DigestFunction_SHA384 DigestFunction_Value = 5 + // The SHA-512 digest function. + DigestFunction_SHA512 DigestFunction_Value = 6 + // Murmur3 128-bit digest function, x64 variant. Note that this is not a + // cryptographic hash function and its collision properties are not strongly guaranteed. + // See https://github.com/aappleby/smhasher/wiki/MurmurHash3 . + DigestFunction_MURMUR3 DigestFunction_Value = 7 + // The SHA-256 digest function, modified to use a Merkle tree for + // large objects. This permits implementations to store large blobs + // as a decomposed sequence of 2^j sized chunks, where j >= 10, + // while being able to validate integrity at the chunk level. + // + // Furthermore, on systems that do not offer dedicated instructions + // for computing SHA-256 hashes (e.g., the Intel SHA and ARMv8 + // cryptographic extensions), SHA256TREE hashes can be computed more + // efficiently than plain SHA-256 hashes by using generic SIMD + // extensions, such as Intel AVX2 or ARM NEON. + // + // SHA256TREE hashes are computed as follows: + // + // - For blobs that are 1024 bytes or smaller, the hash is computed + // using the regular SHA-256 digest function. + // + // - For blobs that are more than 1024 bytes in size, the hash is + // computed as follows: + // + // 1. The blob is partitioned into a left (leading) and right + // (trailing) blob. These blobs have lengths m and n + // respectively, where m = 2^k and 0 < n <= m. + // + // 2. Hashes of the left and right blob, Hash(left) and + // Hash(right) respectively, are computed by recursively + // applying the SHA256TREE algorithm. + // + // 3. A single invocation is made to the SHA-256 block cipher with + // the following parameters: + // + // M = Hash(left) || Hash(right) + // H = { + // 0xcbbb9d5d, 0x629a292a, 0x9159015a, 0x152fecd8, + // 0x67332667, 0x8eb44a87, 0xdb0c2e0d, 0x47b5481d, + // } + // + // The values of H are the leading fractional parts of the + // square roots of the 9th to the 16th prime number (23 to 53). + // This differs from plain SHA-256, where the first eight prime + // numbers (2 to 19) are used, thereby preventing trivial hash + // collisions between small and large objects. + // + // 4. The hash of the full blob can then be obtained by + // concatenating the outputs of the block cipher: + // + // Hash(blob) = a || b || c || d || e || f || g || h + // + // Addition of the original values of H, as normally done + // through the use of the Davies-Meyer structure, is not + // performed. This isn't necessary, as the block cipher is only + // invoked once. + // + // Test vectors of this digest function can be found in the + // accompanying sha256tree_test_vectors.txt file. + DigestFunction_SHA256TREE DigestFunction_Value = 8 + // The BLAKE3 hash function. + // See https://github.com/BLAKE3-team/BLAKE3. + DigestFunction_BLAKE3 DigestFunction_Value = 9 +) + +// Enum value maps for DigestFunction_Value. +var ( + DigestFunction_Value_name = map[int32]string{ + 0: "UNKNOWN", + 1: "SHA256", + 2: "SHA1", + 3: "MD5", + 4: "VSO", + 5: "SHA384", + 6: "SHA512", + 7: "MURMUR3", + 8: "SHA256TREE", + 9: "BLAKE3", + } + DigestFunction_Value_value = map[string]int32{ + "UNKNOWN": 0, + "SHA256": 1, + "SHA1": 2, + "MD5": 3, + "VSO": 4, + "SHA384": 5, + "SHA512": 6, + "MURMUR3": 7, + "SHA256TREE": 8, + "BLAKE3": 9, + } +) + +func (x DigestFunction_Value) Enum() *DigestFunction_Value { + p := new(DigestFunction_Value) + *p = x + return p +} + +func (x DigestFunction_Value) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DigestFunction_Value) Descriptor() protoreflect.EnumDescriptor { + return file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[2].Descriptor() +} + +func (DigestFunction_Value) Type() protoreflect.EnumType { + return &file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[2] +} + +func (x DigestFunction_Value) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DigestFunction_Value.Descriptor instead. +func (DigestFunction_Value) EnumDescriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{36, 0} +} + +type SymlinkAbsolutePathStrategy_Value int32 + +const ( + // Invalid value. + SymlinkAbsolutePathStrategy_UNKNOWN SymlinkAbsolutePathStrategy_Value = 0 + // Server will return an `INVALID_ARGUMENT` on input symlinks with absolute + // targets. + // If an action tries to create an output symlink with an absolute target, a + // `FAILED_PRECONDITION` will be returned. + SymlinkAbsolutePathStrategy_DISALLOWED SymlinkAbsolutePathStrategy_Value = 1 + // Server will allow symlink targets to escape the input root tree, possibly + // resulting in non-hermetic builds. + SymlinkAbsolutePathStrategy_ALLOWED SymlinkAbsolutePathStrategy_Value = 2 +) + +// Enum value maps for SymlinkAbsolutePathStrategy_Value. +var ( + SymlinkAbsolutePathStrategy_Value_name = map[int32]string{ + 0: "UNKNOWN", + 1: "DISALLOWED", + 2: "ALLOWED", + } + SymlinkAbsolutePathStrategy_Value_value = map[string]int32{ + "UNKNOWN": 0, + "DISALLOWED": 1, + "ALLOWED": 2, + } +) + +func (x SymlinkAbsolutePathStrategy_Value) Enum() *SymlinkAbsolutePathStrategy_Value { + p := new(SymlinkAbsolutePathStrategy_Value) + *p = x + return p +} + +func (x SymlinkAbsolutePathStrategy_Value) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SymlinkAbsolutePathStrategy_Value) Descriptor() protoreflect.EnumDescriptor { + return file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[3].Descriptor() +} + +func (SymlinkAbsolutePathStrategy_Value) Type() protoreflect.EnumType { + return &file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[3] +} + +func (x SymlinkAbsolutePathStrategy_Value) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SymlinkAbsolutePathStrategy_Value.Descriptor instead. +func (SymlinkAbsolutePathStrategy_Value) EnumDescriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{39, 0} +} + +type Compressor_Value int32 + +const ( + // No compression. Servers and clients MUST always support this, and do + // not need to advertise it. + Compressor_IDENTITY Compressor_Value = 0 + // Zstandard compression. + Compressor_ZSTD Compressor_Value = 1 + // RFC 1951 Deflate. This format is identical to what is used by ZIP + // files. Headers such as the one generated by gzip are not + // included. + // + // It is advised to use algorithms such as Zstandard instead, as + // those are faster and/or provide a better compression ratio. + Compressor_DEFLATE Compressor_Value = 2 + // Brotli compression. + Compressor_BROTLI Compressor_Value = 3 +) + +// Enum value maps for Compressor_Value. +var ( + Compressor_Value_name = map[int32]string{ + 0: "IDENTITY", + 1: "ZSTD", + 2: "DEFLATE", + 3: "BROTLI", + } + Compressor_Value_value = map[string]int32{ + "IDENTITY": 0, + "ZSTD": 1, + "DEFLATE": 2, + "BROTLI": 3, + } +) + +func (x Compressor_Value) Enum() *Compressor_Value { + p := new(Compressor_Value) + *p = x + return p +} + +func (x Compressor_Value) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Compressor_Value) Descriptor() protoreflect.EnumDescriptor { + return file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[4].Descriptor() +} + +func (Compressor_Value) Type() protoreflect.EnumType { + return &file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes[4] +} + +func (x Compressor_Value) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Compressor_Value.Descriptor instead. +func (Compressor_Value) EnumDescriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{40, 0} +} + +// An `Action` captures all the information about an execution which is required +// to reproduce it. +// +// `Action`s are the core component of the [Execution] service. A single +// `Action` represents a repeatable action that can be performed by the +// execution service. `Action`s can be succinctly identified by the digest of +// their wire format encoding and, once an `Action` has been executed, will be +// cached in the action cache. Future requests can then use the cached result +// rather than needing to run afresh. +// +// When a server completes execution of an +// [Action][build.bazel.remote.execution.v2.Action], it MAY choose to +// cache the [result][build.bazel.remote.execution.v2.ActionResult] in +// the [ActionCache][build.bazel.remote.execution.v2.ActionCache] unless +// `do_not_cache` is `true`. Clients SHOULD expect the server to do so. By +// default, future calls to +// [Execute][build.bazel.remote.execution.v2.Execution.Execute] the same +// `Action` will also serve their results from the cache. Clients must take care +// to understand the caching behaviour. Ideally, all `Action`s will be +// reproducible so that serving a result from cache is always desirable and +// correct. +type Action struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The digest of the [Command][build.bazel.remote.execution.v2.Command] + // to run, which MUST be present in the + // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. + CommandDigest *Digest `protobuf:"bytes,1,opt,name=command_digest,json=commandDigest,proto3" json:"command_digest,omitempty"` + // The digest of the root + // [Directory][build.bazel.remote.execution.v2.Directory] for the input + // files. The files in the directory tree are available in the correct + // location on the build machine before the command is executed. The root + // directory, as well as every subdirectory and content blob referred to, MUST + // be in the + // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. + InputRootDigest *Digest `protobuf:"bytes,2,opt,name=input_root_digest,json=inputRootDigest,proto3" json:"input_root_digest,omitempty"` + // A timeout after which the execution should be killed. If the timeout is + // absent, then the client is specifying that the execution should continue + // as long as the server will let it. The server SHOULD impose a timeout if + // the client does not specify one, however, if the client does specify a + // timeout that is longer than the server's maximum timeout, the server MUST + // reject the request. + // + // The timeout is only intended to cover the "execution" of the specified + // action and not time in queue nor any overheads before or after execution + // such as marshalling inputs/outputs. The server SHOULD avoid including time + // spent the client doesn't have control over, and MAY extend or reduce the + // timeout to account for delays or speedups that occur during execution + // itself (e.g., lazily loading data from the Content Addressable Storage, + // live migration of virtual machines, emulation overhead). + // + // The timeout is a part of the + // [Action][build.bazel.remote.execution.v2.Action] message, and + // therefore two `Actions` with different timeouts are different, even if they + // are otherwise identical. This is because, if they were not, running an + // `Action` with a lower timeout than is required might result in a cache hit + // from an execution run with a longer timeout, hiding the fact that the + // timeout is too short. By encoding it directly in the `Action`, a lower + // timeout will result in a cache miss and the execution timeout will fail + // immediately, rather than whenever the cache entry gets evicted. + Timeout *durationpb.Duration `protobuf:"bytes,6,opt,name=timeout,proto3" json:"timeout,omitempty"` + // If true, then the `Action`'s result cannot be cached, and in-flight + // requests for the same `Action` may not be merged. + DoNotCache bool `protobuf:"varint,7,opt,name=do_not_cache,json=doNotCache,proto3" json:"do_not_cache,omitempty"` + // An optional additional salt value used to place this `Action` into a + // separate cache namespace from other instances having the same field + // contents. This salt typically comes from operational configuration + // specific to sources such as repo and service configuration, + // and allows disowning an entire set of ActionResults that might have been + // poisoned by buggy software or tool failures. + Salt []byte `protobuf:"bytes,9,opt,name=salt,proto3" json:"salt,omitempty"` + // The optional platform requirements for the execution environment. The + // server MAY choose to execute the action on any worker satisfying the + // requirements, so the client SHOULD ensure that running the action on any + // such worker will have the same result. A detailed lexicon for this can be + // found in the accompanying platform.md. + // New in version 2.2: clients SHOULD set these platform properties as well + // as those in the [Command][build.bazel.remote.execution.v2.Command]. Servers + // SHOULD prefer those set here. + Platform *Platform `protobuf:"bytes,10,opt,name=platform,proto3" json:"platform,omitempty"` +} + +func (x *Action) Reset() { + *x = Action{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Action) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Action) ProtoMessage() {} + +func (x *Action) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Action.ProtoReflect.Descriptor instead. +func (*Action) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{0} +} + +func (x *Action) GetCommandDigest() *Digest { + if x != nil { + return x.CommandDigest + } + return nil +} + +func (x *Action) GetInputRootDigest() *Digest { + if x != nil { + return x.InputRootDigest + } + return nil +} + +func (x *Action) GetTimeout() *durationpb.Duration { + if x != nil { + return x.Timeout + } + return nil +} + +func (x *Action) GetDoNotCache() bool { + if x != nil { + return x.DoNotCache + } + return false +} + +func (x *Action) GetSalt() []byte { + if x != nil { + return x.Salt + } + return nil +} + +func (x *Action) GetPlatform() *Platform { + if x != nil { + return x.Platform + } + return nil +} + +// A `Command` is the actual command executed by a worker running an +// [Action][build.bazel.remote.execution.v2.Action] and specifications of its +// environment. +// +// Except as otherwise required, the environment (such as which system +// libraries or binaries are available, and what filesystems are mounted where) +// is defined by and specific to the implementation of the remote execution API. +type Command struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The arguments to the command. + // + // The first argument specifies the command to run, which may be either an + // absolute path, a path relative to the working directory, or an unqualified + // path (without path separators) which will be resolved using the operating + // system's equivalent of the PATH environment variable. Path separators + // native to the operating system running on the worker SHOULD be used. If the + // `environment_variables` list contains an entry for the PATH environment + // variable, it SHOULD be respected. If not, the resolution process is + // implementation-defined. + // + // Changed in v2.3. v2.2 and older require that no PATH lookups are performed, + // and that relative paths are resolved relative to the input root. This + // behavior can, however, not be relied upon, as most implementations already + // followed the rules described above. + Arguments []string `protobuf:"bytes,1,rep,name=arguments,proto3" json:"arguments,omitempty"` + // The environment variables to set when running the program. The worker may + // provide its own default environment variables; these defaults can be + // overridden using this field. Additional variables can also be specified. + // + // In order to ensure that equivalent + // [Command][build.bazel.remote.execution.v2.Command]s always hash to the same + // value, the environment variables MUST be lexicographically sorted by name. + // Sorting of strings is done by code point, equivalently, by the UTF-8 bytes. + EnvironmentVariables []*Command_EnvironmentVariable `protobuf:"bytes,2,rep,name=environment_variables,json=environmentVariables,proto3" json:"environment_variables,omitempty"` + // A list of the output files that the client expects to retrieve from the + // action. Only the listed files, as well as directories listed in + // `output_directories`, will be returned to the client as output. + // Other files or directories that may be created during command execution + // are discarded. + // + // The paths are relative to the working directory of the action execution. + // The paths are specified using a single forward slash (`/`) as a path + // separator, even if the execution platform natively uses a different + // separator. The path MUST NOT include a trailing slash, nor a leading slash, + // being a relative path. + // + // In order to ensure consistent hashing of the same Action, the output paths + // MUST be sorted lexicographically by code point (or, equivalently, by UTF-8 + // bytes). + // + // An output file cannot be duplicated, be a parent of another output file, or + // have the same path as any of the listed output directories. + // + // Directories leading up to the output files are created by the worker prior + // to execution, even if they are not explicitly part of the input root. + // + // DEPRECATED since v2.1: Use `output_paths` instead. + // + // Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto. + OutputFiles []string `protobuf:"bytes,3,rep,name=output_files,json=outputFiles,proto3" json:"output_files,omitempty"` + // A list of the output directories that the client expects to retrieve from + // the action. Only the listed directories will be returned (an entire + // directory structure will be returned as a + // [Tree][build.bazel.remote.execution.v2.Tree] message digest, see + // [OutputDirectory][build.bazel.remote.execution.v2.OutputDirectory]), as + // well as files listed in `output_files`. Other files or directories that + // may be created during command execution are discarded. + // + // The paths are relative to the working directory of the action execution. + // The paths are specified using a single forward slash (`/`) as a path + // separator, even if the execution platform natively uses a different + // separator. The path MUST NOT include a trailing slash, nor a leading slash, + // being a relative path. The special value of empty string is allowed, + // although not recommended, and can be used to capture the entire working + // directory tree, including inputs. + // + // In order to ensure consistent hashing of the same Action, the output paths + // MUST be sorted lexicographically by code point (or, equivalently, by UTF-8 + // bytes). + // + // An output directory cannot be duplicated or have the same path as any of + // the listed output files. An output directory is allowed to be a parent of + // another output directory. + // + // Directories leading up to the output directories (but not the output + // directories themselves) are created by the worker prior to execution, even + // if they are not explicitly part of the input root. + // + // DEPRECATED since 2.1: Use `output_paths` instead. + // + // Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto. + OutputDirectories []string `protobuf:"bytes,4,rep,name=output_directories,json=outputDirectories,proto3" json:"output_directories,omitempty"` + // A list of the output paths that the client expects to retrieve from the + // action. Only the listed paths will be returned to the client as output. + // The type of the output (file or directory) is not specified, and will be + // determined by the server after action execution. If the resulting path is + // a file, it will be returned in an + // [OutputFile][build.bazel.remote.execution.v2.OutputFile] typed field. + // If the path is a directory, the entire directory structure will be returned + // as a [Tree][build.bazel.remote.execution.v2.Tree] message digest, see + // [OutputDirectory][build.bazel.remote.execution.v2.OutputDirectory] + // Other files or directories that may be created during command execution + // are discarded. + // + // The paths are relative to the working directory of the action execution. + // The paths are specified using a single forward slash (`/`) as a path + // separator, even if the execution platform natively uses a different + // separator. The path MUST NOT include a trailing slash, nor a leading slash, + // being a relative path. + // + // In order to ensure consistent hashing of the same Action, the output paths + // MUST be deduplicated and sorted lexicographically by code point (or, + // equivalently, by UTF-8 bytes). + // + // Directories leading up to the output paths are created by the worker prior + // to execution, even if they are not explicitly part of the input root. + // + // New in v2.1: this field supersedes the DEPRECATED `output_files` and + // `output_directories` fields. If `output_paths` is used, `output_files` and + // `output_directories` will be ignored! + OutputPaths []string `protobuf:"bytes,7,rep,name=output_paths,json=outputPaths,proto3" json:"output_paths,omitempty"` + // The platform requirements for the execution environment. The server MAY + // choose to execute the action on any worker satisfying the requirements, so + // the client SHOULD ensure that running the action on any such worker will + // have the same result. A detailed lexicon for this can be found in the + // accompanying platform.md. + // DEPRECATED as of v2.2: platform properties are now specified directly in + // the action. See documentation note in the + // [Action][build.bazel.remote.execution.v2.Action] for migration. + // + // Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto. + Platform *Platform `protobuf:"bytes,5,opt,name=platform,proto3" json:"platform,omitempty"` + // The working directory, relative to the input root, for the command to run + // in. It must be a directory which exists in the input tree. If it is left + // empty, then the action is run in the input root. + WorkingDirectory string `protobuf:"bytes,6,opt,name=working_directory,json=workingDirectory,proto3" json:"working_directory,omitempty"` + // A list of keys for node properties the client expects to retrieve for + // output files and directories. Keys are either names of string-based + // [NodeProperty][build.bazel.remote.execution.v2.NodeProperty] or + // names of fields in [NodeProperties][build.bazel.remote.execution.v2.NodeProperties]. + // In order to ensure that equivalent `Action`s always hash to the same + // value, the node properties MUST be lexicographically sorted by name. + // Sorting of strings is done by code point, equivalently, by the UTF-8 bytes. + // + // The interpretation of string-based properties is server-dependent. If a + // property is not recognized by the server, the server will return an + // `INVALID_ARGUMENT`. + OutputNodeProperties []string `protobuf:"bytes,8,rep,name=output_node_properties,json=outputNodeProperties,proto3" json:"output_node_properties,omitempty"` + // The format that the worker should use to store the contents of + // output directories. + // + // In case this field is set to a value that is not supported by the + // worker, the worker SHOULD interpret this field as TREE_ONLY. The + // worker MAY store output directories in formats that are a superset + // of what was requested (e.g., interpreting DIRECTORY_ONLY as + // TREE_AND_DIRECTORY). + OutputDirectoryFormat Command_OutputDirectoryFormat `protobuf:"varint,9,opt,name=output_directory_format,json=outputDirectoryFormat,proto3,enum=build.bazel.remote.execution.v2.Command_OutputDirectoryFormat" json:"output_directory_format,omitempty"` +} + +func (x *Command) Reset() { + *x = Command{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Command) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Command) ProtoMessage() {} + +func (x *Command) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Command.ProtoReflect.Descriptor instead. +func (*Command) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{1} +} + +func (x *Command) GetArguments() []string { + if x != nil { + return x.Arguments + } + return nil +} + +func (x *Command) GetEnvironmentVariables() []*Command_EnvironmentVariable { + if x != nil { + return x.EnvironmentVariables + } + return nil +} + +// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto. +func (x *Command) GetOutputFiles() []string { + if x != nil { + return x.OutputFiles + } + return nil +} + +// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto. +func (x *Command) GetOutputDirectories() []string { + if x != nil { + return x.OutputDirectories + } + return nil +} + +func (x *Command) GetOutputPaths() []string { + if x != nil { + return x.OutputPaths + } + return nil +} + +// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto. +func (x *Command) GetPlatform() *Platform { + if x != nil { + return x.Platform + } + return nil +} + +func (x *Command) GetWorkingDirectory() string { + if x != nil { + return x.WorkingDirectory + } + return "" +} + +func (x *Command) GetOutputNodeProperties() []string { + if x != nil { + return x.OutputNodeProperties + } + return nil +} + +func (x *Command) GetOutputDirectoryFormat() Command_OutputDirectoryFormat { + if x != nil { + return x.OutputDirectoryFormat + } + return Command_TREE_ONLY +} + +// A `Platform` is a set of requirements, such as hardware, operating system, or +// compiler toolchain, for an +// [Action][build.bazel.remote.execution.v2.Action]'s execution +// environment. A `Platform` is represented as a series of key-value pairs +// representing the properties that are required of the platform. +type Platform struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The properties that make up this platform. In order to ensure that + // equivalent `Platform`s always hash to the same value, the properties MUST + // be lexicographically sorted by name, and then by value. Sorting of strings + // is done by code point, equivalently, by the UTF-8 bytes. + Properties []*Platform_Property `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty"` +} + +func (x *Platform) Reset() { + *x = Platform{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Platform) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Platform) ProtoMessage() {} + +func (x *Platform) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Platform.ProtoReflect.Descriptor instead. +func (*Platform) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{2} +} + +func (x *Platform) GetProperties() []*Platform_Property { + if x != nil { + return x.Properties + } + return nil +} + +// A `Directory` represents a directory node in a file tree, containing zero or +// more children [FileNodes][build.bazel.remote.execution.v2.FileNode], +// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode] and +// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode]. +// Each `Node` contains its name in the directory, either the digest of its +// content (either a file blob or a `Directory` proto) or a symlink target, as +// well as possibly some metadata about the file or directory. +// +// In order to ensure that two equivalent directory trees hash to the same +// value, the following restrictions MUST be obeyed when constructing a +// a `Directory`: +// +// - Every child in the directory must have a path of exactly one segment. +// Multiple levels of directory hierarchy may not be collapsed. +// - Each child in the directory must have a unique path segment (file name). +// Note that while the API itself is case-sensitive, the environment where +// the Action is executed may or may not be case-sensitive. That is, it is +// legal to call the API with a Directory that has both "Foo" and "foo" as +// children, but the Action may be rejected by the remote system upon +// execution. +// - The files, directories and symlinks in the directory must each be sorted +// in lexicographical order by path. The path strings must be sorted by code +// point, equivalently, by UTF-8 bytes. +// - The [NodeProperties][build.bazel.remote.execution.v2.NodeProperty] of files, +// directories, and symlinks must be sorted in lexicographical order by +// property name. +// +// A `Directory` that obeys the restrictions is said to be in canonical form. +// +// As an example, the following could be used for a file named `bar` and a +// directory named `foo` with an executable file named `baz` (hashes shortened +// for readability): +// +// ```json +// // (Directory proto) +// +// { +// files: [ +// { +// name: "bar", +// digest: { +// hash: "4a73bc9d03...", +// size: 65534 +// }, +// node_properties: [ +// { +// "name": "MTime", +// "value": "2017-01-15T01:30:15.01Z" +// } +// ] +// } +// ], +// directories: [ +// { +// name: "foo", +// digest: { +// hash: "4cf2eda940...", +// size: 43 +// } +// } +// ] +// } +// +// // (Directory proto with hash "4cf2eda940..." and size 43) +// +// { +// files: [ +// { +// name: "baz", +// digest: { +// hash: "b2c941073e...", +// size: 1294, +// }, +// is_executable: true +// } +// ] +// } +// +// ``` +type Directory struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The files in the directory. + Files []*FileNode `protobuf:"bytes,1,rep,name=files,proto3" json:"files,omitempty"` + // The subdirectories in the directory. + Directories []*DirectoryNode `protobuf:"bytes,2,rep,name=directories,proto3" json:"directories,omitempty"` + // The symlinks in the directory. + Symlinks []*SymlinkNode `protobuf:"bytes,3,rep,name=symlinks,proto3" json:"symlinks,omitempty"` + NodeProperties *NodeProperties `protobuf:"bytes,5,opt,name=node_properties,json=nodeProperties,proto3" json:"node_properties,omitempty"` +} + +func (x *Directory) Reset() { + *x = Directory{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Directory) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Directory) ProtoMessage() {} + +func (x *Directory) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Directory.ProtoReflect.Descriptor instead. +func (*Directory) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{3} +} + +func (x *Directory) GetFiles() []*FileNode { + if x != nil { + return x.Files + } + return nil +} + +func (x *Directory) GetDirectories() []*DirectoryNode { + if x != nil { + return x.Directories + } + return nil +} + +func (x *Directory) GetSymlinks() []*SymlinkNode { + if x != nil { + return x.Symlinks + } + return nil +} + +func (x *Directory) GetNodeProperties() *NodeProperties { + if x != nil { + return x.NodeProperties + } + return nil +} + +// A single property for [FileNodes][build.bazel.remote.execution.v2.FileNode], +// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode], and +// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode]. The server is +// responsible for specifying the property `name`s that it accepts. If +// permitted by the server, the same `name` may occur multiple times. +type NodeProperty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The property name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The property value. + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *NodeProperty) Reset() { + *x = NodeProperty{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeProperty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeProperty) ProtoMessage() {} + +func (x *NodeProperty) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NodeProperty.ProtoReflect.Descriptor instead. +func (*NodeProperty) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{4} +} + +func (x *NodeProperty) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *NodeProperty) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +// Node properties for [FileNodes][build.bazel.remote.execution.v2.FileNode], +// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode], and +// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode]. The server is +// responsible for specifying the properties that it accepts. +type NodeProperties struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A list of string-based + // [NodeProperties][build.bazel.remote.execution.v2.NodeProperty]. + Properties []*NodeProperty `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty"` + // The file's last modification timestamp. + Mtime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=mtime,proto3" json:"mtime,omitempty"` + // The UNIX file mode, e.g., 0755. + UnixMode *wrapperspb.UInt32Value `protobuf:"bytes,3,opt,name=unix_mode,json=unixMode,proto3" json:"unix_mode,omitempty"` +} + +func (x *NodeProperties) Reset() { + *x = NodeProperties{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NodeProperties) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NodeProperties) ProtoMessage() {} + +func (x *NodeProperties) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NodeProperties.ProtoReflect.Descriptor instead. +func (*NodeProperties) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{5} +} + +func (x *NodeProperties) GetProperties() []*NodeProperty { + if x != nil { + return x.Properties + } + return nil +} + +func (x *NodeProperties) GetMtime() *timestamppb.Timestamp { + if x != nil { + return x.Mtime + } + return nil +} + +func (x *NodeProperties) GetUnixMode() *wrapperspb.UInt32Value { + if x != nil { + return x.UnixMode + } + return nil +} + +// A `FileNode` represents a single file and associated metadata. +type FileNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the file. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The digest of the file's content. + Digest *Digest `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"` + // True if file is executable, false otherwise. + IsExecutable bool `protobuf:"varint,4,opt,name=is_executable,json=isExecutable,proto3" json:"is_executable,omitempty"` + NodeProperties *NodeProperties `protobuf:"bytes,6,opt,name=node_properties,json=nodeProperties,proto3" json:"node_properties,omitempty"` +} + +func (x *FileNode) Reset() { + *x = FileNode{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FileNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FileNode) ProtoMessage() {} + +func (x *FileNode) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FileNode.ProtoReflect.Descriptor instead. +func (*FileNode) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{6} +} + +func (x *FileNode) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *FileNode) GetDigest() *Digest { + if x != nil { + return x.Digest + } + return nil +} + +func (x *FileNode) GetIsExecutable() bool { + if x != nil { + return x.IsExecutable + } + return false +} + +func (x *FileNode) GetNodeProperties() *NodeProperties { + if x != nil { + return x.NodeProperties + } + return nil +} + +// A `DirectoryNode` represents a child of a +// [Directory][build.bazel.remote.execution.v2.Directory] which is itself +// a `Directory` and its associated metadata. +type DirectoryNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the directory. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The digest of the + // [Directory][build.bazel.remote.execution.v2.Directory] object + // represented. See [Digest][build.bazel.remote.execution.v2.Digest] + // for information about how to take the digest of a proto message. + Digest *Digest `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"` +} + +func (x *DirectoryNode) Reset() { + *x = DirectoryNode{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DirectoryNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DirectoryNode) ProtoMessage() {} + +func (x *DirectoryNode) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DirectoryNode.ProtoReflect.Descriptor instead. +func (*DirectoryNode) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{7} +} + +func (x *DirectoryNode) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DirectoryNode) GetDigest() *Digest { + if x != nil { + return x.Digest + } + return nil +} + +// A `SymlinkNode` represents a symbolic link. +type SymlinkNode struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the symlink. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The target path of the symlink. The path separator is a forward slash `/`. + // The target path can be relative to the parent directory of the symlink or + // it can be an absolute path starting with `/`. Support for absolute paths + // can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities] + // API. `..` components are allowed anywhere in the target path as logical + // canonicalization may lead to different behavior in the presence of + // directory symlinks (e.g. `foo/../bar` may not be the same as `bar`). + // To reduce potential cache misses, canonicalization is still recommended + // where this is possible without impacting correctness. + Target string `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` + NodeProperties *NodeProperties `protobuf:"bytes,4,opt,name=node_properties,json=nodeProperties,proto3" json:"node_properties,omitempty"` +} + +func (x *SymlinkNode) Reset() { + *x = SymlinkNode{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SymlinkNode) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SymlinkNode) ProtoMessage() {} + +func (x *SymlinkNode) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SymlinkNode.ProtoReflect.Descriptor instead. +func (*SymlinkNode) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{8} +} + +func (x *SymlinkNode) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SymlinkNode) GetTarget() string { + if x != nil { + return x.Target + } + return "" +} + +func (x *SymlinkNode) GetNodeProperties() *NodeProperties { + if x != nil { + return x.NodeProperties + } + return nil +} + +// A content digest. A digest for a given blob consists of the size of the blob +// and its hash. The hash algorithm to use is defined by the server. +// +// The size is considered to be an integral part of the digest and cannot be +// separated. That is, even if the `hash` field is correctly specified but +// `size_bytes` is not, the server MUST reject the request. +// +// The reason for including the size in the digest is as follows: in a great +// many cases, the server needs to know the size of the blob it is about to work +// with prior to starting an operation with it, such as flattening Merkle tree +// structures or streaming it to a worker. Technically, the server could +// implement a separate metadata store, but this results in a significantly more +// complicated implementation as opposed to having the client specify the size +// up-front (or storing the size along with the digest in every message where +// digests are embedded). This does mean that the API leaks some implementation +// details of (what we consider to be) a reasonable server implementation, but +// we consider this to be a worthwhile tradeoff. +// +// When a `Digest` is used to refer to a proto message, it always refers to the +// message in binary encoded form. To ensure consistent hashing, clients and +// servers MUST ensure that they serialize messages according to the following +// rules, even if there are alternate valid encodings for the same message: +// +// * Fields are serialized in tag order. +// * There are no unknown fields. +// * There are no duplicate fields. +// * Fields are serialized according to the default semantics for their type. +// +// Most protocol buffer implementations will always follow these rules when +// serializing, but care should be taken to avoid shortcuts. For instance, +// concatenating two messages to merge them may produce duplicate fields. +type Digest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The hash. In the case of SHA-256, it will always be a lowercase hex string + // exactly 64 characters long. + Hash string `protobuf:"bytes,1,opt,name=hash,proto3" json:"hash,omitempty"` + // The size of the blob, in bytes. + SizeBytes int64 `protobuf:"varint,2,opt,name=size_bytes,json=sizeBytes,proto3" json:"size_bytes,omitempty"` +} + +func (x *Digest) Reset() { + *x = Digest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Digest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Digest) ProtoMessage() {} + +func (x *Digest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Digest.ProtoReflect.Descriptor instead. +func (*Digest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{9} +} + +func (x *Digest) GetHash() string { + if x != nil { + return x.Hash + } + return "" +} + +func (x *Digest) GetSizeBytes() int64 { + if x != nil { + return x.SizeBytes + } + return 0 +} + +// ExecutedActionMetadata contains details about a completed execution. +type ExecutedActionMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the worker which ran the execution. + Worker string `protobuf:"bytes,1,opt,name=worker,proto3" json:"worker,omitempty"` + // When was the action added to the queue. + QueuedTimestamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=queued_timestamp,json=queuedTimestamp,proto3" json:"queued_timestamp,omitempty"` + // When the worker received the action. + WorkerStartTimestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=worker_start_timestamp,json=workerStartTimestamp,proto3" json:"worker_start_timestamp,omitempty"` + // When the worker completed the action, including all stages. + WorkerCompletedTimestamp *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=worker_completed_timestamp,json=workerCompletedTimestamp,proto3" json:"worker_completed_timestamp,omitempty"` + // When the worker started fetching action inputs. + InputFetchStartTimestamp *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=input_fetch_start_timestamp,json=inputFetchStartTimestamp,proto3" json:"input_fetch_start_timestamp,omitempty"` + // When the worker finished fetching action inputs. + InputFetchCompletedTimestamp *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=input_fetch_completed_timestamp,json=inputFetchCompletedTimestamp,proto3" json:"input_fetch_completed_timestamp,omitempty"` + // When the worker started executing the action command. + ExecutionStartTimestamp *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=execution_start_timestamp,json=executionStartTimestamp,proto3" json:"execution_start_timestamp,omitempty"` + // When the worker completed executing the action command. + ExecutionCompletedTimestamp *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=execution_completed_timestamp,json=executionCompletedTimestamp,proto3" json:"execution_completed_timestamp,omitempty"` + // New in v2.3: the amount of time the worker spent executing the action + // command, potentially computed using a worker-specific virtual clock. + // + // The virtual execution duration is only intended to cover the "execution" of + // the specified action and not time in queue nor any overheads before or + // after execution such as marshalling inputs/outputs. The server SHOULD avoid + // including time spent the client doesn't have control over, and MAY extend + // or reduce the execution duration to account for delays or speedups that + // occur during execution itself (e.g., lazily loading data from the Content + // Addressable Storage, live migration of virtual machines, emulation + // overhead). + // + // The method of timekeeping used to compute the virtual execution duration + // MUST be consistent with what is used to enforce the + // [Action][[build.bazel.remote.execution.v2.Action]'s `timeout`. There is no + // relationship between the virtual execution duration and the values of + // `execution_start_timestamp` and `execution_completed_timestamp`. + VirtualExecutionDuration *durationpb.Duration `protobuf:"bytes,12,opt,name=virtual_execution_duration,json=virtualExecutionDuration,proto3" json:"virtual_execution_duration,omitempty"` + // When the worker started uploading action outputs. + OutputUploadStartTimestamp *timestamppb.Timestamp `protobuf:"bytes,9,opt,name=output_upload_start_timestamp,json=outputUploadStartTimestamp,proto3" json:"output_upload_start_timestamp,omitempty"` + // When the worker finished uploading action outputs. + OutputUploadCompletedTimestamp *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=output_upload_completed_timestamp,json=outputUploadCompletedTimestamp,proto3" json:"output_upload_completed_timestamp,omitempty"` + // Details that are specific to the kind of worker used. For example, + // on POSIX-like systems this could contain a message with + // getrusage(2) statistics. + AuxiliaryMetadata []*anypb.Any `protobuf:"bytes,11,rep,name=auxiliary_metadata,json=auxiliaryMetadata,proto3" json:"auxiliary_metadata,omitempty"` +} + +func (x *ExecutedActionMetadata) Reset() { + *x = ExecutedActionMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecutedActionMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecutedActionMetadata) ProtoMessage() {} + +func (x *ExecutedActionMetadata) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExecutedActionMetadata.ProtoReflect.Descriptor instead. +func (*ExecutedActionMetadata) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{10} +} + +func (x *ExecutedActionMetadata) GetWorker() string { + if x != nil { + return x.Worker + } + return "" +} + +func (x *ExecutedActionMetadata) GetQueuedTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.QueuedTimestamp + } + return nil +} + +func (x *ExecutedActionMetadata) GetWorkerStartTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.WorkerStartTimestamp + } + return nil +} + +func (x *ExecutedActionMetadata) GetWorkerCompletedTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.WorkerCompletedTimestamp + } + return nil +} + +func (x *ExecutedActionMetadata) GetInputFetchStartTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.InputFetchStartTimestamp + } + return nil +} + +func (x *ExecutedActionMetadata) GetInputFetchCompletedTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.InputFetchCompletedTimestamp + } + return nil +} + +func (x *ExecutedActionMetadata) GetExecutionStartTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.ExecutionStartTimestamp + } + return nil +} + +func (x *ExecutedActionMetadata) GetExecutionCompletedTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.ExecutionCompletedTimestamp + } + return nil +} + +func (x *ExecutedActionMetadata) GetVirtualExecutionDuration() *durationpb.Duration { + if x != nil { + return x.VirtualExecutionDuration + } + return nil +} + +func (x *ExecutedActionMetadata) GetOutputUploadStartTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.OutputUploadStartTimestamp + } + return nil +} + +func (x *ExecutedActionMetadata) GetOutputUploadCompletedTimestamp() *timestamppb.Timestamp { + if x != nil { + return x.OutputUploadCompletedTimestamp + } + return nil +} + +func (x *ExecutedActionMetadata) GetAuxiliaryMetadata() []*anypb.Any { + if x != nil { + return x.AuxiliaryMetadata + } + return nil +} + +// An ActionResult represents the result of an +// [Action][build.bazel.remote.execution.v2.Action] being run. +// +// It is advised that at least one field (for example +// `ActionResult.execution_metadata.Worker`) have a non-default value, to +// ensure that the serialized value is non-empty, which can then be used +// as a basic data sanity check. +type ActionResult struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The output files of the action. For each output file requested in the + // `output_files` or `output_paths` field of the Action, if the corresponding + // file existed after the action completed, a single entry will be present + // either in this field, or the `output_file_symlinks` field if the file was + // a symbolic link to another file (`output_symlinks` field after v2.1). + // + // If an output listed in `output_files` was found, but was a directory rather + // than a regular file, the server will return a FAILED_PRECONDITION. + // If the action does not produce the requested output, then that output + // will be omitted from the list. The server is free to arrange the output + // list as desired; clients MUST NOT assume that the output list is sorted. + OutputFiles []*OutputFile `protobuf:"bytes,2,rep,name=output_files,json=outputFiles,proto3" json:"output_files,omitempty"` + // The output files of the action that are symbolic links to other files. Those + // may be links to other output files, or input files, or even absolute paths + // outside of the working directory, if the server supports + // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy]. + // For each output file requested in the `output_files` or `output_paths` + // field of the Action, if the corresponding file existed after + // the action completed, a single entry will be present either in this field, + // or in the `output_files` field, if the file was not a symbolic link. + // + // If an output symbolic link of the same name as listed in `output_files` of + // the Command was found, but its target type was not a regular file, the + // server will return a FAILED_PRECONDITION. + // If the action does not produce the requested output, then that output + // will be omitted from the list. The server is free to arrange the output + // list as desired; clients MUST NOT assume that the output list is sorted. + // + // DEPRECATED as of v2.1. Servers that wish to be compatible with v2.0 API + // should still populate this field in addition to `output_symlinks`. + // + // Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto. + OutputFileSymlinks []*OutputSymlink `protobuf:"bytes,10,rep,name=output_file_symlinks,json=outputFileSymlinks,proto3" json:"output_file_symlinks,omitempty"` + // New in v2.1: this field will only be populated if the command + // `output_paths` field was used, and not the pre v2.1 `output_files` or + // `output_directories` fields. + // The output paths of the action that are symbolic links to other paths. Those + // may be links to other outputs, or inputs, or even absolute paths + // outside of the working directory, if the server supports + // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy]. + // A single entry for each output requested in `output_paths` + // field of the Action, if the corresponding path existed after + // the action completed and was a symbolic link. + // + // If the action does not produce a requested output, then that output + // will be omitted from the list. The server is free to arrange the output + // list as desired; clients MUST NOT assume that the output list is sorted. + OutputSymlinks []*OutputSymlink `protobuf:"bytes,12,rep,name=output_symlinks,json=outputSymlinks,proto3" json:"output_symlinks,omitempty"` + // The output directories of the action. For each output directory requested + // in the `output_directories` or `output_paths` field of the Action, if the + // corresponding directory existed after the action completed, a single entry + // will be present in the output list, which will contain the digest of a + // [Tree][build.bazel.remote.execution.v2.Tree] message containing the + // directory tree, and the path equal exactly to the corresponding Action + // output_directories member. + // + // As an example, suppose the Action had an output directory `a/b/dir` and the + // execution produced the following contents in `a/b/dir`: a file named `bar` + // and a directory named `foo` with an executable file named `baz`. Then, + // output_directory will contain (hashes shortened for readability): + // + // ```json + // // OutputDirectory proto: + // + // { + // path: "a/b/dir" + // tree_digest: { + // hash: "4a73bc9d03...", + // size: 55 + // } + // } + // + // // Tree proto with hash "4a73bc9d03..." and size 55: + // + // { + // root: { + // files: [ + // { + // name: "bar", + // digest: { + // hash: "4a73bc9d03...", + // size: 65534 + // } + // } + // ], + // directories: [ + // { + // name: "foo", + // digest: { + // hash: "4cf2eda940...", + // size: 43 + // } + // } + // ] + // } + // children : { + // // (Directory proto with hash "4cf2eda940..." and size 43) + // files: [ + // { + // name: "baz", + // digest: { + // hash: "b2c941073e...", + // size: 1294, + // }, + // is_executable: true + // } + // ] + // } + // } + // + // ``` + // If an output of the same name as listed in `output_files` of + // the Command was found in `output_directories`, but was not a directory, the + // server will return a FAILED_PRECONDITION. + OutputDirectories []*OutputDirectory `protobuf:"bytes,3,rep,name=output_directories,json=outputDirectories,proto3" json:"output_directories,omitempty"` + // The output directories of the action that are symbolic links to other + // directories. Those may be links to other output directories, or input + // directories, or even absolute paths outside of the working directory, + // if the server supports + // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy]. + // For each output directory requested in the `output_directories` field of + // the Action, if the directory existed after the action completed, a + // single entry will be present either in this field, or in the + // `output_directories` field, if the directory was not a symbolic link. + // + // If an output of the same name was found, but was a symbolic link to a file + // instead of a directory, the server will return a FAILED_PRECONDITION. + // If the action does not produce the requested output, then that output + // will be omitted from the list. The server is free to arrange the output + // list as desired; clients MUST NOT assume that the output list is sorted. + // + // DEPRECATED as of v2.1. Servers that wish to be compatible with v2.0 API + // should still populate this field in addition to `output_symlinks`. + // + // Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto. + OutputDirectorySymlinks []*OutputSymlink `protobuf:"bytes,11,rep,name=output_directory_symlinks,json=outputDirectorySymlinks,proto3" json:"output_directory_symlinks,omitempty"` + // The exit code of the command. + ExitCode int32 `protobuf:"varint,4,opt,name=exit_code,json=exitCode,proto3" json:"exit_code,omitempty"` + // The standard output buffer of the action. The server SHOULD NOT inline + // stdout unless requested by the client in the + // [GetActionResultRequest][build.bazel.remote.execution.v2.GetActionResultRequest] + // message. The server MAY omit inlining, even if requested, and MUST do so if inlining + // would cause the response to exceed message size limits. + // Clients SHOULD NOT populate this field when uploading to the cache. + StdoutRaw []byte `protobuf:"bytes,5,opt,name=stdout_raw,json=stdoutRaw,proto3" json:"stdout_raw,omitempty"` + // The digest for a blob containing the standard output of the action, which + // can be retrieved from the + // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. + StdoutDigest *Digest `protobuf:"bytes,6,opt,name=stdout_digest,json=stdoutDigest,proto3" json:"stdout_digest,omitempty"` + // The standard error buffer of the action. The server SHOULD NOT inline + // stderr unless requested by the client in the + // [GetActionResultRequest][build.bazel.remote.execution.v2.GetActionResultRequest] + // message. The server MAY omit inlining, even if requested, and MUST do so if inlining + // would cause the response to exceed message size limits. + // Clients SHOULD NOT populate this field when uploading to the cache. + StderrRaw []byte `protobuf:"bytes,7,opt,name=stderr_raw,json=stderrRaw,proto3" json:"stderr_raw,omitempty"` + // The digest for a blob containing the standard error of the action, which + // can be retrieved from the + // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. + StderrDigest *Digest `protobuf:"bytes,8,opt,name=stderr_digest,json=stderrDigest,proto3" json:"stderr_digest,omitempty"` + // The details of the execution that originally produced this result. + ExecutionMetadata *ExecutedActionMetadata `protobuf:"bytes,9,opt,name=execution_metadata,json=executionMetadata,proto3" json:"execution_metadata,omitempty"` +} + +func (x *ActionResult) Reset() { + *x = ActionResult{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ActionResult) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActionResult) ProtoMessage() {} + +func (x *ActionResult) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActionResult.ProtoReflect.Descriptor instead. +func (*ActionResult) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{11} +} + +func (x *ActionResult) GetOutputFiles() []*OutputFile { + if x != nil { + return x.OutputFiles + } + return nil +} + +// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto. +func (x *ActionResult) GetOutputFileSymlinks() []*OutputSymlink { + if x != nil { + return x.OutputFileSymlinks + } + return nil +} + +func (x *ActionResult) GetOutputSymlinks() []*OutputSymlink { + if x != nil { + return x.OutputSymlinks + } + return nil +} + +func (x *ActionResult) GetOutputDirectories() []*OutputDirectory { + if x != nil { + return x.OutputDirectories + } + return nil +} + +// Deprecated: Marked as deprecated in build/bazel/remote/execution/v2/remote_execution.proto. +func (x *ActionResult) GetOutputDirectorySymlinks() []*OutputSymlink { + if x != nil { + return x.OutputDirectorySymlinks + } + return nil +} + +func (x *ActionResult) GetExitCode() int32 { + if x != nil { + return x.ExitCode + } + return 0 +} + +func (x *ActionResult) GetStdoutRaw() []byte { + if x != nil { + return x.StdoutRaw + } + return nil +} + +func (x *ActionResult) GetStdoutDigest() *Digest { + if x != nil { + return x.StdoutDigest + } + return nil +} + +func (x *ActionResult) GetStderrRaw() []byte { + if x != nil { + return x.StderrRaw + } + return nil +} + +func (x *ActionResult) GetStderrDigest() *Digest { + if x != nil { + return x.StderrDigest + } + return nil +} + +func (x *ActionResult) GetExecutionMetadata() *ExecutedActionMetadata { + if x != nil { + return x.ExecutionMetadata + } + return nil +} + +// An `OutputFile` is similar to a +// [FileNode][build.bazel.remote.execution.v2.FileNode], but it is used as an +// output in an `ActionResult`. It allows a full file path rather than +// only a name. +type OutputFile struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The full path of the file relative to the working directory, including the + // filename. The path separator is a forward slash `/`. Since this is a + // relative path, it MUST NOT begin with a leading forward slash. + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` + // The digest of the file's content. + Digest *Digest `protobuf:"bytes,2,opt,name=digest,proto3" json:"digest,omitempty"` + // True if file is executable, false otherwise. + IsExecutable bool `protobuf:"varint,4,opt,name=is_executable,json=isExecutable,proto3" json:"is_executable,omitempty"` + // The contents of the file if inlining was requested. The server SHOULD NOT inline + // file contents unless requested by the client in the + // [GetActionResultRequest][build.bazel.remote.execution.v2.GetActionResultRequest] + // message. The server MAY omit inlining, even if requested, and MUST do so if inlining + // would cause the response to exceed message size limits. + // Clients SHOULD NOT populate this field when uploading to the cache. + Contents []byte `protobuf:"bytes,5,opt,name=contents,proto3" json:"contents,omitempty"` + NodeProperties *NodeProperties `protobuf:"bytes,7,opt,name=node_properties,json=nodeProperties,proto3" json:"node_properties,omitempty"` +} + +func (x *OutputFile) Reset() { + *x = OutputFile{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OutputFile) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OutputFile) ProtoMessage() {} + +func (x *OutputFile) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OutputFile.ProtoReflect.Descriptor instead. +func (*OutputFile) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{12} +} + +func (x *OutputFile) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *OutputFile) GetDigest() *Digest { + if x != nil { + return x.Digest + } + return nil +} + +func (x *OutputFile) GetIsExecutable() bool { + if x != nil { + return x.IsExecutable + } + return false +} + +func (x *OutputFile) GetContents() []byte { + if x != nil { + return x.Contents + } + return nil +} + +func (x *OutputFile) GetNodeProperties() *NodeProperties { + if x != nil { + return x.NodeProperties + } + return nil +} + +// A `Tree` contains all the +// [Directory][build.bazel.remote.execution.v2.Directory] protos in a +// single directory Merkle tree, compressed into one message. +type Tree struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The root directory in the tree. + Root *Directory `protobuf:"bytes,1,opt,name=root,proto3" json:"root,omitempty"` + // All the child directories: the directories referred to by the root and, + // recursively, all its children. In order to reconstruct the directory tree, + // the client must take the digests of each of the child directories and then + // build up a tree starting from the `root`. + // Servers SHOULD ensure that these are ordered consistently such that two + // actions producing equivalent output directories on the same server + // implementation also produce Tree messages with matching digests. + Children []*Directory `protobuf:"bytes,2,rep,name=children,proto3" json:"children,omitempty"` +} + +func (x *Tree) Reset() { + *x = Tree{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Tree) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Tree) ProtoMessage() {} + +func (x *Tree) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Tree.ProtoReflect.Descriptor instead. +func (*Tree) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{13} +} + +func (x *Tree) GetRoot() *Directory { + if x != nil { + return x.Root + } + return nil +} + +func (x *Tree) GetChildren() []*Directory { + if x != nil { + return x.Children + } + return nil +} + +// An `OutputDirectory` is the output in an `ActionResult` corresponding to a +// directory's full contents rather than a single file. +type OutputDirectory struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The full path of the directory relative to the working directory. The path + // separator is a forward slash `/`. Since this is a relative path, it MUST + // NOT begin with a leading forward slash. The empty string value is allowed, + // and it denotes the entire working directory. + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` + // The digest of the encoded + // [Tree][build.bazel.remote.execution.v2.Tree] proto containing the + // directory's contents. + TreeDigest *Digest `protobuf:"bytes,3,opt,name=tree_digest,json=treeDigest,proto3" json:"tree_digest,omitempty"` + // If set, consumers MAY make the following assumptions about the + // directories contained in the the Tree, so that it may be + // instantiated on a local file system by scanning through it + // sequentially: + // + // - All directories with the same binary representation are stored + // exactly once. + // - All directories, apart from the root directory, are referenced by + // at least one parent directory. + // - Directories are stored in topological order, with parents being + // stored before the child. The root directory is thus the first to + // be stored. + // + // Additionally, the Tree MUST be encoded as a stream of records, + // where each record has the following format: + // + // - A tag byte, having one of the following two values: + // - (1 << 3) | 2 == 0x0a: First record (the root directory). + // - (2 << 3) | 2 == 0x12: Any subsequent records (child directories). + // - The size of the directory, encoded as a base 128 varint. + // - The contents of the directory, encoded as a binary serialized + // Protobuf message. + // + // This encoding is a subset of the Protobuf wire format of the Tree + // message. As it is only permitted to store data associated with + // field numbers 1 and 2, the tag MUST be encoded as a single byte. + // More details on the Protobuf wire format can be found here: + // https://developers.google.com/protocol-buffers/docs/encoding + // + // It is recommended that implementations using this feature construct + // Tree objects manually using the specification given above, as + // opposed to using a Protobuf library to marshal a full Tree message. + // As individual Directory messages already need to be marshaled to + // compute their digests, constructing the Tree object manually avoids + // redundant marshaling. + IsTopologicallySorted bool `protobuf:"varint,4,opt,name=is_topologically_sorted,json=isTopologicallySorted,proto3" json:"is_topologically_sorted,omitempty"` + // The digest of the encoded + // [Directory][build.bazel.remote.execution.v2.Directory] proto + // containing the contents the directory's root. + // + // If both `tree_digest` and `root_directory_digest` are set, this + // field MUST match the digest of the root directory contained in the + // Tree message. + RootDirectoryDigest *Digest `protobuf:"bytes,5,opt,name=root_directory_digest,json=rootDirectoryDigest,proto3" json:"root_directory_digest,omitempty"` +} + +func (x *OutputDirectory) Reset() { + *x = OutputDirectory{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OutputDirectory) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OutputDirectory) ProtoMessage() {} + +func (x *OutputDirectory) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OutputDirectory.ProtoReflect.Descriptor instead. +func (*OutputDirectory) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{14} +} + +func (x *OutputDirectory) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *OutputDirectory) GetTreeDigest() *Digest { + if x != nil { + return x.TreeDigest + } + return nil +} + +func (x *OutputDirectory) GetIsTopologicallySorted() bool { + if x != nil { + return x.IsTopologicallySorted + } + return false +} + +func (x *OutputDirectory) GetRootDirectoryDigest() *Digest { + if x != nil { + return x.RootDirectoryDigest + } + return nil +} + +// An `OutputSymlink` is similar to a +// [Symlink][build.bazel.remote.execution.v2.SymlinkNode], but it is used as an +// output in an `ActionResult`. +// +// `OutputSymlink` is binary-compatible with `SymlinkNode`. +type OutputSymlink struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The full path of the symlink relative to the working directory, including the + // filename. The path separator is a forward slash `/`. Since this is a + // relative path, it MUST NOT begin with a leading forward slash. + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` + // The target path of the symlink. The path separator is a forward slash `/`. + // The target path can be relative to the parent directory of the symlink or + // it can be an absolute path starting with `/`. Support for absolute paths + // can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities] + // API. `..` components are allowed anywhere in the target path. + Target string `protobuf:"bytes,2,opt,name=target,proto3" json:"target,omitempty"` + NodeProperties *NodeProperties `protobuf:"bytes,4,opt,name=node_properties,json=nodeProperties,proto3" json:"node_properties,omitempty"` +} + +func (x *OutputSymlink) Reset() { + *x = OutputSymlink{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *OutputSymlink) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*OutputSymlink) ProtoMessage() {} + +func (x *OutputSymlink) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use OutputSymlink.ProtoReflect.Descriptor instead. +func (*OutputSymlink) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{15} +} + +func (x *OutputSymlink) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *OutputSymlink) GetTarget() string { + if x != nil { + return x.Target + } + return "" +} + +func (x *OutputSymlink) GetNodeProperties() *NodeProperties { + if x != nil { + return x.NodeProperties + } + return nil +} + +// An `ExecutionPolicy` can be used to control the scheduling of the action. +type ExecutionPolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The priority (relative importance) of this action. Generally, a lower value + // means that the action should be run sooner than actions having a greater + // priority value, but the interpretation of a given value is server- + // dependent. A priority of 0 means the *default* priority. Priorities may be + // positive or negative, and such actions should run later or sooner than + // actions having the default priority, respectively. The particular semantics + // of this field is up to the server. In particular, every server will have + // their own supported range of priorities, and will decide how these map into + // scheduling policy. + Priority int32 `protobuf:"varint,1,opt,name=priority,proto3" json:"priority,omitempty"` +} + +func (x *ExecutionPolicy) Reset() { + *x = ExecutionPolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecutionPolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecutionPolicy) ProtoMessage() {} + +func (x *ExecutionPolicy) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExecutionPolicy.ProtoReflect.Descriptor instead. +func (*ExecutionPolicy) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{16} +} + +func (x *ExecutionPolicy) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 +} + +// A `ResultsCachePolicy` is used for fine-grained control over how action +// outputs are stored in the CAS and Action Cache. +type ResultsCachePolicy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The priority (relative importance) of this content in the overall cache. + // Generally, a lower value means a longer retention time or other advantage, + // but the interpretation of a given value is server-dependent. A priority of + // 0 means a *default* value, decided by the server. + // + // The particular semantics of this field is up to the server. In particular, + // every server will have their own supported range of priorities, and will + // decide how these map into retention/eviction policy. + Priority int32 `protobuf:"varint,1,opt,name=priority,proto3" json:"priority,omitempty"` +} + +func (x *ResultsCachePolicy) Reset() { + *x = ResultsCachePolicy{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResultsCachePolicy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResultsCachePolicy) ProtoMessage() {} + +func (x *ResultsCachePolicy) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResultsCachePolicy.ProtoReflect.Descriptor instead. +func (*ResultsCachePolicy) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{17} +} + +func (x *ResultsCachePolicy) GetPriority() int32 { + if x != nil { + return x.Priority + } + return 0 +} + +// A request message for +// [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute]. +type ExecuteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + // If true, the action will be executed even if its result is already + // present in the [ActionCache][build.bazel.remote.execution.v2.ActionCache]. + // The execution is still allowed to be merged with other in-flight executions + // of the same action, however - semantically, the service MUST only guarantee + // that the results of an execution with this field set were not visible + // before the corresponding execution request was sent. + // Note that actions from execution requests setting this field set are still + // eligible to be entered into the action cache upon completion, and services + // SHOULD overwrite any existing entries that may exist. This allows + // skip_cache_lookup requests to be used as a mechanism for replacing action + // cache entries that reference outputs no longer available or that are + // poisoned in any way. + // If false, the result may be served from the action cache. + SkipCacheLookup bool `protobuf:"varint,3,opt,name=skip_cache_lookup,json=skipCacheLookup,proto3" json:"skip_cache_lookup,omitempty"` + // The digest of the [Action][build.bazel.remote.execution.v2.Action] to + // execute. + ActionDigest *Digest `protobuf:"bytes,6,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"` + // An optional policy for execution of the action. + // The server will have a default policy if this is not provided. + ExecutionPolicy *ExecutionPolicy `protobuf:"bytes,7,opt,name=execution_policy,json=executionPolicy,proto3" json:"execution_policy,omitempty"` + // An optional policy for the results of this execution in the remote cache. + // The server will have a default policy if this is not provided. + // This may be applied to both the ActionResult and the associated blobs. + ResultsCachePolicy *ResultsCachePolicy `protobuf:"bytes,8,opt,name=results_cache_policy,json=resultsCachePolicy,proto3" json:"results_cache_policy,omitempty"` + // The digest function that was used to compute the action digest. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the action digest hash and the digest functions announced + // in the server's capabilities. + DigestFunction DigestFunction_Value `protobuf:"varint,9,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"` +} + +func (x *ExecuteRequest) Reset() { + *x = ExecuteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecuteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecuteRequest) ProtoMessage() {} + +func (x *ExecuteRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExecuteRequest.ProtoReflect.Descriptor instead. +func (*ExecuteRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{18} +} + +func (x *ExecuteRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *ExecuteRequest) GetSkipCacheLookup() bool { + if x != nil { + return x.SkipCacheLookup + } + return false +} + +func (x *ExecuteRequest) GetActionDigest() *Digest { + if x != nil { + return x.ActionDigest + } + return nil +} + +func (x *ExecuteRequest) GetExecutionPolicy() *ExecutionPolicy { + if x != nil { + return x.ExecutionPolicy + } + return nil +} + +func (x *ExecuteRequest) GetResultsCachePolicy() *ResultsCachePolicy { + if x != nil { + return x.ResultsCachePolicy + } + return nil +} + +func (x *ExecuteRequest) GetDigestFunction() DigestFunction_Value { + if x != nil { + return x.DigestFunction + } + return DigestFunction_UNKNOWN +} + +// A `LogFile` is a log stored in the CAS. +type LogFile struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The digest of the log contents. + Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"` + // This is a hint as to the purpose of the log, and is set to true if the log + // is human-readable text that can be usefully displayed to a user, and false + // otherwise. For instance, if a command-line client wishes to print the + // server logs to the terminal for a failed action, this allows it to avoid + // displaying a binary file. + HumanReadable bool `protobuf:"varint,2,opt,name=human_readable,json=humanReadable,proto3" json:"human_readable,omitempty"` +} + +func (x *LogFile) Reset() { + *x = LogFile{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LogFile) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogFile) ProtoMessage() {} + +func (x *LogFile) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LogFile.ProtoReflect.Descriptor instead. +func (*LogFile) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{19} +} + +func (x *LogFile) GetDigest() *Digest { + if x != nil { + return x.Digest + } + return nil +} + +func (x *LogFile) GetHumanReadable() bool { + if x != nil { + return x.HumanReadable + } + return false +} + +// The response message for +// [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute], +// which will be contained in the [response +// field][google.longrunning.Operation.response] of the +// [Operation][google.longrunning.Operation]. +type ExecuteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The result of the action. + Result *ActionResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"` + // True if the result was served from cache, false if it was executed. + CachedResult bool `protobuf:"varint,2,opt,name=cached_result,json=cachedResult,proto3" json:"cached_result,omitempty"` + // If the status has a code other than `OK`, it indicates that the action did + // not finish execution. For example, if the operation times out during + // execution, the status will have a `DEADLINE_EXCEEDED` code. Servers MUST + // use this field for errors in execution, rather than the error field on the + // `Operation` object. + // + // If the status code is other than `OK`, then the result MUST NOT be cached. + // For an error status, the `result` field is optional; the server may + // populate the output-, stdout-, and stderr-related fields if it has any + // information available, such as the stdout and stderr of a timed-out action. + Status *status.Status `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + // An optional list of additional log outputs the server wishes to provide. A + // server can use this to return execution-specific logs however it wishes. + // This is intended primarily to make it easier for users to debug issues that + // may be outside of the actual job execution, such as by identifying the + // worker executing the action or by providing logs from the worker's setup + // phase. The keys SHOULD be human readable so that a client can display them + // to a user. + ServerLogs map[string]*LogFile `protobuf:"bytes,4,rep,name=server_logs,json=serverLogs,proto3" json:"server_logs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Freeform informational message with details on the execution of the action + // that may be displayed to the user upon failure or when requested explicitly. + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *ExecuteResponse) Reset() { + *x = ExecuteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecuteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecuteResponse) ProtoMessage() {} + +func (x *ExecuteResponse) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExecuteResponse.ProtoReflect.Descriptor instead. +func (*ExecuteResponse) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{20} +} + +func (x *ExecuteResponse) GetResult() *ActionResult { + if x != nil { + return x.Result + } + return nil +} + +func (x *ExecuteResponse) GetCachedResult() bool { + if x != nil { + return x.CachedResult + } + return false +} + +func (x *ExecuteResponse) GetStatus() *status.Status { + if x != nil { + return x.Status + } + return nil +} + +func (x *ExecuteResponse) GetServerLogs() map[string]*LogFile { + if x != nil { + return x.ServerLogs + } + return nil +} + +func (x *ExecuteResponse) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// The current stage of action execution. +// +// Even though these stages are numbered according to the order in which +// they generally occur, there is no requirement that the remote +// execution system reports events along this order. For example, an +// operation MAY transition from the EXECUTING stage back to QUEUED +// in case the hardware on which the operation executes fails. +// +// If and only if the remote execution system reports that an operation +// has reached the COMPLETED stage, it MUST set the [done +// field][google.longrunning.Operation.done] of the +// [Operation][google.longrunning.Operation] and terminate the stream. +type ExecutionStage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ExecutionStage) Reset() { + *x = ExecutionStage{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecutionStage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecutionStage) ProtoMessage() {} + +func (x *ExecutionStage) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExecutionStage.ProtoReflect.Descriptor instead. +func (*ExecutionStage) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{21} +} + +// Metadata about an ongoing +// [execution][build.bazel.remote.execution.v2.Execution.Execute], which +// will be contained in the [metadata +// field][google.longrunning.Operation.response] of the +// [Operation][google.longrunning.Operation]. +type ExecuteOperationMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The current stage of execution. + Stage ExecutionStage_Value `protobuf:"varint,1,opt,name=stage,proto3,enum=build.bazel.remote.execution.v2.ExecutionStage_Value" json:"stage,omitempty"` + // The digest of the [Action][build.bazel.remote.execution.v2.Action] + // being executed. + ActionDigest *Digest `protobuf:"bytes,2,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"` + // If set, the client can use this resource name with + // [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the + // standard output from the endpoint hosting streamed responses. + StdoutStreamName string `protobuf:"bytes,3,opt,name=stdout_stream_name,json=stdoutStreamName,proto3" json:"stdout_stream_name,omitempty"` + // If set, the client can use this resource name with + // [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the + // standard error from the endpoint hosting streamed responses. + StderrStreamName string `protobuf:"bytes,4,opt,name=stderr_stream_name,json=stderrStreamName,proto3" json:"stderr_stream_name,omitempty"` + // The client can read this field to view details about the ongoing + // execution. + PartialExecutionMetadata *ExecutedActionMetadata `protobuf:"bytes,5,opt,name=partial_execution_metadata,json=partialExecutionMetadata,proto3" json:"partial_execution_metadata,omitempty"` +} + +func (x *ExecuteOperationMetadata) Reset() { + *x = ExecuteOperationMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecuteOperationMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecuteOperationMetadata) ProtoMessage() {} + +func (x *ExecuteOperationMetadata) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExecuteOperationMetadata.ProtoReflect.Descriptor instead. +func (*ExecuteOperationMetadata) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{22} +} + +func (x *ExecuteOperationMetadata) GetStage() ExecutionStage_Value { + if x != nil { + return x.Stage + } + return ExecutionStage_UNKNOWN +} + +func (x *ExecuteOperationMetadata) GetActionDigest() *Digest { + if x != nil { + return x.ActionDigest + } + return nil +} + +func (x *ExecuteOperationMetadata) GetStdoutStreamName() string { + if x != nil { + return x.StdoutStreamName + } + return "" +} + +func (x *ExecuteOperationMetadata) GetStderrStreamName() string { + if x != nil { + return x.StderrStreamName + } + return "" +} + +func (x *ExecuteOperationMetadata) GetPartialExecutionMetadata() *ExecutedActionMetadata { + if x != nil { + return x.PartialExecutionMetadata + } + return nil +} + +// A request message for +// [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]. +type WaitExecutionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The name of the [Operation][google.longrunning.Operation] + // returned by [Execute][build.bazel.remote.execution.v2.Execution.Execute]. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *WaitExecutionRequest) Reset() { + *x = WaitExecutionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WaitExecutionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WaitExecutionRequest) ProtoMessage() {} + +func (x *WaitExecutionRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WaitExecutionRequest.ProtoReflect.Descriptor instead. +func (*WaitExecutionRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{23} +} + +func (x *WaitExecutionRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// A request message for +// [ActionCache.GetActionResult][build.bazel.remote.execution.v2.ActionCache.GetActionResult]. +type GetActionResultRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + // The digest of the [Action][build.bazel.remote.execution.v2.Action] + // whose result is requested. + ActionDigest *Digest `protobuf:"bytes,2,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"` + // A hint to the server to request inlining stdout in the + // [ActionResult][build.bazel.remote.execution.v2.ActionResult] message. + InlineStdout bool `protobuf:"varint,3,opt,name=inline_stdout,json=inlineStdout,proto3" json:"inline_stdout,omitempty"` + // A hint to the server to request inlining stderr in the + // [ActionResult][build.bazel.remote.execution.v2.ActionResult] message. + InlineStderr bool `protobuf:"varint,4,opt,name=inline_stderr,json=inlineStderr,proto3" json:"inline_stderr,omitempty"` + // A hint to the server to inline the contents of the listed output files. + // Each path needs to exactly match one file path in either `output_paths` or + // `output_files` (DEPRECATED since v2.1) in the + // [Command][build.bazel.remote.execution.v2.Command] message. + InlineOutputFiles []string `protobuf:"bytes,5,rep,name=inline_output_files,json=inlineOutputFiles,proto3" json:"inline_output_files,omitempty"` + // The digest function that was used to compute the action digest. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the action digest hash and the digest functions announced + // in the server's capabilities. + DigestFunction DigestFunction_Value `protobuf:"varint,6,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"` +} + +func (x *GetActionResultRequest) Reset() { + *x = GetActionResultRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetActionResultRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetActionResultRequest) ProtoMessage() {} + +func (x *GetActionResultRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetActionResultRequest.ProtoReflect.Descriptor instead. +func (*GetActionResultRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{24} +} + +func (x *GetActionResultRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *GetActionResultRequest) GetActionDigest() *Digest { + if x != nil { + return x.ActionDigest + } + return nil +} + +func (x *GetActionResultRequest) GetInlineStdout() bool { + if x != nil { + return x.InlineStdout + } + return false +} + +func (x *GetActionResultRequest) GetInlineStderr() bool { + if x != nil { + return x.InlineStderr + } + return false +} + +func (x *GetActionResultRequest) GetInlineOutputFiles() []string { + if x != nil { + return x.InlineOutputFiles + } + return nil +} + +func (x *GetActionResultRequest) GetDigestFunction() DigestFunction_Value { + if x != nil { + return x.DigestFunction + } + return DigestFunction_UNKNOWN +} + +// A request message for +// [ActionCache.UpdateActionResult][build.bazel.remote.execution.v2.ActionCache.UpdateActionResult]. +type UpdateActionResultRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + // The digest of the [Action][build.bazel.remote.execution.v2.Action] + // whose result is being uploaded. + ActionDigest *Digest `protobuf:"bytes,2,opt,name=action_digest,json=actionDigest,proto3" json:"action_digest,omitempty"` + // The [ActionResult][build.bazel.remote.execution.v2.ActionResult] + // to store in the cache. + ActionResult *ActionResult `protobuf:"bytes,3,opt,name=action_result,json=actionResult,proto3" json:"action_result,omitempty"` + // An optional policy for the results of this execution in the remote cache. + // The server will have a default policy if this is not provided. + // This may be applied to both the ActionResult and the associated blobs. + ResultsCachePolicy *ResultsCachePolicy `protobuf:"bytes,4,opt,name=results_cache_policy,json=resultsCachePolicy,proto3" json:"results_cache_policy,omitempty"` + // The digest function that was used to compute the action digest. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the action digest hash and the digest functions announced + // in the server's capabilities. + DigestFunction DigestFunction_Value `protobuf:"varint,5,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"` +} + +func (x *UpdateActionResultRequest) Reset() { + *x = UpdateActionResultRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateActionResultRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateActionResultRequest) ProtoMessage() {} + +func (x *UpdateActionResultRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateActionResultRequest.ProtoReflect.Descriptor instead. +func (*UpdateActionResultRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{25} +} + +func (x *UpdateActionResultRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *UpdateActionResultRequest) GetActionDigest() *Digest { + if x != nil { + return x.ActionDigest + } + return nil +} + +func (x *UpdateActionResultRequest) GetActionResult() *ActionResult { + if x != nil { + return x.ActionResult + } + return nil +} + +func (x *UpdateActionResultRequest) GetResultsCachePolicy() *ResultsCachePolicy { + if x != nil { + return x.ResultsCachePolicy + } + return nil +} + +func (x *UpdateActionResultRequest) GetDigestFunction() DigestFunction_Value { + if x != nil { + return x.DigestFunction + } + return DigestFunction_UNKNOWN +} + +// A request message for +// [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs]. +type FindMissingBlobsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + // A list of the blobs to check. All digests MUST use the same digest + // function. + BlobDigests []*Digest `protobuf:"bytes,2,rep,name=blob_digests,json=blobDigests,proto3" json:"blob_digests,omitempty"` + // The digest function of the blobs whose existence is checked. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the blob digest hashes and the digest functions announced + // in the server's capabilities. + DigestFunction DigestFunction_Value `protobuf:"varint,3,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"` +} + +func (x *FindMissingBlobsRequest) Reset() { + *x = FindMissingBlobsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FindMissingBlobsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FindMissingBlobsRequest) ProtoMessage() {} + +func (x *FindMissingBlobsRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FindMissingBlobsRequest.ProtoReflect.Descriptor instead. +func (*FindMissingBlobsRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{26} +} + +func (x *FindMissingBlobsRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *FindMissingBlobsRequest) GetBlobDigests() []*Digest { + if x != nil { + return x.BlobDigests + } + return nil +} + +func (x *FindMissingBlobsRequest) GetDigestFunction() DigestFunction_Value { + if x != nil { + return x.DigestFunction + } + return DigestFunction_UNKNOWN +} + +// A response message for +// [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs]. +type FindMissingBlobsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A list of the blobs requested *not* present in the storage. + MissingBlobDigests []*Digest `protobuf:"bytes,2,rep,name=missing_blob_digests,json=missingBlobDigests,proto3" json:"missing_blob_digests,omitempty"` +} + +func (x *FindMissingBlobsResponse) Reset() { + *x = FindMissingBlobsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FindMissingBlobsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FindMissingBlobsResponse) ProtoMessage() {} + +func (x *FindMissingBlobsResponse) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FindMissingBlobsResponse.ProtoReflect.Descriptor instead. +func (*FindMissingBlobsResponse) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{27} +} + +func (x *FindMissingBlobsResponse) GetMissingBlobDigests() []*Digest { + if x != nil { + return x.MissingBlobDigests + } + return nil +} + +// A request message for +// [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs]. +type BatchUpdateBlobsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + // The individual upload requests. + Requests []*BatchUpdateBlobsRequest_Request `protobuf:"bytes,2,rep,name=requests,proto3" json:"requests,omitempty"` + // The digest function that was used to compute the digests of the + // blobs being uploaded. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the blob digest hashes and the digest functions announced + // in the server's capabilities. + DigestFunction DigestFunction_Value `protobuf:"varint,5,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"` +} + +func (x *BatchUpdateBlobsRequest) Reset() { + *x = BatchUpdateBlobsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchUpdateBlobsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpdateBlobsRequest) ProtoMessage() {} + +func (x *BatchUpdateBlobsRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchUpdateBlobsRequest.ProtoReflect.Descriptor instead. +func (*BatchUpdateBlobsRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{28} +} + +func (x *BatchUpdateBlobsRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *BatchUpdateBlobsRequest) GetRequests() []*BatchUpdateBlobsRequest_Request { + if x != nil { + return x.Requests + } + return nil +} + +func (x *BatchUpdateBlobsRequest) GetDigestFunction() DigestFunction_Value { + if x != nil { + return x.DigestFunction + } + return DigestFunction_UNKNOWN +} + +// A response message for +// [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs]. +type BatchUpdateBlobsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The responses to the requests. + Responses []*BatchUpdateBlobsResponse_Response `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"` +} + +func (x *BatchUpdateBlobsResponse) Reset() { + *x = BatchUpdateBlobsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchUpdateBlobsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpdateBlobsResponse) ProtoMessage() {} + +func (x *BatchUpdateBlobsResponse) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchUpdateBlobsResponse.ProtoReflect.Descriptor instead. +func (*BatchUpdateBlobsResponse) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{29} +} + +func (x *BatchUpdateBlobsResponse) GetResponses() []*BatchUpdateBlobsResponse_Response { + if x != nil { + return x.Responses + } + return nil +} + +// A request message for +// [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs]. +type BatchReadBlobsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + // The individual blob digests. All digests MUST use the same digest + // function. + Digests []*Digest `protobuf:"bytes,2,rep,name=digests,proto3" json:"digests,omitempty"` + // A list of acceptable encodings for the returned inlined data, in no + // particular order. `IDENTITY` is always allowed even if not specified here. + AcceptableCompressors []Compressor_Value `protobuf:"varint,3,rep,packed,name=acceptable_compressors,json=acceptableCompressors,proto3,enum=build.bazel.remote.execution.v2.Compressor_Value" json:"acceptable_compressors,omitempty"` + // The digest function of the blobs being requested. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the blob digest hashes and the digest functions announced + // in the server's capabilities. + DigestFunction DigestFunction_Value `protobuf:"varint,4,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"` +} + +func (x *BatchReadBlobsRequest) Reset() { + *x = BatchReadBlobsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchReadBlobsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchReadBlobsRequest) ProtoMessage() {} + +func (x *BatchReadBlobsRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchReadBlobsRequest.ProtoReflect.Descriptor instead. +func (*BatchReadBlobsRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{30} +} + +func (x *BatchReadBlobsRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *BatchReadBlobsRequest) GetDigests() []*Digest { + if x != nil { + return x.Digests + } + return nil +} + +func (x *BatchReadBlobsRequest) GetAcceptableCompressors() []Compressor_Value { + if x != nil { + return x.AcceptableCompressors + } + return nil +} + +func (x *BatchReadBlobsRequest) GetDigestFunction() DigestFunction_Value { + if x != nil { + return x.DigestFunction + } + return DigestFunction_UNKNOWN +} + +// A response message for +// [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs]. +type BatchReadBlobsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The responses to the requests. + Responses []*BatchReadBlobsResponse_Response `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"` +} + +func (x *BatchReadBlobsResponse) Reset() { + *x = BatchReadBlobsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchReadBlobsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchReadBlobsResponse) ProtoMessage() {} + +func (x *BatchReadBlobsResponse) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchReadBlobsResponse.ProtoReflect.Descriptor instead. +func (*BatchReadBlobsResponse) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{31} +} + +func (x *BatchReadBlobsResponse) GetResponses() []*BatchReadBlobsResponse_Response { + if x != nil { + return x.Responses + } + return nil +} + +// A request message for +// [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree]. +type GetTreeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` + // The digest of the root, which must be an encoded + // [Directory][build.bazel.remote.execution.v2.Directory] message + // stored in the + // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. + RootDigest *Digest `protobuf:"bytes,2,opt,name=root_digest,json=rootDigest,proto3" json:"root_digest,omitempty"` + // A maximum page size to request. If present, the server will request no more + // than this many items. Regardless of whether a page size is specified, the + // server may place its own limit on the number of items to be returned and + // require the client to retrieve more items using a subsequent request. + PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // A page token, which must be a value received in a previous + // [GetTreeResponse][build.bazel.remote.execution.v2.GetTreeResponse]. + // If present, the server will use that token as an offset, returning only + // that page and the ones that succeed it. + PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + // The digest function that was used to compute the digest of the root + // directory. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the root digest hash and the digest functions announced + // in the server's capabilities. + DigestFunction DigestFunction_Value `protobuf:"varint,5,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"` +} + +func (x *GetTreeRequest) Reset() { + *x = GetTreeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetTreeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTreeRequest) ProtoMessage() {} + +func (x *GetTreeRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTreeRequest.ProtoReflect.Descriptor instead. +func (*GetTreeRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{32} +} + +func (x *GetTreeRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +func (x *GetTreeRequest) GetRootDigest() *Digest { + if x != nil { + return x.RootDigest + } + return nil +} + +func (x *GetTreeRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *GetTreeRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *GetTreeRequest) GetDigestFunction() DigestFunction_Value { + if x != nil { + return x.DigestFunction + } + return DigestFunction_UNKNOWN +} + +// A response message for +// [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree]. +type GetTreeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The directories descended from the requested root. + Directories []*Directory `protobuf:"bytes,1,rep,name=directories,proto3" json:"directories,omitempty"` + // If present, signifies that there are more results which the client can + // retrieve by passing this as the page_token in a subsequent + // [request][build.bazel.remote.execution.v2.GetTreeRequest]. + // If empty, signifies that this is the last page of results. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` +} + +func (x *GetTreeResponse) Reset() { + *x = GetTreeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetTreeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetTreeResponse) ProtoMessage() {} + +func (x *GetTreeResponse) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetTreeResponse.ProtoReflect.Descriptor instead. +func (*GetTreeResponse) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{33} +} + +func (x *GetTreeResponse) GetDirectories() []*Directory { + if x != nil { + return x.Directories + } + return nil +} + +func (x *GetTreeResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +// A request message for +// [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities]. +type GetCapabilitiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The instance of the execution system to operate against. A server may + // support multiple instances of the execution system (with their own workers, + // storage, caches, etc.). The server MAY require use of this field to select + // between them in an implementation-defined fashion, otherwise it can be + // omitted. + InstanceName string `protobuf:"bytes,1,opt,name=instance_name,json=instanceName,proto3" json:"instance_name,omitempty"` +} + +func (x *GetCapabilitiesRequest) Reset() { + *x = GetCapabilitiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetCapabilitiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetCapabilitiesRequest) ProtoMessage() {} + +func (x *GetCapabilitiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetCapabilitiesRequest.ProtoReflect.Descriptor instead. +func (*GetCapabilitiesRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{34} +} + +func (x *GetCapabilitiesRequest) GetInstanceName() string { + if x != nil { + return x.InstanceName + } + return "" +} + +// A response message for +// [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities]. +type ServerCapabilities struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Capabilities of the remote cache system. + CacheCapabilities *CacheCapabilities `protobuf:"bytes,1,opt,name=cache_capabilities,json=cacheCapabilities,proto3" json:"cache_capabilities,omitempty"` + // Capabilities of the remote execution system. + ExecutionCapabilities *ExecutionCapabilities `protobuf:"bytes,2,opt,name=execution_capabilities,json=executionCapabilities,proto3" json:"execution_capabilities,omitempty"` + // Earliest RE API version supported, including deprecated versions. + DeprecatedApiVersion *semver.SemVer `protobuf:"bytes,3,opt,name=deprecated_api_version,json=deprecatedApiVersion,proto3" json:"deprecated_api_version,omitempty"` + // Earliest non-deprecated RE API version supported. + LowApiVersion *semver.SemVer `protobuf:"bytes,4,opt,name=low_api_version,json=lowApiVersion,proto3" json:"low_api_version,omitempty"` + // Latest RE API version supported. + HighApiVersion *semver.SemVer `protobuf:"bytes,5,opt,name=high_api_version,json=highApiVersion,proto3" json:"high_api_version,omitempty"` +} + +func (x *ServerCapabilities) Reset() { + *x = ServerCapabilities{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServerCapabilities) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServerCapabilities) ProtoMessage() {} + +func (x *ServerCapabilities) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServerCapabilities.ProtoReflect.Descriptor instead. +func (*ServerCapabilities) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{35} +} + +func (x *ServerCapabilities) GetCacheCapabilities() *CacheCapabilities { + if x != nil { + return x.CacheCapabilities + } + return nil +} + +func (x *ServerCapabilities) GetExecutionCapabilities() *ExecutionCapabilities { + if x != nil { + return x.ExecutionCapabilities + } + return nil +} + +func (x *ServerCapabilities) GetDeprecatedApiVersion() *semver.SemVer { + if x != nil { + return x.DeprecatedApiVersion + } + return nil +} + +func (x *ServerCapabilities) GetLowApiVersion() *semver.SemVer { + if x != nil { + return x.LowApiVersion + } + return nil +} + +func (x *ServerCapabilities) GetHighApiVersion() *semver.SemVer { + if x != nil { + return x.HighApiVersion + } + return nil +} + +// The digest function used for converting values into keys for CAS and Action +// Cache. +type DigestFunction struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DigestFunction) Reset() { + *x = DigestFunction{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DigestFunction) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DigestFunction) ProtoMessage() {} + +func (x *DigestFunction) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DigestFunction.ProtoReflect.Descriptor instead. +func (*DigestFunction) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{36} +} + +// Describes the server/instance capabilities for updating the action cache. +type ActionCacheUpdateCapabilities struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UpdateEnabled bool `protobuf:"varint,1,opt,name=update_enabled,json=updateEnabled,proto3" json:"update_enabled,omitempty"` +} + +func (x *ActionCacheUpdateCapabilities) Reset() { + *x = ActionCacheUpdateCapabilities{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ActionCacheUpdateCapabilities) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActionCacheUpdateCapabilities) ProtoMessage() {} + +func (x *ActionCacheUpdateCapabilities) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActionCacheUpdateCapabilities.ProtoReflect.Descriptor instead. +func (*ActionCacheUpdateCapabilities) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{37} +} + +func (x *ActionCacheUpdateCapabilities) GetUpdateEnabled() bool { + if x != nil { + return x.UpdateEnabled + } + return false +} + +// Allowed values for priority in +// [ResultsCachePolicy][build.bazel.remoteexecution.v2.ResultsCachePolicy] and +// [ExecutionPolicy][build.bazel.remoteexecution.v2.ResultsCachePolicy] +// Used for querying both cache and execution valid priority ranges. +type PriorityCapabilities struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Priorities []*PriorityCapabilities_PriorityRange `protobuf:"bytes,1,rep,name=priorities,proto3" json:"priorities,omitempty"` +} + +func (x *PriorityCapabilities) Reset() { + *x = PriorityCapabilities{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PriorityCapabilities) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PriorityCapabilities) ProtoMessage() {} + +func (x *PriorityCapabilities) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PriorityCapabilities.ProtoReflect.Descriptor instead. +func (*PriorityCapabilities) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{38} +} + +func (x *PriorityCapabilities) GetPriorities() []*PriorityCapabilities_PriorityRange { + if x != nil { + return x.Priorities + } + return nil +} + +// Describes how the server treats absolute symlink targets. +type SymlinkAbsolutePathStrategy struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *SymlinkAbsolutePathStrategy) Reset() { + *x = SymlinkAbsolutePathStrategy{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SymlinkAbsolutePathStrategy) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SymlinkAbsolutePathStrategy) ProtoMessage() {} + +func (x *SymlinkAbsolutePathStrategy) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SymlinkAbsolutePathStrategy.ProtoReflect.Descriptor instead. +func (*SymlinkAbsolutePathStrategy) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{39} +} + +// Compression formats which may be supported. +type Compressor struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Compressor) Reset() { + *x = Compressor{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Compressor) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Compressor) ProtoMessage() {} + +func (x *Compressor) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[40] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Compressor.ProtoReflect.Descriptor instead. +func (*Compressor) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{40} +} + +// Capabilities of the remote cache system. +type CacheCapabilities struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // All the digest functions supported by the remote cache. + // Remote cache may support multiple digest functions simultaneously. + DigestFunctions []DigestFunction_Value `protobuf:"varint,1,rep,packed,name=digest_functions,json=digestFunctions,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_functions,omitempty"` + // Capabilities for updating the action cache. + ActionCacheUpdateCapabilities *ActionCacheUpdateCapabilities `protobuf:"bytes,2,opt,name=action_cache_update_capabilities,json=actionCacheUpdateCapabilities,proto3" json:"action_cache_update_capabilities,omitempty"` + // Supported cache priority range for both CAS and ActionCache. + CachePriorityCapabilities *PriorityCapabilities `protobuf:"bytes,3,opt,name=cache_priority_capabilities,json=cachePriorityCapabilities,proto3" json:"cache_priority_capabilities,omitempty"` + // Maximum total size of blobs to be uploaded/downloaded using + // batch methods. A value of 0 means no limit is set, although + // in practice there will always be a message size limitation + // of the protocol in use, e.g. GRPC. + MaxBatchTotalSizeBytes int64 `protobuf:"varint,4,opt,name=max_batch_total_size_bytes,json=maxBatchTotalSizeBytes,proto3" json:"max_batch_total_size_bytes,omitempty"` + // Whether absolute symlink targets are supported. + SymlinkAbsolutePathStrategy SymlinkAbsolutePathStrategy_Value `protobuf:"varint,5,opt,name=symlink_absolute_path_strategy,json=symlinkAbsolutePathStrategy,proto3,enum=build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy_Value" json:"symlink_absolute_path_strategy,omitempty"` + // Compressors supported by the "compressed-blobs" bytestream resources. + // Servers MUST support identity/no-compression, even if it is not listed + // here. + // + // Note that this does not imply which if any compressors are supported by + // the server at the gRPC level. + SupportedCompressors []Compressor_Value `protobuf:"varint,6,rep,packed,name=supported_compressors,json=supportedCompressors,proto3,enum=build.bazel.remote.execution.v2.Compressor_Value" json:"supported_compressors,omitempty"` + // Compressors supported for inlined data in + // [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs] + // requests. + SupportedBatchUpdateCompressors []Compressor_Value `protobuf:"varint,7,rep,packed,name=supported_batch_update_compressors,json=supportedBatchUpdateCompressors,proto3,enum=build.bazel.remote.execution.v2.Compressor_Value" json:"supported_batch_update_compressors,omitempty"` +} + +func (x *CacheCapabilities) Reset() { + *x = CacheCapabilities{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CacheCapabilities) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CacheCapabilities) ProtoMessage() {} + +func (x *CacheCapabilities) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[41] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CacheCapabilities.ProtoReflect.Descriptor instead. +func (*CacheCapabilities) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{41} +} + +func (x *CacheCapabilities) GetDigestFunctions() []DigestFunction_Value { + if x != nil { + return x.DigestFunctions + } + return nil +} + +func (x *CacheCapabilities) GetActionCacheUpdateCapabilities() *ActionCacheUpdateCapabilities { + if x != nil { + return x.ActionCacheUpdateCapabilities + } + return nil +} + +func (x *CacheCapabilities) GetCachePriorityCapabilities() *PriorityCapabilities { + if x != nil { + return x.CachePriorityCapabilities + } + return nil +} + +func (x *CacheCapabilities) GetMaxBatchTotalSizeBytes() int64 { + if x != nil { + return x.MaxBatchTotalSizeBytes + } + return 0 +} + +func (x *CacheCapabilities) GetSymlinkAbsolutePathStrategy() SymlinkAbsolutePathStrategy_Value { + if x != nil { + return x.SymlinkAbsolutePathStrategy + } + return SymlinkAbsolutePathStrategy_UNKNOWN +} + +func (x *CacheCapabilities) GetSupportedCompressors() []Compressor_Value { + if x != nil { + return x.SupportedCompressors + } + return nil +} + +func (x *CacheCapabilities) GetSupportedBatchUpdateCompressors() []Compressor_Value { + if x != nil { + return x.SupportedBatchUpdateCompressors + } + return nil +} + +// Capabilities of the remote execution system. +type ExecutionCapabilities struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Legacy field for indicating which digest function is supported by the + // remote execution system. It MUST be set to a value other than UNKNOWN. + // Implementations should consider the repeated digest_functions field + // first, falling back to this singular field if digest_functions is unset. + DigestFunction DigestFunction_Value `protobuf:"varint,1,opt,name=digest_function,json=digestFunction,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_function,omitempty"` + // Whether remote execution is enabled for the particular server/instance. + ExecEnabled bool `protobuf:"varint,2,opt,name=exec_enabled,json=execEnabled,proto3" json:"exec_enabled,omitempty"` + // Supported execution priority range. + ExecutionPriorityCapabilities *PriorityCapabilities `protobuf:"bytes,3,opt,name=execution_priority_capabilities,json=executionPriorityCapabilities,proto3" json:"execution_priority_capabilities,omitempty"` + // Supported node properties. + SupportedNodeProperties []string `protobuf:"bytes,4,rep,name=supported_node_properties,json=supportedNodeProperties,proto3" json:"supported_node_properties,omitempty"` + // All the digest functions supported by the remote execution system. + // If this field is set, it MUST also contain digest_function. + // + // Even if the remote execution system announces support for multiple + // digest functions, individual execution requests may only reference + // CAS objects using a single digest function. For example, it is not + // permitted to execute actions having both MD5 and SHA-256 hashed + // files in their input root. + // + // The CAS objects referenced by action results generated by the + // remote execution system MUST use the same digest function as the + // one used to construct the action. + DigestFunctions []DigestFunction_Value `protobuf:"varint,5,rep,packed,name=digest_functions,json=digestFunctions,proto3,enum=build.bazel.remote.execution.v2.DigestFunction_Value" json:"digest_functions,omitempty"` +} + +func (x *ExecutionCapabilities) Reset() { + *x = ExecutionCapabilities{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecutionCapabilities) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecutionCapabilities) ProtoMessage() {} + +func (x *ExecutionCapabilities) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExecutionCapabilities.ProtoReflect.Descriptor instead. +func (*ExecutionCapabilities) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{42} +} + +func (x *ExecutionCapabilities) GetDigestFunction() DigestFunction_Value { + if x != nil { + return x.DigestFunction + } + return DigestFunction_UNKNOWN +} + +func (x *ExecutionCapabilities) GetExecEnabled() bool { + if x != nil { + return x.ExecEnabled + } + return false +} + +func (x *ExecutionCapabilities) GetExecutionPriorityCapabilities() *PriorityCapabilities { + if x != nil { + return x.ExecutionPriorityCapabilities + } + return nil +} + +func (x *ExecutionCapabilities) GetSupportedNodeProperties() []string { + if x != nil { + return x.SupportedNodeProperties + } + return nil +} + +func (x *ExecutionCapabilities) GetDigestFunctions() []DigestFunction_Value { + if x != nil { + return x.DigestFunctions + } + return nil +} + +// Details for the tool used to call the API. +type ToolDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Name of the tool, e.g. bazel. + ToolName string `protobuf:"bytes,1,opt,name=tool_name,json=toolName,proto3" json:"tool_name,omitempty"` + // Version of the tool used for the request, e.g. 5.0.3. + ToolVersion string `protobuf:"bytes,2,opt,name=tool_version,json=toolVersion,proto3" json:"tool_version,omitempty"` +} + +func (x *ToolDetails) Reset() { + *x = ToolDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ToolDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ToolDetails) ProtoMessage() {} + +func (x *ToolDetails) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ToolDetails.ProtoReflect.Descriptor instead. +func (*ToolDetails) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{43} +} + +func (x *ToolDetails) GetToolName() string { + if x != nil { + return x.ToolName + } + return "" +} + +func (x *ToolDetails) GetToolVersion() string { + if x != nil { + return x.ToolVersion + } + return "" +} + +// An optional Metadata to attach to any RPC request to tell the server about an +// external context of the request. The server may use this for logging or other +// purposes. To use it, the client attaches the header to the call using the +// canonical proto serialization: +// +// * name: `build.bazel.remote.execution.v2.requestmetadata-bin` +// * contents: the base64 encoded binary `RequestMetadata` message. +// Note: the gRPC library serializes binary headers encoded in base64 by +// default (https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests). +// Therefore, if the gRPC library is used to pass/retrieve this +// metadata, the user may ignore the base64 encoding and assume it is simply +// serialized as a binary message. +type RequestMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The details for the tool invoking the requests. + ToolDetails *ToolDetails `protobuf:"bytes,1,opt,name=tool_details,json=toolDetails,proto3" json:"tool_details,omitempty"` + // An identifier that ties multiple requests to the same action. + // For example, multiple requests to the CAS, Action Cache, and Execution + // API are used in order to compile foo.cc. + ActionId string `protobuf:"bytes,2,opt,name=action_id,json=actionId,proto3" json:"action_id,omitempty"` + // An identifier that ties multiple actions together to a final result. + // For example, multiple actions are required to build and run foo_test. + ToolInvocationId string `protobuf:"bytes,3,opt,name=tool_invocation_id,json=toolInvocationId,proto3" json:"tool_invocation_id,omitempty"` + // An identifier to tie multiple tool invocations together. For example, + // runs of foo_test, bar_test and baz_test on a post-submit of a given patch. + CorrelatedInvocationsId string `protobuf:"bytes,4,opt,name=correlated_invocations_id,json=correlatedInvocationsId,proto3" json:"correlated_invocations_id,omitempty"` + // A brief description of the kind of action, for example, CppCompile or GoLink. + // There is no standard agreed set of values for this, and they are expected to vary between different client tools. + ActionMnemonic string `protobuf:"bytes,5,opt,name=action_mnemonic,json=actionMnemonic,proto3" json:"action_mnemonic,omitempty"` + // An identifier for the target which produced this action. + // No guarantees are made around how many actions may relate to a single target. + TargetId string `protobuf:"bytes,6,opt,name=target_id,json=targetId,proto3" json:"target_id,omitempty"` + // An identifier for the configuration in which the target was built, + // e.g. for differentiating building host tools or different target platforms. + // There is no expectation that this value will have any particular structure, + // or equality across invocations, though some client tools may offer these guarantees. + ConfigurationId string `protobuf:"bytes,7,opt,name=configuration_id,json=configurationId,proto3" json:"configuration_id,omitempty"` +} + +func (x *RequestMetadata) Reset() { + *x = RequestMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RequestMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestMetadata) ProtoMessage() {} + +func (x *RequestMetadata) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestMetadata.ProtoReflect.Descriptor instead. +func (*RequestMetadata) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{44} +} + +func (x *RequestMetadata) GetToolDetails() *ToolDetails { + if x != nil { + return x.ToolDetails + } + return nil +} + +func (x *RequestMetadata) GetActionId() string { + if x != nil { + return x.ActionId + } + return "" +} + +func (x *RequestMetadata) GetToolInvocationId() string { + if x != nil { + return x.ToolInvocationId + } + return "" +} + +func (x *RequestMetadata) GetCorrelatedInvocationsId() string { + if x != nil { + return x.CorrelatedInvocationsId + } + return "" +} + +func (x *RequestMetadata) GetActionMnemonic() string { + if x != nil { + return x.ActionMnemonic + } + return "" +} + +func (x *RequestMetadata) GetTargetId() string { + if x != nil { + return x.TargetId + } + return "" +} + +func (x *RequestMetadata) GetConfigurationId() string { + if x != nil { + return x.ConfigurationId + } + return "" +} + +// An `EnvironmentVariable` is one variable to set in the running program's +// environment. +type Command_EnvironmentVariable struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The variable name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The variable value. + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *Command_EnvironmentVariable) Reset() { + *x = Command_EnvironmentVariable{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Command_EnvironmentVariable) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Command_EnvironmentVariable) ProtoMessage() {} + +func (x *Command_EnvironmentVariable) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Command_EnvironmentVariable.ProtoReflect.Descriptor instead. +func (*Command_EnvironmentVariable) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{1, 0} +} + +func (x *Command_EnvironmentVariable) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Command_EnvironmentVariable) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +// A single property for the environment. The server is responsible for +// specifying the property `name`s that it accepts. If an unknown `name` is +// provided in the requirements for an +// [Action][build.bazel.remote.execution.v2.Action], the server SHOULD +// reject the execution request. If permitted by the server, the same `name` +// may occur multiple times. +// +// The server is also responsible for specifying the interpretation of +// property `value`s. For instance, a property describing how much RAM must be +// available may be interpreted as allowing a worker with 16GB to fulfill a +// request for 8GB, while a property describing the OS environment on which +// the action must be performed may require an exact match with the worker's +// OS. +// +// The server MAY use the `value` of one or more properties to determine how +// it sets up the execution environment, such as by making specific system +// files available to the worker. +// +// Both names and values are typically case-sensitive. Note that the platform +// is implicitly part of the action digest, so even tiny changes in the names +// or values (like changing case) may result in different action cache +// entries. +type Platform_Property struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The property name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The property value. + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *Platform_Property) Reset() { + *x = Platform_Property{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Platform_Property) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Platform_Property) ProtoMessage() {} + +func (x *Platform_Property) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Platform_Property.ProtoReflect.Descriptor instead. +func (*Platform_Property) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{2, 0} +} + +func (x *Platform_Property) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Platform_Property) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +// A request corresponding to a single blob that the client wants to upload. +type BatchUpdateBlobsRequest_Request struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The digest of the blob. This MUST be the digest of `data`. All + // digests MUST use the same digest function. + Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"` + // The raw binary data. + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + // The format of `data`. Must be `IDENTITY`/unspecified, or one of the + // compressors advertised by the + // [CacheCapabilities.supported_batch_compressors][build.bazel.remote.execution.v2.CacheCapabilities.supported_batch_compressors] + // field. + Compressor Compressor_Value `protobuf:"varint,3,opt,name=compressor,proto3,enum=build.bazel.remote.execution.v2.Compressor_Value" json:"compressor,omitempty"` +} + +func (x *BatchUpdateBlobsRequest_Request) Reset() { + *x = BatchUpdateBlobsRequest_Request{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchUpdateBlobsRequest_Request) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpdateBlobsRequest_Request) ProtoMessage() {} + +func (x *BatchUpdateBlobsRequest_Request) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchUpdateBlobsRequest_Request.ProtoReflect.Descriptor instead. +func (*BatchUpdateBlobsRequest_Request) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{28, 0} +} + +func (x *BatchUpdateBlobsRequest_Request) GetDigest() *Digest { + if x != nil { + return x.Digest + } + return nil +} + +func (x *BatchUpdateBlobsRequest_Request) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *BatchUpdateBlobsRequest_Request) GetCompressor() Compressor_Value { + if x != nil { + return x.Compressor + } + return Compressor_IDENTITY +} + +// A response corresponding to a single blob that the client tried to upload. +type BatchUpdateBlobsResponse_Response struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The blob digest to which this response corresponds. + Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"` + // The result of attempting to upload that blob. + Status *status.Status `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *BatchUpdateBlobsResponse_Response) Reset() { + *x = BatchUpdateBlobsResponse_Response{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchUpdateBlobsResponse_Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchUpdateBlobsResponse_Response) ProtoMessage() {} + +func (x *BatchUpdateBlobsResponse_Response) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchUpdateBlobsResponse_Response.ProtoReflect.Descriptor instead. +func (*BatchUpdateBlobsResponse_Response) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{29, 0} +} + +func (x *BatchUpdateBlobsResponse_Response) GetDigest() *Digest { + if x != nil { + return x.Digest + } + return nil +} + +func (x *BatchUpdateBlobsResponse_Response) GetStatus() *status.Status { + if x != nil { + return x.Status + } + return nil +} + +// A response corresponding to a single blob that the client tried to download. +type BatchReadBlobsResponse_Response struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The digest to which this response corresponds. + Digest *Digest `protobuf:"bytes,1,opt,name=digest,proto3" json:"digest,omitempty"` + // The raw binary data. + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + // The format the data is encoded in. MUST be `IDENTITY`/unspecified, + // or one of the acceptable compressors specified in the `BatchReadBlobsRequest`. + Compressor Compressor_Value `protobuf:"varint,4,opt,name=compressor,proto3,enum=build.bazel.remote.execution.v2.Compressor_Value" json:"compressor,omitempty"` + // The result of attempting to download that blob. + Status *status.Status `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *BatchReadBlobsResponse_Response) Reset() { + *x = BatchReadBlobsResponse_Response{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BatchReadBlobsResponse_Response) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BatchReadBlobsResponse_Response) ProtoMessage() {} + +func (x *BatchReadBlobsResponse_Response) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BatchReadBlobsResponse_Response.ProtoReflect.Descriptor instead. +func (*BatchReadBlobsResponse_Response) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{31, 0} +} + +func (x *BatchReadBlobsResponse_Response) GetDigest() *Digest { + if x != nil { + return x.Digest + } + return nil +} + +func (x *BatchReadBlobsResponse_Response) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *BatchReadBlobsResponse_Response) GetCompressor() Compressor_Value { + if x != nil { + return x.Compressor + } + return Compressor_IDENTITY +} + +func (x *BatchReadBlobsResponse_Response) GetStatus() *status.Status { + if x != nil { + return x.Status + } + return nil +} + +// Supported range of priorities, including boundaries. +type PriorityCapabilities_PriorityRange struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The minimum numeric value for this priority range, which represents the + // most urgent task or longest retained item. + MinPriority int32 `protobuf:"varint,1,opt,name=min_priority,json=minPriority,proto3" json:"min_priority,omitempty"` + // The maximum numeric value for this priority range, which represents the + // least urgent task or shortest retained item. + MaxPriority int32 `protobuf:"varint,2,opt,name=max_priority,json=maxPriority,proto3" json:"max_priority,omitempty"` +} + +func (x *PriorityCapabilities_PriorityRange) Reset() { + *x = PriorityCapabilities_PriorityRange{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PriorityCapabilities_PriorityRange) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PriorityCapabilities_PriorityRange) ProtoMessage() {} + +func (x *PriorityCapabilities_PriorityRange) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PriorityCapabilities_PriorityRange.ProtoReflect.Descriptor instead. +func (*PriorityCapabilities_PriorityRange) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP(), []int{38, 0} +} + +func (x *PriorityCapabilities_PriorityRange) GetMinPriority() int32 { + if x != nil { + return x.MinPriority + } + return 0 +} + +func (x *PriorityCapabilities_PriorityRange) GetMaxPriority() int32 { + if x != nil { + return x.MaxPriority + } + return 0 +} + +var File_build_bazel_remote_execution_v2_remote_execution_proto protoreflect.FileDescriptor + +var file_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc = []byte{ + 0x0a, 0x36, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, + 0x32, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x1a, 0x1f, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x73, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x2f, 0x73, 0x65, + 0x6d, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, + 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0xeb, 0x02, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, + 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, + 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0d, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, + 0x11, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x52, 0x0f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x64, 0x6f, 0x5f, 0x6e, 0x6f, + 0x74, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, + 0x6f, 0x4e, 0x6f, 0x74, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x61, 0x6c, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x73, 0x61, 0x6c, 0x74, 0x12, 0x45, 0x0a, + 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x32, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, + 0x22, 0xd2, 0x05, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x71, 0x0a, 0x15, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x14, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x25, 0x0a, + 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x12, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x11, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x49, 0x0a, 0x08, 0x70, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x50, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x2b, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, + 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x34, 0x0a, 0x16, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x14, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x76, 0x0a, 0x17, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x15, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x1a, 0x3f, 0x0a, 0x13, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, + 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x52, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52, + 0x45, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x44, 0x49, 0x52, + 0x45, 0x43, 0x54, 0x4f, 0x52, 0x59, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x16, 0x0a, + 0x12, 0x54, 0x52, 0x45, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x59, 0x10, 0x02, 0x22, 0x94, 0x01, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, + 0x72, 0x6d, 0x12, 0x52, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, + 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xc8, 0x02, 0x0a, + 0x09, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x3f, 0x0a, 0x05, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x69, 0x6c, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x0b, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x32, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x0b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x48, 0x0a, + 0x08, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2c, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x32, 0x2e, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x73, + 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x58, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x38, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0xcc, 0x01, 0x0a, 0x0e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x4d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, + 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, + 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x08, 0x75, 0x6e, 0x69, 0x78, 0x4d, 0x6f, 0x64, 0x65, + 0x22, 0xea, 0x01, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x22, 0x64, 0x0a, + 0x0d, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x06, 0x64, 0x69, 0x67, + 0x65, 0x73, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x0b, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x58, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, + 0x3b, 0x0a, 0x06, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x61, 0x73, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0xfd, 0x07, 0x0a, + 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x12, + 0x45, 0x0a, 0x10, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x50, 0x0a, 0x16, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x58, 0x0a, 0x1a, 0x77, 0x6f, 0x72, 0x6b, + 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x18, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x59, 0x0a, 0x1b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x65, 0x74, 0x63, + 0x68, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x18, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x65, 0x74, 0x63, 0x68, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x61, 0x0a, + 0x1f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x1c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x65, 0x74, 0x63, 0x68, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x56, 0x0a, 0x19, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x17, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5e, 0x0a, 0x1d, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x1b, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x57, 0x0a, 0x1a, 0x76, 0x69, 0x72, 0x74, + 0x75, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x5d, 0x0a, 0x1d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x1a, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x65, 0x0a, 0x21, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x1e, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, 0x0a, 0x12, 0x61, 0x75, 0x78, 0x69, 0x6c, + 0x69, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0b, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x11, 0x61, 0x75, 0x78, 0x69, 0x6c, + 0x69, 0x61, 0x72, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd3, 0x06, 0x0a, + 0x0c, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x4e, 0x0a, + 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, + 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, + 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x64, 0x0a, + 0x14, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x79, 0x6d, + 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x12, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x79, 0x6d, 0x6c, 0x69, + 0x6e, 0x6b, 0x73, 0x12, 0x57, 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x73, 0x79, + 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x0e, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x5f, 0x0a, 0x12, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x11, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x6e, 0x0a, + 0x19, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x5f, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x32, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x17, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x73, 0x12, 0x1b, 0x0a, + 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x5f, 0x72, 0x61, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, + 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x52, 0x61, 0x77, 0x12, 0x4c, 0x0a, 0x0d, 0x73, 0x74, 0x64, + 0x6f, 0x75, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0c, 0x73, 0x74, 0x64, 0x6f, 0x75, + 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x64, 0x65, 0x72, + 0x72, 0x5f, 0x72, 0x61, 0x77, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x74, 0x64, + 0x65, 0x72, 0x72, 0x52, 0x61, 0x77, 0x12, 0x4c, 0x0a, 0x0d, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, + 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, + 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0c, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x44, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x12, 0x66, 0x0a, 0x12, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x37, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x32, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x4a, 0x04, 0x08, 0x01, + 0x10, 0x02, 0x22, 0x88, 0x02, 0x0a, 0x0a, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x3f, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, + 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x06, + 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, + 0x73, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x58, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0x8e, 0x01, + 0x0a, 0x04, 0x54, 0x72, 0x65, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, + 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, + 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x46, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x8a, + 0x02, 0x0a, 0x0f, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x48, 0x0a, 0x0b, 0x74, 0x72, 0x65, 0x65, 0x5f, 0x64, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x74, 0x72, 0x65, 0x65, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, + 0x12, 0x36, 0x0a, 0x17, 0x69, 0x73, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63, + 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x15, 0x69, 0x73, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x69, 0x63, 0x61, 0x6c, + 0x6c, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x12, 0x5b, 0x0a, 0x15, 0x72, 0x6f, 0x6f, 0x74, + 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, + 0x52, 0x13, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x44, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x9b, 0x01, 0x0a, 0x0d, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x58, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x2d, 0x0a, 0x0f, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x30, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0xe5, 0x03, 0x0a, 0x0e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, + 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x5f, 0x6c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x73, + 0x6b, 0x69, 0x70, 0x43, 0x61, 0x63, 0x68, 0x65, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x12, 0x4c, + 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, + 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0c, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x5b, 0x0a, 0x10, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, + 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x65, 0x0a, 0x14, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x12, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, + 0x10, 0x06, 0x22, 0x71, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x3f, 0x0a, + 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, + 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x25, + 0x0a, 0x0e, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x52, 0x65, 0x61, + 0x64, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x8f, 0x03, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x06, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x64, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, + 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x61, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x67, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, + 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, + 0x6f, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x67, + 0x0a, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x4c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x61, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x22, 0x4f, 0x0a, 0x05, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, + 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, + 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x04, 0x22, 0x88, 0x03, 0x0a, 0x18, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, + 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x67, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, + 0x64, 0x65, 0x72, 0x72, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x75, + 0x0a, 0x1a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x18, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x61, 0x6c, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2a, 0x0a, 0x14, 0x57, 0x61, 0x69, 0x74, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0xe5, 0x02, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x73, + 0x74, 0x64, 0x65, 0x72, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x53, 0x74, 0x64, 0x65, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x6c, + 0x69, 0x6e, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, + 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa9, 0x03, 0x0a, 0x19, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4c, 0x0a, 0x0d, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, + 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0c, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x52, 0x0a, 0x0d, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x65, + 0x0a, 0x14, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, + 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x52, 0x12, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, + 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x5f, + 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, + 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, + 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xea, 0x01, 0x0a, 0x17, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x64, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x62, 0x44, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x73, 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x75, 0x0a, 0x18, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, + 0x0a, 0x14, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x5f, 0x64, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x12, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x42, 0x6c, + 0x6f, 0x62, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x22, 0xb0, 0x03, 0x0a, 0x17, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5c, 0x0a, 0x08, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xb1, 0x01, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, + 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x06, 0x64, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x51, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0xf5, 0x01, 0x0a, + 0x18, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x62, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x09, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0x77, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, + 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0xc9, 0x02, 0x0a, 0x15, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, + 0x61, 0x64, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, + 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x07, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, + 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x52, 0x07, 0x64, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x12, 0x68, 0x0a, 0x16, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, + 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x61, 0x63, 0x63, 0x65, 0x70, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, + 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xd9, 0x02, 0x0a, 0x16, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x61, 0x64, 0x42, 0x6c, + 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x09, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, + 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, + 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x61, 0x64, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x1a, 0xde, 0x01, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x64, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x52, 0x06, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x51, 0x0a, + 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x9b, 0x02, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x67, + 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x52, 0x0a, 0x72, 0x6f, 0x6f, 0x74, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, + 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x87, 0x01, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, + 0x0a, 0x0b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, + 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x0b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3d, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, + 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0xc2, 0x03, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x12, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, + 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x11, 0x63, 0x61, 0x63, 0x68, + 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x6d, 0x0a, + 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36, 0x2e, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x15, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x16, + 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x73, 0x65, 0x6d, 0x76, 0x65, + 0x72, 0x2e, 0x53, 0x65, 0x6d, 0x56, 0x65, 0x72, 0x52, 0x14, 0x64, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x42, + 0x0a, 0x0f, 0x6c, 0x6f, 0x77, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x73, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x6d, + 0x56, 0x65, 0x72, 0x52, 0x0d, 0x6c, 0x6f, 0x77, 0x41, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x10, 0x68, 0x69, 0x67, 0x68, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x73, 0x65, 0x6d, 0x76, 0x65, + 0x72, 0x2e, 0x53, 0x65, 0x6d, 0x56, 0x65, 0x72, 0x52, 0x0e, 0x68, 0x69, 0x67, 0x68, 0x41, 0x70, + 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x8f, 0x01, 0x0a, 0x0e, 0x44, 0x69, 0x67, + 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7d, 0x0a, 0x05, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x01, 0x12, 0x08, 0x0a, + 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x03, + 0x12, 0x07, 0x0a, 0x03, 0x56, 0x53, 0x4f, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x48, 0x41, + 0x33, 0x38, 0x34, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, + 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x07, 0x12, 0x0e, + 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x54, 0x52, 0x45, 0x45, 0x10, 0x08, 0x12, 0x0a, + 0x0a, 0x06, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x33, 0x10, 0x09, 0x22, 0x46, 0x0a, 0x1d, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x22, 0xd2, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, + 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x63, 0x0a, 0x0a, 0x70, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x43, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x32, 0x2e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x1a, 0x55, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x50, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x69, 0x6f, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x50, + 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x50, 0x0a, 0x1b, 0x53, 0x79, 0x6d, 0x6c, 0x69, + 0x6e, 0x6b, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x31, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, + 0x44, 0x49, 0x53, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, + 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, 0x02, 0x22, 0x46, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x22, 0x38, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x10, 0x00, 0x12, 0x08, + 0x0a, 0x04, 0x5a, 0x53, 0x54, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x4c, + 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x52, 0x4f, 0x54, 0x4c, 0x49, 0x10, + 0x03, 0x22, 0xa4, 0x06, 0x0a, 0x11, 0x43, 0x61, 0x63, 0x68, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x60, 0x0a, 0x10, 0x64, 0x69, 0x67, 0x65, 0x73, + 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, + 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x20, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, + 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x1d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x75, 0x0a, 0x1b, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x70, 0x72, 0x69, + 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x50, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x19, 0x63, 0x61, 0x63, 0x68, 0x65, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, 0x61, + 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x1a, 0x6d, 0x61, + 0x78, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, + 0x6d, 0x61, 0x78, 0x42, 0x61, 0x74, 0x63, 0x68, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x69, 0x7a, + 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x87, 0x01, 0x0a, 0x1e, 0x73, 0x79, 0x6d, 0x6c, 0x69, + 0x6e, 0x6b, 0x5f, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x42, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x32, 0x2e, 0x53, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x2e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x1b, 0x73, 0x79, 0x6d, 0x6c, 0x69, 0x6e, 0x6b, 0x41, 0x62, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, + 0x12, 0x66, 0x0a, 0x15, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, + 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x14, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x7e, 0x0a, 0x22, 0x73, 0x75, 0x70, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, + 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1f, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x22, 0xb7, 0x03, 0x0a, 0x15, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x12, 0x5e, 0x0a, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, + 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x0e, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x65, 0x78, 0x65, 0x63, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x7d, 0x0a, 0x1f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, + 0x2e, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x1d, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x12, 0x60, 0x0a, 0x10, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x44, 0x69, 0x67, + 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x0f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x4d, 0x0a, 0x0b, 0x54, 0x6f, 0x6f, 0x6c, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x6f, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, + 0x0a, 0x0c, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x6f, 0x6f, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0xda, 0x02, 0x0a, 0x0f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x4f, 0x0a, 0x0c, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x54, 0x6f, + 0x6f, 0x6c, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x0b, 0x74, 0x6f, 0x6f, 0x6c, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x6f, 0x6f, 0x6c, 0x5f, 0x69, 0x6e, 0x76, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x74, 0x6f, 0x6f, 0x6c, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x69, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x69, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, + 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x12, 0x27, 0x0a, + 0x0f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6e, 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6e, + 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x49, 0x64, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x32, 0xb9, + 0x02, 0x0a, 0x09, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x8e, 0x01, 0x0a, + 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, + 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x3a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x30, 0x01, 0x12, 0x9a, 0x01, + 0x0a, 0x0d, 0x57, 0x61, 0x69, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x35, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x32, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, + 0x22, 0x26, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x2a, 0x7d, 0x3a, 0x77, 0x61, 0x69, 0x74, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x30, 0x01, 0x32, 0xd6, 0x03, 0x0a, 0x0b, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0xd7, 0x01, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x37, + 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x5c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x56, 0x12, 0x54, + 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x67, + 0x65, 0x73, 0x74, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x7d, 0x2f, 0x7b, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x7d, 0x12, 0xec, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x3a, 0x2e, 0x62, 0x75, + 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x65, 0x3a, 0x0d, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x54, 0x2f, + 0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x2f, 0x7b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x7d, 0x2f, 0x7b, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x2e, 0x73, 0x69, 0x7a, 0x65, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x7d, 0x32, 0x9b, 0x06, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x12, 0xbc, 0x01, 0x0a, 0x10, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x38, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, + 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x39, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x32, 0x2e, 0x46, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x42, 0x6c, + 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x62, + 0x6c, 0x6f, 0x62, 0x73, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x12, 0xbc, 0x01, 0x0a, 0x10, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x12, 0x38, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, + 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x39, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x32, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x6c, 0x6f, + 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x62, 0x6c, + 0x6f, 0x62, 0x73, 0x3a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0xb4, 0x01, 0x0a, 0x0e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x61, 0x64, 0x42, 0x6c, 0x6f, + 0x62, 0x73, 0x12, 0x36, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x61, 0x64, 0x42, 0x6c, + 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x42, 0x61, 0x74, + 0x63, 0x68, 0x52, 0x65, 0x61, 0x64, 0x42, 0x6c, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, + 0x2f, 0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x3a, 0x62, 0x61, 0x74, + 0x63, 0x68, 0x52, 0x65, 0x61, 0x64, 0x12, 0xc8, 0x01, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x72, + 0x65, 0x65, 0x12, 0x2f, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, + 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x58, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x52, 0x12, 0x50, 0x2f, + 0x76, 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x73, 0x2f, 0x7b, 0x72, 0x6f, 0x6f, + 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x2e, 0x68, 0x61, 0x73, 0x68, 0x7d, 0x2f, 0x7b, + 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x2e, 0x73, 0x69, 0x7a, 0x65, + 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x7d, 0x3a, 0x67, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x30, + 0x01, 0x32, 0xbd, 0x01, 0x0a, 0x0c, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x12, 0xac, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x37, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, + 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x61, 0x70, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x33, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x32, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f, 0x76, + 0x32, 0x2f, 0x7b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x3d, 0x2a, 0x2a, 0x7d, 0x2f, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x42, 0xb4, 0x01, 0x0a, 0x1f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, + 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x32, 0x42, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x51, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x73, + 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x32, + 0x3b, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0xa2, 0x02, 0x03, 0x52, 0x45, 0x58, 0xaa, 0x02, 0x1f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x42, + 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x32, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescOnce sync.Once + file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescData = file_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc +) + +func file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescGZIP() []byte { + file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescOnce.Do(func() { + file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescData = protoimpl.X.CompressGZIP(file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescData) + }) + return file_build_bazel_remote_execution_v2_remote_execution_proto_rawDescData +} + +var file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes = make([]protoimpl.MessageInfo, 52) +var file_build_bazel_remote_execution_v2_remote_execution_proto_goTypes = []interface{}{ + (Command_OutputDirectoryFormat)(0), // 0: build.bazel.remote.execution.v2.Command.OutputDirectoryFormat + (ExecutionStage_Value)(0), // 1: build.bazel.remote.execution.v2.ExecutionStage.Value + (DigestFunction_Value)(0), // 2: build.bazel.remote.execution.v2.DigestFunction.Value + (SymlinkAbsolutePathStrategy_Value)(0), // 3: build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy.Value + (Compressor_Value)(0), // 4: build.bazel.remote.execution.v2.Compressor.Value + (*Action)(nil), // 5: build.bazel.remote.execution.v2.Action + (*Command)(nil), // 6: build.bazel.remote.execution.v2.Command + (*Platform)(nil), // 7: build.bazel.remote.execution.v2.Platform + (*Directory)(nil), // 8: build.bazel.remote.execution.v2.Directory + (*NodeProperty)(nil), // 9: build.bazel.remote.execution.v2.NodeProperty + (*NodeProperties)(nil), // 10: build.bazel.remote.execution.v2.NodeProperties + (*FileNode)(nil), // 11: build.bazel.remote.execution.v2.FileNode + (*DirectoryNode)(nil), // 12: build.bazel.remote.execution.v2.DirectoryNode + (*SymlinkNode)(nil), // 13: build.bazel.remote.execution.v2.SymlinkNode + (*Digest)(nil), // 14: build.bazel.remote.execution.v2.Digest + (*ExecutedActionMetadata)(nil), // 15: build.bazel.remote.execution.v2.ExecutedActionMetadata + (*ActionResult)(nil), // 16: build.bazel.remote.execution.v2.ActionResult + (*OutputFile)(nil), // 17: build.bazel.remote.execution.v2.OutputFile + (*Tree)(nil), // 18: build.bazel.remote.execution.v2.Tree + (*OutputDirectory)(nil), // 19: build.bazel.remote.execution.v2.OutputDirectory + (*OutputSymlink)(nil), // 20: build.bazel.remote.execution.v2.OutputSymlink + (*ExecutionPolicy)(nil), // 21: build.bazel.remote.execution.v2.ExecutionPolicy + (*ResultsCachePolicy)(nil), // 22: build.bazel.remote.execution.v2.ResultsCachePolicy + (*ExecuteRequest)(nil), // 23: build.bazel.remote.execution.v2.ExecuteRequest + (*LogFile)(nil), // 24: build.bazel.remote.execution.v2.LogFile + (*ExecuteResponse)(nil), // 25: build.bazel.remote.execution.v2.ExecuteResponse + (*ExecutionStage)(nil), // 26: build.bazel.remote.execution.v2.ExecutionStage + (*ExecuteOperationMetadata)(nil), // 27: build.bazel.remote.execution.v2.ExecuteOperationMetadata + (*WaitExecutionRequest)(nil), // 28: build.bazel.remote.execution.v2.WaitExecutionRequest + (*GetActionResultRequest)(nil), // 29: build.bazel.remote.execution.v2.GetActionResultRequest + (*UpdateActionResultRequest)(nil), // 30: build.bazel.remote.execution.v2.UpdateActionResultRequest + (*FindMissingBlobsRequest)(nil), // 31: build.bazel.remote.execution.v2.FindMissingBlobsRequest + (*FindMissingBlobsResponse)(nil), // 32: build.bazel.remote.execution.v2.FindMissingBlobsResponse + (*BatchUpdateBlobsRequest)(nil), // 33: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest + (*BatchUpdateBlobsResponse)(nil), // 34: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse + (*BatchReadBlobsRequest)(nil), // 35: build.bazel.remote.execution.v2.BatchReadBlobsRequest + (*BatchReadBlobsResponse)(nil), // 36: build.bazel.remote.execution.v2.BatchReadBlobsResponse + (*GetTreeRequest)(nil), // 37: build.bazel.remote.execution.v2.GetTreeRequest + (*GetTreeResponse)(nil), // 38: build.bazel.remote.execution.v2.GetTreeResponse + (*GetCapabilitiesRequest)(nil), // 39: build.bazel.remote.execution.v2.GetCapabilitiesRequest + (*ServerCapabilities)(nil), // 40: build.bazel.remote.execution.v2.ServerCapabilities + (*DigestFunction)(nil), // 41: build.bazel.remote.execution.v2.DigestFunction + (*ActionCacheUpdateCapabilities)(nil), // 42: build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities + (*PriorityCapabilities)(nil), // 43: build.bazel.remote.execution.v2.PriorityCapabilities + (*SymlinkAbsolutePathStrategy)(nil), // 44: build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy + (*Compressor)(nil), // 45: build.bazel.remote.execution.v2.Compressor + (*CacheCapabilities)(nil), // 46: build.bazel.remote.execution.v2.CacheCapabilities + (*ExecutionCapabilities)(nil), // 47: build.bazel.remote.execution.v2.ExecutionCapabilities + (*ToolDetails)(nil), // 48: build.bazel.remote.execution.v2.ToolDetails + (*RequestMetadata)(nil), // 49: build.bazel.remote.execution.v2.RequestMetadata + (*Command_EnvironmentVariable)(nil), // 50: build.bazel.remote.execution.v2.Command.EnvironmentVariable + (*Platform_Property)(nil), // 51: build.bazel.remote.execution.v2.Platform.Property + nil, // 52: build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry + (*BatchUpdateBlobsRequest_Request)(nil), // 53: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request + (*BatchUpdateBlobsResponse_Response)(nil), // 54: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response + (*BatchReadBlobsResponse_Response)(nil), // 55: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response + (*PriorityCapabilities_PriorityRange)(nil), // 56: build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange + (*durationpb.Duration)(nil), // 57: google.protobuf.Duration + (*timestamppb.Timestamp)(nil), // 58: google.protobuf.Timestamp + (*wrapperspb.UInt32Value)(nil), // 59: google.protobuf.UInt32Value + (*anypb.Any)(nil), // 60: google.protobuf.Any + (*status.Status)(nil), // 61: google.rpc.Status + (*semver.SemVer)(nil), // 62: build.bazel.semver.SemVer + (*longrunning.Operation)(nil), // 63: google.longrunning.Operation +} +var file_build_bazel_remote_execution_v2_remote_execution_proto_depIdxs = []int32{ + 14, // 0: build.bazel.remote.execution.v2.Action.command_digest:type_name -> build.bazel.remote.execution.v2.Digest + 14, // 1: build.bazel.remote.execution.v2.Action.input_root_digest:type_name -> build.bazel.remote.execution.v2.Digest + 57, // 2: build.bazel.remote.execution.v2.Action.timeout:type_name -> google.protobuf.Duration + 7, // 3: build.bazel.remote.execution.v2.Action.platform:type_name -> build.bazel.remote.execution.v2.Platform + 50, // 4: build.bazel.remote.execution.v2.Command.environment_variables:type_name -> build.bazel.remote.execution.v2.Command.EnvironmentVariable + 7, // 5: build.bazel.remote.execution.v2.Command.platform:type_name -> build.bazel.remote.execution.v2.Platform + 0, // 6: build.bazel.remote.execution.v2.Command.output_directory_format:type_name -> build.bazel.remote.execution.v2.Command.OutputDirectoryFormat + 51, // 7: build.bazel.remote.execution.v2.Platform.properties:type_name -> build.bazel.remote.execution.v2.Platform.Property + 11, // 8: build.bazel.remote.execution.v2.Directory.files:type_name -> build.bazel.remote.execution.v2.FileNode + 12, // 9: build.bazel.remote.execution.v2.Directory.directories:type_name -> build.bazel.remote.execution.v2.DirectoryNode + 13, // 10: build.bazel.remote.execution.v2.Directory.symlinks:type_name -> build.bazel.remote.execution.v2.SymlinkNode + 10, // 11: build.bazel.remote.execution.v2.Directory.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties + 9, // 12: build.bazel.remote.execution.v2.NodeProperties.properties:type_name -> build.bazel.remote.execution.v2.NodeProperty + 58, // 13: build.bazel.remote.execution.v2.NodeProperties.mtime:type_name -> google.protobuf.Timestamp + 59, // 14: build.bazel.remote.execution.v2.NodeProperties.unix_mode:type_name -> google.protobuf.UInt32Value + 14, // 15: build.bazel.remote.execution.v2.FileNode.digest:type_name -> build.bazel.remote.execution.v2.Digest + 10, // 16: build.bazel.remote.execution.v2.FileNode.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties + 14, // 17: build.bazel.remote.execution.v2.DirectoryNode.digest:type_name -> build.bazel.remote.execution.v2.Digest + 10, // 18: build.bazel.remote.execution.v2.SymlinkNode.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties + 58, // 19: build.bazel.remote.execution.v2.ExecutedActionMetadata.queued_timestamp:type_name -> google.protobuf.Timestamp + 58, // 20: build.bazel.remote.execution.v2.ExecutedActionMetadata.worker_start_timestamp:type_name -> google.protobuf.Timestamp + 58, // 21: build.bazel.remote.execution.v2.ExecutedActionMetadata.worker_completed_timestamp:type_name -> google.protobuf.Timestamp + 58, // 22: build.bazel.remote.execution.v2.ExecutedActionMetadata.input_fetch_start_timestamp:type_name -> google.protobuf.Timestamp + 58, // 23: build.bazel.remote.execution.v2.ExecutedActionMetadata.input_fetch_completed_timestamp:type_name -> google.protobuf.Timestamp + 58, // 24: build.bazel.remote.execution.v2.ExecutedActionMetadata.execution_start_timestamp:type_name -> google.protobuf.Timestamp + 58, // 25: build.bazel.remote.execution.v2.ExecutedActionMetadata.execution_completed_timestamp:type_name -> google.protobuf.Timestamp + 57, // 26: build.bazel.remote.execution.v2.ExecutedActionMetadata.virtual_execution_duration:type_name -> google.protobuf.Duration + 58, // 27: build.bazel.remote.execution.v2.ExecutedActionMetadata.output_upload_start_timestamp:type_name -> google.protobuf.Timestamp + 58, // 28: build.bazel.remote.execution.v2.ExecutedActionMetadata.output_upload_completed_timestamp:type_name -> google.protobuf.Timestamp + 60, // 29: build.bazel.remote.execution.v2.ExecutedActionMetadata.auxiliary_metadata:type_name -> google.protobuf.Any + 17, // 30: build.bazel.remote.execution.v2.ActionResult.output_files:type_name -> build.bazel.remote.execution.v2.OutputFile + 20, // 31: build.bazel.remote.execution.v2.ActionResult.output_file_symlinks:type_name -> build.bazel.remote.execution.v2.OutputSymlink + 20, // 32: build.bazel.remote.execution.v2.ActionResult.output_symlinks:type_name -> build.bazel.remote.execution.v2.OutputSymlink + 19, // 33: build.bazel.remote.execution.v2.ActionResult.output_directories:type_name -> build.bazel.remote.execution.v2.OutputDirectory + 20, // 34: build.bazel.remote.execution.v2.ActionResult.output_directory_symlinks:type_name -> build.bazel.remote.execution.v2.OutputSymlink + 14, // 35: build.bazel.remote.execution.v2.ActionResult.stdout_digest:type_name -> build.bazel.remote.execution.v2.Digest + 14, // 36: build.bazel.remote.execution.v2.ActionResult.stderr_digest:type_name -> build.bazel.remote.execution.v2.Digest + 15, // 37: build.bazel.remote.execution.v2.ActionResult.execution_metadata:type_name -> build.bazel.remote.execution.v2.ExecutedActionMetadata + 14, // 38: build.bazel.remote.execution.v2.OutputFile.digest:type_name -> build.bazel.remote.execution.v2.Digest + 10, // 39: build.bazel.remote.execution.v2.OutputFile.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties + 8, // 40: build.bazel.remote.execution.v2.Tree.root:type_name -> build.bazel.remote.execution.v2.Directory + 8, // 41: build.bazel.remote.execution.v2.Tree.children:type_name -> build.bazel.remote.execution.v2.Directory + 14, // 42: build.bazel.remote.execution.v2.OutputDirectory.tree_digest:type_name -> build.bazel.remote.execution.v2.Digest + 14, // 43: build.bazel.remote.execution.v2.OutputDirectory.root_directory_digest:type_name -> build.bazel.remote.execution.v2.Digest + 10, // 44: build.bazel.remote.execution.v2.OutputSymlink.node_properties:type_name -> build.bazel.remote.execution.v2.NodeProperties + 14, // 45: build.bazel.remote.execution.v2.ExecuteRequest.action_digest:type_name -> build.bazel.remote.execution.v2.Digest + 21, // 46: build.bazel.remote.execution.v2.ExecuteRequest.execution_policy:type_name -> build.bazel.remote.execution.v2.ExecutionPolicy + 22, // 47: build.bazel.remote.execution.v2.ExecuteRequest.results_cache_policy:type_name -> build.bazel.remote.execution.v2.ResultsCachePolicy + 2, // 48: build.bazel.remote.execution.v2.ExecuteRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 14, // 49: build.bazel.remote.execution.v2.LogFile.digest:type_name -> build.bazel.remote.execution.v2.Digest + 16, // 50: build.bazel.remote.execution.v2.ExecuteResponse.result:type_name -> build.bazel.remote.execution.v2.ActionResult + 61, // 51: build.bazel.remote.execution.v2.ExecuteResponse.status:type_name -> google.rpc.Status + 52, // 52: build.bazel.remote.execution.v2.ExecuteResponse.server_logs:type_name -> build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry + 1, // 53: build.bazel.remote.execution.v2.ExecuteOperationMetadata.stage:type_name -> build.bazel.remote.execution.v2.ExecutionStage.Value + 14, // 54: build.bazel.remote.execution.v2.ExecuteOperationMetadata.action_digest:type_name -> build.bazel.remote.execution.v2.Digest + 15, // 55: build.bazel.remote.execution.v2.ExecuteOperationMetadata.partial_execution_metadata:type_name -> build.bazel.remote.execution.v2.ExecutedActionMetadata + 14, // 56: build.bazel.remote.execution.v2.GetActionResultRequest.action_digest:type_name -> build.bazel.remote.execution.v2.Digest + 2, // 57: build.bazel.remote.execution.v2.GetActionResultRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 14, // 58: build.bazel.remote.execution.v2.UpdateActionResultRequest.action_digest:type_name -> build.bazel.remote.execution.v2.Digest + 16, // 59: build.bazel.remote.execution.v2.UpdateActionResultRequest.action_result:type_name -> build.bazel.remote.execution.v2.ActionResult + 22, // 60: build.bazel.remote.execution.v2.UpdateActionResultRequest.results_cache_policy:type_name -> build.bazel.remote.execution.v2.ResultsCachePolicy + 2, // 61: build.bazel.remote.execution.v2.UpdateActionResultRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 14, // 62: build.bazel.remote.execution.v2.FindMissingBlobsRequest.blob_digests:type_name -> build.bazel.remote.execution.v2.Digest + 2, // 63: build.bazel.remote.execution.v2.FindMissingBlobsRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 14, // 64: build.bazel.remote.execution.v2.FindMissingBlobsResponse.missing_blob_digests:type_name -> build.bazel.remote.execution.v2.Digest + 53, // 65: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.requests:type_name -> build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request + 2, // 66: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 54, // 67: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.responses:type_name -> build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response + 14, // 68: build.bazel.remote.execution.v2.BatchReadBlobsRequest.digests:type_name -> build.bazel.remote.execution.v2.Digest + 4, // 69: build.bazel.remote.execution.v2.BatchReadBlobsRequest.acceptable_compressors:type_name -> build.bazel.remote.execution.v2.Compressor.Value + 2, // 70: build.bazel.remote.execution.v2.BatchReadBlobsRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 55, // 71: build.bazel.remote.execution.v2.BatchReadBlobsResponse.responses:type_name -> build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response + 14, // 72: build.bazel.remote.execution.v2.GetTreeRequest.root_digest:type_name -> build.bazel.remote.execution.v2.Digest + 2, // 73: build.bazel.remote.execution.v2.GetTreeRequest.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 8, // 74: build.bazel.remote.execution.v2.GetTreeResponse.directories:type_name -> build.bazel.remote.execution.v2.Directory + 46, // 75: build.bazel.remote.execution.v2.ServerCapabilities.cache_capabilities:type_name -> build.bazel.remote.execution.v2.CacheCapabilities + 47, // 76: build.bazel.remote.execution.v2.ServerCapabilities.execution_capabilities:type_name -> build.bazel.remote.execution.v2.ExecutionCapabilities + 62, // 77: build.bazel.remote.execution.v2.ServerCapabilities.deprecated_api_version:type_name -> build.bazel.semver.SemVer + 62, // 78: build.bazel.remote.execution.v2.ServerCapabilities.low_api_version:type_name -> build.bazel.semver.SemVer + 62, // 79: build.bazel.remote.execution.v2.ServerCapabilities.high_api_version:type_name -> build.bazel.semver.SemVer + 56, // 80: build.bazel.remote.execution.v2.PriorityCapabilities.priorities:type_name -> build.bazel.remote.execution.v2.PriorityCapabilities.PriorityRange + 2, // 81: build.bazel.remote.execution.v2.CacheCapabilities.digest_functions:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 42, // 82: build.bazel.remote.execution.v2.CacheCapabilities.action_cache_update_capabilities:type_name -> build.bazel.remote.execution.v2.ActionCacheUpdateCapabilities + 43, // 83: build.bazel.remote.execution.v2.CacheCapabilities.cache_priority_capabilities:type_name -> build.bazel.remote.execution.v2.PriorityCapabilities + 3, // 84: build.bazel.remote.execution.v2.CacheCapabilities.symlink_absolute_path_strategy:type_name -> build.bazel.remote.execution.v2.SymlinkAbsolutePathStrategy.Value + 4, // 85: build.bazel.remote.execution.v2.CacheCapabilities.supported_compressors:type_name -> build.bazel.remote.execution.v2.Compressor.Value + 4, // 86: build.bazel.remote.execution.v2.CacheCapabilities.supported_batch_update_compressors:type_name -> build.bazel.remote.execution.v2.Compressor.Value + 2, // 87: build.bazel.remote.execution.v2.ExecutionCapabilities.digest_function:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 43, // 88: build.bazel.remote.execution.v2.ExecutionCapabilities.execution_priority_capabilities:type_name -> build.bazel.remote.execution.v2.PriorityCapabilities + 2, // 89: build.bazel.remote.execution.v2.ExecutionCapabilities.digest_functions:type_name -> build.bazel.remote.execution.v2.DigestFunction.Value + 48, // 90: build.bazel.remote.execution.v2.RequestMetadata.tool_details:type_name -> build.bazel.remote.execution.v2.ToolDetails + 24, // 91: build.bazel.remote.execution.v2.ExecuteResponse.ServerLogsEntry.value:type_name -> build.bazel.remote.execution.v2.LogFile + 14, // 92: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request.digest:type_name -> build.bazel.remote.execution.v2.Digest + 4, // 93: build.bazel.remote.execution.v2.BatchUpdateBlobsRequest.Request.compressor:type_name -> build.bazel.remote.execution.v2.Compressor.Value + 14, // 94: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response.digest:type_name -> build.bazel.remote.execution.v2.Digest + 61, // 95: build.bazel.remote.execution.v2.BatchUpdateBlobsResponse.Response.status:type_name -> google.rpc.Status + 14, // 96: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.digest:type_name -> build.bazel.remote.execution.v2.Digest + 4, // 97: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.compressor:type_name -> build.bazel.remote.execution.v2.Compressor.Value + 61, // 98: build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response.status:type_name -> google.rpc.Status + 23, // 99: build.bazel.remote.execution.v2.Execution.Execute:input_type -> build.bazel.remote.execution.v2.ExecuteRequest + 28, // 100: build.bazel.remote.execution.v2.Execution.WaitExecution:input_type -> build.bazel.remote.execution.v2.WaitExecutionRequest + 29, // 101: build.bazel.remote.execution.v2.ActionCache.GetActionResult:input_type -> build.bazel.remote.execution.v2.GetActionResultRequest + 30, // 102: build.bazel.remote.execution.v2.ActionCache.UpdateActionResult:input_type -> build.bazel.remote.execution.v2.UpdateActionResultRequest + 31, // 103: build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs:input_type -> build.bazel.remote.execution.v2.FindMissingBlobsRequest + 33, // 104: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs:input_type -> build.bazel.remote.execution.v2.BatchUpdateBlobsRequest + 35, // 105: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs:input_type -> build.bazel.remote.execution.v2.BatchReadBlobsRequest + 37, // 106: build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree:input_type -> build.bazel.remote.execution.v2.GetTreeRequest + 39, // 107: build.bazel.remote.execution.v2.Capabilities.GetCapabilities:input_type -> build.bazel.remote.execution.v2.GetCapabilitiesRequest + 63, // 108: build.bazel.remote.execution.v2.Execution.Execute:output_type -> google.longrunning.Operation + 63, // 109: build.bazel.remote.execution.v2.Execution.WaitExecution:output_type -> google.longrunning.Operation + 16, // 110: build.bazel.remote.execution.v2.ActionCache.GetActionResult:output_type -> build.bazel.remote.execution.v2.ActionResult + 16, // 111: build.bazel.remote.execution.v2.ActionCache.UpdateActionResult:output_type -> build.bazel.remote.execution.v2.ActionResult + 32, // 112: build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs:output_type -> build.bazel.remote.execution.v2.FindMissingBlobsResponse + 34, // 113: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs:output_type -> build.bazel.remote.execution.v2.BatchUpdateBlobsResponse + 36, // 114: build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs:output_type -> build.bazel.remote.execution.v2.BatchReadBlobsResponse + 38, // 115: build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree:output_type -> build.bazel.remote.execution.v2.GetTreeResponse + 40, // 116: build.bazel.remote.execution.v2.Capabilities.GetCapabilities:output_type -> build.bazel.remote.execution.v2.ServerCapabilities + 108, // [108:117] is the sub-list for method output_type + 99, // [99:108] is the sub-list for method input_type + 99, // [99:99] is the sub-list for extension type_name + 99, // [99:99] is the sub-list for extension extendee + 0, // [0:99] is the sub-list for field type_name +} + +func init() { file_build_bazel_remote_execution_v2_remote_execution_proto_init() } +func file_build_bazel_remote_execution_v2_remote_execution_proto_init() { + if File_build_bazel_remote_execution_v2_remote_execution_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Action); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Command); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Platform); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Directory); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeProperty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NodeProperties); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FileNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DirectoryNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SymlinkNode); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Digest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecutedActionMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActionResult); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OutputFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Tree); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OutputDirectory); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*OutputSymlink); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecutionPolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResultsCachePolicy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecuteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LogFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecuteResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecutionStage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecuteOperationMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WaitExecutionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetActionResultRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateActionResultRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FindMissingBlobsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FindMissingBlobsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchUpdateBlobsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchUpdateBlobsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchReadBlobsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchReadBlobsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTreeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTreeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetCapabilitiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ServerCapabilities); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DigestFunction); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActionCacheUpdateCapabilities); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PriorityCapabilities); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SymlinkAbsolutePathStrategy); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Compressor); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CacheCapabilities); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecutionCapabilities); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ToolDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RequestMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Command_EnvironmentVariable); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Platform_Property); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchUpdateBlobsRequest_Request); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchUpdateBlobsResponse_Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BatchReadBlobsResponse_Response); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PriorityCapabilities_PriorityRange); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc, + NumEnums: 5, + NumMessages: 52, + NumExtensions: 0, + NumServices: 4, + }, + GoTypes: file_build_bazel_remote_execution_v2_remote_execution_proto_goTypes, + DependencyIndexes: file_build_bazel_remote_execution_v2_remote_execution_proto_depIdxs, + EnumInfos: file_build_bazel_remote_execution_v2_remote_execution_proto_enumTypes, + MessageInfos: file_build_bazel_remote_execution_v2_remote_execution_proto_msgTypes, + }.Build() + File_build_bazel_remote_execution_v2_remote_execution_proto = out.File + file_build_bazel_remote_execution_v2_remote_execution_proto_rawDesc = nil + file_build_bazel_remote_execution_v2_remote_execution_proto_goTypes = nil + file_build_bazel_remote_execution_v2_remote_execution_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// ExecutionClient is the client API for Execution service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ExecutionClient interface { + // Execute an action remotely. + // + // In order to execute an action, the client must first upload all of the + // inputs, the + // [Command][build.bazel.remote.execution.v2.Command] to run, and the + // [Action][build.bazel.remote.execution.v2.Action] into the + // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. + // It then calls `Execute` with an `action_digest` referring to them. The + // server will run the action and eventually return the result. + // + // The input `Action`'s fields MUST meet the various canonicalization + // requirements specified in the documentation for their types so that it has + // the same digest as other logically equivalent `Action`s. The server MAY + // enforce the requirements and return errors if a non-canonical input is + // received. It MAY also proceed without verifying some or all of the + // requirements, such as for performance reasons. If the server does not + // verify the requirement, then it will treat the `Action` as distinct from + // another logically equivalent action if they hash differently. + // + // Returns a stream of + // [google.longrunning.Operation][google.longrunning.Operation] messages + // describing the resulting execution, with eventual `response` + // [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The + // `metadata` on the operation is of type + // [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata]. + // + // If the client remains connected after the first response is returned after + // the server, then updates are streamed as if the client had called + // [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution] + // until the execution completes or the request reaches an error. The + // operation can also be queried using [Operations + // API][google.longrunning.Operations.GetOperation]. + // + // The server NEED NOT implement other methods or functionality of the + // Operations API. + // + // Errors discovered during creation of the `Operation` will be reported + // as gRPC Status errors, while errors that occurred while running the + // action will be reported in the `status` field of the `ExecuteResponse`. The + // server MUST NOT set the `error` field of the `Operation` proto. + // The possible errors include: + // + // - `INVALID_ARGUMENT`: One or more arguments are invalid. + // - `FAILED_PRECONDITION`: One or more errors occurred in setting up the + // action requested, such as a missing input or command or no worker being + // available. The client may be able to fix the errors and retry. + // - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run + // the action. + // - `UNAVAILABLE`: Due to a transient condition, such as all workers being + // occupied (and the server does not support a queue), the action could not + // be started. The client should retry. + // - `INTERNAL`: An internal error occurred in the execution engine or the + // worker. + // - `DEADLINE_EXCEEDED`: The execution timed out. + // - `CANCELLED`: The operation was cancelled by the client. This status is + // only possible if the server implements the Operations API CancelOperation + // method, and it was called for the current execution. + // + // In the case of a missing input or command, the server SHOULD additionally + // send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail + // where, for each requested blob not present in the CAS, there is a + // `Violation` with a `type` of `MISSING` and a `subject` of + // `"blobs/{digest_function/}{hash}/{size}"` indicating the digest of the + // missing blob. The `subject` is formatted the same way as the + // `resource_name` provided to + // [ByteStream.Read][google.bytestream.ByteStream.Read], with the leading + // instance name omitted. `digest_function` MUST thus be omitted if its value + // is one of MD5, MURMUR3, SHA1, SHA256, SHA384, SHA512, or VSO. + // + // The server does not need to guarantee that a call to this method leads to + // at most one execution of the action. The server MAY execute the action + // multiple times, potentially in parallel. These redundant executions MAY + // continue to run, even if the operation is completed. + Execute(ctx context.Context, in *ExecuteRequest, opts ...grpc.CallOption) (Execution_ExecuteClient, error) + // Wait for an execution operation to complete. When the client initially + // makes the request, the server immediately responds with the current status + // of the execution. The server will leave the request stream open until the + // operation completes, and then respond with the completed operation. The + // server MAY choose to stream additional updates as execution progresses, + // such as to provide an update as to the state of the execution. + // + // In addition to the cases describe for Execute, the WaitExecution method + // may fail as follows: + // + // - `NOT_FOUND`: The operation no longer exists due to any of a transient + // condition, an unknown operation name, or if the server implements the + // Operations API DeleteOperation method and it was called for the current + // execution. The client should call `Execute` to retry. + WaitExecution(ctx context.Context, in *WaitExecutionRequest, opts ...grpc.CallOption) (Execution_WaitExecutionClient, error) +} + +type executionClient struct { + cc grpc.ClientConnInterface +} + +func NewExecutionClient(cc grpc.ClientConnInterface) ExecutionClient { + return &executionClient{cc} +} + +func (c *executionClient) Execute(ctx context.Context, in *ExecuteRequest, opts ...grpc.CallOption) (Execution_ExecuteClient, error) { + stream, err := c.cc.NewStream(ctx, &_Execution_serviceDesc.Streams[0], "/build.bazel.remote.execution.v2.Execution/Execute", opts...) + if err != nil { + return nil, err + } + x := &executionExecuteClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Execution_ExecuteClient interface { + Recv() (*longrunning.Operation, error) + grpc.ClientStream +} + +type executionExecuteClient struct { + grpc.ClientStream +} + +func (x *executionExecuteClient) Recv() (*longrunning.Operation, error) { + m := new(longrunning.Operation) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *executionClient) WaitExecution(ctx context.Context, in *WaitExecutionRequest, opts ...grpc.CallOption) (Execution_WaitExecutionClient, error) { + stream, err := c.cc.NewStream(ctx, &_Execution_serviceDesc.Streams[1], "/build.bazel.remote.execution.v2.Execution/WaitExecution", opts...) + if err != nil { + return nil, err + } + x := &executionWaitExecutionClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Execution_WaitExecutionClient interface { + Recv() (*longrunning.Operation, error) + grpc.ClientStream +} + +type executionWaitExecutionClient struct { + grpc.ClientStream +} + +func (x *executionWaitExecutionClient) Recv() (*longrunning.Operation, error) { + m := new(longrunning.Operation) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// ExecutionServer is the server API for Execution service. +type ExecutionServer interface { + // Execute an action remotely. + // + // In order to execute an action, the client must first upload all of the + // inputs, the + // [Command][build.bazel.remote.execution.v2.Command] to run, and the + // [Action][build.bazel.remote.execution.v2.Action] into the + // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. + // It then calls `Execute` with an `action_digest` referring to them. The + // server will run the action and eventually return the result. + // + // The input `Action`'s fields MUST meet the various canonicalization + // requirements specified in the documentation for their types so that it has + // the same digest as other logically equivalent `Action`s. The server MAY + // enforce the requirements and return errors if a non-canonical input is + // received. It MAY also proceed without verifying some or all of the + // requirements, such as for performance reasons. If the server does not + // verify the requirement, then it will treat the `Action` as distinct from + // another logically equivalent action if they hash differently. + // + // Returns a stream of + // [google.longrunning.Operation][google.longrunning.Operation] messages + // describing the resulting execution, with eventual `response` + // [ExecuteResponse][build.bazel.remote.execution.v2.ExecuteResponse]. The + // `metadata` on the operation is of type + // [ExecuteOperationMetadata][build.bazel.remote.execution.v2.ExecuteOperationMetadata]. + // + // If the client remains connected after the first response is returned after + // the server, then updates are streamed as if the client had called + // [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution] + // until the execution completes or the request reaches an error. The + // operation can also be queried using [Operations + // API][google.longrunning.Operations.GetOperation]. + // + // The server NEED NOT implement other methods or functionality of the + // Operations API. + // + // Errors discovered during creation of the `Operation` will be reported + // as gRPC Status errors, while errors that occurred while running the + // action will be reported in the `status` field of the `ExecuteResponse`. The + // server MUST NOT set the `error` field of the `Operation` proto. + // The possible errors include: + // + // - `INVALID_ARGUMENT`: One or more arguments are invalid. + // - `FAILED_PRECONDITION`: One or more errors occurred in setting up the + // action requested, such as a missing input or command or no worker being + // available. The client may be able to fix the errors and retry. + // - `RESOURCE_EXHAUSTED`: There is insufficient quota of some resource to run + // the action. + // - `UNAVAILABLE`: Due to a transient condition, such as all workers being + // occupied (and the server does not support a queue), the action could not + // be started. The client should retry. + // - `INTERNAL`: An internal error occurred in the execution engine or the + // worker. + // - `DEADLINE_EXCEEDED`: The execution timed out. + // - `CANCELLED`: The operation was cancelled by the client. This status is + // only possible if the server implements the Operations API CancelOperation + // method, and it was called for the current execution. + // + // In the case of a missing input or command, the server SHOULD additionally + // send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail + // where, for each requested blob not present in the CAS, there is a + // `Violation` with a `type` of `MISSING` and a `subject` of + // `"blobs/{digest_function/}{hash}/{size}"` indicating the digest of the + // missing blob. The `subject` is formatted the same way as the + // `resource_name` provided to + // [ByteStream.Read][google.bytestream.ByteStream.Read], with the leading + // instance name omitted. `digest_function` MUST thus be omitted if its value + // is one of MD5, MURMUR3, SHA1, SHA256, SHA384, SHA512, or VSO. + // + // The server does not need to guarantee that a call to this method leads to + // at most one execution of the action. The server MAY execute the action + // multiple times, potentially in parallel. These redundant executions MAY + // continue to run, even if the operation is completed. + Execute(*ExecuteRequest, Execution_ExecuteServer) error + // Wait for an execution operation to complete. When the client initially + // makes the request, the server immediately responds with the current status + // of the execution. The server will leave the request stream open until the + // operation completes, and then respond with the completed operation. The + // server MAY choose to stream additional updates as execution progresses, + // such as to provide an update as to the state of the execution. + // + // In addition to the cases describe for Execute, the WaitExecution method + // may fail as follows: + // + // - `NOT_FOUND`: The operation no longer exists due to any of a transient + // condition, an unknown operation name, or if the server implements the + // Operations API DeleteOperation method and it was called for the current + // execution. The client should call `Execute` to retry. + WaitExecution(*WaitExecutionRequest, Execution_WaitExecutionServer) error +} + +// UnimplementedExecutionServer can be embedded to have forward compatible implementations. +type UnimplementedExecutionServer struct { +} + +func (*UnimplementedExecutionServer) Execute(*ExecuteRequest, Execution_ExecuteServer) error { + return status1.Errorf(codes.Unimplemented, "method Execute not implemented") +} +func (*UnimplementedExecutionServer) WaitExecution(*WaitExecutionRequest, Execution_WaitExecutionServer) error { + return status1.Errorf(codes.Unimplemented, "method WaitExecution not implemented") +} + +func RegisterExecutionServer(s *grpc.Server, srv ExecutionServer) { + s.RegisterService(&_Execution_serviceDesc, srv) +} + +func _Execution_Execute_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(ExecuteRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ExecutionServer).Execute(m, &executionExecuteServer{stream}) +} + +type Execution_ExecuteServer interface { + Send(*longrunning.Operation) error + grpc.ServerStream +} + +type executionExecuteServer struct { + grpc.ServerStream +} + +func (x *executionExecuteServer) Send(m *longrunning.Operation) error { + return x.ServerStream.SendMsg(m) +} + +func _Execution_WaitExecution_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(WaitExecutionRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ExecutionServer).WaitExecution(m, &executionWaitExecutionServer{stream}) +} + +type Execution_WaitExecutionServer interface { + Send(*longrunning.Operation) error + grpc.ServerStream +} + +type executionWaitExecutionServer struct { + grpc.ServerStream +} + +func (x *executionWaitExecutionServer) Send(m *longrunning.Operation) error { + return x.ServerStream.SendMsg(m) +} + +var _Execution_serviceDesc = grpc.ServiceDesc{ + ServiceName: "build.bazel.remote.execution.v2.Execution", + HandlerType: (*ExecutionServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "Execute", + Handler: _Execution_Execute_Handler, + ServerStreams: true, + }, + { + StreamName: "WaitExecution", + Handler: _Execution_WaitExecution_Handler, + ServerStreams: true, + }, + }, + Metadata: "build/bazel/remote/execution/v2/remote_execution.proto", +} + +// ActionCacheClient is the client API for ActionCache service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ActionCacheClient interface { + // Retrieve a cached execution result. + // + // Implementations SHOULD ensure that any blobs referenced from the + // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage] + // are available at the time of returning the + // [ActionResult][build.bazel.remote.execution.v2.ActionResult] and will be + // for some period of time afterwards. The lifetimes of the referenced blobs SHOULD be increased + // if necessary and applicable. + // + // Errors: + // + // * `NOT_FOUND`: The requested `ActionResult` is not in the cache. + GetActionResult(ctx context.Context, in *GetActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error) + // Upload a new execution result. + // + // In order to allow the server to perform access control based on the type of + // action, and to assist with client debugging, the client MUST first upload + // the [Action][build.bazel.remote.execution.v2.Execution] that produced the + // result, along with its + // [Command][build.bazel.remote.execution.v2.Command], into the + // `ContentAddressableStorage`. + // + // Server implementations MAY modify the + // `UpdateActionResultRequest.action_result` and return an equivalent value. + // + // Errors: + // + // - `INVALID_ARGUMENT`: One or more arguments are invalid. + // - `FAILED_PRECONDITION`: One or more errors occurred in updating the + // action result, such as a missing command or action. + // - `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the + // entry to the cache. + UpdateActionResult(ctx context.Context, in *UpdateActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error) +} + +type actionCacheClient struct { + cc grpc.ClientConnInterface +} + +func NewActionCacheClient(cc grpc.ClientConnInterface) ActionCacheClient { + return &actionCacheClient{cc} +} + +func (c *actionCacheClient) GetActionResult(ctx context.Context, in *GetActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error) { + out := new(ActionResult) + err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ActionCache/GetActionResult", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *actionCacheClient) UpdateActionResult(ctx context.Context, in *UpdateActionResultRequest, opts ...grpc.CallOption) (*ActionResult, error) { + out := new(ActionResult) + err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ActionCache/UpdateActionResult", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ActionCacheServer is the server API for ActionCache service. +type ActionCacheServer interface { + // Retrieve a cached execution result. + // + // Implementations SHOULD ensure that any blobs referenced from the + // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage] + // are available at the time of returning the + // [ActionResult][build.bazel.remote.execution.v2.ActionResult] and will be + // for some period of time afterwards. The lifetimes of the referenced blobs SHOULD be increased + // if necessary and applicable. + // + // Errors: + // + // * `NOT_FOUND`: The requested `ActionResult` is not in the cache. + GetActionResult(context.Context, *GetActionResultRequest) (*ActionResult, error) + // Upload a new execution result. + // + // In order to allow the server to perform access control based on the type of + // action, and to assist with client debugging, the client MUST first upload + // the [Action][build.bazel.remote.execution.v2.Execution] that produced the + // result, along with its + // [Command][build.bazel.remote.execution.v2.Command], into the + // `ContentAddressableStorage`. + // + // Server implementations MAY modify the + // `UpdateActionResultRequest.action_result` and return an equivalent value. + // + // Errors: + // + // - `INVALID_ARGUMENT`: One or more arguments are invalid. + // - `FAILED_PRECONDITION`: One or more errors occurred in updating the + // action result, such as a missing command or action. + // - `RESOURCE_EXHAUSTED`: There is insufficient storage space to add the + // entry to the cache. + UpdateActionResult(context.Context, *UpdateActionResultRequest) (*ActionResult, error) +} + +// UnimplementedActionCacheServer can be embedded to have forward compatible implementations. +type UnimplementedActionCacheServer struct { +} + +func (*UnimplementedActionCacheServer) GetActionResult(context.Context, *GetActionResultRequest) (*ActionResult, error) { + return nil, status1.Errorf(codes.Unimplemented, "method GetActionResult not implemented") +} +func (*UnimplementedActionCacheServer) UpdateActionResult(context.Context, *UpdateActionResultRequest) (*ActionResult, error) { + return nil, status1.Errorf(codes.Unimplemented, "method UpdateActionResult not implemented") +} + +func RegisterActionCacheServer(s *grpc.Server, srv ActionCacheServer) { + s.RegisterService(&_ActionCache_serviceDesc, srv) +} + +func _ActionCache_GetActionResult_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetActionResultRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ActionCacheServer).GetActionResult(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/build.bazel.remote.execution.v2.ActionCache/GetActionResult", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ActionCacheServer).GetActionResult(ctx, req.(*GetActionResultRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ActionCache_UpdateActionResult_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateActionResultRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ActionCacheServer).UpdateActionResult(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/build.bazel.remote.execution.v2.ActionCache/UpdateActionResult", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ActionCacheServer).UpdateActionResult(ctx, req.(*UpdateActionResultRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _ActionCache_serviceDesc = grpc.ServiceDesc{ + ServiceName: "build.bazel.remote.execution.v2.ActionCache", + HandlerType: (*ActionCacheServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetActionResult", + Handler: _ActionCache_GetActionResult_Handler, + }, + { + MethodName: "UpdateActionResult", + Handler: _ActionCache_UpdateActionResult_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "build/bazel/remote/execution/v2/remote_execution.proto", +} + +// ContentAddressableStorageClient is the client API for ContentAddressableStorage service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ContentAddressableStorageClient interface { + // Determine if blobs are present in the CAS. + // + // Clients can use this API before uploading blobs to determine which ones are + // already present in the CAS and do not need to be uploaded again. + // + // Servers SHOULD increase the lifetimes of the referenced blobs if necessary and + // applicable. + // + // There are no method-specific errors. + FindMissingBlobs(ctx context.Context, in *FindMissingBlobsRequest, opts ...grpc.CallOption) (*FindMissingBlobsResponse, error) + // Upload many blobs at once. + // + // The server may enforce a limit of the combined total size of blobs + // to be uploaded using this API. This limit may be obtained using the + // [Capabilities][build.bazel.remote.execution.v2.Capabilities] API. + // Requests exceeding the limit should either be split into smaller + // chunks or uploaded using the + // [ByteStream API][google.bytestream.ByteStream], as appropriate. + // + // This request is equivalent to calling a Bytestream `Write` request + // on each individual blob, in parallel. The requests may succeed or fail + // independently. + // + // Errors: + // + // - `INVALID_ARGUMENT`: The client attempted to upload more than the + // server supported limit. + // + // Individual requests may return the following errors, additionally: + // + // * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob. + // * `INVALID_ARGUMENT`: The + // [Digest][build.bazel.remote.execution.v2.Digest] does not match the + // provided data. + BatchUpdateBlobs(ctx context.Context, in *BatchUpdateBlobsRequest, opts ...grpc.CallOption) (*BatchUpdateBlobsResponse, error) + // Download many blobs at once. + // + // The server may enforce a limit of the combined total size of blobs + // to be downloaded using this API. This limit may be obtained using the + // [Capabilities][build.bazel.remote.execution.v2.Capabilities] API. + // Requests exceeding the limit should either be split into smaller + // chunks or downloaded using the + // [ByteStream API][google.bytestream.ByteStream], as appropriate. + // + // This request is equivalent to calling a Bytestream `Read` request + // on each individual blob, in parallel. The requests may succeed or fail + // independently. + // + // Errors: + // + // - `INVALID_ARGUMENT`: The client attempted to read more than the + // server supported limit. + // + // Every error on individual read will be returned in the corresponding digest + // status. + BatchReadBlobs(ctx context.Context, in *BatchReadBlobsRequest, opts ...grpc.CallOption) (*BatchReadBlobsResponse, error) + // Fetch the entire directory tree rooted at a node. + // + // This request must be targeted at a + // [Directory][build.bazel.remote.execution.v2.Directory] stored in the + // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage] + // (CAS). The server will enumerate the `Directory` tree recursively and + // return every node descended from the root. + // + // The GetTreeRequest.page_token parameter can be used to skip ahead in + // the stream (e.g. when retrying a partially completed and aborted request), + // by setting it to a value taken from GetTreeResponse.next_page_token of the + // last successfully processed GetTreeResponse). + // + // The exact traversal order is unspecified and, unless retrieving subsequent + // pages from an earlier request, is not guaranteed to be stable across + // multiple invocations of `GetTree`. + // + // If part of the tree is missing from the CAS, the server will return the + // portion present and omit the rest. + // + // Errors: + // + // * `NOT_FOUND`: The requested tree root is not present in the CAS. + GetTree(ctx context.Context, in *GetTreeRequest, opts ...grpc.CallOption) (ContentAddressableStorage_GetTreeClient, error) +} + +type contentAddressableStorageClient struct { + cc grpc.ClientConnInterface +} + +func NewContentAddressableStorageClient(cc grpc.ClientConnInterface) ContentAddressableStorageClient { + return &contentAddressableStorageClient{cc} +} + +func (c *contentAddressableStorageClient) FindMissingBlobs(ctx context.Context, in *FindMissingBlobsRequest, opts ...grpc.CallOption) (*FindMissingBlobsResponse, error) { + out := new(FindMissingBlobsResponse) + err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ContentAddressableStorage/FindMissingBlobs", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *contentAddressableStorageClient) BatchUpdateBlobs(ctx context.Context, in *BatchUpdateBlobsRequest, opts ...grpc.CallOption) (*BatchUpdateBlobsResponse, error) { + out := new(BatchUpdateBlobsResponse) + err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchUpdateBlobs", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *contentAddressableStorageClient) BatchReadBlobs(ctx context.Context, in *BatchReadBlobsRequest, opts ...grpc.CallOption) (*BatchReadBlobsResponse, error) { + out := new(BatchReadBlobsResponse) + err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchReadBlobs", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *contentAddressableStorageClient) GetTree(ctx context.Context, in *GetTreeRequest, opts ...grpc.CallOption) (ContentAddressableStorage_GetTreeClient, error) { + stream, err := c.cc.NewStream(ctx, &_ContentAddressableStorage_serviceDesc.Streams[0], "/build.bazel.remote.execution.v2.ContentAddressableStorage/GetTree", opts...) + if err != nil { + return nil, err + } + x := &contentAddressableStorageGetTreeClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type ContentAddressableStorage_GetTreeClient interface { + Recv() (*GetTreeResponse, error) + grpc.ClientStream +} + +type contentAddressableStorageGetTreeClient struct { + grpc.ClientStream +} + +func (x *contentAddressableStorageGetTreeClient) Recv() (*GetTreeResponse, error) { + m := new(GetTreeResponse) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// ContentAddressableStorageServer is the server API for ContentAddressableStorage service. +type ContentAddressableStorageServer interface { + // Determine if blobs are present in the CAS. + // + // Clients can use this API before uploading blobs to determine which ones are + // already present in the CAS and do not need to be uploaded again. + // + // Servers SHOULD increase the lifetimes of the referenced blobs if necessary and + // applicable. + // + // There are no method-specific errors. + FindMissingBlobs(context.Context, *FindMissingBlobsRequest) (*FindMissingBlobsResponse, error) + // Upload many blobs at once. + // + // The server may enforce a limit of the combined total size of blobs + // to be uploaded using this API. This limit may be obtained using the + // [Capabilities][build.bazel.remote.execution.v2.Capabilities] API. + // Requests exceeding the limit should either be split into smaller + // chunks or uploaded using the + // [ByteStream API][google.bytestream.ByteStream], as appropriate. + // + // This request is equivalent to calling a Bytestream `Write` request + // on each individual blob, in parallel. The requests may succeed or fail + // independently. + // + // Errors: + // + // - `INVALID_ARGUMENT`: The client attempted to upload more than the + // server supported limit. + // + // Individual requests may return the following errors, additionally: + // + // * `RESOURCE_EXHAUSTED`: There is insufficient disk quota to store the blob. + // * `INVALID_ARGUMENT`: The + // [Digest][build.bazel.remote.execution.v2.Digest] does not match the + // provided data. + BatchUpdateBlobs(context.Context, *BatchUpdateBlobsRequest) (*BatchUpdateBlobsResponse, error) + // Download many blobs at once. + // + // The server may enforce a limit of the combined total size of blobs + // to be downloaded using this API. This limit may be obtained using the + // [Capabilities][build.bazel.remote.execution.v2.Capabilities] API. + // Requests exceeding the limit should either be split into smaller + // chunks or downloaded using the + // [ByteStream API][google.bytestream.ByteStream], as appropriate. + // + // This request is equivalent to calling a Bytestream `Read` request + // on each individual blob, in parallel. The requests may succeed or fail + // independently. + // + // Errors: + // + // - `INVALID_ARGUMENT`: The client attempted to read more than the + // server supported limit. + // + // Every error on individual read will be returned in the corresponding digest + // status. + BatchReadBlobs(context.Context, *BatchReadBlobsRequest) (*BatchReadBlobsResponse, error) + // Fetch the entire directory tree rooted at a node. + // + // This request must be targeted at a + // [Directory][build.bazel.remote.execution.v2.Directory] stored in the + // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage] + // (CAS). The server will enumerate the `Directory` tree recursively and + // return every node descended from the root. + // + // The GetTreeRequest.page_token parameter can be used to skip ahead in + // the stream (e.g. when retrying a partially completed and aborted request), + // by setting it to a value taken from GetTreeResponse.next_page_token of the + // last successfully processed GetTreeResponse). + // + // The exact traversal order is unspecified and, unless retrieving subsequent + // pages from an earlier request, is not guaranteed to be stable across + // multiple invocations of `GetTree`. + // + // If part of the tree is missing from the CAS, the server will return the + // portion present and omit the rest. + // + // Errors: + // + // * `NOT_FOUND`: The requested tree root is not present in the CAS. + GetTree(*GetTreeRequest, ContentAddressableStorage_GetTreeServer) error +} + +// UnimplementedContentAddressableStorageServer can be embedded to have forward compatible implementations. +type UnimplementedContentAddressableStorageServer struct { +} + +func (*UnimplementedContentAddressableStorageServer) FindMissingBlobs(context.Context, *FindMissingBlobsRequest) (*FindMissingBlobsResponse, error) { + return nil, status1.Errorf(codes.Unimplemented, "method FindMissingBlobs not implemented") +} +func (*UnimplementedContentAddressableStorageServer) BatchUpdateBlobs(context.Context, *BatchUpdateBlobsRequest) (*BatchUpdateBlobsResponse, error) { + return nil, status1.Errorf(codes.Unimplemented, "method BatchUpdateBlobs not implemented") +} +func (*UnimplementedContentAddressableStorageServer) BatchReadBlobs(context.Context, *BatchReadBlobsRequest) (*BatchReadBlobsResponse, error) { + return nil, status1.Errorf(codes.Unimplemented, "method BatchReadBlobs not implemented") +} +func (*UnimplementedContentAddressableStorageServer) GetTree(*GetTreeRequest, ContentAddressableStorage_GetTreeServer) error { + return status1.Errorf(codes.Unimplemented, "method GetTree not implemented") +} + +func RegisterContentAddressableStorageServer(s *grpc.Server, srv ContentAddressableStorageServer) { + s.RegisterService(&_ContentAddressableStorage_serviceDesc, srv) +} + +func _ContentAddressableStorage_FindMissingBlobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(FindMissingBlobsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ContentAddressableStorageServer).FindMissingBlobs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/build.bazel.remote.execution.v2.ContentAddressableStorage/FindMissingBlobs", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ContentAddressableStorageServer).FindMissingBlobs(ctx, req.(*FindMissingBlobsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ContentAddressableStorage_BatchUpdateBlobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BatchUpdateBlobsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ContentAddressableStorageServer).BatchUpdateBlobs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchUpdateBlobs", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ContentAddressableStorageServer).BatchUpdateBlobs(ctx, req.(*BatchUpdateBlobsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ContentAddressableStorage_BatchReadBlobs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(BatchReadBlobsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ContentAddressableStorageServer).BatchReadBlobs(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/build.bazel.remote.execution.v2.ContentAddressableStorage/BatchReadBlobs", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ContentAddressableStorageServer).BatchReadBlobs(ctx, req.(*BatchReadBlobsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ContentAddressableStorage_GetTree_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(GetTreeRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ContentAddressableStorageServer).GetTree(m, &contentAddressableStorageGetTreeServer{stream}) +} + +type ContentAddressableStorage_GetTreeServer interface { + Send(*GetTreeResponse) error + grpc.ServerStream +} + +type contentAddressableStorageGetTreeServer struct { + grpc.ServerStream +} + +func (x *contentAddressableStorageGetTreeServer) Send(m *GetTreeResponse) error { + return x.ServerStream.SendMsg(m) +} + +var _ContentAddressableStorage_serviceDesc = grpc.ServiceDesc{ + ServiceName: "build.bazel.remote.execution.v2.ContentAddressableStorage", + HandlerType: (*ContentAddressableStorageServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "FindMissingBlobs", + Handler: _ContentAddressableStorage_FindMissingBlobs_Handler, + }, + { + MethodName: "BatchUpdateBlobs", + Handler: _ContentAddressableStorage_BatchUpdateBlobs_Handler, + }, + { + MethodName: "BatchReadBlobs", + Handler: _ContentAddressableStorage_BatchReadBlobs_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "GetTree", + Handler: _ContentAddressableStorage_GetTree_Handler, + ServerStreams: true, + }, + }, + Metadata: "build/bazel/remote/execution/v2/remote_execution.proto", +} + +// CapabilitiesClient is the client API for Capabilities service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type CapabilitiesClient interface { + // GetCapabilities returns the server capabilities configuration of the + // remote endpoint. + // Only the capabilities of the services supported by the endpoint will + // be returned: + // - Execution + CAS + Action Cache endpoints should return both + // CacheCapabilities and ExecutionCapabilities. + // - Execution only endpoints should return ExecutionCapabilities. + // - CAS + Action Cache only endpoints should return CacheCapabilities. + // + // There are no method-specific errors. + GetCapabilities(ctx context.Context, in *GetCapabilitiesRequest, opts ...grpc.CallOption) (*ServerCapabilities, error) +} + +type capabilitiesClient struct { + cc grpc.ClientConnInterface +} + +func NewCapabilitiesClient(cc grpc.ClientConnInterface) CapabilitiesClient { + return &capabilitiesClient{cc} +} + +func (c *capabilitiesClient) GetCapabilities(ctx context.Context, in *GetCapabilitiesRequest, opts ...grpc.CallOption) (*ServerCapabilities, error) { + out := new(ServerCapabilities) + err := c.cc.Invoke(ctx, "/build.bazel.remote.execution.v2.Capabilities/GetCapabilities", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// CapabilitiesServer is the server API for Capabilities service. +type CapabilitiesServer interface { + // GetCapabilities returns the server capabilities configuration of the + // remote endpoint. + // Only the capabilities of the services supported by the endpoint will + // be returned: + // - Execution + CAS + Action Cache endpoints should return both + // CacheCapabilities and ExecutionCapabilities. + // - Execution only endpoints should return ExecutionCapabilities. + // - CAS + Action Cache only endpoints should return CacheCapabilities. + // + // There are no method-specific errors. + GetCapabilities(context.Context, *GetCapabilitiesRequest) (*ServerCapabilities, error) +} + +// UnimplementedCapabilitiesServer can be embedded to have forward compatible implementations. +type UnimplementedCapabilitiesServer struct { +} + +func (*UnimplementedCapabilitiesServer) GetCapabilities(context.Context, *GetCapabilitiesRequest) (*ServerCapabilities, error) { + return nil, status1.Errorf(codes.Unimplemented, "method GetCapabilities not implemented") +} + +func RegisterCapabilitiesServer(s *grpc.Server, srv CapabilitiesServer) { + s.RegisterService(&_Capabilities_serviceDesc, srv) +} + +func _Capabilities_GetCapabilities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetCapabilitiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CapabilitiesServer).GetCapabilities(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/build.bazel.remote.execution.v2.Capabilities/GetCapabilities", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CapabilitiesServer).GetCapabilities(ctx, req.(*GetCapabilitiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Capabilities_serviceDesc = grpc.ServiceDesc{ + ServiceName: "build.bazel.remote.execution.v2.Capabilities", + HandlerType: (*CapabilitiesServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetCapabilities", + Handler: _Capabilities_GetCapabilities_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "build/bazel/remote/execution/v2/remote_execution.proto", +} diff --git a/build/bazel/remote/execution/v2/remote_execution.proto b/build/bazel/remote/execution/v2/remote_execution.proto index ca96a34..31e20dc 100644 --- a/build/bazel/remote/execution/v2/remote_execution.proto +++ b/build/bazel/remote/execution/v2/remote_execution.proto @@ -19,12 +19,14 @@ package build.bazel.remote.execution.v2; import "build/bazel/semver/semver.proto"; import "google/api/annotations.proto"; import "google/longrunning/operations.proto"; +import "google/protobuf/any.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/timestamp.proto"; +import "google/protobuf/wrappers.proto"; import "google/rpc/status.proto"; option csharp_namespace = "Build.Bazel.Remote.Execution.V2"; -option go_package = "remoteexecution"; +option go_package = "github.com/bazelbuild/remote-apis/build/bazel/remote/execution/v2;remoteexecution"; option java_multiple_files = true; option java_outer_classname = "RemoteExecutionProto"; option java_package = "build.bazel.remote.execution.v2"; @@ -102,7 +104,17 @@ service Execution { // send a [PreconditionFailure][google.rpc.PreconditionFailure] error detail // where, for each requested blob not present in the CAS, there is a // `Violation` with a `type` of `MISSING` and a `subject` of - // `"blobs/{hash}/{size}"` indicating the digest of the missing blob. + // `"blobs/{digest_function/}{hash}/{size}"` indicating the digest of the + // missing blob. The `subject` is formatted the same way as the + // `resource_name` provided to + // [ByteStream.Read][google.bytestream.ByteStream.Read], with the leading + // instance name omitted. `digest_function` MUST thus be omitted if its value + // is one of MD5, MURMUR3, SHA1, SHA256, SHA384, SHA512, or VSO. + // + // The server does not need to guarantee that a call to this method leads to + // at most one execution of the action. The server MAY execute the action + // multiple times, potentially in parallel. These redundant executions MAY + // continue to run, even if the operation is completed. rpc Execute(ExecuteRequest) returns (stream google.longrunning.Operation) { option (google.api.http) = { post: "/v2/{instance_name=**}/actions:execute" body: "*" }; } @@ -113,6 +125,14 @@ service Execution { // operation completes, and then respond with the completed operation. The // server MAY choose to stream additional updates as execution progresses, // such as to provide an update as to the state of the execution. + // + // In addition to the cases describe for Execute, the WaitExecution method + // may fail as follows: + // + // * `NOT_FOUND`: The operation no longer exists due to any of a transient + // condition, an unknown operation name, or if the server implements the + // Operations API DeleteOperation method and it was called for the current + // execution. The client should call `Execute` to retry. rpc WaitExecution(WaitExecutionRequest) returns (stream google.longrunning.Operation) { option (google.api.http) = { post: "/v2/{name=operations/**}:waitExecution" body: "*" }; } @@ -128,10 +148,7 @@ service Execution { // // The lifetime of entries in the action cache is implementation-specific, but // the server SHOULD assume that more recently used entries are more likely to -// be used again. Additionally, action cache implementations SHOULD ensure that -// any blobs referenced in the -// [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage] -// are still valid when returning a result. +// be used again. // // As with other services in the Remote Execution API, any call may return an // error with a [RetryInfo][google.rpc.RetryInfo] error detail providing @@ -140,6 +157,13 @@ service Execution { service ActionCache { // Retrieve a cached execution result. // + // Implementations SHOULD ensure that any blobs referenced from the + // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage] + // are available at the time of returning the + // [ActionResult][build.bazel.remote.execution.v2.ActionResult] and will be + // for some period of time afterwards. The lifetimes of the referenced blobs SHOULD be increased + // if necessary and applicable. + // // Errors: // // * `NOT_FOUND`: The requested `ActionResult` is not in the cache. @@ -156,6 +180,9 @@ service ActionCache { // [Command][build.bazel.remote.execution.v2.Command], into the // `ContentAddressableStorage`. // + // Server implementations MAY modify the + // `UpdateActionResultRequest.action_result` and return an equivalent value. + // // Errors: // // * `INVALID_ARGUMENT`: One or more arguments are invalid. @@ -185,53 +212,128 @@ service ActionCache { // // For small file uploads the client should group them together and call // [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs]. +// // For large uploads, the client must use the -// [Write method][google.bytestream.ByteStream.Write] of the ByteStream API. The -// `resource_name` is `{instance_name}/uploads/{uuid}/blobs/{hash}/{size}`, -// where `instance_name` is as described in the next paragraph, `uuid` is a -// version 4 UUID generated by the client, and `hash` and `size` are the -// [Digest][build.bazel.remote.execution.v2.Digest] of the blob. The -// `uuid` is used only to avoid collisions when multiple clients try to upload -// the same file (or the same client tries to upload the file multiple times at -// once on different threads), so the client MAY reuse the `uuid` for uploading -// different blobs. The `resource_name` may optionally have a trailing filename -// (or other metadata) for a client to use if it is storing URLs, as in -// `{instance}/uploads/{uuid}/blobs/{hash}/{size}/foo/bar/baz.cc`. Anything -// after the `size` is ignored. +// [Write method][google.bytestream.ByteStream.Write] of the ByteStream API. +// +// For uncompressed data, The `WriteRequest.resource_name` is of the following form: +// `{instance_name}/uploads/{uuid}/blobs/{digest_function/}{hash}/{size}{/optional_metadata}` +// +// Where: +// * `instance_name` is an identifier used to distinguish between the various +// instances on the server. Syntax and semantics of this field are defined +// by the server; Clients must not make any assumptions about it (e.g., +// whether it spans multiple path segments or not). If it is the empty path, +// the leading slash is omitted, so that the `resource_name` becomes +// `uploads/{uuid}/blobs/{digest_function/}{hash}/{size}{/optional_metadata}`. +// To simplify parsing, a path segment cannot equal any of the following +// keywords: `blobs`, `uploads`, `actions`, `actionResults`, `operations`, +// `capabilities` or `compressed-blobs`. +// * `uuid` is a version 4 UUID generated by the client, used to avoid +// collisions between concurrent uploads of the same data. Clients MAY +// reuse the same `uuid` for uploading different blobs. +// * `digest_function` is a lowercase string form of a `DigestFunction.Value` +// enum, indicating which digest function was used to compute `hash`. If the +// digest function used is one of MD5, MURMUR3, SHA1, SHA256, SHA384, SHA512, +// or VSO, this component MUST be omitted. In that case the server SHOULD +// infer the digest function using the length of the `hash` and the digest +// functions announced in the server's capabilities. +// * `hash` and `size` refer to the [Digest][build.bazel.remote.execution.v2.Digest] +// of the data being uploaded. +// * `optional_metadata` is implementation specific data, which clients MAY omit. +// Servers MAY ignore this metadata. +// +// Data can alternatively be uploaded in compressed form, with the following +// `WriteRequest.resource_name` form: +// `{instance_name}/uploads/{uuid}/compressed-blobs/{compressor}/{digest_function/}{uncompressed_hash}/{uncompressed_size}{/optional_metadata}` // -// A single server MAY support multiple instances of the execution system, each -// with their own workers, storage, cache, etc. The exact relationship between -// instances is up to the server. If the server does, then the `instance_name` -// is an identifier, possibly containing multiple path segments, used to -// distinguish between the various instances on the server, in a manner defined -// by the server. For servers which do not support multiple instances, then the -// `instance_name` is the empty path and the leading slash is omitted, so that -// the `resource_name` becomes `uploads/{uuid}/blobs/{hash}/{size}`. -// To simplify parsing, a path segment cannot equal any of the following -// keywords: `blobs`, `uploads`, `actions`, `actionResults`, `operations` and -// `capabilities`. +// Where: +// * `instance_name`, `uuid`, `digest_function` and `optional_metadata` are +// defined as above. +// * `compressor` is a lowercase string form of a `Compressor.Value` enum +// other than `identity`, which is supported by the server and advertised in +// [CacheCapabilities.supported_compressor][build.bazel.remote.execution.v2.CacheCapabilities.supported_compressor]. +// * `uncompressed_hash` and `uncompressed_size` refer to the +// [Digest][build.bazel.remote.execution.v2.Digest] of the data being +// uploaded, once uncompressed. Servers MUST verify that these match +// the uploaded data once uncompressed, and MUST return an +// `INVALID_ARGUMENT` error in the case of mismatch. +// +// Note that when writing compressed blobs, the `WriteRequest.write_offset` in +// the initial request in a stream refers to the offset in the uncompressed form +// of the blob. In subsequent requests, `WriteRequest.write_offset` MUST be the +// sum of the first request's 'WriteRequest.write_offset' and the total size of +// all the compressed data bundles in the previous requests. +// Note that this mixes an uncompressed offset with a compressed byte length, +// which is nonsensical, but it is done to fit the semantics of the existing +// ByteStream protocol. +// +// Uploads of the same data MAY occur concurrently in any form, compressed or +// uncompressed. +// +// Clients SHOULD NOT use gRPC-level compression for ByteStream API `Write` +// calls of compressed blobs, since this would compress already-compressed data. // // When attempting an upload, if another client has already completed the upload // (which may occur in the middle of a single upload if another client uploads -// the same blob concurrently), the request will terminate immediately with -// a response whose `committed_size` is the full size of the uploaded file -// (regardless of how much data was transmitted by the client). If the client -// completes the upload but the +// the same blob concurrently), the request will terminate immediately without +// error, and with a response whose `committed_size` is the value `-1` if this +// is a compressed upload, or with the full size of the uploaded file if this is +// an uncompressed upload (regardless of how much data was transmitted by the +// client). If the client completes the upload but the // [Digest][build.bazel.remote.execution.v2.Digest] does not match, an // `INVALID_ARGUMENT` error will be returned. In either case, the client should // not attempt to retry the upload. // -// For downloading blobs, the client must use the -// [Read method][google.bytestream.ByteStream.Read] of the ByteStream API, with -// a `resource_name` of `"{instance_name}/blobs/{hash}/{size}"`, where -// `instance_name` is the instance name (see above), and `hash` and `size` are -// the [Digest][build.bazel.remote.execution.v2.Digest] of the blob. +// Small downloads can be grouped and requested in a batch via +// [BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs]. +// +// For large downloads, the client must use the +// [Read method][google.bytestream.ByteStream.Read] of the ByteStream API. +// +// For uncompressed data, The `ReadRequest.resource_name` is of the following form: +// `{instance_name}/blobs/{digest_function/}{hash}/{size}` +// Where `instance_name`, `digest_function`, `hash` and `size` are defined as +// for uploads. +// +// Data can alternatively be downloaded in compressed form, with the following +// `ReadRequest.resource_name` form: +// `{instance_name}/compressed-blobs/{compressor}/{digest_function/}{uncompressed_hash}/{uncompressed_size}` +// +// Where: +// * `instance_name`, `compressor` and `digest_function` are defined as for +// uploads. +// * `uncompressed_hash` and `uncompressed_size` refer to the +// [Digest][build.bazel.remote.execution.v2.Digest] of the data being +// downloaded, once uncompressed. Clients MUST verify that these match +// the downloaded data once uncompressed, and take appropriate steps in +// the case of failure such as retrying a limited number of times or +// surfacing an error to the user. +// +// When downloading compressed blobs: +// * `ReadRequest.read_offset` refers to the offset in the uncompressed form +// of the blob. +// * Servers MUST return `INVALID_ARGUMENT` if `ReadRequest.read_limit` is +// non-zero. +// * Servers MAY use any compression level they choose, including different +// levels for different blobs (e.g. choosing a level designed for maximum +// speed for data known to be incompressible). +// * Clients SHOULD NOT use gRPC-level compression, since this would compress +// already-compressed data. +// +// Servers MUST be able to provide data for all recently advertised blobs in +// each of the compression formats that the server supports, as well as in +// uncompressed form. // // The lifetime of entries in the CAS is implementation specific, but it SHOULD // be long enough to allow for newly-added and recently looked-up entries to be // used in subsequent calls (e.g. to // [Execute][build.bazel.remote.execution.v2.Execution.Execute]). // +// Servers MUST behave as though empty blobs are always available, even if they +// have not been uploaded. Clients MAY optimize away the uploading or +// downloading of empty blobs. +// // As with other services in the Remote Execution API, any call may return an // error with a [RetryInfo][google.rpc.RetryInfo] error detail providing // information about when the client should retry the request; clients SHOULD @@ -242,6 +344,9 @@ service ContentAddressableStorage { // Clients can use this API before uploading blobs to determine which ones are // already present in the CAS and do not need to be uploaded again. // + // Servers SHOULD increase the lifetimes of the referenced blobs if necessary and + // applicable. + // // There are no method-specific errors. rpc FindMissingBlobs(FindMissingBlobsRequest) returns (FindMissingBlobsResponse) { option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:findMissing" body: "*" }; @@ -319,6 +424,8 @@ service ContentAddressableStorage { // If part of the tree is missing from the CAS, the server will return the // portion present and omit the rest. // + // Errors: + // // * `NOT_FOUND`: The requested tree root is not present in the CAS. rpc GetTree(GetTreeRequest) returns (stream GetTreeResponse) { option (google.api.http) = { get: "/v2/{instance_name=**}/blobs/{root_digest.hash}/{root_digest.size_bytes}:getTree" }; @@ -332,7 +439,16 @@ service ContentAddressableStorage { // The query may include a particular `instance_name`, in which case the values // returned will pertain to that instance. service Capabilities { - // GetCapabilities returns the server capabilities configuration. + // GetCapabilities returns the server capabilities configuration of the + // remote endpoint. + // Only the capabilities of the services supported by the endpoint will + // be returned: + // * Execution + CAS + Action Cache endpoints should return both + // CacheCapabilities and ExecutionCapabilities. + // * Execution only endpoints should return ExecutionCapabilities. + // * CAS + Action Cache only endpoints should return CacheCapabilities. + // + // There are no method-specific errors. rpc GetCapabilities(GetCapabilitiesRequest) returns (ServerCapabilities) { option (google.api.http) = { get: "/v2/{instance_name=**}/capabilities" @@ -385,6 +501,14 @@ message Action { // timeout that is longer than the server's maximum timeout, the server MUST // reject the request. // + // The timeout is only intended to cover the "execution" of the specified + // action and not time in queue nor any overheads before or after execution + // such as marshalling inputs/outputs. The server SHOULD avoid including time + // spent the client doesn't have control over, and MAY extend or reduce the + // timeout to account for delays or speedups that occur during execution + // itself (e.g., lazily loading data from the Content Addressable Storage, + // live migration of virtual machines, emulation overhead). + // // The timeout is a part of the // [Action][build.bazel.remote.execution.v2.Action] message, and // therefore two `Actions` with different timeouts are different, even if they @@ -399,6 +523,26 @@ message Action { // If true, then the `Action`'s result cannot be cached, and in-flight // requests for the same `Action` may not be merged. bool do_not_cache = 7; + + reserved 8; // Used for field moved to [Command][build.bazel.remote.execution.v2.Command]. + + // An optional additional salt value used to place this `Action` into a + // separate cache namespace from other instances having the same field + // contents. This salt typically comes from operational configuration + // specific to sources such as repo and service configuration, + // and allows disowning an entire set of ActionResults that might have been + // poisoned by buggy software or tool failures. + bytes salt = 9; + + // The optional platform requirements for the execution environment. The + // server MAY choose to execute the action on any worker satisfying the + // requirements, so the client SHOULD ensure that running the action on any + // such worker will have the same result. A detailed lexicon for this can be + // found in the accompanying platform.md. + // New in version 2.2: clients SHOULD set these platform properties as well + // as those in the [Command][build.bazel.remote.execution.v2.Command]. Servers + // SHOULD prefer those set here. + Platform platform = 10; } // A `Command` is the actual command executed by a worker running an @@ -419,9 +563,21 @@ message Command { string value = 2; } - // The arguments to the command. The first argument must be the path to the - // executable, which must be either a relative path, in which case it is - // evaluated with respect to the input root, or an absolute path. + // The arguments to the command. + // + // The first argument specifies the command to run, which may be either an + // absolute path, a path relative to the working directory, or an unqualified + // path (without path separators) which will be resolved using the operating + // system's equivalent of the PATH environment variable. Path separators + // native to the operating system running on the worker SHOULD be used. If the + // `environment_variables` list contains an entry for the PATH environment + // variable, it SHOULD be respected. If not, the resolution process is + // implementation-defined. + // + // Changed in v2.3. v2.2 and older require that no PATH lookups are performed, + // and that relative paths are resolved relative to the input root. This + // behavior can, however, not be relied upon, as most implementations already + // followed the rules described above. repeated string arguments = 1; // The environment variables to set when running the program. The worker may @@ -455,7 +611,9 @@ message Command { // // Directories leading up to the output files are created by the worker prior // to execution, even if they are not explicitly part of the input root. - repeated string output_files = 3; + // + // DEPRECATED since v2.1: Use `output_paths` instead. + repeated string output_files = 3 [ deprecated = true ]; // A list of the output directories that the client expects to retrieve from // the action. Only the listed directories will be returned (an entire @@ -478,23 +636,100 @@ message Command { // bytes). // // An output directory cannot be duplicated or have the same path as any of - // the listed output files. + // the listed output files. An output directory is allowed to be a parent of + // another output directory. // // Directories leading up to the output directories (but not the output // directories themselves) are created by the worker prior to execution, even // if they are not explicitly part of the input root. - repeated string output_directories = 4; + // + // DEPRECATED since 2.1: Use `output_paths` instead. + repeated string output_directories = 4 [ deprecated = true ]; + + // A list of the output paths that the client expects to retrieve from the + // action. Only the listed paths will be returned to the client as output. + // The type of the output (file or directory) is not specified, and will be + // determined by the server after action execution. If the resulting path is + // a file, it will be returned in an + // [OutputFile][build.bazel.remote.execution.v2.OutputFile] typed field. + // If the path is a directory, the entire directory structure will be returned + // as a [Tree][build.bazel.remote.execution.v2.Tree] message digest, see + // [OutputDirectory][build.bazel.remote.execution.v2.OutputDirectory] + // Other files or directories that may be created during command execution + // are discarded. + // + // The paths are relative to the working directory of the action execution. + // The paths are specified using a single forward slash (`/`) as a path + // separator, even if the execution platform natively uses a different + // separator. The path MUST NOT include a trailing slash, nor a leading slash, + // being a relative path. + // + // In order to ensure consistent hashing of the same Action, the output paths + // MUST be deduplicated and sorted lexicographically by code point (or, + // equivalently, by UTF-8 bytes). + // + // Directories leading up to the output paths are created by the worker prior + // to execution, even if they are not explicitly part of the input root. + // + // New in v2.1: this field supersedes the DEPRECATED `output_files` and + // `output_directories` fields. If `output_paths` is used, `output_files` and + // `output_directories` will be ignored! + repeated string output_paths = 7; // The platform requirements for the execution environment. The server MAY // choose to execute the action on any worker satisfying the requirements, so // the client SHOULD ensure that running the action on any such worker will - // have the same result. - Platform platform = 5; + // have the same result. A detailed lexicon for this can be found in the + // accompanying platform.md. + // DEPRECATED as of v2.2: platform properties are now specified directly in + // the action. See documentation note in the + // [Action][build.bazel.remote.execution.v2.Action] for migration. + Platform platform = 5 [ deprecated = true ]; // The working directory, relative to the input root, for the command to run // in. It must be a directory which exists in the input tree. If it is left // empty, then the action is run in the input root. string working_directory = 6; + + // A list of keys for node properties the client expects to retrieve for + // output files and directories. Keys are either names of string-based + // [NodeProperty][build.bazel.remote.execution.v2.NodeProperty] or + // names of fields in [NodeProperties][build.bazel.remote.execution.v2.NodeProperties]. + // In order to ensure that equivalent `Action`s always hash to the same + // value, the node properties MUST be lexicographically sorted by name. + // Sorting of strings is done by code point, equivalently, by the UTF-8 bytes. + // + // The interpretation of string-based properties is server-dependent. If a + // property is not recognized by the server, the server will return an + // `INVALID_ARGUMENT`. + repeated string output_node_properties = 8; + + enum OutputDirectoryFormat { + // The client is only interested in receiving output directories in + // the form of a single Tree object, using the `tree_digest` field. + TREE_ONLY = 0; + + // The client is only interested in receiving output directories in + // the form of a hierarchy of separately stored Directory objects, + // using the `root_directory_digest` field. + DIRECTORY_ONLY = 1; + + // The client is interested in receiving output directories both in + // the form of a single Tree object and a hierarchy of separately + // stored Directory objects, using both the `tree_digest` and + // `root_directory_digest` fields. + TREE_AND_DIRECTORY = 2; + } + + // The format that the worker should use to store the contents of + // output directories. + // + // In case this field is set to a value that is not supported by the + // worker, the worker SHOULD interpret this field as TREE_ONLY. The + // worker MAY store output directories in formats that are a superset + // of what was requested (e.g., interpreting DIRECTORY_ONLY as + // TREE_AND_DIRECTORY). + OutputDirectoryFormat output_directory_format = 9; } // A `Platform` is a set of requirements, such as hardware, operating system, or @@ -520,6 +755,11 @@ message Platform { // The server MAY use the `value` of one or more properties to determine how // it sets up the execution environment, such as by making specific system // files available to the worker. + // + // Both names and values are typically case-sensitive. Note that the platform + // is implicitly part of the action digest, so even tiny changes in the names + // or values (like changing case) may result in different action cache + // entries. message Property { // The property name. string name = 1; @@ -558,6 +798,9 @@ message Platform { // * The files, directories and symlinks in the directory must each be sorted // in lexicographical order by path. The path strings must be sorted by code // point, equivalently, by UTF-8 bytes. +// * The [NodeProperties][build.bazel.remote.execution.v2.NodeProperty] of files, +// directories, and symlinks must be sorted in lexicographical order by +// property name. // // A `Directory` that obeys the restrictions is said to be in canonical form. // @@ -574,7 +817,13 @@ message Platform { // digest: { // hash: "4a73bc9d03...", // size: 65534 -// } +// }, +// node_properties: [ +// { +// "name": "MTime", +// "value": "2017-01-15T01:30:15.01Z" +// } +// ] // } // ], // directories: [ @@ -611,6 +860,40 @@ message Directory { // The symlinks in the directory. repeated SymlinkNode symlinks = 3; + + // The node properties of the Directory. + reserved 4; + NodeProperties node_properties = 5; +} + +// A single property for [FileNodes][build.bazel.remote.execution.v2.FileNode], +// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode], and +// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode]. The server is +// responsible for specifying the property `name`s that it accepts. If +// permitted by the server, the same `name` may occur multiple times. +message NodeProperty { + // The property name. + string name = 1; + + // The property value. + string value = 2; +} + +// Node properties for [FileNodes][build.bazel.remote.execution.v2.FileNode], +// [DirectoryNodes][build.bazel.remote.execution.v2.DirectoryNode], and +// [SymlinkNodes][build.bazel.remote.execution.v2.SymlinkNode]. The server is +// responsible for specifying the properties that it accepts. +// +message NodeProperties { + // A list of string-based + // [NodeProperties][build.bazel.remote.execution.v2.NodeProperty]. + repeated NodeProperty properties = 1; + + // The file's last modification timestamp. + google.protobuf.Timestamp mtime = 2; + + // The UNIX file mode, e.g., 0755. + google.protobuf.UInt32Value unix_mode = 3; } // A `FileNode` represents a single file and associated metadata. @@ -625,6 +908,10 @@ message FileNode { // True if file is executable, false otherwise. bool is_executable = 4; + + // The node properties of the FileNode. + reserved 5; + NodeProperties node_properties = 6; } // A `DirectoryNode` represents a child of a @@ -650,14 +937,20 @@ message SymlinkNode { // The target path can be relative to the parent directory of the symlink or // it can be an absolute path starting with `/`. Support for absolute paths // can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities] - // API. The canonical form forbids the substrings `/./` and `//` in the target - // path. `..` components are allowed anywhere in the target path. + // API. `..` components are allowed anywhere in the target path as logical + // canonicalization may lead to different behavior in the presence of + // directory symlinks (e.g. `foo/../bar` may not be the same as `bar`). + // To reduce potential cache misses, canonicalization is still recommended + // where this is possible without impacting correctness. string target = 2; + + // The node properties of the SymlinkNode. + reserved 3; + NodeProperties node_properties = 4; } // A content digest. A digest for a given blob consists of the size of the blob -// and its hash. The hash algorithm to use is defined by the server, but servers -// SHOULD use SHA-256. +// and its hash. The hash algorithm to use is defined by the server. // // The size is considered to be an integral part of the digest and cannot be // separated. That is, even if the `hash` field is correctly specified but @@ -688,8 +981,8 @@ message SymlinkNode { // serializing, but care should be taken to avoid shortcuts. For instance, // concatenating two messages to merge them may produce duplicate fields. message Digest { - // The hash. In the case of SHA-256, it will always be a lowercase hex string - // exactly 64 characters long. + // The hash, represented as a lowercase hexadecimal string, padded with + // leading zeroes up to the hash function length. string hash = 1; // The size of the blob, in bytes. @@ -722,26 +1015,56 @@ message ExecutedActionMetadata { // When the worker completed executing the action command. google.protobuf.Timestamp execution_completed_timestamp = 8; + // New in v2.3: the amount of time the worker spent executing the action + // command, potentially computed using a worker-specific virtual clock. + // + // The virtual execution duration is only intended to cover the "execution" of + // the specified action and not time in queue nor any overheads before or + // after execution such as marshalling inputs/outputs. The server SHOULD avoid + // including time spent the client doesn't have control over, and MAY extend + // or reduce the execution duration to account for delays or speedups that + // occur during execution itself (e.g., lazily loading data from the Content + // Addressable Storage, live migration of virtual machines, emulation + // overhead). + // + // The method of timekeeping used to compute the virtual execution duration + // MUST be consistent with what is used to enforce the + // [Action][[build.bazel.remote.execution.v2.Action]'s `timeout`. There is no + // relationship between the virtual execution duration and the values of + // `execution_start_timestamp` and `execution_completed_timestamp`. + google.protobuf.Duration virtual_execution_duration = 12; + // When the worker started uploading action outputs. google.protobuf.Timestamp output_upload_start_timestamp = 9; // When the worker finished uploading action outputs. google.protobuf.Timestamp output_upload_completed_timestamp = 10; + + // Details that are specific to the kind of worker used. For example, + // on POSIX-like systems this could contain a message with + // getrusage(2) statistics. + repeated google.protobuf.Any auxiliary_metadata = 11; } // An ActionResult represents the result of an // [Action][build.bazel.remote.execution.v2.Action] being run. +// +// It is advised that at least one field (for example +// `ActionResult.execution_metadata.Worker`) have a non-default value, to +// ensure that the serialized value is non-empty, which can then be used +// as a basic data sanity check. message ActionResult { reserved 1; // Reserved for use as the resource name. // The output files of the action. For each output file requested in the - // `output_files` field of the Action, if the corresponding file existed after - // the action completed, a single entry will be present either in this field, - // or in the output_file_symlinks field, if the file was a symbolic link to - // another file. + // `output_files` or `output_paths` field of the Action, if the corresponding + // file existed after the action completed, a single entry will be present + // either in this field, or the `output_file_symlinks` field if the file was + // a symbolic link to another file (`output_symlinks` field after v2.1). // - // If the action does not produce the requested output, or produces a - // directory where a regular file is expected or vice versa, then that output + // If an output listed in `output_files` was found, but was a directory rather + // than a regular file, the server will return a FAILED_PRECONDITION. + // If the action does not produce the requested output, then that output // will be omitted from the list. The server is free to arrange the output // list as desired; clients MUST NOT assume that the output list is sorted. repeated OutputFile output_files = 2; @@ -750,21 +1073,42 @@ message ActionResult { // may be links to other output files, or input files, or even absolute paths // outside of the working directory, if the server supports // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy]. - // For each output file requested in the `output_files` field of the Action, - // if the corresponding file existed after + // For each output file requested in the `output_files` or `output_paths` + // field of the Action, if the corresponding file existed after // the action completed, a single entry will be present either in this field, // or in the `output_files` field, if the file was not a symbolic link. // - // If the action does not produce the requested output, or produces a - // directory where a regular file is expected or vice versa, then that output + // If an output symbolic link of the same name as listed in `output_files` of + // the Command was found, but its target type was not a regular file, the + // server will return a FAILED_PRECONDITION. + // If the action does not produce the requested output, then that output // will be omitted from the list. The server is free to arrange the output // list as desired; clients MUST NOT assume that the output list is sorted. - repeated OutputSymlink output_file_symlinks = 10; + // + // DEPRECATED as of v2.1. Servers that wish to be compatible with v2.0 API + // should still populate this field in addition to `output_symlinks`. + repeated OutputSymlink output_file_symlinks = 10 [ deprecated = true ]; + + // New in v2.1: this field will only be populated if the command + // `output_paths` field was used, and not the pre v2.1 `output_files` or + // `output_directories` fields. + // The output paths of the action that are symbolic links to other paths. Those + // may be links to other outputs, or inputs, or even absolute paths + // outside of the working directory, if the server supports + // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy]. + // A single entry for each output requested in `output_paths` + // field of the Action, if the corresponding path existed after + // the action completed and was a symbolic link. + // + // If the action does not produce a requested output, then that output + // will be omitted from the list. The server is free to arrange the output + // list as desired; clients MUST NOT assume that the output list is sorted. + repeated OutputSymlink output_symlinks = 12; // The output directories of the action. For each output directory requested - // in the `output_directories` field of the Action, if the corresponding - // directory existed after the action completed, a single entry will be - // present in the output list, which will contain the digest of a + // in the `output_directories` or `output_paths` field of the Action, if the + // corresponding directory existed after the action completed, a single entry + // will be present in the output list, which will contain the digest of a // [Tree][build.bazel.remote.execution.v2.Tree] message containing the // directory tree, and the path equal exactly to the corresponding Action // output_directories member. @@ -820,6 +1164,9 @@ message ActionResult { // } // } // ``` + // If an output of the same name as listed in `output_files` of + // the Command was found in `output_directories`, but was not a directory, the + // server will return a FAILED_PRECONDITION. repeated OutputDirectory output_directories = 3; // The output directories of the action that are symbolic links to other @@ -828,45 +1175,47 @@ message ActionResult { // if the server supports // [SymlinkAbsolutePathStrategy.ALLOWED][build.bazel.remote.execution.v2.CacheCapabilities.SymlinkAbsolutePathStrategy]. // For each output directory requested in the `output_directories` field of - // the Action, if the directory file existed after - // the action completed, a single entry will be present either in this field, - // or in the `output_directories` field, if the directory was not a symbolic link. + // the Action, if the directory existed after the action completed, a + // single entry will be present either in this field, or in the + // `output_directories` field, if the directory was not a symbolic link. // - // If the action does not produce the requested output, or produces a - // file where a directory is expected or vice versa, then that output + // If an output of the same name was found, but was a symbolic link to a file + // instead of a directory, the server will return a FAILED_PRECONDITION. + // If the action does not produce the requested output, then that output // will be omitted from the list. The server is free to arrange the output // list as desired; clients MUST NOT assume that the output list is sorted. - repeated OutputSymlink output_directory_symlinks = 11; + // + // DEPRECATED as of v2.1. Servers that wish to be compatible with v2.0 API + // should still populate this field in addition to `output_symlinks`. + repeated OutputSymlink output_directory_symlinks = 11 [ deprecated = true ]; // The exit code of the command. int32 exit_code = 4; - // The standard output buffer of the action. The server will determine, based - // on the size of the buffer, whether to return it in raw form or to return - // a digest in `stdout_digest` that points to the buffer. If neither is set, - // then the buffer is empty. The client SHOULD NOT assume it will get one of - // the raw buffer or a digest on any given request and should be prepared to - // handle either. + // The standard output buffer of the action. The server SHOULD NOT inline + // stdout unless requested by the client in the + // [GetActionResultRequest][build.bazel.remote.execution.v2.GetActionResultRequest] + // message. The server MAY omit inlining, even if requested, and MUST do so if inlining + // would cause the response to exceed message size limits. + // Clients SHOULD NOT populate this field when uploading to the cache. bytes stdout_raw = 5; // The digest for a blob containing the standard output of the action, which // can be retrieved from the // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. - // See `stdout_raw` for when this will be set. Digest stdout_digest = 6; - // The standard error buffer of the action. The server will determine, based - // on the size of the buffer, whether to return it in raw form or to return - // a digest in `stderr_digest` that points to the buffer. If neither is set, - // then the buffer is empty. The client SHOULD NOT assume it will get one of - // the raw buffer or a digest on any given request and should be prepared to - // handle either. + // The standard error buffer of the action. The server SHOULD NOT inline + // stderr unless requested by the client in the + // [GetActionResultRequest][build.bazel.remote.execution.v2.GetActionResultRequest] + // message. The server MAY omit inlining, even if requested, and MUST do so if inlining + // would cause the response to exceed message size limits. + // Clients SHOULD NOT populate this field when uploading to the cache. bytes stderr_raw = 7; // The digest for a blob containing the standard error of the action, which // can be retrieved from the // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage]. - // See `stderr_raw` for when this will be set. Digest stderr_digest = 8; // The details of the execution that originally produced this result. @@ -877,8 +1226,6 @@ message ActionResult { // [FileNode][build.bazel.remote.execution.v2.FileNode], but it is used as an // output in an `ActionResult`. It allows a full file path rather than // only a name. -// -// `OutputFile` is binary-compatible with `FileNode`. message OutputFile { // The full path of the file relative to the working directory, including the // filename. The path separator is a forward slash `/`. Since this is a @@ -892,6 +1239,18 @@ message OutputFile { // True if file is executable, false otherwise. bool is_executable = 4; + + // The contents of the file if inlining was requested. The server SHOULD NOT inline + // file contents unless requested by the client in the + // [GetActionResultRequest][build.bazel.remote.execution.v2.GetActionResultRequest] + // message. The server MAY omit inlining, even if requested, and MUST do so if inlining + // would cause the response to exceed message size limits. + // Clients SHOULD NOT populate this field when uploading to the cache. + bytes contents = 5; + + // The supported node properties of the OutputFile, if requested by the Action. + reserved 6; + NodeProperties node_properties = 7; } // A `Tree` contains all the @@ -905,6 +1264,9 @@ message Tree { // recursively, all its children. In order to reconstruct the directory tree, // the client must take the digests of each of the child directories and then // build up a tree starting from the `root`. + // Servers SHOULD ensure that these are ordered consistently such that two + // actions producing equivalent output directories on the same server + // implementation also produce Tree messages with matching digests. repeated Directory children = 2; } @@ -923,6 +1285,52 @@ message OutputDirectory { // [Tree][build.bazel.remote.execution.v2.Tree] proto containing the // directory's contents. Digest tree_digest = 3; + + // If set, consumers MAY make the following assumptions about the + // directories contained in the the Tree, so that it may be + // instantiated on a local file system by scanning through it + // sequentially: + // + // - All directories with the same binary representation are stored + // exactly once. + // - All directories, apart from the root directory, are referenced by + // at least one parent directory. + // - Directories are stored in topological order, with parents being + // stored before the child. The root directory is thus the first to + // be stored. + // + // Additionally, the Tree MUST be encoded as a stream of records, + // where each record has the following format: + // + // - A tag byte, having one of the following two values: + // - (1 << 3) | 2 == 0x0a: First record (the root directory). + // - (2 << 3) | 2 == 0x12: Any subsequent records (child directories). + // - The size of the directory, encoded as a base 128 varint. + // - The contents of the directory, encoded as a binary serialized + // Protobuf message. + // + // This encoding is a subset of the Protobuf wire format of the Tree + // message. As it is only permitted to store data associated with + // field numbers 1 and 2, the tag MUST be encoded as a single byte. + // More details on the Protobuf wire format can be found here: + // https://developers.google.com/protocol-buffers/docs/encoding + // + // It is recommended that implementations using this feature construct + // Tree objects manually using the specification given above, as + // opposed to using a Protobuf library to marshal a full Tree message. + // As individual Directory messages already need to be marshaled to + // compute their digests, constructing the Tree object manually avoids + // redundant marshaling. + bool is_topologically_sorted = 4; + + // The digest of the encoded + // [Directory][build.bazel.remote.execution.v2.Directory] proto + // containing the contents the directory's root. + // + // If both `tree_digest` and `root_directory_digest` are set, this + // field MUST match the digest of the root directory contained in the + // Tree message. + Digest root_directory_digest = 5; } // An `OutputSymlink` is similar to a @@ -940,9 +1348,13 @@ message OutputSymlink { // The target path can be relative to the parent directory of the symlink or // it can be an absolute path starting with `/`. Support for absolute paths // can be checked using the [Capabilities][build.bazel.remote.execution.v2.Capabilities] - // API. The canonical form forbids the substrings `/./` and `//` in the target - // path. `..` components are allowed anywhere in the target path. + // API. `..` components are allowed anywhere in the target path. string target = 2; + + // The supported node properties of the OutputSymlink, if requested by the + // Action. + reserved 3; + NodeProperties node_properties = 4; } // An `ExecutionPolicy` can be used to control the scheduling of the action. @@ -1012,6 +1424,29 @@ message ExecuteRequest { // The server will have a default policy if this is not provided. // This may be applied to both the ActionResult and the associated blobs. ResultsCachePolicy results_cache_policy = 8; + + // The digest function that was used to compute the action digest. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the action digest hash and the digest functions announced + // in the server's capabilities. + DigestFunction.Value digest_function = 9; + + // A hint to the server to request inlining stdout in the + // [ActionResult][build.bazel.remote.execution.v2.ActionResult] message. + bool inline_stdout = 10; + + // A hint to the server to request inlining stderr in the + // [ActionResult][build.bazel.remote.execution.v2.ActionResult] message. + bool inline_stderr = 11; + + // A hint to the server to inline the contents of the listed output files. + // Each path needs to exactly match one file path in either `output_paths` or + // `output_files` (DEPRECATED since v2.1) in the + // [Command][build.bazel.remote.execution.v2.Command] message. + repeated string inline_output_files = 12; } // A `LogFile` is a log stored in the CAS. @@ -1065,14 +1500,21 @@ message ExecuteResponse { string message = 5; } -// Metadata about an ongoing -// [execution][build.bazel.remote.execution.v2.Execution.Execute], which -// will be contained in the [metadata -// field][google.longrunning.Operation.response] of the -// [Operation][google.longrunning.Operation]. -message ExecuteOperationMetadata { - // The current stage of execution. - enum Stage { +// The current stage of action execution. +// +// Even though these stages are numbered according to the order in which +// they generally occur, there is no requirement that the remote +// execution system reports events along this order. For example, an +// operation MAY transition from the EXECUTING stage back to QUEUED +// in case the hardware on which the operation executes fails. +// +// If and only if the remote execution system reports that an operation +// has reached the COMPLETED stage, it MUST set the [done +// field][google.longrunning.Operation.done] of the +// [Operation][google.longrunning.Operation] and terminate the stream. +message ExecutionStage { + enum Value { + // Invalid value. UNKNOWN = 0; // Checking the result against the cache. @@ -1087,22 +1529,34 @@ message ExecuteOperationMetadata { // Finished execution. COMPLETED = 4; } +} - Stage stage = 1; +// Metadata about an ongoing +// [execution][build.bazel.remote.execution.v2.Execution.Execute], which +// will be contained in the [metadata +// field][google.longrunning.Operation.response] of the +// [Operation][google.longrunning.Operation]. +message ExecuteOperationMetadata { + // The current stage of execution. + ExecutionStage.Value stage = 1; // The digest of the [Action][build.bazel.remote.execution.v2.Action] // being executed. Digest action_digest = 2; - // If set, the client can use this name with + // If set, the client can use this resource name with // [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the - // standard output. + // standard output from the endpoint hosting streamed responses. string stdout_stream_name = 3; - // If set, the client can use this name with + // If set, the client can use this resource name with // [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the - // standard error. + // standard error from the endpoint hosting streamed responses. string stderr_stream_name = 4; + + // The client can read this field to view details about the ongoing + // execution. + ExecutedActionMetadata partial_execution_metadata = 5; } // A request message for @@ -1126,6 +1580,29 @@ message GetActionResultRequest { // The digest of the [Action][build.bazel.remote.execution.v2.Action] // whose result is requested. Digest action_digest = 2; + + // A hint to the server to request inlining stdout in the + // [ActionResult][build.bazel.remote.execution.v2.ActionResult] message. + bool inline_stdout = 3; + + // A hint to the server to request inlining stderr in the + // [ActionResult][build.bazel.remote.execution.v2.ActionResult] message. + bool inline_stderr = 4; + + // A hint to the server to inline the contents of the listed output files. + // Each path needs to exactly match one file path in either `output_paths` or + // `output_files` (DEPRECATED since v2.1) in the + // [Command][build.bazel.remote.execution.v2.Command] message. + repeated string inline_output_files = 5; + + // The digest function that was used to compute the action digest. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the action digest hash and the digest functions announced + // in the server's capabilities. + DigestFunction.Value digest_function = 6; } // A request message for @@ -1150,6 +1627,15 @@ message UpdateActionResultRequest { // The server will have a default policy if this is not provided. // This may be applied to both the ActionResult and the associated blobs. ResultsCachePolicy results_cache_policy = 4; + + // The digest function that was used to compute the action digest. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the action digest hash and the digest functions announced + // in the server's capabilities. + DigestFunction.Value digest_function = 5; } // A request message for @@ -1162,8 +1648,18 @@ message FindMissingBlobsRequest { // omitted. string instance_name = 1; - // A list of the blobs to check. + // A list of the blobs to check. All digests MUST use the same digest + // function. repeated Digest blob_digests = 2; + + // The digest function of the blobs whose existence is checked. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the blob digest hashes and the digest functions announced + // in the server's capabilities. + DigestFunction.Value digest_function = 3; } // A response message for @@ -1178,11 +1674,18 @@ message FindMissingBlobsResponse { message BatchUpdateBlobsRequest { // A request corresponding to a single blob that the client wants to upload. message Request { - // The digest of the blob. This MUST be the digest of `data`. + // The digest of the blob. This MUST be the digest of `data`. All + // digests MUST use the same digest function. Digest digest = 1; // The raw binary data. bytes data = 2; + + // The format of `data`. Must be `IDENTITY`/unspecified, or one of the + // compressors advertised by the + // [CacheCapabilities.supported_batch_compressors][build.bazel.remote.execution.v2.CacheCapabilities.supported_batch_compressors] + // field. + Compressor.Value compressor = 3; } // The instance of the execution system to operate against. A server may @@ -1194,6 +1697,16 @@ message BatchUpdateBlobsRequest { // The individual upload requests. repeated Request requests = 2; + + // The digest function that was used to compute the digests of the + // blobs being uploaded. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the blob digest hashes and the digest functions announced + // in the server's capabilities. + DigestFunction.Value digest_function = 5; } // A response message for @@ -1222,8 +1735,22 @@ message BatchReadBlobsRequest { // omitted. string instance_name = 1; - // The individual blob digests. + // The individual blob digests. All digests MUST use the same digest + // function. repeated Digest digests = 2; + + // A list of acceptable encodings for the returned inlined data, in no + // particular order. `IDENTITY` is always allowed even if not specified here. + repeated Compressor.Value acceptable_compressors = 3; + + // The digest function of the blobs being requested. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the blob digest hashes and the digest functions announced + // in the server's capabilities. + DigestFunction.Value digest_function = 4; } // A response message for @@ -1237,6 +1764,10 @@ message BatchReadBlobsResponse { // The raw binary data. bytes data = 2; + // The format the data is encoded in. MUST be `IDENTITY`/unspecified, + // or one of the acceptable compressors specified in the `BatchReadBlobsRequest`. + Compressor.Value compressor = 4; + // The result of attempting to download that blob. google.rpc.Status status = 3; } @@ -1269,8 +1800,19 @@ message GetTreeRequest { // A page token, which must be a value received in a previous // [GetTreeResponse][build.bazel.remote.execution.v2.GetTreeResponse]. - // If present, the server will use it to return the following page of results. + // If present, the server will use that token as an offset, returning only + // that page and the ones that succeed it. string page_token = 4; + + // The digest function that was used to compute the digest of the root + // directory. + // + // If the digest function used is one of MD5, MURMUR3, SHA1, SHA256, + // SHA384, SHA512, or VSO, the client MAY leave this field unset. In + // that case the server SHOULD infer the digest function using the + // length of the root digest hash and the digest functions announced + // in the server's capabilities. + DigestFunction.Value digest_function = 5; } // A response message for @@ -1318,18 +1860,95 @@ message ServerCapabilities { // The digest function used for converting values into keys for CAS and Action // Cache. -enum DigestFunction { - // It is an error for the server to return this value. - UNKNOWN = 0; - - // The Sha-256 digest function. - SHA256 = 1; - - // The Sha-1 digest function. - SHA1 = 2; +message DigestFunction { + enum Value { + // It is an error for the server to return this value. + UNKNOWN = 0; - // The MD5 digest function. - MD5 = 3; + // The SHA-256 digest function. + SHA256 = 1; + + // The SHA-1 digest function. + SHA1 = 2; + + // The MD5 digest function. + MD5 = 3; + + // The Microsoft "VSO-Hash" paged SHA256 digest function. + // See https://github.com/microsoft/BuildXL/blob/master/Documentation/Specs/PagedHash.md . + VSO = 4; + + // The SHA-384 digest function. + SHA384 = 5; + + // The SHA-512 digest function. + SHA512 = 6; + + // Murmur3 128-bit digest function, x64 variant. Note that this is not a + // cryptographic hash function and its collision properties are not strongly guaranteed. + // See https://github.com/aappleby/smhasher/wiki/MurmurHash3 . + MURMUR3 = 7; + + // The SHA-256 digest function, modified to use a Merkle tree for + // large objects. This permits implementations to store large blobs + // as a decomposed sequence of 2^j sized chunks, where j >= 10, + // while being able to validate integrity at the chunk level. + // + // Furthermore, on systems that do not offer dedicated instructions + // for computing SHA-256 hashes (e.g., the Intel SHA and ARMv8 + // cryptographic extensions), SHA256TREE hashes can be computed more + // efficiently than plain SHA-256 hashes by using generic SIMD + // extensions, such as Intel AVX2 or ARM NEON. + // + // SHA256TREE hashes are computed as follows: + // + // - For blobs that are 1024 bytes or smaller, the hash is computed + // using the regular SHA-256 digest function. + // + // - For blobs that are more than 1024 bytes in size, the hash is + // computed as follows: + // + // 1. The blob is partitioned into a left (leading) and right + // (trailing) blob. These blobs have lengths m and n + // respectively, where m = 2^k and 0 < n <= m. + // + // 2. Hashes of the left and right blob, Hash(left) and + // Hash(right) respectively, are computed by recursively + // applying the SHA256TREE algorithm. + // + // 3. A single invocation is made to the SHA-256 block cipher with + // the following parameters: + // + // M = Hash(left) || Hash(right) + // H = { + // 0xcbbb9d5d, 0x629a292a, 0x9159015a, 0x152fecd8, + // 0x67332667, 0x8eb44a87, 0xdb0c2e0d, 0x47b5481d, + // } + // + // The values of H are the leading fractional parts of the + // square roots of the 9th to the 16th prime number (23 to 53). + // This differs from plain SHA-256, where the first eight prime + // numbers (2 to 19) are used, thereby preventing trivial hash + // collisions between small and large objects. + // + // 4. The hash of the full blob can then be obtained by + // concatenating the outputs of the block cipher: + // + // Hash(blob) = a || b || c || d || e || f || g || h + // + // Addition of the original values of H, as normally done + // through the use of the Davies-Meyer structure, is not + // performed. This isn't necessary, as the block cipher is only + // invoked once. + // + // Test vectors of this digest function can be found in the + // accompanying sha256tree_test_vectors.txt file. + SHA256TREE = 8; + + // The BLAKE3 hash function. + // See https://github.com/BLAKE3-team/BLAKE3. + BLAKE3 = 9; + } } // Describes the server/instance capabilities for updating the action cache. @@ -1338,21 +1957,26 @@ message ActionCacheUpdateCapabilities { } // Allowed values for priority in -// [ResultsCachePolicy][google.devtools.remoteexecution.v2.ResultsCachePolicy] +// [ResultsCachePolicy][build.bazel.remoteexecution.v2.ResultsCachePolicy] and +// [ExecutionPolicy][build.bazel.remoteexecution.v2.ResultsCachePolicy] // Used for querying both cache and execution valid priority ranges. message PriorityCapabilities { // Supported range of priorities, including boundaries. message PriorityRange { + // The minimum numeric value for this priority range, which represents the + // most urgent task or longest retained item. int32 min_priority = 1; + // The maximum numeric value for this priority range, which represents the + // least urgent task or shortest retained item. int32 max_priority = 2; } repeated PriorityRange priorities = 1; } -// Capabilities of the remote cache system. -message CacheCapabilities { - // Describes how the server treats absolute symlink targets. - enum SymlinkAbsolutePathStrategy { +// Describes how the server treats absolute symlink targets. +message SymlinkAbsolutePathStrategy { + enum Value { + // Invalid value. UNKNOWN = 0; // Server will return an `INVALID_ARGUMENT` on input symlinks with absolute @@ -1365,10 +1989,36 @@ message CacheCapabilities { // resulting in non-hermetic builds. ALLOWED = 2; } +} + +// Compression formats which may be supported. +message Compressor { + enum Value { + // No compression. Servers and clients MUST always support this, and do + // not need to advertise it. + IDENTITY = 0; + + // Zstandard compression. + ZSTD = 1; + + // RFC 1951 Deflate. This format is identical to what is used by ZIP + // files. Headers such as the one generated by gzip are not + // included. + // + // It is advised to use algorithms such as Zstandard instead, as + // those are faster and/or provide a better compression ratio. + DEFLATE = 2; + + // Brotli compression. + BROTLI = 3; + } +} +// Capabilities of the remote cache system. +message CacheCapabilities { // All the digest functions supported by the remote cache. // Remote cache may support multiple digest functions simultaneously. - repeated DigestFunction digest_function = 1; + repeated DigestFunction.Value digest_functions = 1; // Capabilities for updating the action cache. ActionCacheUpdateCapabilities action_cache_update_capabilities = 2; @@ -1383,19 +2033,52 @@ message CacheCapabilities { int64 max_batch_total_size_bytes = 4; // Whether absolute symlink targets are supported. - SymlinkAbsolutePathStrategy symlink_absolute_path_strategy = 5; + SymlinkAbsolutePathStrategy.Value symlink_absolute_path_strategy = 5; + + // Compressors supported by the "compressed-blobs" bytestream resources. + // Servers MUST support identity/no-compression, even if it is not listed + // here. + // + // Note that this does not imply which if any compressors are supported by + // the server at the gRPC level. + repeated Compressor.Value supported_compressors = 6; + + // Compressors supported for inlined data in + // [BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs] + // requests. + repeated Compressor.Value supported_batch_update_compressors = 7; } // Capabilities of the remote execution system. message ExecutionCapabilities { - // Remote execution may only support a single digest function. - DigestFunction digest_function = 1; + // Legacy field for indicating which digest function is supported by the + // remote execution system. It MUST be set to a value other than UNKNOWN. + // Implementations should consider the repeated digest_functions field + // first, falling back to this singular field if digest_functions is unset. + DigestFunction.Value digest_function = 1; // Whether remote execution is enabled for the particular server/instance. bool exec_enabled = 2; // Supported execution priority range. PriorityCapabilities execution_priority_capabilities = 3; + + // Supported node properties. + repeated string supported_node_properties = 4; + + // All the digest functions supported by the remote execution system. + // If this field is set, it MUST also contain digest_function. + // + // Even if the remote execution system announces support for multiple + // digest functions, individual execution requests may only reference + // CAS objects using a single digest function. For example, it is not + // permitted to execute actions having both MD5 and SHA-256 hashed + // files in their input root. + // + // The CAS objects referenced by action results generated by the + // remote execution system MUST use the same digest function as the + // one used to construct the action. + repeated DigestFunction.Value digest_functions = 5; } // Details for the tool used to call the API. @@ -1414,6 +2097,11 @@ message ToolDetails { // // * name: `build.bazel.remote.execution.v2.requestmetadata-bin` // * contents: the base64 encoded binary `RequestMetadata` message. +// Note: the gRPC library serializes binary headers encoded in base64 by +// default (https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md#requests). +// Therefore, if the gRPC library is used to pass/retrieve this +// metadata, the user may ignore the base64 encoding and assume it is simply +// serialized as a binary message. message RequestMetadata { // The details for the tool invoking the requests. ToolDetails tool_details = 1; @@ -1430,4 +2118,18 @@ message RequestMetadata { // An identifier to tie multiple tool invocations together. For example, // runs of foo_test, bar_test and baz_test on a post-submit of a given patch. string correlated_invocations_id = 4; + + // A brief description of the kind of action, for example, CppCompile or GoLink. + // There is no standard agreed set of values for this, and they are expected to vary between different client tools. + string action_mnemonic = 5; + + // An identifier for the target which produced this action. + // No guarantees are made around how many actions may relate to a single target. + string target_id = 6; + + // An identifier for the configuration in which the target was built, + // e.g. for differentiating building host tools or different target platforms. + // There is no expectation that this value will have any particular structure, + // or equality across invocations, though some client tools may offer these guarantees. + string configuration_id = 7; } diff --git a/build/bazel/remote/execution/v2/sha256tree_test_vectors.txt b/build/bazel/remote/execution/v2/sha256tree_test_vectors.txt new file mode 100644 index 0000000..d048317 --- /dev/null +++ b/build/bazel/remote/execution/v2/sha256tree_test_vectors.txt @@ -0,0 +1,27 @@ +# Test vectors for the SHA256TREE digest function +# +# Each test vector corresponds to the hash of a repeating sequence of +# 251 bytes: 0, 1, 2, ..., 249, 250, 0, 1, ..., and so on. The number in +# the first column corresponds to the length of the sequence, in bytes. +# +# Test vectors for input lengths 1024 and less are not provided, as +# those are identical to those of plain SHA-256. + +1025 36c0998b21839ef74300b9de47d96d1f62323dc81f2b4231e98ce70cd6ffe750 +2048 b584996386f01793751c5cf0c39561f51b7e9924b818943b3cb2f6928cea0fa9 +2049 7318d2029b0392edf4cf109edb5a086b4bdadbb7950f710a1483eb881d9e5d44 +3072 dfc61c0a041f79d55d53bfe31c6cda7df77fdc8e6fbac1143d70b7144fdf6937 +3073 517d20c0e5835f060a1bd6388ed68574f63424bdac2a2c3a35a5c2ef859d8fe2 +4096 2f72bb93880012168c027f6781527ff08177c7c8dccb443f4d2c6389c186633d +4097 c3ec942c1b8f4580320d3a06bcf4f8fe1f5db2be797ab67061ea4c2a95f208f2 +5120 a76924f6535b4b473377c285ec27acc84cc58e95ab1e9e29b1bb6a4a3fb9d0b3 +5121 98f987c3e9fc057a70873715b679b89a663d0df806859b6ce73f8379b06a10ff +6144 372f988af412041b680ab236feef45626380062beb7514bbf93607aedd28fc9a +6145 6dc4b78efd770453417b2ffdc74b27054793efe6122ecd7ee098670ed7c4651c +7168 43686312c0cabccf9d5ad509efa096e3d743c63c7a51f122473c57949e4dd9a0 +7169 ad729297ab36cd099665b27c4247474a5518e4cd0be443f5f31d95edda08429b +8192 fcfdde6fe59178e17708c5ba647919c3b141a44c9d1970782e597e1465266932 +8193 113c6e3a2452f388b6fad13dfab66ee0bff597a0a9a517ad8d0165f7190b603e +16384 a7a10149a8cb00be537000560edb83b196306b780b72fad8af218f369f75fc19 +31744 2cdf7662636c173d4b236f6ea03bf84c65e7f6487b53b2a61c420e26cf8a98c7 +102400 0668d69e5331840d2f1823d717b7b3f5d1fdc8a09504cddb692b87ff83d50e5f diff --git a/build/bazel/remote/logstream/v1/BUILD b/build/bazel/remote/logstream/v1/BUILD new file mode 100644 index 0000000..d189c9c --- /dev/null +++ b/build/bazel/remote/logstream/v1/BUILD @@ -0,0 +1,30 @@ +package(default_visibility = ["//visibility:public"]) + +load("@rules_proto//proto:defs.bzl", "proto_library") + +licenses(["notice"]) + +proto_library( + name = "remote_logstream_proto", + srcs = ["remote_logstream.proto"], +) + +alias( + name = "remote_logstream_java_proto", + actual = "//build/bazel/remote/logstream/v1/java:remote_logstream_java_proto", +) + +alias( + name = "remote_logstream_cc_proto", + actual = "//build/bazel/remote/logstream/v1/cc:remote_logstream_cc_grpc", +) + +alias( + name = "remote_logstream_go_proto", + actual = "//build/bazel/remote/logstream/v1/go:remote_logstream_go_proto", +) + +alias( + name = "go_default_library", + actual = "//build/bazel/remote/logstream/v1/go:go_default_library", +) diff --git a/build/bazel/remote/logstream/v1/cc/BUILD b/build/bazel/remote/logstream/v1/cc/BUILD new file mode 100644 index 0000000..21458e0 --- /dev/null +++ b/build/bazel/remote/logstream/v1/cc/BUILD @@ -0,0 +1,25 @@ +package(default_visibility = ["//build/bazel/remote/logstream/v1:__pkg__"]) + +load("//internal:cc_grpc_library.bzl", "cc_grpc_codegen") + +cc_proto_library( + name = "remote_logstream_cc_proto", + deps = ["//build/bazel/remote/logstream/v1:remote_logstream_proto"], +) + +cc_grpc_codegen( + name = "remote_logstream_cc_grpc_codegen", + proto = "//build/bazel/remote/logstream/v1:remote_logstream_proto", +) + +cc_library( + name = "remote_logstream_cc_grpc", + srcs = [":remote_logstream_cc_grpc_codegen"], + hdrs = [":remote_logstream_cc_grpc_codegen"], + include_prefix = "build/bazel/remote/logstream/v1", + strip_include_prefix = "/" + package_name(), + deps = [ + ":remote_logstream_cc_proto", + "@com_github_grpc_grpc//:grpc++_codegen_proto", + ], +) diff --git a/build/bazel/remote/logstream/v1/go/BUILD b/build/bazel/remote/logstream/v1/go/BUILD new file mode 100644 index 0000000..df86f75 --- /dev/null +++ b/build/bazel/remote/logstream/v1/go/BUILD @@ -0,0 +1,17 @@ +package(default_visibility = ["//build/bazel/remote/logstream/v1:__pkg__"]) + +load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library") + +go_proto_library( + name = "remote_logstream_go_proto", + compilers = ["@io_bazel_rules_go//proto:go_grpc"], + importpath = "github.com/bazelbuild/remote-apis/build/bazel/remote/logstream/v1", + proto = "//build/bazel/remote/logstream/v1:remote_logstream_proto", +) + +go_library( + name = "go_default_library", + embed = [":remote_logstream_go_proto"], + importpath = "github.com/bazelbuild/remote-apis/build/bazel/remote/logstream/v1", +) diff --git a/build/bazel/remote/logstream/v1/java/BUILD b/build/bazel/remote/logstream/v1/java/BUILD new file mode 100644 index 0000000..23f3a2c --- /dev/null +++ b/build/bazel/remote/logstream/v1/java/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//build/bazel/remote/logstream/v1:__pkg__"]) + +java_proto_library( + name = "remote_logstream_java_proto", + deps = ["//build/bazel/remote/logstream/v1:remote_logstream_proto"], +) diff --git a/build/bazel/remote/logstream/v1/remote_logstream.pb.go b/build/bazel/remote/logstream/v1/remote_logstream.pb.go new file mode 100755 index 0000000..cd1ac2f --- /dev/null +++ b/build/bazel/remote/logstream/v1/remote_logstream.pb.go @@ -0,0 +1,389 @@ +// Copyright 2020 The Bazel Authors. +// +// 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. + +// Log Stream API + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v3.15.0 +// source: build/bazel/remote/logstream/v1/remote_logstream.proto + +package remotelogstream + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Contains all information necessary to create a new LogStream resource. +type CreateLogStreamRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. The parent resource of the created LogStream. + // The list of valid types of parent resources of LogStreams is up to the + // implementing server. + // Example: projects/123 + Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` +} + +func (x *CreateLogStreamRequest) Reset() { + *x = CreateLogStreamRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateLogStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateLogStreamRequest) ProtoMessage() {} + +func (x *CreateLogStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateLogStreamRequest.ProtoReflect.Descriptor instead. +func (*CreateLogStreamRequest) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescGZIP(), []int{0} +} + +func (x *CreateLogStreamRequest) GetParent() string { + if x != nil { + return x.Parent + } + return "" +} + +// A handle to a log (an ordered sequence of bytes). +type LogStream struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Structured name of the resource in the format: + // + // {parent=**}/logstreams/{logstream_id} + // Example: projects/123/logstreams/456-def + // + // Attempting to call the Byte Stream API's `Write` RPC with a LogStream's + // + // `name` as the value for `ByteStream.Write.resource_name` is an error. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Resource name to pass to `ByteStream.Write` in the format: + // + // {parent=**}/logstreams/{logstream_id}/{write_token} + // Example: projects/123/logstreams/456-def/789-ghi + // + // Attempting to call the Byte Stream API's `Read` RPC with a LogStream's + // + // `write_resource_name` as the value for `ByteStream.Write.resource_name` + // is an error. + // + // `write_resource_name` is separate from `name` to ensure that only the + // intended writers can write to a given LogStream. Writers must address write + // operations to the `write_resource_name`, not the `name`, and must have + // permission to write LogStreams. `write_resource_name` embeds a secret token + // and should be protected accordingly; a mishandled `write_resource_name` can + // result in unintended writers corrupting the LogStream. Therefore, the field + // should be excluded from calls to any calls which retrieve LogStream + // metadata (i.e.: `GetLogStream`). + // + // Bytes written to this resource must to be readable when `ByteStream.Read` + // is called with the `name` resource. + // Reading a write_resource_name must return an INVALID_ARGUMENT error. + WriteResourceName string `protobuf:"bytes,2,opt,name=write_resource_name,json=writeResourceName,proto3" json:"write_resource_name,omitempty"` +} + +func (x *LogStream) Reset() { + *x = LogStream{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LogStream) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogStream) ProtoMessage() {} + +func (x *LogStream) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LogStream.ProtoReflect.Descriptor instead. +func (*LogStream) Descriptor() ([]byte, []int) { + return file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescGZIP(), []int{1} +} + +func (x *LogStream) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *LogStream) GetWriteResourceName() string { + if x != nil { + return x.WriteResourceName + } + return "" +} + +var File_build_bazel_remote_logstream_v1_remote_logstream_proto protoreflect.FileDescriptor + +var file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDesc = []byte{ + 0x0a, 0x36, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2f, 0x76, + 0x31, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, + 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x6c, 0x6f, 0x67, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x22, 0x30, 0x0a, 0x16, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x4f, 0x0a, 0x09, 0x4c, + 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x32, 0x8c, 0x01, 0x0a, + 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x78, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x12, 0x37, 0x2e, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, + 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x22, 0x00, 0x42, 0xb3, 0x01, 0x0a, 0x1f, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x2e, 0x6c, 0x6f, 0x67, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, 0x31, 0x42, + 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x51, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, + 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x2f, 0x6c, 0x6f, + 0x67, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2f, 0x76, 0x31, 0x3b, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x6c, 0x6f, 0x67, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0xa2, 0x02, 0x02, 0x52, 0x4c, 0xaa, + 0x02, 0x1f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x42, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x2e, 0x76, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescOnce sync.Once + file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescData = file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDesc +) + +func file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescGZIP() []byte { + file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescOnce.Do(func() { + file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescData = protoimpl.X.CompressGZIP(file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescData) + }) + return file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDescData +} + +var file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_build_bazel_remote_logstream_v1_remote_logstream_proto_goTypes = []interface{}{ + (*CreateLogStreamRequest)(nil), // 0: build.bazel.remote.logstream.v1.CreateLogStreamRequest + (*LogStream)(nil), // 1: build.bazel.remote.logstream.v1.LogStream +} +var file_build_bazel_remote_logstream_v1_remote_logstream_proto_depIdxs = []int32{ + 0, // 0: build.bazel.remote.logstream.v1.LogStreamService.CreateLogStream:input_type -> build.bazel.remote.logstream.v1.CreateLogStreamRequest + 1, // 1: build.bazel.remote.logstream.v1.LogStreamService.CreateLogStream:output_type -> build.bazel.remote.logstream.v1.LogStream + 1, // [1:2] is the sub-list for method output_type + 0, // [0:1] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_build_bazel_remote_logstream_v1_remote_logstream_proto_init() } +func file_build_bazel_remote_logstream_v1_remote_logstream_proto_init() { + if File_build_bazel_remote_logstream_v1_remote_logstream_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateLogStreamRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LogStream); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_build_bazel_remote_logstream_v1_remote_logstream_proto_goTypes, + DependencyIndexes: file_build_bazel_remote_logstream_v1_remote_logstream_proto_depIdxs, + MessageInfos: file_build_bazel_remote_logstream_v1_remote_logstream_proto_msgTypes, + }.Build() + File_build_bazel_remote_logstream_v1_remote_logstream_proto = out.File + file_build_bazel_remote_logstream_v1_remote_logstream_proto_rawDesc = nil + file_build_bazel_remote_logstream_v1_remote_logstream_proto_goTypes = nil + file_build_bazel_remote_logstream_v1_remote_logstream_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// LogStreamServiceClient is the client API for LogStreamService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type LogStreamServiceClient interface { + // Create a LogStream which may be written to. + // + // The returned LogStream resource name will include a `write_resource_name` + // which is the resource to use when writing to the LogStream. + // Callers of CreateLogStream are expected to NOT publish the + // `write_resource_name`. + CreateLogStream(ctx context.Context, in *CreateLogStreamRequest, opts ...grpc.CallOption) (*LogStream, error) +} + +type logStreamServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewLogStreamServiceClient(cc grpc.ClientConnInterface) LogStreamServiceClient { + return &logStreamServiceClient{cc} +} + +func (c *logStreamServiceClient) CreateLogStream(ctx context.Context, in *CreateLogStreamRequest, opts ...grpc.CallOption) (*LogStream, error) { + out := new(LogStream) + err := c.cc.Invoke(ctx, "/build.bazel.remote.logstream.v1.LogStreamService/CreateLogStream", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// LogStreamServiceServer is the server API for LogStreamService service. +type LogStreamServiceServer interface { + // Create a LogStream which may be written to. + // + // The returned LogStream resource name will include a `write_resource_name` + // which is the resource to use when writing to the LogStream. + // Callers of CreateLogStream are expected to NOT publish the + // `write_resource_name`. + CreateLogStream(context.Context, *CreateLogStreamRequest) (*LogStream, error) +} + +// UnimplementedLogStreamServiceServer can be embedded to have forward compatible implementations. +type UnimplementedLogStreamServiceServer struct { +} + +func (*UnimplementedLogStreamServiceServer) CreateLogStream(context.Context, *CreateLogStreamRequest) (*LogStream, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateLogStream not implemented") +} + +func RegisterLogStreamServiceServer(s *grpc.Server, srv LogStreamServiceServer) { + s.RegisterService(&_LogStreamService_serviceDesc, srv) +} + +func _LogStreamService_CreateLogStream_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateLogStreamRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogStreamServiceServer).CreateLogStream(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/build.bazel.remote.logstream.v1.LogStreamService/CreateLogStream", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogStreamServiceServer).CreateLogStream(ctx, req.(*CreateLogStreamRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _LogStreamService_serviceDesc = grpc.ServiceDesc{ + ServiceName: "build.bazel.remote.logstream.v1.LogStreamService", + HandlerType: (*LogStreamServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateLogStream", + Handler: _LogStreamService_CreateLogStream_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "build/bazel/remote/logstream/v1/remote_logstream.proto", +} diff --git a/build/bazel/remote/logstream/v1/remote_logstream.proto b/build/bazel/remote/logstream/v1/remote_logstream.proto new file mode 100644 index 0000000..2741016 --- /dev/null +++ b/build/bazel/remote/logstream/v1/remote_logstream.proto @@ -0,0 +1,139 @@ +// Copyright 2020 The Bazel Authors. +// +// 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. + +// Log Stream API + +syntax = "proto3"; + +package build.bazel.remote.logstream.v1; + +option csharp_namespace = "Build.Bazel.Remote.LogStream.v1"; +option go_package = "github.com/bazelbuild/remote-apis/build/bazel/remote/logstream/v1;remotelogstream"; +option java_multiple_files = true; +option java_outer_classname = "RemoteLogStreamProto"; +option java_package = "build.bazel.remote.logstream.v1"; +option objc_class_prefix = "RL"; + + +// #### Introduction +// +// The Log Stream API manages LogStream resources which are used to stream +// writes and reads of an ordered sequence of bytes of unknown eventual length. +// +// Note that this is an API Interface and not an API Service, per the definitions +// at: https://cloud.google.com/apis/design/glossary +// +// Log Stream API supports the reading of unfinalized LogStreams either by +// seeking or in "tail" mode, for example by end-users browsing to a build +// result UI interested in seeing logs from a build action as soon as they are +// (or as they become) available. +// +// Reads and Writes of LogStreams are done via the Byte Stream API: +// https://cloud.google.com/dataproc/docs/reference/rpc/google.bytestream +// https://github.com/googleapis/googleapis/blob/master/google/bytestream/bytestream.proto +// +// #### Writing LogStreams +// +// LogStreams are written to via the Byte Stream API's `Write` RPC. Bytes +// written to LogStreams are expected to be committed and available for reading +// within a reasonable period of time (implementation-defined). Committed bytes +// to a LogStream cannot be overwritten, and finalized LogStreams - indicated by +// setting `finish_write` field in the final WriteRequest - also cannot be +// appended to. +// +// When calling the Byte Stream API's `Write` RPC to write LogStreams, writers +// must pass the `write_resource_name` of a LogStream as +// `ByteStream.WriteRequest.resource_name` rather than the LogStream's `name`. +// Separate resource names for reading and writing allows for broadcasting the +// read resource name widely while simultaneously ensuring that only writer(s) +// with knowledge of the write resource name may have written bytes to the +// LogStream. +// +// #### Reading LogStreams +// +// Use the Byte Stream API's `Read` RPC to read LogStreams. When reading +// finalized LogStreams the server will stream all contents of the LogStream +// starting at `ByteStream.ReadRequest.read_offset`. +// +// When reading unfinalized LogStreams the server must keep the streaming +// `ByteStream.Read` RPC open and send `ByteStream.ReadResponse` messages as +// more bytes become available or the LogStream is finalized. +// +// #### Example Multi-Party Read/Write Flow +// +// 1. LogStream Writer calls `CreateLogStream` +// 2. LogStream Writer publishes `LogStream.name` +// 3. LogStream Writer calls `ByteStream.Write` with +// `LogStream.write_resource_name` as +// `ByteStream.WriteRequest.resource_name`, +// `ByteStream.WriteRequest.finish_write`=false. +// 4. LogStream Reader(s) call `ByteStream.Read` with the published +// `LogStream.name` as `ByteStream.ReadRequest.resource_name`. +// 5. LogStream Service streams all committed bytes to LogStream Reader(s), +// leave the stream open. +// 6. LogStream Writer calls `ByteStream.Write` with +// `LogStream.write_resource_name` as +// `ByteStream.WriteRequest.resource_name`, +// `ByteStream.WriteRequest.finish_write`=true. +// 7. LogStream Service streams all remaining bytes to LogStream Reader(s), +// terminates the stream. +service LogStreamService { + // Create a LogStream which may be written to. + // + // The returned LogStream resource name will include a `write_resource_name` + // which is the resource to use when writing to the LogStream. + // Callers of CreateLogStream are expected to NOT publish the + // `write_resource_name`. + rpc CreateLogStream(CreateLogStreamRequest) returns (LogStream) {} +} + +// Contains all information necessary to create a new LogStream resource. +message CreateLogStreamRequest { + // Required. The parent resource of the created LogStream. + // The list of valid types of parent resources of LogStreams is up to the + // implementing server. + // Example: projects/123 + string parent = 1; +} + +// A handle to a log (an ordered sequence of bytes). +message LogStream { + // Structured name of the resource in the format: + // {parent=**}/logstreams/{logstream_id} + // Example: projects/123/logstreams/456-def + // Attempting to call the Byte Stream API's `Write` RPC with a LogStream's + // `name` as the value for `ByteStream.Write.resource_name` is an error. + string name = 1; + + // Resource name to pass to `ByteStream.Write` in the format: + // {parent=**}/logstreams/{logstream_id}/{write_token} + // Example: projects/123/logstreams/456-def/789-ghi + // Attempting to call the Byte Stream API's `Read` RPC with a LogStream's + // `write_resource_name` as the value for `ByteStream.Write.resource_name` + // is an error. + // + // `write_resource_name` is separate from `name` to ensure that only the + // intended writers can write to a given LogStream. Writers must address write + // operations to the `write_resource_name`, not the `name`, and must have + // permission to write LogStreams. `write_resource_name` embeds a secret token + // and should be protected accordingly; a mishandled `write_resource_name` can + // result in unintended writers corrupting the LogStream. Therefore, the field + // should be excluded from calls to any calls which retrieve LogStream + // metadata (i.e.: `GetLogStream`). + // + // Bytes written to this resource must to be readable when `ByteStream.Read` + // is called with the `name` resource. + // Reading a write_resource_name must return an INVALID_ARGUMENT error. + string write_resource_name = 2; +} diff --git a/build/bazel/semver/BUILD b/build/bazel/semver/BUILD index a3da887..9663c94 100644 --- a/build/bazel/semver/BUILD +++ b/build/bazel/semver/BUILD @@ -1,5 +1,6 @@ package(default_visibility = ["//visibility:public"]) -load("@com_github_grpc_grpc//bazel:cc_grpc_library.bzl", "cc_grpc_library") + +load("@rules_proto//proto:defs.bzl", "proto_library") licenses(["notice"]) @@ -8,17 +9,22 @@ proto_library( srcs = ["semver.proto"], ) -java_proto_library( +alias( name = "semver_java_proto", - deps = [":semver_proto"], + actual = "//build/bazel/semver/java:semver_java_proto", ) -cc_grpc_library( +alias( name = "semver_cc_proto", - srcs = ["semver.proto"], - deps = [], - proto_only = False, - well_known_protos = True, - use_external = False, + actual = "//build/bazel/semver/cc:semver_cc_proto", ) +alias( + name = "semver_go_proto", + actual = "//build/bazel/semver/go:semver_go_proto", +) + +alias( + name = "go_default_library", + actual = "//build/bazel/semver/go:go_default_library", +) diff --git a/build/bazel/semver/cc/BUILD b/build/bazel/semver/cc/BUILD new file mode 100644 index 0000000..ceda8a5 --- /dev/null +++ b/build/bazel/semver/cc/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//build/bazel/semver:__pkg__"]) + +cc_proto_library( + name = "semver_cc_proto", + deps = ["//build/bazel/semver:semver_proto"], +) diff --git a/build/bazel/semver/go/BUILD b/build/bazel/semver/go/BUILD new file mode 100644 index 0000000..3023c19 --- /dev/null +++ b/build/bazel/semver/go/BUILD @@ -0,0 +1,16 @@ +package(default_visibility = ["//build/bazel/semver:__pkg__"]) + +load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library") + +go_proto_library( + name = "semver_go_proto", + importpath = "github.com/bazelbuild/remote-apis/build/bazel/semver", + proto = "//build/bazel/semver:semver_proto", +) + +go_library( + name = "go_default_library", + embed = [":semver_go_proto"], + importpath = "github.com/bazelbuild/remote-apis/build/bazel/semver", +) diff --git a/build/bazel/semver/java/BUILD b/build/bazel/semver/java/BUILD new file mode 100644 index 0000000..7148af3 --- /dev/null +++ b/build/bazel/semver/java/BUILD @@ -0,0 +1,6 @@ +package(default_visibility = ["//build/bazel/semver:__pkg__"]) + +java_proto_library( + name = "semver_java_proto", + deps = ["//build/bazel/semver:semver_proto"], +) diff --git a/build/bazel/semver/semver.pb.go b/build/bazel/semver/semver.pb.go new file mode 100755 index 0000000..a33beca --- /dev/null +++ b/build/bazel/semver/semver.pb.go @@ -0,0 +1,199 @@ +// Copyright 2018 The Bazel Authors. +// +// 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. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v3.15.0 +// source: build/bazel/semver/semver.proto + +package semver + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// The full version of a given tool. +type SemVer struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The major version, e.g 10 for 10.2.3. + Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` + // The minor version, e.g. 2 for 10.2.3. + Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` + // The patch version, e.g 3 for 10.2.3. + Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` + // The pre-release version. Either this field or major/minor/patch fields + // must be filled. They are mutually exclusive. Pre-release versions are + // assumed to be earlier than any released versions. + Prerelease string `protobuf:"bytes,4,opt,name=prerelease,proto3" json:"prerelease,omitempty"` +} + +func (x *SemVer) Reset() { + *x = SemVer{} + if protoimpl.UnsafeEnabled { + mi := &file_build_bazel_semver_semver_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SemVer) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SemVer) ProtoMessage() {} + +func (x *SemVer) ProtoReflect() protoreflect.Message { + mi := &file_build_bazel_semver_semver_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SemVer.ProtoReflect.Descriptor instead. +func (*SemVer) Descriptor() ([]byte, []int) { + return file_build_bazel_semver_semver_proto_rawDescGZIP(), []int{0} +} + +func (x *SemVer) GetMajor() int32 { + if x != nil { + return x.Major + } + return 0 +} + +func (x *SemVer) GetMinor() int32 { + if x != nil { + return x.Minor + } + return 0 +} + +func (x *SemVer) GetPatch() int32 { + if x != nil { + return x.Patch + } + return 0 +} + +func (x *SemVer) GetPrerelease() string { + if x != nil { + return x.Prerelease + } + return "" +} + +var File_build_bazel_semver_semver_proto protoreflect.FileDescriptor + +var file_build_bazel_semver_semver_proto_rawDesc = []byte{ + 0x0a, 0x1f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x73, 0x65, + 0x6d, 0x76, 0x65, 0x72, 0x2f, 0x73, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x12, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2e, 0x73, + 0x65, 0x6d, 0x76, 0x65, 0x72, 0x22, 0x6a, 0x0a, 0x06, 0x53, 0x65, 0x6d, 0x56, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, + 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x65, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x65, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x42, 0x74, 0x0a, 0x12, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x62, 0x61, 0x7a, 0x65, 0x6c, + 0x2e, 0x73, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x42, 0x0b, 0x53, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x2d, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x2f, + 0x62, 0x61, 0x7a, 0x65, 0x6c, 0x2f, 0x73, 0x65, 0x6d, 0x76, 0x65, 0x72, 0xa2, 0x02, 0x03, 0x53, + 0x4d, 0x56, 0xaa, 0x02, 0x12, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x42, 0x61, 0x7a, 0x65, 0x6c, + 0x2e, 0x53, 0x65, 0x6d, 0x76, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_build_bazel_semver_semver_proto_rawDescOnce sync.Once + file_build_bazel_semver_semver_proto_rawDescData = file_build_bazel_semver_semver_proto_rawDesc +) + +func file_build_bazel_semver_semver_proto_rawDescGZIP() []byte { + file_build_bazel_semver_semver_proto_rawDescOnce.Do(func() { + file_build_bazel_semver_semver_proto_rawDescData = protoimpl.X.CompressGZIP(file_build_bazel_semver_semver_proto_rawDescData) + }) + return file_build_bazel_semver_semver_proto_rawDescData +} + +var file_build_bazel_semver_semver_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_build_bazel_semver_semver_proto_goTypes = []interface{}{ + (*SemVer)(nil), // 0: build.bazel.semver.SemVer +} +var file_build_bazel_semver_semver_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_build_bazel_semver_semver_proto_init() } +func file_build_bazel_semver_semver_proto_init() { + if File_build_bazel_semver_semver_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_build_bazel_semver_semver_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SemVer); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_build_bazel_semver_semver_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_build_bazel_semver_semver_proto_goTypes, + DependencyIndexes: file_build_bazel_semver_semver_proto_depIdxs, + MessageInfos: file_build_bazel_semver_semver_proto_msgTypes, + }.Build() + File_build_bazel_semver_semver_proto = out.File + file_build_bazel_semver_semver_proto_rawDesc = nil + file_build_bazel_semver_semver_proto_goTypes = nil + file_build_bazel_semver_semver_proto_depIdxs = nil +} diff --git a/build/bazel/semver/semver.proto b/build/bazel/semver/semver.proto index 3b626b7..44f83f8 100644 --- a/build/bazel/semver/semver.proto +++ b/build/bazel/semver/semver.proto @@ -17,7 +17,7 @@ syntax = "proto3"; package build.bazel.semver; option csharp_namespace = "Build.Bazel.Semver"; -option go_package = "semver"; +option go_package = "github.com/bazelbuild/remote-apis/build/bazel/semver"; option java_multiple_files = true; option java_outer_classname = "SemverProto"; option java_package = "build.bazel.semver"; diff --git a/external/BUILD.googleapis b/external/BUILD.googleapis deleted file mode 100644 index 1cfef9f..0000000 --- a/external/BUILD.googleapis +++ /dev/null @@ -1,78 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@com_github_grpc_grpc//bazel:cc_grpc_library.bzl", "cc_grpc_library") - -licenses(["notice"]) - -proto_library( - name = "google_api_annotations_proto", - srcs = ["google/api/annotations.proto"], - deps = [ - ":google_api_http_proto", - "@com_google_protobuf//:descriptor_proto", - ], -) - -cc_grpc_library( - name = "google_api_annotations_cc_proto", - srcs = ["google/api/annotations.proto"], - deps = [":google_api_http_cc_proto"], - proto_only = False, - well_known_protos = True, - use_external = False, -) - -proto_library( - name = "google_api_http_proto", - srcs = ["google/api/http.proto"], -) - -cc_grpc_library( - name = "google_api_http_cc_proto", - srcs = ["google/api/http.proto"], - deps = [], - proto_only = False, - well_known_protos = True, - use_external = False, -) - -proto_library( - name = "google_longrunning_operations_proto", - srcs = ["google/longrunning/operations.proto"], - deps = [ - ":google_api_annotations_proto", - ":google_api_http_proto", - ":google_rpc_status_proto", - "@com_google_protobuf//:any_proto", - "@com_google_protobuf//:empty_proto", - ], -) - -cc_grpc_library( - name = "google_longrunning_operations_cc_proto", - srcs = ["google/longrunning/operations.proto"], - deps = [ - ":google_api_annotations_cc_proto", - ":google_api_http_cc_proto", - ":google_rpc_status_cc_proto", - ], - proto_only = False, - well_known_protos = True, - use_external = False, -) - -proto_library( - name = "google_rpc_status_proto", - srcs = ["google/rpc/status.proto"], - deps = ["@com_google_protobuf//:any_proto"], -) - -cc_grpc_library( - name = "google_rpc_status_cc_proto", - srcs = ["google/rpc/status.proto"], - deps = [], - proto_only = False, - well_known_protos = True, - use_external = False, -) - @@ -0,0 +1,12 @@ +module github.com/bazelbuild/remote-apis + +go 1.12 + +require ( + github.com/golang/protobuf v1.5.2 + golang.org/x/net v0.0.0-20210505214959-0714010a04ed // indirect + golang.org/x/sys v0.0.0-20210507014357-30e306a8bba5 // indirect + google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2 + google.golang.org/grpc v1.37.0 + google.golang.org/protobuf v1.26.0 +) @@ -0,0 +1,123 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210505214959-0714010a04ed h1:V9kAVxLvz1lkufatrpHuUVyJ/5tR3Ms7rk951P4mI98= +golang.org/x/net v0.0.0-20210505214959-0714010a04ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210507014357-30e306a8bba5 h1:cez+MEm4+A0CG7ik1Qzj3bmK9DFoouuLom9lwM+Ijow= +golang.org/x/sys v0.0.0-20210507014357-30e306a8bba5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2 h1:pl8qT5D+48655f14yDURpIZwSPvMWuuekfAP+gxtjvk= +google.golang.org/genproto v0.0.0-20210506142907-4a47615972c2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0 h1:uSZWeQJX5j11bIQ4AJoj+McDBo29cY1MCoC1wO3ts+c= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/hooks/pre-commit b/hooks/pre-commit new file mode 100755 index 0000000..ca2e9e8 --- /dev/null +++ b/hooks/pre-commit @@ -0,0 +1,15 @@ +#!/bin/sh +# Precommit hook to rebuild generated go code. Fails if building or copying the +# files fails. +set -e +bazel build build/bazel/remote/execution/v2:remote_execution_go_proto \ + build/bazel/remote/asset/v1:remote_asset_go_proto \ + build/bazel/remote/logstream/v1:remote_logstream_go_proto + +for i in "build/bazel/remote/execution/v2/remote_execution.pb.go" \ + "build/bazel/semver/semver.pb.go" \ + "build/bazel/remote/asset/v1/remote_asset.pb.go" \ + "build/bazel/remote/logstream/v1/remote_logstream.pb.go" ; do + cp "$(find $(bazel info bazel-bin) -path "*/$i")" "$i" + git add "$i" +done diff --git a/internal/BUILD b/internal/BUILD new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/internal/BUILD diff --git a/internal/cc_grpc_library.bzl b/internal/cc_grpc_library.bzl new file mode 100644 index 0000000..a6e8ab0 --- /dev/null +++ b/internal/cc_grpc_library.bzl @@ -0,0 +1,118 @@ +"""Rule for running the gRPC C++ code generator. + +This is a simplified and modernised version of the upstream gRPC +`bazel/cc_grpc_library.bzl` file, which as of release v1.45 +(published 2022-03-19) does not support separating the `proto_library` and +`cc_proto_library` targets into separate packages or repositories. + +The following logic should eventually find a home in upstream gRPC, rules_proto, +or rules_cc so that the Bazel Remote APIs repository can be further decoupled +from language-specific concerns. +""" + +load("@com_github_grpc_grpc//bazel:protobuf.bzl", "get_include_protoc_args") + +_EXT_PROTO = ".proto" +_EXT_PROTODEVEL = ".protodevel" +_EXT_GRPC_HDR = ".grpc.pb.h" +_EXT_GRPC_SRC = ".grpc.pb.cc" + +def _drop_proto_ext(name): + if name.endswith(_EXT_PROTO): + return name[:-len(_EXT_PROTO)] + if name.endswith(_EXT_PROTODEVEL): + return name[:-len(_EXT_PROTODEVEL)] + fail("{!r} does not end with {!r} or {!r}".format( + name, + _EXT_PROTO, + _EXT_PROTODEVEL, + )) + +def _proto_srcname(file): + """Return the Protobuf source name for a proto_library source file. + + The source name is what the Protobuf compiler uses to identify a .proto + source file. It is relative to the compiler's `--proto_path` flag. + """ + ws_root = file.owner.workspace_root + if ws_root != "" and file.path.startswith(ws_root): + return file.path[len(ws_root) + 1:] + return file.short_path + +def _cc_grpc_codegen(ctx): + """Run the gRPC C++ code generator to produce sources and headers""" + proto = ctx.attr.proto[ProtoInfo] + proto_srcs = proto.check_deps_sources.to_list() + proto_imports = proto.transitive_imports.to_list() + + protoc_out = ctx.actions.declare_directory(ctx.attr.name + "_protoc_out") + protoc_outputs = [protoc_out] + rule_outputs = [] + + for proto_src in proto_srcs: + srcname = _drop_proto_ext(_proto_srcname(proto_src)) + basename = _drop_proto_ext(proto_src.basename) + + out_hdr = ctx.actions.declare_file(basename + _EXT_GRPC_HDR) + out_src = ctx.actions.declare_file(basename + _EXT_GRPC_SRC) + + protoc_out_prefix = protoc_out.basename + protoc_out_hdr = ctx.actions.declare_file( + "{}/{}".format(protoc_out_prefix, srcname + _EXT_GRPC_HDR), + ) + protoc_out_src = ctx.actions.declare_file( + "{}/{}".format(protoc_out_prefix, srcname + _EXT_GRPC_SRC), + ) + + rule_outputs.extend([out_hdr, out_src]) + protoc_outputs.extend([protoc_out_hdr, protoc_out_src]) + + ctx.actions.expand_template( + template = protoc_out_hdr, + output = out_hdr, + substitutions = {}, + ) + ctx.actions.expand_template( + template = protoc_out_src, + output = out_src, + substitutions = {}, + ) + + plugin = ctx.executable._protoc_gen_grpc + protoc_args = ctx.actions.args() + protoc_args.add("--plugin", "protoc-gen-grpc=" + plugin.path) + protoc_args.add("--grpc_out", protoc_out.path) + + protoc_args.add_all(get_include_protoc_args(proto_imports)) + protoc_args.add_all(proto_srcs, map_each = _proto_srcname) + + ctx.actions.run( + executable = ctx.executable._protoc, + arguments = [protoc_args], + inputs = proto_srcs + proto_imports, + outputs = protoc_outputs, + tools = [plugin], + ) + + return DefaultInfo(files = depset(rule_outputs)) + +cc_grpc_codegen = rule( + implementation = _cc_grpc_codegen, + attrs = { + "proto": attr.label( + mandatory = True, + allow_single_file = True, + providers = [ProtoInfo], + ), + "_protoc_gen_grpc": attr.label( + default = Label("@com_github_grpc_grpc//src/compiler:grpc_cpp_plugin"), + executable = True, + cfg = "host", + ), + "_protoc": attr.label( + default = Label("//external:protocol_compiler"), + executable = True, + cfg = "host", + ), + }, +) diff --git a/remote_apis_deps.bzl b/remote_apis_deps.bzl new file mode 100644 index 0000000..c828a2e --- /dev/null +++ b/remote_apis_deps.bzl @@ -0,0 +1,55 @@ +"""Load dependencies needed to depend on the RE API repo.""" + +load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository") +load("@io_bazel_rules_go//go:deps.bzl", "go_download_sdk", "go_register_toolchains", "go_rules_dependencies") + +def _maybe(repo_rule, name, **kwargs): + if name not in native.existing_rules(): + repo_rule(name = name, **kwargs) + +def remote_apis_go_deps(): + """Load dependencies needed to depend on RE API for Go""" + go_download_sdk(name = "go_sdk", version = "1.20.6") + go_register_toolchains() + + # The version of this repo needs to be in sync with @googleapis + go_repository( + name = "org_golang_google_genproto", + build_extra_args = ["-exclude=vendor"], + build_file_generation = "on", + build_file_proto_mode = "disable_global", + importpath = "google.golang.org/genproto", + sum = "h1:S9GbmC1iCgvbLyAokVCwiO6tVIrU9Y7c5oMx1V/ki/Y=", + version = "v0.0.0-20221024183307-1bc688fe9f3e", + ) + + go_rules_dependencies() + gazelle_dependencies(go_sdk = "go_sdk") + _maybe( + go_repository, + name = "com_github_golang_protobuf", + importpath = "github.com/golang/protobuf", + tag = "v1.3.2", + ) + _maybe( + go_repository, + name = "org_golang_google_grpc", + build_file_proto_mode = "disable", + importpath = "google.golang.org/grpc", + sum = "h1:uSZWeQJX5j11bIQ4AJoj+McDBo29cY1MCoC1wO3ts+c=", + version = "v1.37.0", + ) + _maybe( + go_repository, + name = "org_golang_x_net", + importpath = "golang.org/x/net", + sum = "h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=", + version = "v0.0.0-20190311183353-d8887717615a", + ) + _maybe( + go_repository, + name = "org_golang_x_text", + importpath = "golang.org/x/text", + sum = "h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=", + version = "v0.3.0", + ) diff --git a/repository_rules.bzl b/repository_rules.bzl new file mode 100644 index 0000000..b6174ce --- /dev/null +++ b/repository_rules.bzl @@ -0,0 +1,18 @@ +"""Deprecated stub for compatibility with previous releases.""" + +load("//:remote_apis_deps.bzl", "remote_apis_go_deps") + +def switched_rules_by_language( + name, + java = False, + go = False, + cc = False, + rules_override = {}): + """Deprecated stub for compatibility with previous releases.""" + print( + "The switched_rules_by_language macro is deprecated. Consumers of" + + " @bazel_remote_apis should specify per-language dependencies in" + + " their own workspace.", + ) + if go: + remote_apis_go_deps() |