blob: 2741016b926b9055c2665aae85163ea28142c6c6 [file] [log] [blame]
// 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;
}