// 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. syntax = "proto3"; 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/duration.proto"; import "google/protobuf/timestamp.proto"; import "google/rpc/status.proto"; option csharp_namespace = "Build.Bazel.Remote.Execution.V2"; option go_package = "bazel.build/remote/execution/v2;remoteexecution"; option java_multiple_files = true; option java_outer_classname = "RemoteExecutionProto"; option java_package = "build.bazel.remote.execution.v2"; option objc_class_prefix = "REX"; // The Remote Execution API is used to execute an // [Action][build.bazel.remote.execution.v2.Action] on the remote // workers. // // 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 Execution { // 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/{hash}/{size}"` indicating the digest of the missing blob. rpc Execute(ExecuteRequest) returns (stream google.longrunning.Operation) { option (google.api.http) = { post: "/v2/{instance_name=**}/actions:execute" body: "*" }; } // 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. rpc WaitExecution(WaitExecutionRequest) returns (stream google.longrunning.Operation) { option (google.api.http) = { post: "/v2/{name=operations/**}:waitExecution" body: "*" }; } } // The action cache API is used to query whether a given action has already been // performed and, if so, retrieve its result. Unlike the // [ContentAddressableStorage][build.bazel.remote.execution.v2.ContentAddressableStorage], // which addresses blobs by their own content, the action cache addresses the // [ActionResult][build.bazel.remote.execution.v2.ActionResult] by a // digest of the encoded [Action][build.bazel.remote.execution.v2.Action] // which produced them. // // 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. // // 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 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 TTLs of the referenced blobs SHOULD be increased // if necessary and applicable. // // Errors: // // * `NOT_FOUND`: The requested `ActionResult` is not in the cache. rpc GetActionResult(GetActionResultRequest) returns (ActionResult) { option (google.api.http) = { get: "/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}" }; } // 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`. // // 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. rpc UpdateActionResult(UpdateActionResultRequest) returns (ActionResult) { option (google.api.http) = { put: "/v2/{instance_name=**}/actionResults/{action_digest.hash}/{action_digest.size_bytes}" body: "action_result" }; } } // The CAS (content-addressable storage) is used to store the inputs to and // outputs from the execution service. Each piece of content is addressed by the // digest of its binary data. // // Most of the binary data stored in the CAS is opaque to the execution engine, // and is only used as a communication medium. In order to build an // [Action][build.bazel.remote.execution.v2.Action], // however, the client will need to also upload the // [Command][build.bazel.remote.execution.v2.Command] and input root // [Directory][build.bazel.remote.execution.v2.Directory] for the Action. // The Command and Directory messages must be marshalled to wire format and then // uploaded under the hash as with any other piece of content. In practice, the // input root directory is likely to refer to other Directories in its // hierarchy, which must also each be uploaded on their own. // // 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. // // 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`. // // 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 // [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. // // 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]). // // 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 ContentAddressableStorage { // 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. // // There are no method-specific errors. rpc FindMissingBlobs(FindMissingBlobsRequest) returns (FindMissingBlobsResponse) { option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:findMissing" body: "*" }; } // 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. rpc BatchUpdateBlobs(BatchUpdateBlobsRequest) returns (BatchUpdateBlobsResponse) { option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:batchUpdate" body: "*" }; } // 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. rpc BatchReadBlobs(BatchReadBlobsRequest) returns (BatchReadBlobsResponse) { option (google.api.http) = { post: "/v2/{instance_name=**}/blobs:batchRead" body: "*" }; } // 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. rpc GetTree(GetTreeRequest) returns (stream GetTreeResponse) { option (google.api.http) = { get: "/v2/{instance_name=**}/blobs/{root_digest.hash}/{root_digest.size_bytes}:getTree" }; } } // The Capabilities service may be used by remote execution clients to query // various server properties, in order to self-configure or return meaningful // error messages. // // 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 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. rpc GetCapabilities(GetCapabilitiesRequest) returns (ServerCapabilities) { option (google.api.http) = { get: "/v2/{instance_name=**}/capabilities" }; } } // 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. message Action { // 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]. Digest command_digest = 1; // 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]. Digest input_root_digest = 2; reserved 3 to 5; // Used for fields moved to [Command][build.bazel.remote.execution.v2.Command]. // 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 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. google.protobuf.Duration timeout = 6; // 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; // List of required supported [NodeProperty][build.bazel.remote.execution.v2.NodeProperty] // keys. In order to ensure that equivalent `Action`s always hash to the same // value, the supported 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 these properties is server-dependent. If a property is // not recognized by the server, the server will return an `INVALID_ARGUMENT` // error. repeated string output_node_properties = 8; } // 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. message Command { // An `EnvironmentVariable` is one variable to set in the running program's // environment. message EnvironmentVariable { // The variable name. string name = 1; // The variable value. 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. repeated string arguments = 1; // 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. repeated EnvironmentVariable environment_variables = 2; // 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. repeated string output_files = 3; // 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. repeated string output_directories = 4; // 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. Platform platform = 5; // 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 `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. message Platform { // 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. message Property { // The property name. string name = 1; // The property value. string value = 2; } // 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. repeated Property properties = 1; } // 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 // } // ] // } // ``` message Directory { // The files in the directory. repeated FileNode files = 1; // The subdirectories in the directory. repeated DirectoryNode directories = 2; // The symlinks in the directory. repeated SymlinkNode symlinks = 3; // The node properties of the Directory. repeated NodeProperty node_properties = 4; } // 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; } // A `FileNode` represents a single file and associated metadata. message FileNode { // The name of the file. string name = 1; // The digest of the file's content. Digest digest = 2; reserved 3; // Reserved to ensure wire-compatibility with `OutputFile`. // True if file is executable, false otherwise. bool is_executable = 4; // The node properties of the FileNode. repeated NodeProperty node_properties = 5; } // A `DirectoryNode` represents a child of a // [Directory][build.bazel.remote.execution.v2.Directory] which is itself // a `Directory` and its associated metadata. message DirectoryNode { // The name of the directory. string name = 1; // 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 = 2; } // A `SymlinkNode` represents a symbolic link. message SymlinkNode { // The name of the symlink. string name = 1; // 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. The canonical form forbids the substrings `/./` and `//` in the target // path. `..` components are allowed anywhere in the target path. string target = 2; // The node properties of the SymlinkNode. repeated NodeProperty node_properties = 3; } // 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. message Digest { // The hash. In the case of SHA-256, it will always be a lowercase hex string // exactly 64 characters long. string hash = 1; // The size of the blob, in bytes. int64 size_bytes = 2; } // ExecutedActionMetadata contains details about a completed execution. message ExecutedActionMetadata { // The name of the worker which ran the execution. string worker = 1; // When was the action added to the queue. google.protobuf.Timestamp queued_timestamp = 2; // When the worker received the action. google.protobuf.Timestamp worker_start_timestamp = 3; // When the worker completed the action, including all stages. google.protobuf.Timestamp worker_completed_timestamp = 4; // When the worker started fetching action inputs. google.protobuf.Timestamp input_fetch_start_timestamp = 5; // When the worker finished fetching action inputs. google.protobuf.Timestamp input_fetch_completed_timestamp = 6; // When the worker started executing the action command. google.protobuf.Timestamp execution_start_timestamp = 7; // When the worker completed executing the action command. google.protobuf.Timestamp execution_completed_timestamp = 8; // 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; } // An ActionResult represents the result of an // [Action][build.bazel.remote.execution.v2.Action] being run. 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 the `output_file_symlinks` field if the file was a symbolic link to // another file. // // If an output of the same name 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; // 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` 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 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; // 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 // [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 was found, 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 // 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. repeated OutputSymlink output_directory_symlinks = 11; // The exit code of the command. int32 exit_code = 4; // 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. 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]. Digest stdout_digest = 6; // 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. 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]. Digest stderr_digest = 8; // The details of the execution that originally produced this result. ExecutedActionMetadata execution_metadata = 9; } // 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. 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 // relative path, it MUST NOT begin with a leading forward slash. string path = 1; // The digest of the file's content. Digest digest = 2; reserved 3; // Used for a removed field in an earlier version of the API. // 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. bytes contents = 5; // The supported node properties of the OutputFile, if requested by the Action. repeated NodeProperty node_properties = 6; } // A `Tree` contains all the // [Directory][build.bazel.remote.execution.v2.Directory] protos in a // single directory Merkle tree, compressed into one message. message Tree { // The root directory in the tree. Directory root = 1; // 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`. repeated Directory children = 2; } // An `OutputDirectory` is the output in an `ActionResult` corresponding to a // directory's full contents rather than a single file. message OutputDirectory { // 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. string path = 1; reserved 2; // Used for a removed field in an earlier version of the API. // The digest of the encoded // [Tree][build.bazel.remote.execution.v2.Tree] proto containing the // directory's contents. Digest tree_digest = 3; } // 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`. message OutputSymlink { // 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. string path = 1; // 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. The canonical form forbids the substrings `/./` and `//` in the target // path. `..` components are allowed anywhere in the target path. string target = 2; // The supported node properties of the OutputSymlink, if requested by the // Action. repeated NodeProperty node_properties = 3; } // An `ExecutionPolicy` can be used to control the scheduling of the action. message ExecutionPolicy { // 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. int32 priority = 1; } // A `ResultsCachePolicy` is used for fine-grained control over how action // outputs are stored in the CAS and Action Cache. message ResultsCachePolicy { // 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. int32 priority = 1; } // A request message for // [Execution.Execute][build.bazel.remote.execution.v2.Execution.Execute]. message ExecuteRequest { // 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; // 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. bool skip_cache_lookup = 3; reserved 2, 4, 5; // Used for removed fields in an earlier version of the API. // The digest of the [Action][build.bazel.remote.execution.v2.Action] to // execute. Digest action_digest = 6; // An optional policy for execution of the action. // The server will have a default policy if this is not provided. ExecutionPolicy execution_policy = 7; // 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 results_cache_policy = 8; } // A `LogFile` is a log stored in the CAS. message LogFile { // The digest of the log contents. Digest digest = 1; // 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. bool human_readable = 2; } // 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]. message ExecuteResponse { // The result of the action. ActionResult result = 1; // True if the result was served from cache, false if it was executed. bool cached_result = 2; // 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. google.rpc.Status status = 3; // 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. map server_logs = 4; // Freeform informational message with details on the execution of the action // that may be displayed to the user upon failure or when requested explicitly. string message = 5; } // The current stage of action execution. message ExecutionStage { enum Value { // Invalid value. UNKNOWN = 0; // Checking the result against the cache. CACHE_CHECK = 1; // Currently idle, awaiting a free machine to execute. QUEUED = 2; // Currently being executed by a worker. EXECUTING = 3; // Finished execution. COMPLETED = 4; } } // 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 // [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the // standard output. string stdout_stream_name = 3; // If set, the client can use this name with // [ByteStream.Read][google.bytestream.ByteStream.Read] to stream the // standard error. string stderr_stream_name = 4; } // A request message for // [WaitExecution][build.bazel.remote.execution.v2.Execution.WaitExecution]. message WaitExecutionRequest { // The name of the [Operation][google.longrunning.Operation] // returned by [Execute][build.bazel.remote.execution.v2.Execution.Execute]. string name = 1; } // A request message for // [ActionCache.GetActionResult][build.bazel.remote.execution.v2.ActionCache.GetActionResult]. message GetActionResultRequest { // 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 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 path in `output_files` in the // [Command][build.bazel.remote.execution.v2.Command] message. repeated string inline_output_files = 5; } // A request message for // [ActionCache.UpdateActionResult][build.bazel.remote.execution.v2.ActionCache.UpdateActionResult]. message UpdateActionResultRequest { // 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 digest of the [Action][build.bazel.remote.execution.v2.Action] // whose result is being uploaded. Digest action_digest = 2; // The [ActionResult][build.bazel.remote.execution.v2.ActionResult] // to store in the cache. ActionResult action_result = 3; // 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 results_cache_policy = 4; } // A request message for // [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs]. message FindMissingBlobsRequest { // 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; // A list of the blobs to check. repeated Digest blob_digests = 2; } // A response message for // [ContentAddressableStorage.FindMissingBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.FindMissingBlobs]. message FindMissingBlobsResponse { // A list of the blobs requested *not* present in the storage. repeated Digest missing_blob_digests = 2; } // A request message for // [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs]. 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`. Digest digest = 1; // The raw binary data. bytes data = 2; } // 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 individual upload requests. repeated Request requests = 2; } // A response message for // [ContentAddressableStorage.BatchUpdateBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchUpdateBlobs]. message BatchUpdateBlobsResponse { // A response corresponding to a single blob that the client tried to upload. message Response { // The blob digest to which this response corresponds. Digest digest = 1; // The result of attempting to upload that blob. google.rpc.Status status = 2; } // The responses to the requests. repeated Response responses = 1; } // A request message for // [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs]. message BatchReadBlobsRequest { // 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 individual blob digests. repeated Digest digests = 2; } // A response message for // [ContentAddressableStorage.BatchReadBlobs][build.bazel.remote.execution.v2.ContentAddressableStorage.BatchReadBlobs]. message BatchReadBlobsResponse { // A response corresponding to a single blob that the client tried to download. message Response { // The digest to which this response corresponds. Digest digest = 1; // The raw binary data. bytes data = 2; // The result of attempting to download that blob. google.rpc.Status status = 3; } // The responses to the requests. repeated Response responses = 1; } // A request message for // [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree]. message GetTreeRequest { // 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 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]. Digest root_digest = 2; // 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. int32 page_size = 3; // 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. string page_token = 4; } // A response message for // [ContentAddressableStorage.GetTree][build.bazel.remote.execution.v2.ContentAddressableStorage.GetTree]. message GetTreeResponse { // The directories descended from the requested root. repeated Directory directories = 1; // 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. string next_page_token = 2; } // A request message for // [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities]. message GetCapabilitiesRequest { // 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; } // A response message for // [Capabilities.GetCapabilities][build.bazel.remote.execution.v2.Capabilities.GetCapabilities]. message ServerCapabilities { // Capabilities of the remote cache system. CacheCapabilities cache_capabilities = 1; // Capabilities of the remote execution system. ExecutionCapabilities execution_capabilities = 2; // Earliest RE API version supported, including deprecated versions. build.bazel.semver.SemVer deprecated_api_version = 3; // Earliest non-deprecated RE API version supported. build.bazel.semver.SemVer low_api_version = 4; // Latest RE API version supported. build.bazel.semver.SemVer high_api_version = 5; } // The digest function used for converting values into keys for CAS and Action // Cache. message DigestFunction { enum Value { // 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; // 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; } } // Describes the server/instance capabilities for updating the action cache. message ActionCacheUpdateCapabilities { bool update_enabled = 1; } // Allowed values for priority in // [ResultsCachePolicy][google.devtools.remoteexecution.v2.ResultsCachePolicy] // Used for querying both cache and execution valid priority ranges. message PriorityCapabilities { // Supported range of priorities, including boundaries. message PriorityRange { int32 min_priority = 1; int32 max_priority = 2; } repeated PriorityRange priorities = 1; } // 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 // targets. // If an action tries to create an output symlink with an absolute target, a // `FAILED_PRECONDITION` will be returned. DISALLOWED = 1; // Server will allow symlink targets to escape the input root tree, possibly // resulting in non-hermetic builds. ALLOWED = 2; } } // 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.Value digest_function = 1; // Capabilities for updating the action cache. ActionCacheUpdateCapabilities action_cache_update_capabilities = 2; // Supported cache priority range for both CAS and ActionCache. PriorityCapabilities cache_priority_capabilities = 3; // 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. int64 max_batch_total_size_bytes = 4; // Whether absolute symlink targets are supported. SymlinkAbsolutePathStrategy.Value symlink_absolute_path_strategy = 5; } // Capabilities of the remote execution system. message ExecutionCapabilities { // Remote execution may only support a single digest function. 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; } // Details for the tool used to call the API. message ToolDetails { // Name of the tool, e.g. bazel. string tool_name = 1; // Version of the tool used for the request, e.g. 5.0.3. string tool_version = 2; } // 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 base 64 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; // 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. string action_id = 2; // An identifier that ties multiple actions together to a final result. // For example, multiple actions are required to build and run foo_test. string tool_invocation_id = 3; // 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; }