diff --git a/java-showcase/gapic-showcase/pom.xml b/java-showcase/gapic-showcase/pom.xml
index 644bd919d319..34e000fda630 100644
--- a/java-showcase/gapic-showcase/pom.xml
+++ b/java-showcase/gapic-showcase/pom.xml
@@ -68,6 +68,7 @@
https://raw.githubusercontent.com/googleapis/gapic-showcase/v${gapic-showcase.version}/server/services/compliance_suite.json
src/test/resources
+ true
true
diff --git a/sdk-platform-java/gapic-generator-java/pom.xml b/sdk-platform-java/gapic-generator-java/pom.xml
index fda11c14ee22..bb8229e92ad2 100644
--- a/sdk-platform-java/gapic-generator-java/pom.xml
+++ b/sdk-platform-java/gapic-generator-java/pom.xml
@@ -121,122 +121,6 @@
-
- com.googlecode.maven-download-plugin
- download-maven-plugin
- 1.6.8
-
-
- download-metadata-proto
- generate-sources
-
- wget
-
-
-
- https://raw.githubusercontent.com/googleapis/googleapis/${googleapis.commit}/gapic/metadata/gapic_metadata.proto
-
- target/generated-sources/proto
-
-
-
- download-common-resources-proto
- generate-test-sources
-
- wget
-
-
-
- https://raw.githubusercontent.com/googleapis/googleapis/${googleapis.commit}/google/cloud/common_resources.proto
-
- target/generated-test-sources/proto
-
-
-
- download-pubsub-proto
- generate-test-sources
-
- wget
-
-
-
- https://raw.githubusercontent.com/googleapis/googleapis/${googleapis.commit}/google/pubsub/v1/pubsub.proto
-
- target/generated-test-sources/proto
-
-
-
- download-schema-proto
- generate-test-sources
-
- wget
-
-
-
- https://raw.githubusercontent.com/googleapis/googleapis/${googleapis.commit}/google/pubsub/v1/schema.proto
-
- target/generated-test-sources/proto/google/pubsub/v1
-
-
-
-
- download-logging-proto
- generate-test-sources
-
- wget
-
-
-
- https://raw.githubusercontent.com/googleapis/googleapis/${googleapis.commit}/google/logging/v2/logging.proto
-
- target/generated-test-sources/proto
-
-
-
- download-log-entry-proto
- generate-test-sources
-
- wget
-
-
-
- https://raw.githubusercontent.com/googleapis/googleapis/${googleapis.commit}/google/logging/v2/log_entry.proto
-
- target/generated-test-sources/proto/google/logging/v2
-
-
-
-
- download-logging-config-proto
- generate-test-sources
-
- wget
-
-
-
- https://raw.githubusercontent.com/googleapis/googleapis/${googleapis.commit}/google/logging/v2/logging_config.proto
-
- target/generated-test-sources/proto/google/logging/v2
-
-
-
-
- download-logging-metrics-proto
- generate-test-sources
-
- wget
-
-
-
- https://raw.githubusercontent.com/googleapis/googleapis/${googleapis.commit}/google/logging/v2/logging_metrics.proto
-
- target/generated-test-sources/proto/google/logging/v2
-
-
-
-
-
-
org.xolstice.maven.plugins
protobuf-maven-plugin
@@ -256,16 +140,6 @@
src/main/proto
-
- compile-downloaded-protos
-
- compile
-
-
- target/generated-sources/proto
- false
-
-
compile-test-protos
@@ -279,16 +153,6 @@
test-proto.descriptorset
-
- compile-downloaded-test-protos
-
- test-compile
-
-
- target/generated-test-sources/proto
- false
-
-
diff --git a/sdk-platform-java/gapic-generator-java/src/main/proto/gapic/metadata/gapic_metadata.proto b/sdk-platform-java/gapic-generator-java/src/main/proto/gapic/metadata/gapic_metadata.proto
new file mode 100644
index 000000000000..0f2855c15a66
--- /dev/null
+++ b/sdk-platform-java/gapic-generator-java/src/main/proto/gapic/metadata/gapic_metadata.proto
@@ -0,0 +1,98 @@
+// Copyright 2020 Google LLC.
+//
+// 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 google.gapic.metadata;
+
+option csharp_namespace = "Google.Gapic.Metadata";
+option go_package = "google.golang.org/genproto/googleapis/gapic/metadata;metadata";
+option java_multiple_files = true;
+option java_outer_classname = "GapicMetadataProto";
+option java_package = "com.google.gapic.metadata";
+option php_namespace = "Google\\Gapic\\Metadata";
+option ruby_package = "Google::Gapic::Metadata";
+
+// Metadata about a GAPIC library service for a specific combination of API,
+// version, and computer language.
+message GapicMetadata {
+ // Schema version of this proto. Current value: 1.0
+ string schema = 1;
+
+ // Any human-readable comments to be included in this file.
+ string comment = 2;
+
+ // Computer language of this generated language. This must be
+ // spelled out as it spoken in English, with no capitalization or
+ // separators (e.g. "csharp", "nodejs").
+ string language = 3;
+
+ // The proto package containing the API definition for which this
+ // GAPIC library was generated.
+ string proto_package = 4;
+
+ // The language-specific library package for this GAPIC library.
+ string library_package = 5;
+
+ // A map from each proto-defined service to ServiceForTransports,
+ // which allows listing information about transport-specific
+ // implementations of the service.
+ //
+ // The key is the name of the service as it appears in the .proto
+ // file.
+ map services = 6;
+
+ // A map from a transport name to ServiceAsClient, which allows
+ // listing information about the client objects that implement the
+ // parent RPC service for the specified transport.
+ message ServiceForTransport {
+ // Map of transport name to ServiceAsClient. The key name is the transport,
+ // lower-cased with no separators (e.g. "grpc", "rest").
+ map clients = 1;
+
+ // The API version for the interface definition found in the
+ // `google.api.api_version` annotation of this proto-defined service during
+ // code generation.
+ // This is the value populated by the client in the API version request
+ // parameter as per
+ // [AIP-4236](https://google.aip.dev/client-libraries/4236).
+ string api_version = 2;
+ }
+
+ // Information about a specific client implementing a proto-defined service.
+ message ServiceAsClient {
+ // The name of the library client formatted as it appears in the source code
+ string library_client = 1;
+
+ // A mapping from each proto-defined RPC name to the the list of
+ // methods in library_client that implement it. There can be more
+ // than one library_client method for each RPC. RPCs with no
+ // library_client methods need not be included.
+ //
+ // The key name is the name of the RPC as defined and formatted in
+ // the proto file.
+ map rpcs = 2;
+ }
+
+ // List of GAPIC client methods implementing the proto-defined RPC
+ // for the transport and service specified in the containing
+ // structures.
+ message MethodList {
+ // List of methods for a specific proto-service client in the
+ // GAPIC. These names should be formatted as they appear in the
+ // source code.
+ repeated string methods = 1;
+ }
+}
diff --git a/sdk-platform-java/gapic-generator-java/src/test/proto/google/cloud/common_resources.proto b/sdk-platform-java/gapic-generator-java/src/test/proto/google/cloud/common_resources.proto
new file mode 100644
index 000000000000..cd44c5474606
--- /dev/null
+++ b/sdk-platform-java/gapic-generator-java/src/test/proto/google/cloud/common_resources.proto
@@ -0,0 +1,52 @@
+// Copyright 2025 Google LLC
+//
+// 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.
+
+// This file contains stub messages for common resources in GCP.
+// It is not intended to be directly generated, and is instead used by
+// other tooling to be able to match common resource patterns.
+syntax = "proto3";
+
+package google.cloud;
+
+import "google/api/resource.proto";
+
+
+option (google.api.resource_definition) = {
+ type: "cloudresourcemanager.googleapis.com/Project"
+ pattern: "projects/{project}"
+};
+
+
+option (google.api.resource_definition) = {
+ type: "cloudresourcemanager.googleapis.com/Organization"
+ pattern: "organizations/{organization}"
+};
+
+
+option (google.api.resource_definition) = {
+ type: "cloudresourcemanager.googleapis.com/Folder"
+ pattern: "folders/{folder}"
+};
+
+
+option (google.api.resource_definition) = {
+ type: "cloudbilling.googleapis.com/BillingAccount"
+ pattern: "billingAccounts/{billing_account}"
+};
+
+option (google.api.resource_definition) = {
+ type: "locations.googleapis.com/Location"
+ pattern: "projects/{project}/locations/{location}"
+};
+
diff --git a/sdk-platform-java/gapic-generator-java/src/test/proto/google/logging/v2/log_entry.proto b/sdk-platform-java/gapic-generator-java/src/test/proto/google/logging/v2/log_entry.proto
new file mode 100644
index 000000000000..820b047b5735
--- /dev/null
+++ b/sdk-platform-java/gapic-generator-java/src/test/proto/google/logging/v2/log_entry.proto
@@ -0,0 +1,280 @@
+// Copyright 2025 Google LLC
+//
+// 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 google.logging.v2;
+
+import "google/api/field_behavior.proto";
+import "google/api/monitored_resource.proto";
+import "google/api/resource.proto";
+import "google/logging/type/http_request.proto";
+import "google/logging/type/log_severity.proto";
+import "google/protobuf/any.proto";
+import "google/protobuf/struct.proto";
+import "google/protobuf/timestamp.proto";
+
+option cc_enable_arenas = true;
+option csharp_namespace = "Google.Cloud.Logging.V2";
+option go_package = "cloud.google.com/go/logging/apiv2/loggingpb;loggingpb";
+option java_multiple_files = true;
+option java_outer_classname = "LogEntryProto";
+option java_package = "com.google.logging.v2";
+option php_namespace = "Google\\Cloud\\Logging\\V2";
+option ruby_package = "Google::Cloud::Logging::V2";
+
+// An individual entry in a log.
+message LogEntry {
+ option (google.api.resource) = {
+ type: "logging.googleapis.com/Log"
+ pattern: "projects/{project}/logs/{log}"
+ pattern: "organizations/{organization}/logs/{log}"
+ pattern: "folders/{folder}/logs/{log}"
+ pattern: "billingAccounts/{billing_account}/logs/{log}"
+ name_field: "log_name"
+ };
+
+ // Required. The resource name of the log to which this log entry belongs:
+ //
+ // "projects/[PROJECT_ID]/logs/[LOG_ID]"
+ // "organizations/[ORGANIZATION_ID]/logs/[LOG_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]"
+ // "folders/[FOLDER_ID]/logs/[LOG_ID]"
+ //
+ // A project number may be used in place of PROJECT_ID. The project number is
+ // translated to its corresponding PROJECT_ID internally and the `log_name`
+ // field will contain PROJECT_ID in queries and exports.
+ //
+ // `[LOG_ID]` must be URL-encoded within `log_name`. Example:
+ // `"organizations/1234567890/logs/cloudresourcemanager.googleapis.com%2Factivity"`.
+ //
+ // `[LOG_ID]` must be less than 512 characters long and can only include the
+ // following characters: upper and lower case alphanumeric characters,
+ // forward-slash, underscore, hyphen, and period.
+ //
+ // For backward compatibility, if `log_name` begins with a forward-slash, such
+ // as `/projects/...`, then the log entry is ingested as usual, but the
+ // forward-slash is removed. Listing the log entry will not show the leading
+ // slash and filtering for a log name with a leading slash will never return
+ // any results.
+ string log_name = 12 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The monitored resource that produced this log entry.
+ //
+ // Example: a log entry that reports a database error would be associated with
+ // the monitored resource designating the particular database that reported
+ // the error.
+ google.api.MonitoredResource resource = 8
+ [(google.api.field_behavior) = REQUIRED];
+
+ // The log entry payload, which can be one of multiple types.
+ oneof payload {
+ // The log entry payload, represented as a protocol buffer. Some Google
+ // Cloud Platform services use this field for their log entry payloads.
+ //
+ // The following protocol buffer types are supported; user-defined types
+ // are not supported:
+ //
+ // "type.googleapis.com/google.cloud.audit.AuditLog"
+ // "type.googleapis.com/google.appengine.logging.v1.RequestLog"
+ google.protobuf.Any proto_payload = 2;
+
+ // The log entry payload, represented as a Unicode string (UTF-8).
+ string text_payload = 3;
+
+ // The log entry payload, represented as a structure that is
+ // expressed as a JSON object.
+ google.protobuf.Struct json_payload = 6;
+ }
+
+ // Optional. The time the event described by the log entry occurred. This time
+ // is used to compute the log entry's age and to enforce the logs retention
+ // period. If this field is omitted in a new log entry, then Logging assigns
+ // it the current time. Timestamps have nanosecond accuracy, but trailing
+ // zeros in the fractional seconds might be omitted when the timestamp is
+ // displayed.
+ //
+ // Incoming log entries must have timestamps that don't exceed the
+ // [logs retention
+ // period](https://cloud.google.com/logging/quotas#logs_retention_periods) in
+ // the past, and that don't exceed 24 hours in the future. Log entries outside
+ // those time boundaries aren't ingested by Logging.
+ google.protobuf.Timestamp timestamp = 9
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Output only. The time the log entry was received by Logging.
+ google.protobuf.Timestamp receive_timestamp = 24
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Optional. The severity of the log entry. The default value is
+ // `LogSeverity.DEFAULT`.
+ google.logging.type.LogSeverity severity = 10
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. A unique identifier for the log entry. If you provide a value,
+ // then Logging considers other log entries in the same project, with the same
+ // `timestamp`, and with the same `insert_id` to be duplicates which are
+ // removed in a single query result. However, there are no guarantees of
+ // de-duplication in the export of logs.
+ //
+ // If the `insert_id` is omitted when writing a log entry, the Logging API
+ // assigns its own unique identifier in this field.
+ //
+ // In queries, the `insert_id` is also used to order log entries that have
+ // the same `log_name` and `timestamp` values.
+ string insert_id = 4 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Information about the HTTP request associated with this log
+ // entry, if applicable.
+ google.logging.type.HttpRequest http_request = 7
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. A map of key, value pairs that provides additional information
+ // about the log entry. The labels can be user-defined or system-defined.
+ //
+ // User-defined labels are arbitrary key, value pairs that you can use to
+ // classify logs.
+ //
+ // System-defined labels are defined by GCP services for platform logs.
+ // They have two components - a service namespace component and the
+ // attribute name. For example: `compute.googleapis.com/resource_name`.
+ //
+ // Cloud Logging truncates label keys that exceed 512 B and label
+ // values that exceed 64 KB upon their associated log entry being
+ // written. The truncation is indicated by an ellipsis at the
+ // end of the character string.
+ map labels = 11 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Information about an operation associated with the log entry, if
+ // applicable.
+ LogEntryOperation operation = 15 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The REST resource name of the trace being written to
+ // [Cloud Trace](https://cloud.google.com/trace) in
+ // association with this log entry. For example, if your trace data is stored
+ // in the Cloud project "my-trace-project" and if the service that is creating
+ // the log entry receives a trace header that includes the trace ID "12345",
+ // then the service should use "projects/my-tracing-project/traces/12345".
+ //
+ // The `trace` field provides the link between logs and traces. By using
+ // this field, you can navigate from a log entry to a trace.
+ string trace = 22 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The ID of the [Cloud Trace](https://cloud.google.com/trace) span
+ // associated with the current operation in which the log is being written.
+ // For example, if a span has the REST resource name of
+ // "projects/some-project/traces/some-trace/spans/some-span-id", then the
+ // `span_id` field is "some-span-id".
+ //
+ // A
+ // [Span](https://cloud.google.com/trace/docs/reference/v2/rest/v2/projects.traces/batchWrite#Span)
+ // represents a single operation within a trace. Whereas a trace may involve
+ // multiple different microservices running on multiple different machines,
+ // a span generally corresponds to a single logical operation being performed
+ // in a single instance of a microservice on one specific machine. Spans
+ // are the nodes within the tree that is a trace.
+ //
+ // Applications that are [instrumented for
+ // tracing](https://cloud.google.com/trace/docs/setup) will generally assign a
+ // new, unique span ID on each incoming request. It is also common to create
+ // and record additional spans corresponding to internal processing elements
+ // as well as issuing requests to dependencies.
+ //
+ // The span ID is expected to be a 16-character, hexadecimal encoding of an
+ // 8-byte array and should not be zero. It should be unique within the trace
+ // and should, ideally, be generated in a manner that is uniformly random.
+ //
+ // Example values:
+ //
+ // - `000000000000004a`
+ // - `7a2190356c3fc94b`
+ // - `0000f00300090021`
+ // - `d39223e101960076`
+ string span_id = 27 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The sampling decision of the trace associated with the log entry.
+ //
+ // True means that the trace resource name in the `trace` field was sampled
+ // for storage in a trace backend. False means that the trace was not sampled
+ // for storage when this log entry was written, or the sampling decision was
+ // unknown at the time. A non-sampled `trace` value is still useful as a
+ // request correlation identifier. The default is False.
+ bool trace_sampled = 30 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Source code location information associated with the log entry,
+ // if any.
+ LogEntrySourceLocation source_location = 23
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Information indicating this LogEntry is part of a sequence of
+ // multiple log entries split from a single LogEntry.
+ LogSplit split = 35 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Additional information about a potentially long-running operation with which
+// a log entry is associated.
+message LogEntryOperation {
+ // Optional. An arbitrary operation identifier. Log entries with the same
+ // identifier are assumed to be part of the same operation.
+ string id = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. An arbitrary producer identifier. The combination of `id` and
+ // `producer` must be globally unique. Examples for `producer`:
+ // `"MyDivision.MyBigCompany.com"`, `"github.com/MyProject/MyApplication"`.
+ string producer = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Set this to True if this is the first log entry in the operation.
+ bool first = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Set this to True if this is the last log entry in the operation.
+ bool last = 4 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Additional information about the source code location that produced the log
+// entry.
+message LogEntrySourceLocation {
+ // Optional. Source file name. Depending on the runtime environment, this
+ // might be a simple name or a fully-qualified name.
+ string file = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Line within the source file. 1-based; 0 indicates no line number
+ // available.
+ int64 line = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Human-readable name of the function or method being invoked, with
+ // optional context such as the class or package name. This information may be
+ // used in contexts such as the logs viewer, where a file and line number are
+ // less meaningful. The format can vary by language. For example:
+ // `qual.if.ied.Class.method` (Java), `dir/package.func` (Go), `function`
+ // (Python).
+ string function = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Additional information used to correlate multiple log entries. Used when a
+// single LogEntry would exceed the Google Cloud Logging size limit and is
+// split across multiple log entries.
+message LogSplit {
+ // A globally unique identifier for all log entries in a sequence of split log
+ // entries. All log entries with the same |LogSplit.uid| are assumed to be
+ // part of the same sequence of split log entries.
+ string uid = 1;
+
+ // The index of this LogEntry in the sequence of split log entries. Log
+ // entries are given |index| values 0, 1, ..., n-1 for a sequence of n log
+ // entries.
+ int32 index = 2;
+
+ // The total number of log entries that the original LogEntry was split into.
+ int32 total_splits = 3;
+}
diff --git a/sdk-platform-java/gapic-generator-java/src/test/proto/google/logging/v2/logging.proto b/sdk-platform-java/gapic-generator-java/src/test/proto/google/logging/v2/logging.proto
new file mode 100644
index 000000000000..e984d6ec0d5b
--- /dev/null
+++ b/sdk-platform-java/gapic-generator-java/src/test/proto/google/logging/v2/logging.proto
@@ -0,0 +1,483 @@
+// Copyright 2025 Google LLC
+//
+// 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 google.logging.v2;
+
+import "google/api/annotations.proto";
+import "google/api/client.proto";
+import "google/api/field_behavior.proto";
+import "google/api/monitored_resource.proto";
+import "google/api/resource.proto";
+import "google/logging/v2/log_entry.proto";
+import "google/protobuf/duration.proto";
+import "google/protobuf/empty.proto";
+import "google/rpc/status.proto";
+
+option cc_enable_arenas = true;
+option csharp_namespace = "Google.Cloud.Logging.V2";
+option go_package = "cloud.google.com/go/logging/apiv2/loggingpb;loggingpb";
+option java_multiple_files = true;
+option java_outer_classname = "LoggingProto";
+option java_package = "com.google.logging.v2";
+option php_namespace = "Google\\Cloud\\Logging\\V2";
+option ruby_package = "Google::Cloud::Logging::V2";
+
+// Service for ingesting and querying logs.
+service LoggingServiceV2 {
+ option (google.api.default_host) = "logging.googleapis.com";
+ option (google.api.oauth_scopes) =
+ "https://www.googleapis.com/auth/cloud-platform,"
+ "https://www.googleapis.com/auth/cloud-platform.read-only,"
+ "https://www.googleapis.com/auth/logging.admin,"
+ "https://www.googleapis.com/auth/logging.read,"
+ "https://www.googleapis.com/auth/logging.write";
+
+ // Deletes all the log entries in a log for the _Default Log Bucket. The log
+ // reappears if it receives new entries. Log entries written shortly before
+ // the delete operation might not be deleted. Entries received after the
+ // delete operation with a timestamp before the operation will be deleted.
+ rpc DeleteLog(DeleteLogRequest) returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ delete: "/v2/{log_name=projects/*/logs/*}"
+ additional_bindings { delete: "/v2/{log_name=*/*/logs/*}" }
+ additional_bindings { delete: "/v2/{log_name=organizations/*/logs/*}" }
+ additional_bindings { delete: "/v2/{log_name=folders/*/logs/*}" }
+ additional_bindings { delete: "/v2/{log_name=billingAccounts/*/logs/*}" }
+ };
+ option (google.api.method_signature) = "log_name";
+ }
+
+ // Writes log entries to Logging. This API method is the
+ // only way to send log entries to Logging. This method
+ // is used, directly or indirectly, by the Logging agent
+ // (fluentd) and all logging libraries configured to use Logging.
+ // A single request may contain log entries for a maximum of 1000
+ // different resources (projects, organizations, billing accounts or
+ // folders)
+ rpc WriteLogEntries(WriteLogEntriesRequest)
+ returns (WriteLogEntriesResponse) {
+ option (google.api.http) = {
+ post: "/v2/entries:write"
+ body: "*"
+ };
+ option (google.api.method_signature) = "log_name,resource,labels,entries";
+ }
+
+ // Lists log entries. Use this method to retrieve log entries that originated
+ // from a project/folder/organization/billing account. For ways to export log
+ // entries, see [Exporting
+ // Logs](https://cloud.google.com/logging/docs/export).
+ rpc ListLogEntries(ListLogEntriesRequest) returns (ListLogEntriesResponse) {
+ option (google.api.http) = {
+ post: "/v2/entries:list"
+ body: "*"
+ };
+ option (google.api.method_signature) = "resource_names,filter,order_by";
+ }
+
+ // Lists the descriptors for monitored resource types used by Logging.
+ rpc ListMonitoredResourceDescriptors(ListMonitoredResourceDescriptorsRequest)
+ returns (ListMonitoredResourceDescriptorsResponse) {
+ option (google.api.http) = {
+ get: "/v2/monitoredResourceDescriptors"
+ };
+ }
+
+ // Lists the logs in projects, organizations, folders, or billing accounts.
+ // Only logs that have entries are listed.
+ rpc ListLogs(ListLogsRequest) returns (ListLogsResponse) {
+ option (google.api.http) = {
+ get: "/v2/{parent=*/*}/logs"
+ additional_bindings { get: "/v2/{parent=projects/*}/logs" }
+ additional_bindings { get: "/v2/{parent=organizations/*}/logs" }
+ additional_bindings { get: "/v2/{parent=folders/*}/logs" }
+ additional_bindings { get: "/v2/{parent=billingAccounts/*}/logs" }
+ additional_bindings {
+ get: "/v2/{parent=projects/*/locations/*/buckets/*/views/*}/logs"
+ }
+ additional_bindings {
+ get: "/v2/{parent=organizations/*/locations/*/buckets/*/views/*}/logs"
+ }
+ additional_bindings {
+ get: "/v2/{parent=folders/*/locations/*/buckets/*/views/*}/logs"
+ }
+ additional_bindings {
+ get: "/v2/{parent=billingAccounts/*/locations/*/buckets/*/views/*}/logs"
+ }
+ };
+ option (google.api.method_signature) = "parent";
+ }
+
+ // Streaming read of log entries as they are ingested. Until the stream is
+ // terminated, it will continue reading logs.
+ rpc TailLogEntries(stream TailLogEntriesRequest)
+ returns (stream TailLogEntriesResponse) {
+ option (google.api.http) = {
+ post: "/v2/entries:tail"
+ body: "*"
+ };
+ }
+}
+
+// The parameters to DeleteLog.
+message DeleteLogRequest {
+ // Required. The resource name of the log to delete:
+ //
+ // * `projects/[PROJECT_ID]/logs/[LOG_ID]`
+ // * `organizations/[ORGANIZATION_ID]/logs/[LOG_ID]`
+ // * `billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]`
+ // * `folders/[FOLDER_ID]/logs/[LOG_ID]`
+ //
+ // `[LOG_ID]` must be URL-encoded. For example,
+ // `"projects/my-project-id/logs/syslog"`,
+ // `"organizations/123/logs/cloudaudit.googleapis.com%2Factivity"`.
+ //
+ // For more information about log names, see
+ // [LogEntry][google.logging.v2.LogEntry].
+ string log_name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "logging.googleapis.com/Log" }
+ ];
+}
+
+// The parameters to WriteLogEntries.
+message WriteLogEntriesRequest {
+ // Optional. A default log resource name that is assigned to all log entries
+ // in `entries` that do not specify a value for `log_name`:
+ //
+ // * `projects/[PROJECT_ID]/logs/[LOG_ID]`
+ // * `organizations/[ORGANIZATION_ID]/logs/[LOG_ID]`
+ // * `billingAccounts/[BILLING_ACCOUNT_ID]/logs/[LOG_ID]`
+ // * `folders/[FOLDER_ID]/logs/[LOG_ID]`
+ //
+ // `[LOG_ID]` must be URL-encoded. For example:
+ //
+ // "projects/my-project-id/logs/syslog"
+ // "organizations/123/logs/cloudaudit.googleapis.com%2Factivity"
+ //
+ // The permission `logging.logEntries.create` is needed on each project,
+ // organization, billing account, or folder that is receiving new log
+ // entries, whether the resource is specified in `logName` or in an
+ // individual log entry.
+ string log_name = 1 [
+ (google.api.field_behavior) = OPTIONAL,
+ (google.api.resource_reference) = { type: "logging.googleapis.com/Log" }
+ ];
+
+ // Optional. A default monitored resource object that is assigned to all log
+ // entries in `entries` that do not specify a value for `resource`. Example:
+ //
+ // { "type": "gce_instance",
+ // "labels": {
+ // "zone": "us-central1-a", "instance_id": "00000000000000000000" }}
+ //
+ // See [LogEntry][google.logging.v2.LogEntry].
+ google.api.MonitoredResource resource = 2
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Default labels that are added to the `labels` field of all log
+ // entries in `entries`. If a log entry already has a label with the same key
+ // as a label in this parameter, then the log entry's label is not changed.
+ // See [LogEntry][google.logging.v2.LogEntry].
+ map labels = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Required. The log entries to send to Logging. The order of log
+ // entries in this list does not matter. Values supplied in this method's
+ // `log_name`, `resource`, and `labels` fields are copied into those log
+ // entries in this list that do not include values for their corresponding
+ // fields. For more information, see the
+ // [LogEntry][google.logging.v2.LogEntry] type.
+ //
+ // If the `timestamp` or `insert_id` fields are missing in log entries, then
+ // this method supplies the current time or a unique identifier, respectively.
+ // The supplied values are chosen so that, among the log entries that did not
+ // supply their own values, the entries earlier in the list will sort before
+ // the entries later in the list. See the `entries.list` method.
+ //
+ // Log entries with timestamps that are more than the
+ // [logs retention period](https://cloud.google.com/logging/quotas) in
+ // the past or more than 24 hours in the future will not be available when
+ // calling `entries.list`. However, those log entries can still be [exported
+ // with
+ // LogSinks](https://cloud.google.com/logging/docs/api/tasks/exporting-logs).
+ //
+ // To improve throughput and to avoid exceeding the
+ // [quota limit](https://cloud.google.com/logging/quotas) for calls to
+ // `entries.write`, you should try to include several log entries in this
+ // list, rather than calling this method for each individual log entry.
+ repeated LogEntry entries = 4 [(google.api.field_behavior) = REQUIRED];
+
+ // Optional. Whether a batch's valid entries should be written even if some
+ // other entry failed due to a permanent error such as INVALID_ARGUMENT or
+ // PERMISSION_DENIED. If any entry failed, then the response status is the
+ // response status of one of the failed entries. The response will include
+ // error details in `WriteLogEntriesPartialErrors.log_entry_errors` keyed by
+ // the entries' zero-based index in the `entries`. Failed requests for which
+ // no entries are written will not include per-entry errors.
+ bool partial_success = 5 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If true, the request should expect normal response, but the
+ // entries won't be persisted nor exported. Useful for checking whether the
+ // logging API endpoints are working properly before sending valuable data.
+ bool dry_run = 6 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Result returned from WriteLogEntries.
+message WriteLogEntriesResponse {}
+
+// Error details for WriteLogEntries with partial success.
+message WriteLogEntriesPartialErrors {
+ // When `WriteLogEntriesRequest.partial_success` is true, records the error
+ // status for entries that were not written due to a permanent error, keyed
+ // by the entry's zero-based index in `WriteLogEntriesRequest.entries`.
+ //
+ // Failed requests for which no entries are written will not include
+ // per-entry errors.
+ map log_entry_errors = 1;
+}
+
+// The parameters to `ListLogEntries`.
+message ListLogEntriesRequest {
+ // Required. Names of one or more parent resources from which to
+ // retrieve log entries:
+ //
+ // * `projects/[PROJECT_ID]`
+ // * `organizations/[ORGANIZATION_ID]`
+ // * `billingAccounts/[BILLING_ACCOUNT_ID]`
+ // * `folders/[FOLDER_ID]`
+ //
+ // May alternatively be one or more views:
+ //
+ // * `projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]`
+ // * `organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]`
+ // * `billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]`
+ // * `folders/[FOLDER_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]`
+ //
+ // Projects listed in the `project_ids` field are added to this list.
+ // A maximum of 100 resources may be specified in a single request.
+ repeated string resource_names = 8 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ child_type: "logging.googleapis.com/Log"
+ }
+ ];
+
+ // Optional. Only log entries that match the filter are returned. An empty
+ // filter matches all log entries in the resources listed in `resource_names`.
+ // Referencing a parent resource that is not listed in `resource_names` will
+ // cause the filter to return no results. The maximum length of a filter is
+ // 20,000 characters.
+ string filter = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. How the results should be sorted. Presently, the only permitted
+ // values are `"timestamp asc"` (default) and `"timestamp desc"`. The first
+ // option returns entries in order of increasing values of
+ // `LogEntry.timestamp` (oldest first), and the second option returns entries
+ // in order of decreasing timestamps (newest first). Entries with equal
+ // timestamps are returned in order of their `insert_id` values.
+ string order_by = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The maximum number of results to return from this request.
+ // Default is 50. If the value is negative or exceeds 1000, the request is
+ // rejected. The presence of `next_page_token` in the response indicates that
+ // more results might be available.
+ int32 page_size = 4 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If present, then retrieve the next batch of results from the
+ // preceding call to this method. `page_token` must be the value of
+ // `next_page_token` from the previous response. The values of other method
+ // parameters should be identical to those in the previous call.
+ string page_token = 5 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Result returned from `ListLogEntries`.
+message ListLogEntriesResponse {
+ // A list of log entries. If `entries` is empty, `nextPageToken` may still be
+ // returned, indicating that more entries may exist. See `nextPageToken` for
+ // more information.
+ repeated LogEntry entries = 1;
+
+ // If there might be more results than those appearing in this response, then
+ // `nextPageToken` is included. To get the next set of results, call this
+ // method again using the value of `nextPageToken` as `pageToken`.
+ //
+ // If a value for `next_page_token` appears and the `entries` field is empty,
+ // it means that the search found no log entries so far but it did not have
+ // time to search all the possible log entries. Retry the method with this
+ // value for `page_token` to continue the search. Alternatively, consider
+ // speeding up the search by changing your filter to specify a single log name
+ // or resource type, or to narrow the time range of the search.
+ string next_page_token = 2;
+}
+
+// The parameters to ListMonitoredResourceDescriptors
+message ListMonitoredResourceDescriptorsRequest {
+ // Optional. The maximum number of results to return from this request.
+ // Non-positive values are ignored. The presence of `nextPageToken` in the
+ // response indicates that more results might be available.
+ int32 page_size = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If present, then retrieve the next batch of results from the
+ // preceding call to this method. `pageToken` must be the value of
+ // `nextPageToken` from the previous response. The values of other method
+ // parameters should be identical to those in the previous call.
+ string page_token = 2 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Result returned from ListMonitoredResourceDescriptors.
+message ListMonitoredResourceDescriptorsResponse {
+ // A list of resource descriptors.
+ repeated google.api.MonitoredResourceDescriptor resource_descriptors = 1;
+
+ // If there might be more results than those appearing in this response, then
+ // `nextPageToken` is included. To get the next set of results, call this
+ // method again using the value of `nextPageToken` as `pageToken`.
+ string next_page_token = 2;
+}
+
+// The parameters to ListLogs.
+message ListLogsRequest {
+ // Required. The resource name to list logs for:
+ //
+ // * `projects/[PROJECT_ID]`
+ // * `organizations/[ORGANIZATION_ID]`
+ // * `billingAccounts/[BILLING_ACCOUNT_ID]`
+ // * `folders/[FOLDER_ID]`
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ child_type: "logging.googleapis.com/Log"
+ }
+ ];
+
+ // Optional. List of resource names to list logs for:
+ //
+ // * `projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]`
+ // * `organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]`
+ // * `billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]`
+ // * `folders/[FOLDER_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]`
+ //
+ // To support legacy queries, it could also be:
+ //
+ // * `projects/[PROJECT_ID]`
+ // * `organizations/[ORGANIZATION_ID]`
+ // * `billingAccounts/[BILLING_ACCOUNT_ID]`
+ // * `folders/[FOLDER_ID]`
+ //
+ // The resource name in the `parent` field is added to this list.
+ repeated string resource_names = 8 [
+ (google.api.field_behavior) = OPTIONAL,
+ (google.api.resource_reference) = {
+ child_type: "logging.googleapis.com/Log"
+ }
+ ];
+
+ // Optional. The maximum number of results to return from this request.
+ // Non-positive values are ignored. The presence of `nextPageToken` in the
+ // response indicates that more results might be available.
+ int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If present, then retrieve the next batch of results from the
+ // preceding call to this method. `pageToken` must be the value of
+ // `nextPageToken` from the previous response. The values of other method
+ // parameters should be identical to those in the previous call.
+ string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Result returned from ListLogs.
+message ListLogsResponse {
+ // A list of log names. For example,
+ // `"projects/my-project/logs/syslog"` or
+ // `"organizations/123/logs/cloudresourcemanager.googleapis.com%2Factivity"`.
+ repeated string log_names = 3;
+
+ // If there might be more results than those appearing in this response, then
+ // `nextPageToken` is included. To get the next set of results, call this
+ // method again using the value of `nextPageToken` as `pageToken`.
+ string next_page_token = 2;
+}
+
+// The parameters to `TailLogEntries`.
+message TailLogEntriesRequest {
+ // Required. Name of a parent resource from which to retrieve log entries:
+ //
+ // * `projects/[PROJECT_ID]`
+ // * `organizations/[ORGANIZATION_ID]`
+ // * `billingAccounts/[BILLING_ACCOUNT_ID]`
+ // * `folders/[FOLDER_ID]`
+ //
+ // May alternatively be one or more views:
+ //
+ // * `projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]`
+ // * `organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]`
+ // * `billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]`
+ // * `folders/[FOLDER_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]`
+ repeated string resource_names = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Optional. Only log entries that match the filter are returned. An empty
+ // filter matches all log entries in the resources listed in `resource_names`.
+ // Referencing a parent resource that is not listed in `resource_names` will
+ // cause the filter to return no results. The maximum length of a filter is
+ // 20,000 characters.
+ string filter = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The amount of time to buffer log entries at the server before
+ // being returned to prevent out of order results due to late arriving log
+ // entries. Valid values are between 0-60000 milliseconds. Defaults to 2000
+ // milliseconds.
+ google.protobuf.Duration buffer_window = 3
+ [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Result returned from `TailLogEntries`.
+message TailLogEntriesResponse {
+ // Information about entries that were omitted from the session.
+ message SuppressionInfo {
+ // An indicator of why entries were omitted.
+ enum Reason {
+ // Unexpected default.
+ REASON_UNSPECIFIED = 0;
+
+ // Indicates suppression occurred due to relevant entries being
+ // received in excess of rate limits. For quotas and limits, see
+ // [Logging API quotas and
+ // limits](https://cloud.google.com/logging/quotas#api-limits).
+ RATE_LIMIT = 1;
+
+ // Indicates suppression occurred due to the client not consuming
+ // responses quickly enough.
+ NOT_CONSUMED = 2;
+ }
+
+ // The reason that entries were omitted from the session.
+ Reason reason = 1;
+
+ // A lower bound on the count of entries omitted due to `reason`.
+ int32 suppressed_count = 2;
+ }
+
+ // A list of log entries. Each response in the stream will order entries with
+ // increasing values of `LogEntry.timestamp`. Ordering is not guaranteed
+ // between separate responses.
+ repeated LogEntry entries = 1;
+
+ // If entries that otherwise would have been included in the session were not
+ // sent back to the client, counts of relevant entries omitted from the
+ // session with the reason that they were not included. There will be at most
+ // one of each reason per response. The counts represent the number of
+ // suppressed entries since the last streamed response.
+ repeated SuppressionInfo suppression_info = 2;
+}
diff --git a/sdk-platform-java/gapic-generator-java/src/test/proto/google/logging/v2/logging_config.proto b/sdk-platform-java/gapic-generator-java/src/test/proto/google/logging/v2/logging_config.proto
new file mode 100644
index 000000000000..05ed940b3972
--- /dev/null
+++ b/sdk-platform-java/gapic-generator-java/src/test/proto/google/logging/v2/logging_config.proto
@@ -0,0 +1,2317 @@
+// Copyright 2025 Google LLC
+//
+// 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 google.logging.v2;
+
+import "google/api/annotations.proto";
+import "google/api/client.proto";
+import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
+import "google/longrunning/operations.proto";
+import "google/protobuf/empty.proto";
+import "google/protobuf/field_mask.proto";
+import "google/protobuf/timestamp.proto";
+
+option cc_enable_arenas = true;
+option csharp_namespace = "Google.Cloud.Logging.V2";
+option go_package = "cloud.google.com/go/logging/apiv2/loggingpb;loggingpb";
+option java_multiple_files = true;
+option java_outer_classname = "LoggingConfigProto";
+option java_package = "com.google.logging.v2";
+option php_namespace = "Google\\Cloud\\Logging\\V2";
+option ruby_package = "Google::Cloud::Logging::V2";
+option (google.api.resource_definition) = {
+ type: "logging.googleapis.com/OrganizationLocation"
+ pattern: "organizations/{organization}/locations/{location}"
+};
+option (google.api.resource_definition) = {
+ type: "logging.googleapis.com/FolderLocation"
+ pattern: "folders/{folder}/locations/{location}"
+};
+option (google.api.resource_definition) = {
+ type: "logging.googleapis.com/BillingAccountLocation"
+ pattern: "billingAccounts/{billing_account}/locations/{location}"
+};
+
+// Service for configuring sinks used to route log entries.
+service ConfigServiceV2 {
+ option (google.api.default_host) = "logging.googleapis.com";
+ option (google.api.oauth_scopes) =
+ "https://www.googleapis.com/auth/cloud-platform,"
+ "https://www.googleapis.com/auth/cloud-platform.read-only,"
+ "https://www.googleapis.com/auth/logging.admin,"
+ "https://www.googleapis.com/auth/logging.read";
+
+ // Lists log buckets.
+ rpc ListBuckets(ListBucketsRequest) returns (ListBucketsResponse) {
+ option (google.api.http) = {
+ get: "/v2/{parent=*/*/locations/*}/buckets"
+ additional_bindings { get: "/v2/{parent=projects/*/locations/*}/buckets" }
+ additional_bindings {
+ get: "/v2/{parent=organizations/*/locations/*}/buckets"
+ }
+ additional_bindings { get: "/v2/{parent=folders/*/locations/*}/buckets" }
+ additional_bindings {
+ get: "/v2/{parent=billingAccounts/*/locations/*}/buckets"
+ }
+ };
+ option (google.api.method_signature) = "parent";
+ }
+
+ // Gets a log bucket.
+ rpc GetBucket(GetBucketRequest) returns (LogBucket) {
+ option (google.api.http) = {
+ get: "/v2/{name=*/*/locations/*/buckets/*}"
+ additional_bindings { get: "/v2/{name=projects/*/locations/*/buckets/*}" }
+ additional_bindings {
+ get: "/v2/{name=organizations/*/locations/*/buckets/*}"
+ }
+ additional_bindings { get: "/v2/{name=folders/*/locations/*/buckets/*}" }
+ additional_bindings {
+ get: "/v2/{name=billingAccounts/*/locations/*/buckets/*}"
+ }
+ };
+ }
+
+ // Creates a log bucket asynchronously that can be used to store log entries.
+ //
+ // After a bucket has been created, the bucket's location cannot be changed.
+ rpc CreateBucketAsync(CreateBucketRequest)
+ returns (google.longrunning.Operation) {
+ option (google.api.http) = {
+ post: "/v2/{parent=*/*/locations/*}/buckets:createAsync"
+ body: "bucket"
+ additional_bindings {
+ post: "/v2/{parent=projects/*/locations/*}/buckets:createAsync"
+ body: "bucket"
+ }
+ additional_bindings {
+ post: "/v2/{parent=organizations/*/locations/*}/buckets:createAsync"
+ body: "bucket"
+ }
+ additional_bindings {
+ post: "/v2/{parent=folders/*/locations/*}/buckets:createAsync"
+ body: "bucket"
+ }
+ additional_bindings {
+ post: "/v2/{parent=billingAccounts/*/locations/*}/buckets:createAsync"
+ body: "bucket"
+ }
+ };
+ option (google.longrunning.operation_info) = {
+ response_type: "LogBucket"
+ metadata_type: "BucketMetadata"
+ };
+ }
+
+ // Updates a log bucket asynchronously.
+ //
+ // If the bucket has a `lifecycle_state` of `DELETE_REQUESTED`, then
+ // `FAILED_PRECONDITION` will be returned.
+ //
+ // After a bucket has been created, the bucket's location cannot be changed.
+ rpc UpdateBucketAsync(UpdateBucketRequest)
+ returns (google.longrunning.Operation) {
+ option (google.api.http) = {
+ post: "/v2/{name=*/*/locations/*/buckets/*}:updateAsync"
+ body: "bucket"
+ additional_bindings {
+ post: "/v2/{name=projects/*/locations/*/buckets/*}:updateAsync"
+ body: "bucket"
+ }
+ additional_bindings {
+ post: "/v2/{name=organizations/*/locations/*/buckets/*}:updateAsync"
+ body: "bucket"
+ }
+ additional_bindings {
+ post: "/v2/{name=folders/*/locations/*/buckets/*}:updateAsync"
+ body: "bucket"
+ }
+ additional_bindings {
+ post: "/v2/{name=billingAccounts/*/locations/*/buckets/*}:updateAsync"
+ body: "bucket"
+ }
+ };
+ option (google.longrunning.operation_info) = {
+ response_type: "LogBucket"
+ metadata_type: "BucketMetadata"
+ };
+ }
+
+ // Creates a log bucket that can be used to store log entries. After a bucket
+ // has been created, the bucket's location cannot be changed.
+ rpc CreateBucket(CreateBucketRequest) returns (LogBucket) {
+ option (google.api.http) = {
+ post: "/v2/{parent=*/*/locations/*}/buckets"
+ body: "bucket"
+ additional_bindings {
+ post: "/v2/{parent=projects/*/locations/*}/buckets"
+ body: "bucket"
+ }
+ additional_bindings {
+ post: "/v2/{parent=organizations/*/locations/*}/buckets"
+ body: "bucket"
+ }
+ additional_bindings {
+ post: "/v2/{parent=folders/*/locations/*}/buckets"
+ body: "bucket"
+ }
+ additional_bindings {
+ post: "/v2/{parent=billingAccounts/*/locations/*}/buckets"
+ body: "bucket"
+ }
+ };
+ }
+
+ // Updates a log bucket.
+ //
+ // If the bucket has a `lifecycle_state` of `DELETE_REQUESTED`, then
+ // `FAILED_PRECONDITION` will be returned.
+ //
+ // After a bucket has been created, the bucket's location cannot be changed.
+ rpc UpdateBucket(UpdateBucketRequest) returns (LogBucket) {
+ option (google.api.http) = {
+ patch: "/v2/{name=*/*/locations/*/buckets/*}"
+ body: "bucket"
+ additional_bindings {
+ patch: "/v2/{name=projects/*/locations/*/buckets/*}"
+ body: "bucket"
+ }
+ additional_bindings {
+ patch: "/v2/{name=organizations/*/locations/*/buckets/*}"
+ body: "bucket"
+ }
+ additional_bindings {
+ patch: "/v2/{name=folders/*/locations/*/buckets/*}"
+ body: "bucket"
+ }
+ additional_bindings {
+ patch: "/v2/{name=billingAccounts/*/locations/*/buckets/*}"
+ body: "bucket"
+ }
+ };
+ }
+
+ // Deletes a log bucket.
+ //
+ // Changes the bucket's `lifecycle_state` to the `DELETE_REQUESTED` state.
+ // After 7 days, the bucket will be purged and all log entries in the bucket
+ // will be permanently deleted.
+ rpc DeleteBucket(DeleteBucketRequest) returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ delete: "/v2/{name=*/*/locations/*/buckets/*}"
+ additional_bindings {
+ delete: "/v2/{name=projects/*/locations/*/buckets/*}"
+ }
+ additional_bindings {
+ delete: "/v2/{name=organizations/*/locations/*/buckets/*}"
+ }
+ additional_bindings {
+ delete: "/v2/{name=folders/*/locations/*/buckets/*}"
+ }
+ additional_bindings {
+ delete: "/v2/{name=billingAccounts/*/locations/*/buckets/*}"
+ }
+ };
+ }
+
+ // Undeletes a log bucket. A bucket that has been deleted can be undeleted
+ // within the grace period of 7 days.
+ rpc UndeleteBucket(UndeleteBucketRequest) returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ post: "/v2/{name=*/*/locations/*/buckets/*}:undelete"
+ body: "*"
+ additional_bindings {
+ post: "/v2/{name=projects/*/locations/*/buckets/*}:undelete"
+ body: "*"
+ }
+ additional_bindings {
+ post: "/v2/{name=organizations/*/locations/*/buckets/*}:undelete"
+ body: "*"
+ }
+ additional_bindings {
+ post: "/v2/{name=folders/*/locations/*/buckets/*}:undelete"
+ body: "*"
+ }
+ additional_bindings {
+ post: "/v2/{name=billingAccounts/*/locations/*/buckets/*}:undelete"
+ body: "*"
+ }
+ };
+ }
+
+ // Lists views on a log bucket.
+ rpc ListViews(ListViewsRequest) returns (ListViewsResponse) {
+ option (google.api.http) = {
+ get: "/v2/{parent=*/*/locations/*/buckets/*}/views"
+ additional_bindings {
+ get: "/v2/{parent=projects/*/locations/*/buckets/*}/views"
+ }
+ additional_bindings {
+ get: "/v2/{parent=organizations/*/locations/*/buckets/*}/views"
+ }
+ additional_bindings {
+ get: "/v2/{parent=folders/*/locations/*/buckets/*}/views"
+ }
+ additional_bindings {
+ get: "/v2/{parent=billingAccounts/*/locations/*/buckets/*}/views"
+ }
+ };
+ option (google.api.method_signature) = "parent";
+ }
+
+ // Gets a view on a log bucket..
+ rpc GetView(GetViewRequest) returns (LogView) {
+ option (google.api.http) = {
+ get: "/v2/{name=*/*/locations/*/buckets/*/views/*}"
+ additional_bindings {
+ get: "/v2/{name=projects/*/locations/*/buckets/*/views/*}"
+ }
+ additional_bindings {
+ get: "/v2/{name=organizations/*/locations/*/buckets/*/views/*}"
+ }
+ additional_bindings {
+ get: "/v2/{name=folders/*/locations/*/buckets/*/views/*}"
+ }
+ additional_bindings {
+ get: "/v2/{name=billingAccounts/*/locations/*/buckets/*/views/*}"
+ }
+ };
+ }
+
+ // Creates a view over log entries in a log bucket. A bucket may contain a
+ // maximum of 30 views.
+ rpc CreateView(CreateViewRequest) returns (LogView) {
+ option (google.api.http) = {
+ post: "/v2/{parent=*/*/locations/*/buckets/*}/views"
+ body: "view"
+ additional_bindings {
+ post: "/v2/{parent=projects/*/locations/*/buckets/*}/views"
+ body: "view"
+ }
+ additional_bindings {
+ post: "/v2/{parent=organizations/*/locations/*/buckets/*}/views"
+ body: "view"
+ }
+ additional_bindings {
+ post: "/v2/{parent=folders/*/locations/*/buckets/*}/views"
+ body: "view"
+ }
+ additional_bindings {
+ post: "/v2/{parent=billingAccounts/*/locations/*/buckets/*}/views"
+ body: "view"
+ }
+ };
+ }
+
+ // Updates a view on a log bucket. This method replaces the following fields
+ // in the existing view with values from the new view: `filter`.
+ // If an `UNAVAILABLE` error is returned, this indicates that system is not in
+ // a state where it can update the view. If this occurs, please try again in a
+ // few minutes.
+ rpc UpdateView(UpdateViewRequest) returns (LogView) {
+ option (google.api.http) = {
+ patch: "/v2/{name=*/*/locations/*/buckets/*/views/*}"
+ body: "view"
+ additional_bindings {
+ patch: "/v2/{name=projects/*/locations/*/buckets/*/views/*}"
+ body: "view"
+ }
+ additional_bindings {
+ patch: "/v2/{name=organizations/*/locations/*/buckets/*/views/*}"
+ body: "view"
+ }
+ additional_bindings {
+ patch: "/v2/{name=folders/*/locations/*/buckets/*/views/*}"
+ body: "view"
+ }
+ additional_bindings {
+ patch: "/v2/{name=billingAccounts/*/locations/*/buckets/*/views/*}"
+ body: "view"
+ }
+ };
+ }
+
+ // Deletes a view on a log bucket.
+ // If an `UNAVAILABLE` error is returned, this indicates that system is not in
+ // a state where it can delete the view. If this occurs, please try again in a
+ // few minutes.
+ rpc DeleteView(DeleteViewRequest) returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ delete: "/v2/{name=*/*/locations/*/buckets/*/views/*}"
+ additional_bindings {
+ delete: "/v2/{name=projects/*/locations/*/buckets/*/views/*}"
+ }
+ additional_bindings {
+ delete: "/v2/{name=organizations/*/locations/*/buckets/*/views/*}"
+ }
+ additional_bindings {
+ delete: "/v2/{name=folders/*/locations/*/buckets/*/views/*}"
+ }
+ additional_bindings {
+ delete: "/v2/{name=billingAccounts/*/locations/*/buckets/*/views/*}"
+ }
+ };
+ }
+
+ // Lists sinks.
+ rpc ListSinks(ListSinksRequest) returns (ListSinksResponse) {
+ option (google.api.http) = {
+ get: "/v2/{parent=*/*}/sinks"
+ additional_bindings { get: "/v2/{parent=projects/*}/sinks" }
+ additional_bindings { get: "/v2/{parent=organizations/*}/sinks" }
+ additional_bindings { get: "/v2/{parent=folders/*}/sinks" }
+ additional_bindings { get: "/v2/{parent=billingAccounts/*}/sinks" }
+ };
+ option (google.api.method_signature) = "parent";
+ }
+
+ // Gets a sink.
+ rpc GetSink(GetSinkRequest) returns (LogSink) {
+ option (google.api.http) = {
+ get: "/v2/{sink_name=*/*/sinks/*}"
+ additional_bindings { get: "/v2/{sink_name=projects/*/sinks/*}" }
+ additional_bindings { get: "/v2/{sink_name=organizations/*/sinks/*}" }
+ additional_bindings { get: "/v2/{sink_name=folders/*/sinks/*}" }
+ additional_bindings { get: "/v2/{sink_name=billingAccounts/*/sinks/*}" }
+ };
+ option (google.api.method_signature) = "sink_name";
+ }
+
+ // Creates a sink that exports specified log entries to a destination. The
+ // export of newly-ingested log entries begins immediately, unless the sink's
+ // `writer_identity` is not permitted to write to the destination. A sink can
+ // export log entries only from the resource owning the sink.
+ rpc CreateSink(CreateSinkRequest) returns (LogSink) {
+ option (google.api.http) = {
+ post: "/v2/{parent=*/*}/sinks"
+ body: "sink"
+ additional_bindings { post: "/v2/{parent=projects/*}/sinks" body: "sink" }
+ additional_bindings {
+ post: "/v2/{parent=organizations/*}/sinks"
+ body: "sink"
+ }
+ additional_bindings { post: "/v2/{parent=folders/*}/sinks" body: "sink" }
+ additional_bindings {
+ post: "/v2/{parent=billingAccounts/*}/sinks"
+ body: "sink"
+ }
+ };
+ option (google.api.method_signature) = "parent,sink";
+ }
+
+ // Updates a sink. This method replaces the following fields in the existing
+ // sink with values from the new sink: `destination`, and `filter`.
+ //
+ // The updated sink might also have a new `writer_identity`; see the
+ // `unique_writer_identity` field.
+ rpc UpdateSink(UpdateSinkRequest) returns (LogSink) {
+ option (google.api.http) = {
+ put: "/v2/{sink_name=*/*/sinks/*}"
+ body: "sink"
+ additional_bindings {
+ put: "/v2/{sink_name=projects/*/sinks/*}"
+ body: "sink"
+ }
+ additional_bindings {
+ put: "/v2/{sink_name=organizations/*/sinks/*}"
+ body: "sink"
+ }
+ additional_bindings {
+ put: "/v2/{sink_name=folders/*/sinks/*}"
+ body: "sink"
+ }
+ additional_bindings {
+ put: "/v2/{sink_name=billingAccounts/*/sinks/*}"
+ body: "sink"
+ }
+ additional_bindings {
+ patch: "/v2/{sink_name=projects/*/sinks/*}"
+ body: "sink"
+ }
+ additional_bindings {
+ patch: "/v2/{sink_name=organizations/*/sinks/*}"
+ body: "sink"
+ }
+ additional_bindings {
+ patch: "/v2/{sink_name=folders/*/sinks/*}"
+ body: "sink"
+ }
+ additional_bindings {
+ patch: "/v2/{sink_name=billingAccounts/*/sinks/*}"
+ body: "sink"
+ }
+ };
+ option (google.api.method_signature) = "sink_name,sink,update_mask";
+ option (google.api.method_signature) = "sink_name,sink";
+ }
+
+ // Deletes a sink. If the sink has a unique `writer_identity`, then that
+ // service account is also deleted.
+ rpc DeleteSink(DeleteSinkRequest) returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ delete: "/v2/{sink_name=*/*/sinks/*}"
+ additional_bindings { delete: "/v2/{sink_name=projects/*/sinks/*}" }
+ additional_bindings { delete: "/v2/{sink_name=organizations/*/sinks/*}" }
+ additional_bindings { delete: "/v2/{sink_name=folders/*/sinks/*}" }
+ additional_bindings {
+ delete: "/v2/{sink_name=billingAccounts/*/sinks/*}"
+ }
+ };
+ option (google.api.method_signature) = "sink_name";
+ }
+
+ // Asynchronously creates a linked dataset in BigQuery which makes it possible
+ // to use BigQuery to read the logs stored in the log bucket. A log bucket may
+ // currently only contain one link.
+ rpc CreateLink(CreateLinkRequest) returns (google.longrunning.Operation) {
+ option (google.api.http) = {
+ post: "/v2/{parent=*/*/locations/*/buckets/*}/links"
+ body: "link"
+ additional_bindings {
+ post: "/v2/{parent=projects/*/locations/*/buckets/*}/links"
+ body: "link"
+ }
+ additional_bindings {
+ post: "/v2/{parent=organizations/*/locations/*/buckets/*}/links"
+ body: "link"
+ }
+ additional_bindings {
+ post: "/v2/{parent=folders/*/locations/*/buckets/*}/links"
+ body: "link"
+ }
+ additional_bindings {
+ post: "/v2/{parent=billingAccounts/*/locations/*/buckets/*}/links"
+ body: "link"
+ }
+ };
+ option (google.api.method_signature) = "parent,link,link_id";
+ option (google.longrunning.operation_info) = {
+ response_type: "Link"
+ metadata_type: "LinkMetadata"
+ };
+ }
+
+ // Deletes a link. This will also delete the corresponding BigQuery linked
+ // dataset.
+ rpc DeleteLink(DeleteLinkRequest) returns (google.longrunning.Operation) {
+ option (google.api.http) = {
+ delete: "/v2/{name=*/*/locations/*/buckets/*/links/*}"
+ additional_bindings {
+ delete: "/v2/{name=projects/*/locations/*/buckets/*/links/*}"
+ }
+ additional_bindings {
+ delete: "/v2/{name=organizations/*/locations/*/buckets/*/links/*}"
+ }
+ additional_bindings {
+ delete: "/v2/{name=folders/*/locations/*/buckets/*/links/*}"
+ }
+ additional_bindings {
+ delete: "/v2/{name=billingAccounts/*/locations/*/buckets/*/links/*}"
+ }
+ };
+ option (google.api.method_signature) = "name";
+ option (google.longrunning.operation_info) = {
+ response_type: "google.protobuf.Empty"
+ metadata_type: "LinkMetadata"
+ };
+ }
+
+ // Lists links.
+ rpc ListLinks(ListLinksRequest) returns (ListLinksResponse) {
+ option (google.api.http) = {
+ get: "/v2/{parent=*/*/locations/*/buckets/*}/links"
+ additional_bindings {
+ get: "/v2/{parent=projects/*/locations/*/buckets/*}/links"
+ }
+ additional_bindings {
+ get: "/v2/{parent=organizations/*/locations/*/buckets/*}/links"
+ }
+ additional_bindings {
+ get: "/v2/{parent=folders/*/locations/*/buckets/*}/links"
+ }
+ additional_bindings {
+ get: "/v2/{parent=billingAccounts/*/locations/*/buckets/*}/links"
+ }
+ };
+ option (google.api.method_signature) = "parent";
+ }
+
+ // Gets a link.
+ rpc GetLink(GetLinkRequest) returns (Link) {
+ option (google.api.http) = {
+ get: "/v2/{name=*/*/locations/*/buckets/*/links/*}"
+ additional_bindings {
+ get: "/v2/{name=projects/*/locations/*/buckets/*/links/*}"
+ }
+ additional_bindings {
+ get: "/v2/{name=organizations/*/locations/*/buckets/*/links/*}"
+ }
+ additional_bindings {
+ get: "/v2/{name=folders/*/locations/*/buckets/*/links/*}"
+ }
+ additional_bindings {
+ get: "/v2/{name=billingAccounts/*/locations/*/buckets/*/links/*}"
+ }
+ };
+ option (google.api.method_signature) = "name";
+ }
+
+ // Lists all the exclusions on the _Default sink in a parent resource.
+ rpc ListExclusions(ListExclusionsRequest) returns (ListExclusionsResponse) {
+ option (google.api.http) = {
+ get: "/v2/{parent=*/*}/exclusions"
+ additional_bindings { get: "/v2/{parent=projects/*}/exclusions" }
+ additional_bindings { get: "/v2/{parent=organizations/*}/exclusions" }
+ additional_bindings { get: "/v2/{parent=folders/*}/exclusions" }
+ additional_bindings { get: "/v2/{parent=billingAccounts/*}/exclusions" }
+ };
+ option (google.api.method_signature) = "parent";
+ }
+
+ // Gets the description of an exclusion in the _Default sink.
+ rpc GetExclusion(GetExclusionRequest) returns (LogExclusion) {
+ option (google.api.http) = {
+ get: "/v2/{name=*/*/exclusions/*}"
+ additional_bindings { get: "/v2/{name=projects/*/exclusions/*}" }
+ additional_bindings { get: "/v2/{name=organizations/*/exclusions/*}" }
+ additional_bindings { get: "/v2/{name=folders/*/exclusions/*}" }
+ additional_bindings { get: "/v2/{name=billingAccounts/*/exclusions/*}" }
+ };
+ option (google.api.method_signature) = "name";
+ }
+
+ // Creates a new exclusion in the _Default sink in a specified parent
+ // resource. Only log entries belonging to that resource can be excluded. You
+ // can have up to 10 exclusions in a resource.
+ rpc CreateExclusion(CreateExclusionRequest) returns (LogExclusion) {
+ option (google.api.http) = {
+ post: "/v2/{parent=*/*}/exclusions"
+ body: "exclusion"
+ additional_bindings {
+ post: "/v2/{parent=projects/*}/exclusions"
+ body: "exclusion"
+ }
+ additional_bindings {
+ post: "/v2/{parent=organizations/*}/exclusions"
+ body: "exclusion"
+ }
+ additional_bindings {
+ post: "/v2/{parent=folders/*}/exclusions"
+ body: "exclusion"
+ }
+ additional_bindings {
+ post: "/v2/{parent=billingAccounts/*}/exclusions"
+ body: "exclusion"
+ }
+ };
+ option (google.api.method_signature) = "parent,exclusion";
+ }
+
+ // Changes one or more properties of an existing exclusion in the _Default
+ // sink.
+ rpc UpdateExclusion(UpdateExclusionRequest) returns (LogExclusion) {
+ option (google.api.http) = {
+ patch: "/v2/{name=*/*/exclusions/*}"
+ body: "exclusion"
+ additional_bindings {
+ patch: "/v2/{name=projects/*/exclusions/*}"
+ body: "exclusion"
+ }
+ additional_bindings {
+ patch: "/v2/{name=organizations/*/exclusions/*}"
+ body: "exclusion"
+ }
+ additional_bindings {
+ patch: "/v2/{name=folders/*/exclusions/*}"
+ body: "exclusion"
+ }
+ additional_bindings {
+ patch: "/v2/{name=billingAccounts/*/exclusions/*}"
+ body: "exclusion"
+ }
+ };
+ option (google.api.method_signature) = "name,exclusion,update_mask";
+ }
+
+ // Deletes an exclusion in the _Default sink.
+ rpc DeleteExclusion(DeleteExclusionRequest) returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ delete: "/v2/{name=*/*/exclusions/*}"
+ additional_bindings { delete: "/v2/{name=projects/*/exclusions/*}" }
+ additional_bindings { delete: "/v2/{name=organizations/*/exclusions/*}" }
+ additional_bindings { delete: "/v2/{name=folders/*/exclusions/*}" }
+ additional_bindings {
+ delete: "/v2/{name=billingAccounts/*/exclusions/*}"
+ }
+ };
+ option (google.api.method_signature) = "name";
+ }
+
+ // Gets the Logging CMEK settings for the given resource.
+ //
+ // Note: CMEK for the Log Router can be configured for Google Cloud projects,
+ // folders, organizations and billing accounts. Once configured for an
+ // organization, it applies to all projects and folders in the Google Cloud
+ // organization.
+ //
+ // See [Enabling CMEK for Log
+ // Router](https://cloud.google.com/logging/docs/routing/managed-encryption)
+ // for more information.
+ rpc GetCmekSettings(GetCmekSettingsRequest) returns (CmekSettings) {
+ option (google.api.http) = {
+ get: "/v2/{name=*/*}/cmekSettings"
+ additional_bindings { get: "/v2/{name=projects/*}/cmekSettings" }
+ additional_bindings { get: "/v2/{name=organizations/*}/cmekSettings" }
+ additional_bindings { get: "/v2/{name=folders/*}/cmekSettings" }
+ additional_bindings { get: "/v2/{name=billingAccounts/*}/cmekSettings" }
+ };
+ }
+
+ // Updates the Log Router CMEK settings for the given resource.
+ //
+ // Note: CMEK for the Log Router can currently only be configured for Google
+ // Cloud organizations. Once configured, it applies to all projects and
+ // folders in the Google Cloud organization.
+ //
+ // [UpdateCmekSettings][google.logging.v2.ConfigServiceV2.UpdateCmekSettings]
+ // will fail if 1) `kms_key_name` is invalid, or 2) the associated service
+ // account does not have the required
+ // `roles/cloudkms.cryptoKeyEncrypterDecrypter` role assigned for the key, or
+ // 3) access to the key is disabled.
+ //
+ // See [Enabling CMEK for Log
+ // Router](https://cloud.google.com/logging/docs/routing/managed-encryption)
+ // for more information.
+ rpc UpdateCmekSettings(UpdateCmekSettingsRequest) returns (CmekSettings) {
+ option (google.api.http) = {
+ patch: "/v2/{name=*/*}/cmekSettings"
+ body: "cmek_settings"
+ additional_bindings {
+ patch: "/v2/{name=organizations/*}/cmekSettings"
+ body: "cmek_settings"
+ }
+ };
+ }
+
+ // Gets the Log Router settings for the given resource.
+ //
+ // Note: Settings for the Log Router can be get for Google Cloud projects,
+ // folders, organizations and billing accounts. Currently it can only be
+ // configured for organizations. Once configured for an organization, it
+ // applies to all projects and folders in the Google Cloud organization.
+ //
+ // See [Enabling CMEK for Log
+ // Router](https://cloud.google.com/logging/docs/routing/managed-encryption)
+ // for more information.
+ rpc GetSettings(GetSettingsRequest) returns (Settings) {
+ option (google.api.http) = {
+ get: "/v2/{name=*/*}/settings"
+ additional_bindings { get: "/v2/{name=projects/*}/settings" }
+ additional_bindings { get: "/v2/{name=organizations/*}/settings" }
+ additional_bindings { get: "/v2/{name=folders/*}/settings" }
+ additional_bindings { get: "/v2/{name=billingAccounts/*}/settings" }
+ };
+ option (google.api.method_signature) = "name";
+ }
+
+ // Updates the Log Router settings for the given resource.
+ //
+ // Note: Settings for the Log Router can currently only be configured for
+ // Google Cloud organizations. Once configured, it applies to all projects and
+ // folders in the Google Cloud organization.
+ //
+ // [UpdateSettings][google.logging.v2.ConfigServiceV2.UpdateSettings]
+ // will fail if 1) `kms_key_name` is invalid, or 2) the associated service
+ // account does not have the required
+ // `roles/cloudkms.cryptoKeyEncrypterDecrypter` role assigned for the key, or
+ // 3) access to the key is disabled. 4) `location_id` is not supported by
+ // Logging. 5) `location_id` violate OrgPolicy.
+ //
+ // See [Enabling CMEK for Log
+ // Router](https://cloud.google.com/logging/docs/routing/managed-encryption)
+ // for more information.
+ rpc UpdateSettings(UpdateSettingsRequest) returns (Settings) {
+ option (google.api.http) = {
+ patch: "/v2/{name=*/*}/settings"
+ body: "settings"
+ additional_bindings {
+ patch: "/v2/{name=organizations/*}/settings"
+ body: "settings"
+ }
+ additional_bindings {
+ patch: "/v2/{name=folders/*}/settings"
+ body: "settings"
+ }
+ };
+ option (google.api.method_signature) = "settings,update_mask";
+ }
+
+ // Copies a set of log entries from a log bucket to a Cloud Storage bucket.
+ rpc CopyLogEntries(CopyLogEntriesRequest)
+ returns (google.longrunning.Operation) {
+ option (google.api.http) = {
+ post: "/v2/entries:copy"
+ body: "*"
+ };
+ option (google.longrunning.operation_info) = {
+ response_type: "CopyLogEntriesResponse"
+ metadata_type: "CopyLogEntriesMetadata"
+ };
+ }
+}
+
+// Configuration for an indexed field.
+message IndexConfig {
+ // Required. The LogEntry field path to index.
+ //
+ // Note that some paths are automatically indexed, and other paths are not
+ // eligible for indexing. See [indexing documentation](
+ // https://cloud.google.com/logging/docs/view/advanced-queries#indexed-fields)
+ // for details.
+ //
+ // For example: `jsonPayload.request.status`
+ string field_path = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The type of data in this index.
+ IndexType type = 2 [(google.api.field_behavior) = REQUIRED];
+
+ // Output only. The timestamp when the index was last modified.
+ //
+ // This is used to return the timestamp, and will be ignored if supplied
+ // during update.
+ google.protobuf.Timestamp create_time = 3
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+}
+
+// Describes a repository in which log entries are stored.
+message LogBucket {
+ option (google.api.resource) = {
+ type: "logging.googleapis.com/LogBucket"
+ pattern: "projects/{project}/locations/{location}/buckets/{bucket}"
+ pattern: "organizations/{organization}/locations/{location}/buckets/{bucket}"
+ pattern: "folders/{folder}/locations/{location}/buckets/{bucket}"
+ pattern: "billingAccounts/{billing_account}/locations/{location}/buckets/{bucket}"
+ };
+
+ // Output only. The resource name of the bucket.
+ //
+ // For example:
+ //
+ // `projects/my-project/locations/global/buckets/my-bucket`
+ //
+ // For a list of supported locations, see [Supported
+ // Regions](https://cloud.google.com/logging/docs/region-support)
+ //
+ // For the location of `global` it is unspecified where log entries are
+ // actually stored.
+ //
+ // After a bucket has been created, the location cannot be changed.
+ string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Describes this bucket.
+ string description = 3;
+
+ // Output only. The creation timestamp of the bucket. This is not set for any
+ // of the default buckets.
+ google.protobuf.Timestamp create_time = 4
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Output only. The last update timestamp of the bucket.
+ google.protobuf.Timestamp update_time = 5
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Logs will be retained by default for this amount of time, after which they
+ // will automatically be deleted. The minimum retention period is 1 day. If
+ // this value is set to zero at bucket creation time, the default time of 30
+ // days will be used.
+ int32 retention_days = 11;
+
+ // Whether the bucket is locked.
+ //
+ // The retention period on a locked bucket cannot be changed. Locked buckets
+ // may only be deleted if they are empty.
+ bool locked = 9;
+
+ // Output only. The bucket lifecycle state.
+ LifecycleState lifecycle_state = 12
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Whether log analytics is enabled for this bucket.
+ //
+ // Once enabled, log analytics features cannot be disabled.
+ bool analytics_enabled = 14;
+
+ // Log entry field paths that are denied access in this bucket.
+ //
+ // The following fields and their children are eligible: `textPayload`,
+ // `jsonPayload`, `protoPayload`, `httpRequest`, `labels`, `sourceLocation`.
+ //
+ // Restricting a repeated field will restrict all values. Adding a parent will
+ // block all child fields. (e.g. `foo.bar` will block `foo.bar.baz`)
+ repeated string restricted_fields = 15;
+
+ // A list of indexed fields and related configuration data.
+ repeated IndexConfig index_configs = 17;
+
+ // The CMEK settings of the log bucket. If present, new log entries written to
+ // this log bucket are encrypted using the CMEK key provided in this
+ // configuration. If a log bucket has CMEK settings, the CMEK settings cannot
+ // be disabled later by updating the log bucket. Changing the KMS key is
+ // allowed.
+ CmekSettings cmek_settings = 19;
+}
+
+// Describes a view over log entries in a bucket.
+message LogView {
+ option (google.api.resource) = {
+ type: "logging.googleapis.com/LogView"
+ pattern: "projects/{project}/locations/{location}/buckets/{bucket}/views/{view}"
+ pattern: "organizations/{organization}/locations/{location}/buckets/{bucket}/views/{view}"
+ pattern: "folders/{folder}/locations/{location}/buckets/{bucket}/views/{view}"
+ pattern: "billingAccounts/{billing_account}/locations/{location}/buckets/{bucket}/views/{view}"
+ };
+
+ // The resource name of the view.
+ //
+ // For example:
+ //
+ // `projects/my-project/locations/global/buckets/my-bucket/views/my-view`
+ string name = 1;
+
+ // Describes this view.
+ string description = 3;
+
+ // Output only. The creation timestamp of the view.
+ google.protobuf.Timestamp create_time = 4
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Output only. The last update timestamp of the view.
+ google.protobuf.Timestamp update_time = 5
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Filter that restricts which log entries in a bucket are visible in this
+ // view.
+ //
+ // Filters are restricted to be a logical AND of ==/!= of any of the
+ // following:
+ //
+ // - originating project/folder/organization/billing account.
+ // - resource type
+ // - log id
+ //
+ // For example:
+ //
+ // SOURCE("projects/myproject") AND resource.type = "gce_instance"
+ // AND LOG_ID("stdout")
+ string filter = 7;
+}
+
+// Describes a sink used to export log entries to one of the following
+// destinations in any project: a Cloud Storage bucket, a BigQuery dataset, a
+// Pub/Sub topic or a Cloud Logging log bucket. A logs filter controls which log
+// entries are exported. The sink must be created within a project,
+// organization, billing account, or folder.
+message LogSink {
+ option (google.api.resource) = {
+ type: "logging.googleapis.com/LogSink"
+ pattern: "projects/{project}/sinks/{sink}"
+ pattern: "organizations/{organization}/sinks/{sink}"
+ pattern: "folders/{folder}/sinks/{sink}"
+ pattern: "billingAccounts/{billing_account}/sinks/{sink}"
+ };
+
+ // Deprecated. This is unused.
+ enum VersionFormat {
+ // An unspecified format version that will default to V2.
+ VERSION_FORMAT_UNSPECIFIED = 0;
+
+ // `LogEntry` version 2 format.
+ V2 = 1;
+
+ // `LogEntry` version 1 format.
+ V1 = 2;
+ }
+
+ // Required. The client-assigned sink identifier, unique within the project.
+ //
+ // For example: `"my-syslog-errors-to-pubsub"`. Sink identifiers are limited
+ // to 100 characters and can include only the following characters: upper and
+ // lower-case alphanumeric characters, underscores, hyphens, and periods.
+ // First character has to be alphanumeric.
+ string name = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The export destination:
+ //
+ // "storage.googleapis.com/[GCS_BUCKET]"
+ // "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET]"
+ // "pubsub.googleapis.com/projects/[PROJECT_ID]/topics/[TOPIC_ID]"
+ //
+ // The sink's `writer_identity`, set when the sink is created, must have
+ // permission to write to the destination or else the log entries are not
+ // exported. For more information, see
+ // [Exporting Logs with
+ // Sinks](https://cloud.google.com/logging/docs/api/tasks/exporting-logs).
+ string destination = 3 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "*" }
+ ];
+
+ // Optional. An [advanced logs
+ // filter](https://cloud.google.com/logging/docs/view/advanced-queries). The
+ // only exported log entries are those that are in the resource owning the
+ // sink and that match the filter.
+ //
+ // For example:
+ //
+ // `logName="projects/[PROJECT_ID]/logs/[LOG_ID]" AND severity>=ERROR`
+ string filter = 5 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. A description of this sink.
+ //
+ // The maximum length of the description is 8000 characters.
+ string description = 18 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If set to true, then this sink is disabled and it does not export
+ // any log entries.
+ bool disabled = 19 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Log entries that match any of these exclusion filters will not be
+ // exported.
+ //
+ // If a log entry is matched by both `filter` and one of `exclusion_filters`
+ // it will not be exported.
+ repeated LogExclusion exclusions = 16
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Deprecated. This field is unused.
+ VersionFormat output_version_format = 6 [deprecated = true];
+
+ // Output only. An IAM identity—a service account or group—under
+ // which Cloud Logging writes the exported log entries to the sink's
+ // destination. This field is either set by specifying
+ // `custom_writer_identity` or set automatically by
+ // [sinks.create][google.logging.v2.ConfigServiceV2.CreateSink] and
+ // [sinks.update][google.logging.v2.ConfigServiceV2.UpdateSink] based on the
+ // value of `unique_writer_identity` in those methods.
+ //
+ // Until you grant this identity write-access to the destination, log entry
+ // exports from this sink will fail. For more information, see [Granting
+ // Access for a
+ // Resource](https://cloud.google.com/iam/docs/granting-roles-to-service-accounts#granting_access_to_a_service_account_for_a_resource).
+ // Consult the destination service's documentation to determine the
+ // appropriate IAM roles to assign to the identity.
+ //
+ // Sinks that have a destination that is a log bucket in the same project as
+ // the sink cannot have a writer_identity and no additional permissions are
+ // required.
+ string writer_identity = 8 [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Optional. This field applies only to sinks owned by organizations and
+ // folders. If the field is false, the default, only the logs owned by the
+ // sink's parent resource are available for export. If the field is true, then
+ // log entries from all the projects, folders, and billing accounts contained
+ // in the sink's parent resource are also available for export. Whether a
+ // particular log entry from the children is exported depends on the sink's
+ // filter expression.
+ //
+ // For example, if this field is true, then the filter
+ // `resource.type=gce_instance` would export all Compute Engine VM instance
+ // log entries from all projects in the sink's parent.
+ //
+ // To only export entries from certain child projects, filter on the project
+ // part of the log name:
+ //
+ // logName:("projects/test-project1/" OR "projects/test-project2/") AND
+ // resource.type=gce_instance
+ bool include_children = 9 [(google.api.field_behavior) = OPTIONAL];
+
+ // Destination dependent options.
+ oneof options {
+ // Optional. Options that affect sinks exporting data to BigQuery.
+ BigQueryOptions bigquery_options = 12
+ [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Output only. The creation timestamp of the sink.
+ //
+ // This field may not be present for older sinks.
+ google.protobuf.Timestamp create_time = 13
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Output only. The last update timestamp of the sink.
+ //
+ // This field may not be present for older sinks.
+ google.protobuf.Timestamp update_time = 14
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+}
+
+// Describes a BigQuery dataset that was created by a link.
+message BigQueryDataset {
+ // Output only. The full resource name of the BigQuery dataset. The DATASET_ID
+ // will match the ID of the link, so the link must match the naming
+ // restrictions of BigQuery datasets (alphanumeric characters and underscores
+ // only).
+ //
+ // The dataset will have a resource path of
+ // "bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET_ID]"
+ string dataset_id = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
+}
+
+// Describes a link connected to an analytics enabled bucket.
+message Link {
+ option (google.api.resource) = {
+ type: "logging.googleapis.com/Link"
+ pattern: "projects/{project}/locations/{location}/buckets/{bucket}/links/{link}"
+ pattern: "organizations/{organization}/locations/{location}/buckets/{bucket}/links/{link}"
+ pattern: "folders/{folder}/locations/{location}/buckets/{bucket}/links/{link}"
+ pattern: "billingAccounts/{billing_account}/locations/{location}/buckets/{bucket}/links/{link}"
+ };
+
+ // The resource name of the link. The name can have up to 100 characters.
+ // A valid link id (at the end of the link name) must only have alphanumeric
+ // characters and underscores within it.
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/[LINK_ID]"
+ // "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/[LINK_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/[LINK_ID]"
+ // "folders/[FOLDER_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/[LINK_ID]"
+ //
+ // For example:
+ //
+ // `projects/my-project/locations/global/buckets/my-bucket/links/my_link
+ string name = 1;
+
+ // Describes this link.
+ //
+ // The maximum length of the description is 8000 characters.
+ string description = 2;
+
+ // Output only. The creation timestamp of the link.
+ google.protobuf.Timestamp create_time = 3
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Output only. The resource lifecycle state.
+ LifecycleState lifecycle_state = 4
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // The information of a BigQuery Dataset. When a link is created, a BigQuery
+ // dataset is created along with it, in the same project as the LogBucket it's
+ // linked to. This dataset will also have BigQuery Views corresponding to the
+ // LogViews in the bucket.
+ BigQueryDataset bigquery_dataset = 5;
+}
+
+// Options that change functionality of a sink exporting data to BigQuery.
+message BigQueryOptions {
+ // Optional. Whether to use [BigQuery's partition
+ // tables](https://cloud.google.com/bigquery/docs/partitioned-tables). By
+ // default, Cloud Logging creates dated tables based on the log entries'
+ // timestamps, e.g. syslog_20170523. With partitioned tables the date suffix
+ // is no longer present and [special query
+ // syntax](https://cloud.google.com/bigquery/docs/querying-partitioned-tables)
+ // has to be used instead. In both cases, tables are sharded based on UTC
+ // timezone.
+ bool use_partitioned_tables = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Output only. True if new timestamp column based partitioning is in use,
+ // false if legacy ingestion-time partitioning is in use.
+ //
+ // All new sinks will have this field set true and will use timestamp column
+ // based partitioning. If use_partitioned_tables is false, this value has no
+ // meaning and will be false. Legacy sinks using partitioned tables will have
+ // this field set to false.
+ bool uses_timestamp_column_partitioning = 3
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+}
+
+// The parameters to `ListBuckets`.
+message ListBucketsRequest {
+ // Required. The parent resource whose buckets are to be listed:
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]"
+ // "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]"
+ // "folders/[FOLDER_ID]/locations/[LOCATION_ID]"
+ //
+ // Note: The locations portion of the resource must be specified, but
+ // supplying the character `-` in place of [LOCATION_ID] will return all
+ // buckets.
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ child_type: "logging.googleapis.com/LogBucket"
+ }
+ ];
+
+ // Optional. If present, then retrieve the next batch of results from the
+ // preceding call to this method. `pageToken` must be the value of
+ // `nextPageToken` from the previous response. The values of other method
+ // parameters should be identical to those in the previous call.
+ string page_token = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The maximum number of results to return from this request.
+ // Non-positive values are ignored. The presence of `nextPageToken` in the
+ // response indicates that more results might be available.
+ int32 page_size = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// The response from ListBuckets.
+message ListBucketsResponse {
+ // A list of buckets.
+ repeated LogBucket buckets = 1;
+
+ // If there might be more results than appear in this response, then
+ // `nextPageToken` is included. To get the next set of results, call the same
+ // method again using the value of `nextPageToken` as `pageToken`.
+ string next_page_token = 2;
+}
+
+// The parameters to `CreateBucket`.
+message CreateBucketRequest {
+ // Required. The resource in which to create the log bucket:
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]"
+ //
+ // For example:
+ //
+ // `"projects/my-project/locations/global"`
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ child_type: "logging.googleapis.com/LogBucket"
+ }
+ ];
+
+ // Required. A client-assigned identifier such as `"my-bucket"`. Identifiers
+ // are limited to 100 characters and can include only letters, digits,
+ // underscores, hyphens, and periods.
+ string bucket_id = 2 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The new bucket. The region specified in the new bucket must be
+ // compliant with any Location Restriction Org Policy. The name field in the
+ // bucket is ignored.
+ LogBucket bucket = 3 [(google.api.field_behavior) = REQUIRED];
+}
+
+// The parameters to `UpdateBucket`.
+message UpdateBucketRequest {
+ // Required. The full resource name of the bucket to update.
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "folders/[FOLDER_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ //
+ // For example:
+ //
+ // `"projects/my-project/locations/global/buckets/my-bucket"`
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "logging.googleapis.com/LogBucket"
+ }
+ ];
+
+ // Required. The updated bucket.
+ LogBucket bucket = 2 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. Field mask that specifies the fields in `bucket` that need an
+ // update. A bucket field will be overwritten if, and only if, it is in the
+ // update mask. `name` and output only fields cannot be updated.
+ //
+ // For a detailed `FieldMask` definition, see:
+ // https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.FieldMask
+ //
+ // For example: `updateMask=retention_days`
+ google.protobuf.FieldMask update_mask = 4
+ [(google.api.field_behavior) = REQUIRED];
+}
+
+// The parameters to `GetBucket`.
+message GetBucketRequest {
+ // Required. The resource name of the bucket:
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "folders/[FOLDER_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ //
+ // For example:
+ //
+ // `"projects/my-project/locations/global/buckets/my-bucket"`
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "logging.googleapis.com/LogBucket"
+ }
+ ];
+}
+
+// The parameters to `DeleteBucket`.
+message DeleteBucketRequest {
+ // Required. The full resource name of the bucket to delete.
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "folders/[FOLDER_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ //
+ // For example:
+ //
+ // `"projects/my-project/locations/global/buckets/my-bucket"`
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "logging.googleapis.com/LogBucket"
+ }
+ ];
+}
+
+// The parameters to `UndeleteBucket`.
+message UndeleteBucketRequest {
+ // Required. The full resource name of the bucket to undelete.
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "folders/[FOLDER_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ //
+ // For example:
+ //
+ // `"projects/my-project/locations/global/buckets/my-bucket"`
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "logging.googleapis.com/LogBucket"
+ }
+ ];
+}
+
+// The parameters to `ListViews`.
+message ListViewsRequest {
+ // Required. The bucket whose views are to be listed:
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ string parent = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Optional. If present, then retrieve the next batch of results from the
+ // preceding call to this method. `pageToken` must be the value of
+ // `nextPageToken` from the previous response. The values of other method
+ // parameters should be identical to those in the previous call.
+ string page_token = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The maximum number of results to return from this request.
+ //
+ // Non-positive values are ignored. The presence of `nextPageToken` in the
+ // response indicates that more results might be available.
+ int32 page_size = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// The response from ListViews.
+message ListViewsResponse {
+ // A list of views.
+ repeated LogView views = 1;
+
+ // If there might be more results than appear in this response, then
+ // `nextPageToken` is included. To get the next set of results, call the same
+ // method again using the value of `nextPageToken` as `pageToken`.
+ string next_page_token = 2;
+}
+
+// The parameters to `CreateView`.
+message CreateViewRequest {
+ // Required. The bucket in which to create the view
+ //
+ // `"projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"`
+ //
+ // For example:
+ //
+ // `"projects/my-project/locations/global/buckets/my-bucket"`
+ string parent = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. A client-assigned identifier such as `"my-view"`. Identifiers are
+ // limited to 100 characters and can include only letters, digits,
+ // underscores, hyphens, and periods.
+ string view_id = 2 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The new view.
+ LogView view = 3 [(google.api.field_behavior) = REQUIRED];
+}
+
+// The parameters to `UpdateView`.
+message UpdateViewRequest {
+ // Required. The full resource name of the view to update
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]"
+ //
+ // For example:
+ //
+ // `"projects/my-project/locations/global/buckets/my-bucket/views/my-view"`
+ string name = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The updated view.
+ LogView view = 2 [(google.api.field_behavior) = REQUIRED];
+
+ // Optional. Field mask that specifies the fields in `view` that need
+ // an update. A field will be overwritten if, and only if, it is
+ // in the update mask. `name` and output only fields cannot be updated.
+ //
+ // For a detailed `FieldMask` definition, see
+ // https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.FieldMask
+ //
+ // For example: `updateMask=filter`
+ google.protobuf.FieldMask update_mask = 4
+ [(google.api.field_behavior) = OPTIONAL];
+}
+
+// The parameters to `GetView`.
+message GetViewRequest {
+ // Required. The resource name of the policy:
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]"
+ //
+ // For example:
+ //
+ // `"projects/my-project/locations/global/buckets/my-bucket/views/my-view"`
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "logging.googleapis.com/LogView" }
+ ];
+}
+
+// The parameters to `DeleteView`.
+message DeleteViewRequest {
+ // Required. The full resource name of the view to delete:
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/views/[VIEW_ID]"
+ //
+ // For example:
+ //
+ // `"projects/my-project/locations/global/buckets/my-bucket/views/my-view"`
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "logging.googleapis.com/LogView" }
+ ];
+}
+
+// The parameters to `ListSinks`.
+message ListSinksRequest {
+ // Required. The parent resource whose sinks are to be listed:
+ //
+ // "projects/[PROJECT_ID]"
+ // "organizations/[ORGANIZATION_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]"
+ // "folders/[FOLDER_ID]"
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ child_type: "logging.googleapis.com/LogSink"
+ }
+ ];
+
+ // Optional. If present, then retrieve the next batch of results from the
+ // preceding call to this method. `pageToken` must be the value of
+ // `nextPageToken` from the previous response. The values of other method
+ // parameters should be identical to those in the previous call.
+ string page_token = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The maximum number of results to return from this request.
+ // Non-positive values are ignored. The presence of `nextPageToken` in the
+ // response indicates that more results might be available.
+ int32 page_size = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Result returned from `ListSinks`.
+message ListSinksResponse {
+ // A list of sinks.
+ repeated LogSink sinks = 1;
+
+ // If there might be more results than appear in this response, then
+ // `nextPageToken` is included. To get the next set of results, call the same
+ // method again using the value of `nextPageToken` as `pageToken`.
+ string next_page_token = 2;
+}
+
+// The parameters to `GetSink`.
+message GetSinkRequest {
+ // Required. The resource name of the sink:
+ //
+ // "projects/[PROJECT_ID]/sinks/[SINK_ID]"
+ // "organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/sinks/[SINK_ID]"
+ // "folders/[FOLDER_ID]/sinks/[SINK_ID]"
+ //
+ // For example:
+ //
+ // `"projects/my-project/sinks/my-sink"`
+ string sink_name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "logging.googleapis.com/LogSink" }
+ ];
+}
+
+// The parameters to `CreateSink`.
+message CreateSinkRequest {
+ // Required. The resource in which to create the sink:
+ //
+ // "projects/[PROJECT_ID]"
+ // "organizations/[ORGANIZATION_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]"
+ // "folders/[FOLDER_ID]"
+ //
+ // For examples:
+ //
+ // `"projects/my-project"`
+ // `"organizations/123456789"`
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ child_type: "logging.googleapis.com/LogSink"
+ }
+ ];
+
+ // Required. The new sink, whose `name` parameter is a sink identifier that
+ // is not already in use.
+ LogSink sink = 2 [(google.api.field_behavior) = REQUIRED];
+
+ // Optional. Determines the kind of IAM identity returned as `writer_identity`
+ // in the new sink. If this value is omitted or set to false, and if the
+ // sink's parent is a project, then the value returned as `writer_identity` is
+ // the same group or service account used by Cloud Logging before the addition
+ // of writer identities to this API. The sink's destination must be in the
+ // same project as the sink itself.
+ //
+ // If this field is set to true, or if the sink is owned by a non-project
+ // resource such as an organization, then the value of `writer_identity` will
+ // be a unique service account used only for exports from the new sink. For
+ // more information, see `writer_identity` in
+ // [LogSink][google.logging.v2.LogSink].
+ bool unique_writer_identity = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// The parameters to `UpdateSink`.
+message UpdateSinkRequest {
+ // Required. The full resource name of the sink to update, including the
+ // parent resource and the sink identifier:
+ //
+ // "projects/[PROJECT_ID]/sinks/[SINK_ID]"
+ // "organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/sinks/[SINK_ID]"
+ // "folders/[FOLDER_ID]/sinks/[SINK_ID]"
+ //
+ // For example:
+ //
+ // `"projects/my-project/sinks/my-sink"`
+ string sink_name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "logging.googleapis.com/LogSink" }
+ ];
+
+ // Required. The updated sink, whose name is the same identifier that appears
+ // as part of `sink_name`.
+ LogSink sink = 2 [(google.api.field_behavior) = REQUIRED];
+
+ // Optional. See [sinks.create][google.logging.v2.ConfigServiceV2.CreateSink]
+ // for a description of this field. When updating a sink, the effect of this
+ // field on the value of `writer_identity` in the updated sink depends on both
+ // the old and new values of this field:
+ //
+ // + If the old and new values of this field are both false or both true,
+ // then there is no change to the sink's `writer_identity`.
+ // + If the old value is false and the new value is true, then
+ // `writer_identity` is changed to a unique service account.
+ // + It is an error if the old value is true and the new value is
+ // set to false or defaulted to false.
+ bool unique_writer_identity = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Field mask that specifies the fields in `sink` that need
+ // an update. A sink field will be overwritten if, and only if, it is
+ // in the update mask. `name` and output only fields cannot be updated.
+ //
+ // An empty `updateMask` is temporarily treated as using the following mask
+ // for backwards compatibility purposes:
+ //
+ // `destination,filter,includeChildren`
+ //
+ // At some point in the future, behavior will be removed and specifying an
+ // empty `updateMask` will be an error.
+ //
+ // For a detailed `FieldMask` definition, see
+ // https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#google.protobuf.FieldMask
+ //
+ // For example: `updateMask=filter`
+ google.protobuf.FieldMask update_mask = 4
+ [(google.api.field_behavior) = OPTIONAL];
+}
+
+// The parameters to `DeleteSink`.
+message DeleteSinkRequest {
+ // Required. The full resource name of the sink to delete, including the
+ // parent resource and the sink identifier:
+ //
+ // "projects/[PROJECT_ID]/sinks/[SINK_ID]"
+ // "organizations/[ORGANIZATION_ID]/sinks/[SINK_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/sinks/[SINK_ID]"
+ // "folders/[FOLDER_ID]/sinks/[SINK_ID]"
+ //
+ // For example:
+ //
+ // `"projects/my-project/sinks/my-sink"`
+ string sink_name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "logging.googleapis.com/LogSink" }
+ ];
+}
+
+// The parameters to CreateLink.
+message CreateLinkRequest {
+ // Required. The full resource name of the bucket to create a link for.
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ // "folders/[FOLDER_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]"
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ child_type: "logging.googleapis.com/Link"
+ }
+ ];
+
+ // Required. The new link.
+ Link link = 2 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The ID to use for the link. The link_id can have up to 100
+ // characters. A valid link_id must only have alphanumeric characters and
+ // underscores within it.
+ string link_id = 3 [(google.api.field_behavior) = REQUIRED];
+}
+
+// The parameters to DeleteLink.
+message DeleteLinkRequest {
+ // Required. The full resource name of the link to delete.
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/[LINK_ID]"
+ // "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/[LINK_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/[LINK_ID]"
+ // "folders/[FOLDER_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/[LINK_ID]"
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "logging.googleapis.com/Link" }
+ ];
+}
+
+// The parameters to ListLinks.
+message ListLinksRequest {
+ // Required. The parent resource whose links are to be listed:
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/"
+ // "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/"
+ // "folders/[FOLDER_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ child_type: "logging.googleapis.com/Link"
+ }
+ ];
+
+ // Optional. If present, then retrieve the next batch of results from the
+ // preceding call to this method. `pageToken` must be the value of
+ // `nextPageToken` from the previous response.
+ string page_token = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The maximum number of results to return from this request.
+ int32 page_size = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// The response from ListLinks.
+message ListLinksResponse {
+ // A list of links.
+ repeated Link links = 1;
+
+ // If there might be more results than those appearing in this response, then
+ // `nextPageToken` is included. To get the next set of results, call the same
+ // method again using the value of `nextPageToken` as `pageToken`.
+ string next_page_token = 2;
+}
+
+// The parameters to GetLink.
+message GetLinkRequest {
+ // Required. The resource name of the link:
+ //
+ // "projects/[PROJECT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/[LINK_ID]"
+ // "organizations/[ORGANIZATION_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/[LINK_ID]"
+ // "billingAccounts/[BILLING_ACCOUNT_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/[LINK_ID]"
+ // "folders/[FOLDER_ID]/locations/[LOCATION_ID]/buckets/[BUCKET_ID]/links/[LINK_ID]
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "logging.googleapis.com/Link" }
+ ];
+}
+
+// Specifies a set of log entries that are filtered out by a sink. If
+// your Google Cloud resource receives a large volume of log entries, you can
+// use exclusions to reduce your chargeable logs. Note that exclusions on
+// organization-level and folder-level sinks don't apply to child resources.
+// Note also that you cannot modify the _Required sink or exclude logs from it.
+message LogExclusion {
+ option (google.api.resource) = {
+ type: "logging.googleapis.com/LogExclusion"
+ pattern: "projects/{project}/exclusions/{exclusion}"
+ pattern: "organizations/{organization}/exclusions/{exclusion}"
+ pattern: "folders/{folder}/exclusions/{exclusion}"
+ pattern: "billingAccounts/{billing_account}/exclusions/{exclusion}"
+ };
+
+ // Required. A client-assigned identifier, such as
+ // `"load-balancer-exclusion"`. Identifiers are limited to 100 characters and
+ // can include only letters, digits, underscores, hyphens, and periods. First
+ // character has to be alphanumeric.
+ string name = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Optional. A description of this exclusion.
+ string description = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Required. An [advanced logs
+ // filter](https://cloud.google.com/logging/docs/view/advanced-queries) that
+ // matches the log entries to be excluded. By using the [sample
+ // function](https://cloud.google.com/logging/docs/view/advanced-queries#sample),
+ // you can exclude less than 100% of the matching log entries.
+ //
+ // For example, the following query matches 99% of low-severity log entries
+ // from Google Cloud Storage buckets:
+ //
+ // `resource.type=gcs_bucket severity=ERROR"
+ //
+ // The maximum length of the filter is 20000 characters.
+ string filter = 3 [(google.api.field_behavior) = REQUIRED];
+
+ // Optional. The resource name of the Log Bucket that owns the Log Metric.
+ // Only Log Buckets in projects are supported. The bucket has to be in the
+ // same project as the metric.
+ //
+ // For example:
+ //
+ // `projects/my-project/locations/global/buckets/my-bucket`
+ //
+ // If empty, then the Log Metric is considered a non-Bucket Log Metric.
+ string bucket_name = 13 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If set to True, then this metric is disabled and it does not
+ // generate any points.
+ bool disabled = 12 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The metric descriptor associated with the logs-based metric.
+ // If unspecified, it uses a default metric descriptor with a DELTA metric
+ // kind, INT64 value type, with no labels and a unit of "1". Such a metric
+ // counts the number of log entries matching the `filter` expression.
+ //
+ // The `name`, `type`, and `description` fields in the `metric_descriptor`
+ // are output only, and is constructed using the `name` and `description`
+ // field in the LogMetric.
+ //
+ // To create a logs-based metric that records a distribution of log values, a
+ // DELTA metric kind with a DISTRIBUTION value type must be used along with
+ // a `value_extractor` expression in the LogMetric.
+ //
+ // Each label in the metric descriptor must have a matching label
+ // name as the key and an extractor expression as the value in the
+ // `label_extractors` map.
+ //
+ // The `metric_kind` and `value_type` fields in the `metric_descriptor` cannot
+ // be updated once initially configured. New labels can be added in the
+ // `metric_descriptor`, but existing labels cannot be modified except for
+ // their description.
+ google.api.MetricDescriptor metric_descriptor = 5
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. A `value_extractor` is required when using a distribution
+ // logs-based metric to extract the values to record from a log entry.
+ // Two functions are supported for value extraction: `EXTRACT(field)` or
+ // `REGEXP_EXTRACT(field, regex)`. The arguments are:
+ //
+ // 1. field: The name of the log entry field from which the value is to be
+ // extracted.
+ // 2. regex: A regular expression using the Google RE2 syntax
+ // (https://github.com/google/re2/wiki/Syntax) with a single capture
+ // group to extract data from the specified log entry field. The value
+ // of the field is converted to a string before applying the regex.
+ // It is an error to specify a regex that does not include exactly one
+ // capture group.
+ //
+ // The result of the extraction must be convertible to a double type, as the
+ // distribution always records double values. If either the extraction or
+ // the conversion to double fails, then those values are not recorded in the
+ // distribution.
+ //
+ // Example: `REGEXP_EXTRACT(jsonPayload.request, ".*quantity=(\d+).*")`
+ string value_extractor = 6 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. A map from a label key string to an extractor expression which is
+ // used to extract data from a log entry field and assign as the label value.
+ // Each label key specified in the LabelDescriptor must have an associated
+ // extractor expression in this map. The syntax of the extractor expression
+ // is the same as for the `value_extractor` field.
+ //
+ // The extracted value is converted to the type defined in the label
+ // descriptor. If either the extraction or the type conversion fails,
+ // the label will have a default value. The default value for a string
+ // label is an empty string, for an integer label its 0, and for a boolean
+ // label its `false`.
+ //
+ // Note that there are upper bounds on the maximum number of labels and the
+ // number of active time series that are allowed in a project.
+ map label_extractors = 7
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The `bucket_options` are required when the logs-based metric is
+ // using a DISTRIBUTION value type and it describes the bucket boundaries
+ // used to create a histogram of the extracted values.
+ google.api.Distribution.BucketOptions bucket_options = 8
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Output only. The creation timestamp of the metric.
+ //
+ // This field may not be present for older metrics.
+ google.protobuf.Timestamp create_time = 9
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Output only. The last update timestamp of the metric.
+ //
+ // This field may not be present for older metrics.
+ google.protobuf.Timestamp update_time = 10
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Deprecated. The API version that created or updated this metric.
+ // The v2 format is used by default and cannot be changed.
+ ApiVersion version = 4 [deprecated = true];
+}
+
+// The parameters to ListLogMetrics.
+message ListLogMetricsRequest {
+ // Required. The name of the project containing the metrics:
+ //
+ // "projects/[PROJECT_ID]"
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "cloudresourcemanager.googleapis.com/Project"
+ }
+ ];
+
+ // Optional. If present, then retrieve the next batch of results from the
+ // preceding call to this method. `pageToken` must be the value of
+ // `nextPageToken` from the previous response. The values of other method
+ // parameters should be identical to those in the previous call.
+ string page_token = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The maximum number of results to return from this request.
+ // Non-positive values are ignored. The presence of `nextPageToken` in the
+ // response indicates that more results might be available.
+ int32 page_size = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Result returned from ListLogMetrics.
+message ListLogMetricsResponse {
+ // A list of logs-based metrics.
+ repeated LogMetric metrics = 1;
+
+ // If there might be more results than appear in this response, then
+ // `nextPageToken` is included. To get the next set of results, call this
+ // method again using the value of `nextPageToken` as `pageToken`.
+ string next_page_token = 2;
+}
+
+// The parameters to GetLogMetric.
+message GetLogMetricRequest {
+ // Required. The resource name of the desired metric:
+ //
+ // "projects/[PROJECT_ID]/metrics/[METRIC_ID]"
+ string metric_name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "logging.googleapis.com/LogMetric"
+ }
+ ];
+}
+
+// The parameters to CreateLogMetric.
+message CreateLogMetricRequest {
+ // Required. The resource name of the project in which to create the metric:
+ //
+ // "projects/[PROJECT_ID]"
+ //
+ // The new metric must be provided in the request.
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ child_type: "logging.googleapis.com/LogMetric"
+ }
+ ];
+
+ // Required. The new logs-based metric, which must not have an identifier that
+ // already exists.
+ LogMetric metric = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+// The parameters to UpdateLogMetric.
+message UpdateLogMetricRequest {
+ // Required. The resource name of the metric to update:
+ //
+ // "projects/[PROJECT_ID]/metrics/[METRIC_ID]"
+ //
+ // The updated metric must be provided in the request and it's
+ // `name` field must be the same as `[METRIC_ID]` If the metric
+ // does not exist in `[PROJECT_ID]`, then a new metric is created.
+ string metric_name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "logging.googleapis.com/LogMetric"
+ }
+ ];
+
+ // Required. The updated metric.
+ LogMetric metric = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+// The parameters to DeleteLogMetric.
+message DeleteLogMetricRequest {
+ // Required. The resource name of the metric to delete:
+ //
+ // "projects/[PROJECT_ID]/metrics/[METRIC_ID]"
+ string metric_name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "logging.googleapis.com/LogMetric"
+ }
+ ];
+}
diff --git a/sdk-platform-java/gapic-generator-java/src/test/proto/google/pubsub/v1/pubsub.proto b/sdk-platform-java/gapic-generator-java/src/test/proto/google/pubsub/v1/pubsub.proto
new file mode 100644
index 000000000000..b542351d9d67
--- /dev/null
+++ b/sdk-platform-java/gapic-generator-java/src/test/proto/google/pubsub/v1/pubsub.proto
@@ -0,0 +1,2445 @@
+// Copyright 2025 Google LLC
+//
+// 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 google.pubsub.v1;
+
+import "google/api/annotations.proto";
+import "google/api/client.proto";
+import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
+import "google/protobuf/duration.proto";
+import "google/protobuf/empty.proto";
+import "google/protobuf/field_mask.proto";
+import "google/protobuf/timestamp.proto";
+import "google/pubsub/v1/schema.proto";
+
+option csharp_namespace = "Google.Cloud.PubSub.V1";
+option go_package = "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb;pubsubpb";
+option java_multiple_files = true;
+option java_outer_classname = "PubsubProto";
+option java_package = "com.google.pubsub.v1";
+option php_namespace = "Google\\Cloud\\PubSub\\V1";
+option ruby_package = "Google::Cloud::PubSub::V1";
+option (google.api.resource_definition) = {
+ type: "cloudkms.googleapis.com/CryptoKey"
+ pattern: "projects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}"
+};
+option (google.api.resource_definition) = {
+ type: "analyticshub.googleapis.com/Listing"
+ pattern: "projects/{project}/locations/{location}/dataExchanges/{data_exchange}/listings/{listing}"
+};
+
+// The service that an application uses to manipulate topics, and to send
+// messages to a topic.
+service Publisher {
+ option (google.api.default_host) = "pubsub.googleapis.com";
+ option (google.api.oauth_scopes) =
+ "https://www.googleapis.com/auth/cloud-platform,"
+ "https://www.googleapis.com/auth/pubsub";
+
+ // Creates the given topic with the given name. See the [resource name rules]
+ // (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names).
+ rpc CreateTopic(Topic) returns (Topic) {
+ option (google.api.http) = {
+ put: "/v1/{name=projects/*/topics/*}"
+ body: "*"
+ };
+ option (google.api.method_signature) = "name";
+ }
+
+ // Updates an existing topic by updating the fields specified in the update
+ // mask. Note that certain properties of a topic are not modifiable.
+ rpc UpdateTopic(UpdateTopicRequest) returns (Topic) {
+ option (google.api.http) = {
+ patch: "/v1/{topic.name=projects/*/topics/*}"
+ body: "*"
+ };
+ option (google.api.method_signature) = "topic,update_mask";
+ }
+
+ // Adds one or more messages to the topic. Returns `NOT_FOUND` if the topic
+ // does not exist.
+ rpc Publish(PublishRequest) returns (PublishResponse) {
+ option (google.api.http) = {
+ post: "/v1/{topic=projects/*/topics/*}:publish"
+ body: "*"
+ };
+ option (google.api.method_signature) = "topic,messages";
+ }
+
+ // Gets the configuration of a topic.
+ rpc GetTopic(GetTopicRequest) returns (Topic) {
+ option (google.api.http) = {
+ get: "/v1/{topic=projects/*/topics/*}"
+ };
+ option (google.api.method_signature) = "topic";
+ }
+
+ // Lists matching topics.
+ rpc ListTopics(ListTopicsRequest) returns (ListTopicsResponse) {
+ option (google.api.http) = {
+ get: "/v1/{project=projects/*}/topics"
+ };
+ option (google.api.method_signature) = "project";
+ }
+
+ // Lists the names of the attached subscriptions on this topic.
+ rpc ListTopicSubscriptions(ListTopicSubscriptionsRequest)
+ returns (ListTopicSubscriptionsResponse) {
+ option (google.api.http) = {
+ get: "/v1/{topic=projects/*/topics/*}/subscriptions"
+ };
+ option (google.api.method_signature) = "topic";
+ }
+
+ // Lists the names of the snapshots on this topic. Snapshots are used in
+ // [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations,
+ // which allow you to manage message acknowledgments in bulk. That is, you can
+ // set the acknowledgment state of messages in an existing subscription to the
+ // state captured by a snapshot.
+ rpc ListTopicSnapshots(ListTopicSnapshotsRequest)
+ returns (ListTopicSnapshotsResponse) {
+ option (google.api.http) = {
+ get: "/v1/{topic=projects/*/topics/*}/snapshots"
+ };
+ option (google.api.method_signature) = "topic";
+ }
+
+ // Deletes the topic with the given name. Returns `NOT_FOUND` if the topic
+ // does not exist. After a topic is deleted, a new topic may be created with
+ // the same name; this is an entirely new topic with none of the old
+ // configuration or subscriptions. Existing subscriptions to this topic are
+ // not deleted, but their `topic` field is set to `_deleted-topic_`.
+ rpc DeleteTopic(DeleteTopicRequest) returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ delete: "/v1/{topic=projects/*/topics/*}"
+ };
+ option (google.api.method_signature) = "topic";
+ }
+
+ // Detaches a subscription from this topic. All messages retained in the
+ // subscription are dropped. Subsequent `Pull` and `StreamingPull` requests
+ // will return FAILED_PRECONDITION. If the subscription is a push
+ // subscription, pushes to the endpoint will stop.
+ rpc DetachSubscription(DetachSubscriptionRequest)
+ returns (DetachSubscriptionResponse) {
+ option (google.api.http) = {
+ post: "/v1/{subscription=projects/*/subscriptions/*}:detach"
+ };
+ }
+}
+
+// A policy constraining the storage of messages published to the topic.
+message MessageStoragePolicy {
+ // Optional. A list of IDs of Google Cloud regions where messages that are
+ // published to the topic may be persisted in storage. Messages published by
+ // publishers running in non-allowed Google Cloud regions (or running outside
+ // of Google Cloud altogether) are routed for storage in one of the allowed
+ // regions. An empty list means that no regions are allowed, and is not a
+ // valid configuration.
+ repeated string allowed_persistence_regions = 1
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If true, `allowed_persistence_regions` is also used to enforce
+ // in-transit guarantees for messages. That is, Pub/Sub will fail
+ // Publish operations on this topic and subscribe operations
+ // on any subscription attached to this topic in any region that is
+ // not in `allowed_persistence_regions`.
+ bool enforce_in_transit = 2 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Settings for validating messages published against a schema.
+message SchemaSettings {
+ // Required. The name of the schema that messages published should be
+ // validated against. Format is `projects/{project}/schemas/{schema}`. The
+ // value of this field will be `_deleted-schema_` if the schema has been
+ // deleted.
+ string schema = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" }
+ ];
+
+ // Optional. The encoding of messages validated against `schema`.
+ Encoding encoding = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The minimum (inclusive) revision allowed for validating messages.
+ // If empty or not present, allow any revision to be validated against
+ // last_revision or any revision created before.
+ string first_revision_id = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The maximum (inclusive) revision allowed for validating messages.
+ // If empty or not present, allow any revision to be validated against
+ // first_revision or any revision created after.
+ string last_revision_id = 4 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Settings for an ingestion data source on a topic.
+message IngestionDataSourceSettings {
+ // Ingestion settings for Amazon Kinesis Data Streams.
+ message AwsKinesis {
+ // Possible states for ingestion from Amazon Kinesis Data Streams.
+ enum State {
+ // Default value. This value is unused.
+ STATE_UNSPECIFIED = 0;
+
+ // Ingestion is active.
+ ACTIVE = 1;
+
+ // Permission denied encountered while consuming data from Kinesis.
+ // This can happen if:
+ // - The provided `aws_role_arn` does not exist or does not have the
+ // appropriate permissions attached.
+ // - The provided `aws_role_arn` is not set up properly for Identity
+ // Federation using `gcp_service_account`.
+ // - The Pub/Sub SA is not granted the
+ // `iam.serviceAccounts.getOpenIdToken` permission on
+ // `gcp_service_account`.
+ KINESIS_PERMISSION_DENIED = 2;
+
+ // Permission denied encountered while publishing to the topic. This can
+ // happen if the Pub/Sub SA has not been granted the [appropriate publish
+ // permissions](https://cloud.google.com/pubsub/docs/access-control#pubsub.publisher)
+ PUBLISH_PERMISSION_DENIED = 3;
+
+ // The Kinesis stream does not exist.
+ STREAM_NOT_FOUND = 4;
+
+ // The Kinesis consumer does not exist.
+ CONSUMER_NOT_FOUND = 5;
+ }
+
+ // Output only. An output-only field that indicates the state of the Kinesis
+ // ingestion source.
+ State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Required. The Kinesis stream ARN to ingest data from.
+ string stream_arn = 2 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The Kinesis consumer ARN to used for ingestion in Enhanced
+ // Fan-Out mode. The consumer must be already created and ready to be used.
+ string consumer_arn = 3 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. AWS role ARN to be used for Federated Identity authentication
+ // with Kinesis. Check the Pub/Sub docs for how to set up this role and the
+ // required permissions that need to be attached to it.
+ string aws_role_arn = 4 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The GCP service account to be used for Federated Identity
+ // authentication with Kinesis (via a `AssumeRoleWithWebIdentity` call for
+ // the provided role). The `aws_role_arn` must be set up with
+ // `accounts.google.com:sub` equals to this service account number.
+ string gcp_service_account = 5 [(google.api.field_behavior) = REQUIRED];
+ }
+
+ // Ingestion settings for Cloud Storage.
+ message CloudStorage {
+ // Possible states for ingestion from Cloud Storage.
+ enum State {
+ // Default value. This value is unused.
+ STATE_UNSPECIFIED = 0;
+
+ // Ingestion is active.
+ ACTIVE = 1;
+
+ // Permission denied encountered while calling the Cloud Storage API. This
+ // can happen if the Pub/Sub SA has not been granted the
+ // [appropriate
+ // permissions](https://cloud.google.com/storage/docs/access-control/iam-permissions):
+ // - storage.objects.list: to list the objects in a bucket.
+ // - storage.objects.get: to read the objects in a bucket.
+ // - storage.buckets.get: to verify the bucket exists.
+ CLOUD_STORAGE_PERMISSION_DENIED = 2;
+
+ // Permission denied encountered while publishing to the topic. This can
+ // happen if the Pub/Sub SA has not been granted the [appropriate publish
+ // permissions](https://cloud.google.com/pubsub/docs/access-control#pubsub.publisher)
+ PUBLISH_PERMISSION_DENIED = 3;
+
+ // The provided Cloud Storage bucket doesn't exist.
+ BUCKET_NOT_FOUND = 4;
+
+ // The Cloud Storage bucket has too many objects, ingestion will be
+ // paused.
+ TOO_MANY_OBJECTS = 5;
+ }
+
+ // Configuration for reading Cloud Storage data in text format. Each line of
+ // text as specified by the delimiter will be set to the `data` field of a
+ // Pub/Sub message.
+ message TextFormat {
+ // Optional. When unset, '\n' is used.
+ optional string delimiter = 1 [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Configuration for reading Cloud Storage data in Avro binary format. The
+ // bytes of each object will be set to the `data` field of a Pub/Sub
+ // message.
+ message AvroFormat {}
+
+ // Configuration for reading Cloud Storage data written via [Cloud Storage
+ // subscriptions](https://cloud.google.com/pubsub/docs/cloudstorage). The
+ // data and attributes fields of the originally exported Pub/Sub message
+ // will be restored when publishing.
+ message PubSubAvroFormat {}
+
+ // Output only. An output-only field that indicates the state of the Cloud
+ // Storage ingestion source.
+ State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Optional. Cloud Storage bucket. The bucket name must be without any
+ // prefix like "gs://". See the [bucket naming requirements]
+ // (https://cloud.google.com/storage/docs/buckets#naming).
+ string bucket = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Defaults to text format.
+ oneof input_format {
+ // Optional. Data from Cloud Storage will be interpreted as text.
+ TextFormat text_format = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Data from Cloud Storage will be interpreted in Avro format.
+ AvroFormat avro_format = 4 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. It will be assumed data from Cloud Storage was written via
+ // [Cloud Storage
+ // subscriptions](https://cloud.google.com/pubsub/docs/cloudstorage).
+ PubSubAvroFormat pubsub_avro_format = 5
+ [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Optional. Only objects with a larger or equal creation timestamp will be
+ // ingested.
+ google.protobuf.Timestamp minimum_object_create_time = 6
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Glob pattern used to match objects that will be ingested. If
+ // unset, all objects will be ingested. See the [supported
+ // patterns](https://cloud.google.com/storage/docs/json_api/v1/objects/list#list-objects-and-prefixes-using-glob).
+ string match_glob = 9 [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Ingestion settings for Azure Event Hubs.
+ message AzureEventHubs {
+ // Possible states for managed ingestion from Event Hubs.
+ enum State {
+ // Default value. This value is unused.
+ STATE_UNSPECIFIED = 0;
+
+ // Ingestion is active.
+ ACTIVE = 1;
+
+ // Permission denied encountered while consuming data from Event Hubs.
+ // This can happen when `client_id`, or `tenant_id` are invalid. Or the
+ // right permissions haven't been granted.
+ EVENT_HUBS_PERMISSION_DENIED = 2;
+
+ // Permission denied encountered while publishing to the topic.
+ PUBLISH_PERMISSION_DENIED = 3;
+
+ // The provided Event Hubs namespace couldn't be found.
+ NAMESPACE_NOT_FOUND = 4;
+
+ // The provided Event Hub couldn't be found.
+ EVENT_HUB_NOT_FOUND = 5;
+
+ // The provided Event Hubs subscription couldn't be found.
+ SUBSCRIPTION_NOT_FOUND = 6;
+
+ // The provided Event Hubs resource group couldn't be found.
+ RESOURCE_GROUP_NOT_FOUND = 7;
+ }
+
+ // Output only. An output-only field that indicates the state of the Event
+ // Hubs ingestion source.
+ State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Optional. Name of the resource group within the azure subscription.
+ string resource_group = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The name of the Event Hubs namespace.
+ string namespace = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The name of the Event Hub.
+ string event_hub = 4 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The client id of the Azure application that is being used to
+ // authenticate Pub/Sub.
+ string client_id = 5 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The tenant id of the Azure application that is being used to
+ // authenticate Pub/Sub.
+ string tenant_id = 6 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The Azure subscription id.
+ string subscription_id = 7 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The GCP service account to be used for Federated Identity
+ // authentication.
+ string gcp_service_account = 8 [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Ingestion settings for Amazon MSK.
+ message AwsMsk {
+ // Possible states for managed ingestion from Amazon MSK.
+ enum State {
+ // Default value. This value is unused.
+ STATE_UNSPECIFIED = 0;
+
+ // Ingestion is active.
+ ACTIVE = 1;
+
+ // Permission denied encountered while consuming data from Amazon MSK.
+ MSK_PERMISSION_DENIED = 2;
+
+ // Permission denied encountered while publishing to the topic.
+ PUBLISH_PERMISSION_DENIED = 3;
+
+ // The provided MSK cluster wasn't found.
+ CLUSTER_NOT_FOUND = 4;
+
+ // The provided topic wasn't found.
+ TOPIC_NOT_FOUND = 5;
+ }
+
+ // Output only. An output-only field that indicates the state of the Amazon
+ // MSK ingestion source.
+ State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Required. The Amazon Resource Name (ARN) that uniquely identifies the
+ // cluster.
+ string cluster_arn = 2 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The name of the topic in the Amazon MSK cluster that Pub/Sub
+ // will import from.
+ string topic = 3 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" }
+ ];
+
+ // Required. AWS role ARN to be used for Federated Identity authentication
+ // with Amazon MSK. Check the Pub/Sub docs for how to set up this role and
+ // the required permissions that need to be attached to it.
+ string aws_role_arn = 4 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The GCP service account to be used for Federated Identity
+ // authentication with Amazon MSK (via a `AssumeRoleWithWebIdentity` call
+ // for the provided role). The `aws_role_arn` must be set up with
+ // `accounts.google.com:sub` equals to this service account number.
+ string gcp_service_account = 5 [(google.api.field_behavior) = REQUIRED];
+ }
+
+ // Ingestion settings for Confluent Cloud.
+ message ConfluentCloud {
+ // Possible states for managed ingestion from Confluent Cloud.
+ enum State {
+ // Default value. This value is unused.
+ STATE_UNSPECIFIED = 0;
+
+ // Ingestion is active.
+ ACTIVE = 1;
+
+ // Permission denied encountered while consuming data from Confluent
+ // Cloud.
+ CONFLUENT_CLOUD_PERMISSION_DENIED = 2;
+
+ // Permission denied encountered while publishing to the topic.
+ PUBLISH_PERMISSION_DENIED = 3;
+
+ // The provided bootstrap server address is unreachable.
+ UNREACHABLE_BOOTSTRAP_SERVER = 4;
+
+ // The provided cluster wasn't found.
+ CLUSTER_NOT_FOUND = 5;
+
+ // The provided topic wasn't found.
+ TOPIC_NOT_FOUND = 6;
+ }
+
+ // Output only. An output-only field that indicates the state of the
+ // Confluent Cloud ingestion source.
+ State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Required. The address of the bootstrap server. The format is url:port.
+ string bootstrap_server = 2 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The id of the cluster.
+ string cluster_id = 3 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The name of the topic in the Confluent Cloud cluster that
+ // Pub/Sub will import from.
+ string topic = 4 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The id of the identity pool to be used for Federated Identity
+ // authentication with Confluent Cloud. See
+ // https://docs.confluent.io/cloud/current/security/authenticate/workload-identities/identity-providers/oauth/identity-pools.html#add-oauth-identity-pools.
+ string identity_pool_id = 5 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The GCP service account to be used for Federated Identity
+ // authentication with `identity_pool_id`.
+ string gcp_service_account = 6 [(google.api.field_behavior) = REQUIRED];
+ }
+
+ // Only one source type can have settings set.
+ oneof source {
+ // Optional. Amazon Kinesis Data Streams.
+ AwsKinesis aws_kinesis = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Cloud Storage.
+ CloudStorage cloud_storage = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Azure Event Hubs.
+ AzureEventHubs azure_event_hubs = 3
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Amazon MSK.
+ AwsMsk aws_msk = 5 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Confluent Cloud.
+ ConfluentCloud confluent_cloud = 6 [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Optional. Platform Logs settings. If unset, no Platform Logs will be
+ // generated.
+ PlatformLogsSettings platform_logs_settings = 4
+ [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Settings for Platform Logs produced by Pub/Sub.
+message PlatformLogsSettings {
+ // Severity levels of Platform Logs.
+ enum Severity {
+ // Default value. Logs level is unspecified. Logs will be disabled.
+ SEVERITY_UNSPECIFIED = 0;
+
+ // Logs will be disabled.
+ DISABLED = 1;
+
+ // Debug logs and higher-severity logs will be written.
+ DEBUG = 2;
+
+ // Info logs and higher-severity logs will be written.
+ INFO = 3;
+
+ // Warning logs and higher-severity logs will be written.
+ WARNING = 4;
+
+ // Only error logs will be written.
+ ERROR = 5;
+ }
+
+ // Optional. The minimum severity level of Platform Logs that will be written.
+ Severity severity = 1 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Payload of the Platform Log entry sent when a failure is encountered while
+// ingesting.
+message IngestionFailureEvent {
+ // Specifies the reason why some data may have been left out of
+ // the desired Pub/Sub message due to the API message limits
+ // (https://cloud.google.com/pubsub/quotas#resource_limits). For example,
+ // when the number of attributes is larger than 100, the number of
+ // attributes is truncated to 100 to respect the limit on the attribute count.
+ // Other attribute limits are treated similarly. When the size of the desired
+ // message would've been larger than 10MB, the message won't be published at
+ // all, and ingestion of the subsequent messages will proceed as normal.
+ message ApiViolationReason {}
+
+ // Set when an Avro file is unsupported or its format is not valid. When this
+ // occurs, one or more Avro objects won't be ingested.
+ message AvroFailureReason {}
+
+ // Set when a Pub/Sub message fails to get published due to a schema
+ // validation violation.
+ message SchemaViolationReason {}
+
+ // Set when a Pub/Sub message fails to get published due to a message
+ // transformation error.
+ message MessageTransformationFailureReason {}
+
+ // Failure when ingesting from a Cloud Storage source.
+ message CloudStorageFailure {
+ // Optional. Name of the Cloud Storage bucket used for ingestion.
+ string bucket = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Name of the Cloud Storage object which contained the section
+ // that couldn't be ingested.
+ string object_name = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Generation of the Cloud Storage object which contained the
+ // section that couldn't be ingested.
+ int64 object_generation = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Reason why ingestion failed for the specified object.
+ oneof reason {
+ // Optional. Failure encountered when parsing an Avro file.
+ AvroFailureReason avro_failure_reason = 5
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The Pub/Sub API limits prevented the desired message from
+ // being published.
+ ApiViolationReason api_violation_reason = 6
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The Pub/Sub message failed schema validation.
+ SchemaViolationReason schema_violation_reason = 7
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Failure encountered when applying a message transformation to
+ // the Pub/Sub message.
+ MessageTransformationFailureReason message_transformation_failure_reason =
+ 8 [(google.api.field_behavior) = OPTIONAL];
+ }
+ }
+
+ // Failure when ingesting from an Amazon MSK source.
+ message AwsMskFailureReason {
+ // Optional. The ARN of the cluster of the topic being ingested from.
+ string cluster_arn = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The name of the Kafka topic being ingested from.
+ string kafka_topic = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The partition ID of the message that failed to be ingested.
+ int64 partition_id = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The offset within the partition of the message that failed to
+ // be ingested.
+ int64 offset = 4 [(google.api.field_behavior) = OPTIONAL];
+
+ // Reason why ingestion failed for the specified message.
+ oneof reason {
+ // Optional. The Pub/Sub API limits prevented the desired message from
+ // being published.
+ ApiViolationReason api_violation_reason = 5
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The Pub/Sub message failed schema validation.
+ SchemaViolationReason schema_violation_reason = 6
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Failure encountered when applying a message transformation to
+ // the Pub/Sub message.
+ MessageTransformationFailureReason message_transformation_failure_reason =
+ 7 [(google.api.field_behavior) = OPTIONAL];
+ }
+ }
+
+ // Failure when ingesting from an Azure Event Hubs source.
+ message AzureEventHubsFailureReason {
+ // Optional. The namespace containing the event hub being ingested from.
+ string namespace = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The name of the event hub being ingested from.
+ string event_hub = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The partition ID of the message that failed to be ingested.
+ int64 partition_id = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The offset within the partition of the message that failed to
+ // be ingested.
+ int64 offset = 4 [(google.api.field_behavior) = OPTIONAL];
+
+ // Reason why ingestion failed for the specified message.
+ oneof reason {
+ // Optional. The Pub/Sub API limits prevented the desired message from
+ // being published.
+ ApiViolationReason api_violation_reason = 5
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The Pub/Sub message failed schema validation.
+ SchemaViolationReason schema_violation_reason = 6
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Failure encountered when applying a message transformation to
+ // the Pub/Sub message.
+ MessageTransformationFailureReason message_transformation_failure_reason =
+ 7 [(google.api.field_behavior) = OPTIONAL];
+ }
+ }
+
+ // Failure when ingesting from a Confluent Cloud source.
+ message ConfluentCloudFailureReason {
+ // Optional. The cluster ID containing the topic being ingested from.
+ string cluster_id = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The name of the Kafka topic being ingested from.
+ string kafka_topic = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The partition ID of the message that failed to be ingested.
+ int64 partition_id = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The offset within the partition of the message that failed to
+ // be ingested.
+ int64 offset = 4 [(google.api.field_behavior) = OPTIONAL];
+
+ // Reason why ingestion failed for the specified message.
+ oneof reason {
+ // Optional. The Pub/Sub API limits prevented the desired message from
+ // being published.
+ ApiViolationReason api_violation_reason = 5
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The Pub/Sub message failed schema validation.
+ SchemaViolationReason schema_violation_reason = 6
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Failure encountered when applying a message transformation to
+ // the Pub/Sub message.
+ MessageTransformationFailureReason message_transformation_failure_reason =
+ 7 [(google.api.field_behavior) = OPTIONAL];
+ }
+ }
+
+ // Failure when ingesting from an AWS Kinesis source.
+ message AwsKinesisFailureReason {
+ // Optional. The stream ARN of the Kinesis stream being ingested from.
+ string stream_arn = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The partition key of the message that failed to be ingested.
+ string partition_key = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The sequence number of the message that failed to be ingested.
+ string sequence_number = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Reason why ingestion failed for the specified message.
+ oneof reason {
+ // Optional. The Pub/Sub message failed schema validation.
+ SchemaViolationReason schema_violation_reason = 4
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Failure encountered when applying a message transformation to
+ // the Pub/Sub message.
+ MessageTransformationFailureReason message_transformation_failure_reason =
+ 5 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The message failed to be published due to an API violation.
+ // This is only set when the size of the data field of the Kinesis record
+ // is zero.
+ ApiViolationReason api_violation_reason = 6
+ [(google.api.field_behavior) = OPTIONAL];
+ }
+ }
+
+ // Required. Name of the import topic. Format is:
+ // projects/{project_name}/topics/{topic_name}.
+ string topic = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" }
+ ];
+
+ // Required. Error details explaining why ingestion to Pub/Sub has failed.
+ string error_message = 2 [(google.api.field_behavior) = REQUIRED];
+
+ oneof failure {
+ // Optional. Failure when ingesting from Cloud Storage.
+ CloudStorageFailure cloud_storage_failure = 3
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Failure when ingesting from Amazon MSK.
+ AwsMskFailureReason aws_msk_failure = 4
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Failure when ingesting from Azure Event Hubs.
+ AzureEventHubsFailureReason azure_event_hubs_failure = 5
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Failure when ingesting from Confluent Cloud.
+ ConfluentCloudFailureReason confluent_cloud_failure = 6
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Failure when ingesting from AWS Kinesis.
+ AwsKinesisFailureReason aws_kinesis_failure = 7
+ [(google.api.field_behavior) = OPTIONAL];
+ }
+}
+
+// User-defined JavaScript function that can transform or filter a Pub/Sub
+// message.
+message JavaScriptUDF {
+ // Required. Name of the JavasScript function that should applied to Pub/Sub
+ // messages.
+ string function_name = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. JavaScript code that contains a function `function_name` with the
+ // below signature:
+ //
+ // ```
+ // /**
+ // * Transforms a Pub/Sub message.
+ //
+ // * @return {(Object)>|null)} - To
+ // * filter a message, return `null`. To transform a message return a map
+ // * with the following keys:
+ // * - (required) 'data' : {string}
+ // * - (optional) 'attributes' : {Object}
+ // * Returning empty `attributes` will remove all attributes from the
+ // * message.
+ // *
+ // * @param {(Object)>} Pub/Sub
+ // * message. Keys:
+ // * - (required) 'data' : {string}
+ // * - (required) 'attributes' : {Object}
+ // *
+ // * @param {Object} metadata - Pub/Sub message metadata.
+ // * Keys:
+ // * - (optional) 'message_id' : {string}
+ // * - (optional) 'publish_time': {string} YYYY-MM-DDTHH:MM:SSZ format
+ // * - (optional) 'ordering_key': {string}
+ // */
+ //
+ // function (message, metadata) {
+ // }
+ // ```
+ string code = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+// All supported message transforms types.
+message MessageTransform {
+ // The type of transform to apply to messages.
+ oneof transform {
+ // Optional. JavaScript User Defined Function. If multiple JavaScriptUDF's
+ // are specified on a resource, each must have a unique `function_name`.
+ JavaScriptUDF javascript_udf = 2 [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Optional. This field is deprecated, use the `disabled` field to disable
+ // transforms.
+ bool enabled = 3 [deprecated = true, (google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If true, the transform is disabled and will not be applied to
+ // messages. Defaults to `false`.
+ bool disabled = 4 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// A topic resource.
+message Topic {
+ option (google.api.resource) = {
+ type: "pubsub.googleapis.com/Topic"
+ pattern: "projects/{project}/topics/{topic}"
+ pattern: "_deleted-topic_"
+ plural: "topics"
+ singular: "topic"
+ };
+
+ // The state of the topic.
+ enum State {
+ // Default value. This value is unused.
+ STATE_UNSPECIFIED = 0;
+
+ // The topic does not have any persistent errors.
+ ACTIVE = 1;
+
+ // Ingestion from the data source has encountered a permanent error.
+ // See the more detailed error state in the corresponding ingestion
+ // source configuration.
+ INGESTION_RESOURCE_ERROR = 2;
+ }
+
+ // Required. The name of the topic. It must have the format
+ // `"projects/{project}/topics/{topic}"`. `{topic}` must start with a letter,
+ // and contain only letters (`[A-Za-z]`), numbers (`[0-9]`), dashes (`-`),
+ // underscores (`_`), periods (`.`), tildes (`~`), plus (`+`) or percent
+ // signs (`%`). It must be between 3 and 255 characters in length, and it
+ // must not start with `"goog"`.
+ string name = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Optional. See [Creating and managing labels]
+ // (https://cloud.google.com/pubsub/docs/labels).
+ map labels = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Policy constraining the set of Google Cloud Platform regions
+ // where messages published to the topic may be stored. If not present, then
+ // no constraints are in effect.
+ MessageStoragePolicy message_storage_policy = 3
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The resource name of the Cloud KMS CryptoKey to be used to
+ // protect access to messages published on this topic.
+ //
+ // The expected format is `projects/*/locations/*/keyRings/*/cryptoKeys/*`.
+ string kms_key_name = 5 [
+ (google.api.field_behavior) = OPTIONAL,
+ (google.api.resource_reference) = {
+ type: "cloudkms.googleapis.com/CryptoKey"
+ }
+ ];
+
+ // Optional. Settings for validating messages published against a schema.
+ SchemaSettings schema_settings = 6 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Reserved for future use. This field is set only in responses from
+ // the server; it is ignored if it is set in any requests.
+ bool satisfies_pzs = 7 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Indicates the minimum duration to retain a message after it is
+ // published to the topic. If this field is set, messages published to the
+ // topic in the last `message_retention_duration` are always available to
+ // subscribers. For instance, it allows any attached subscription to [seek to
+ // a
+ // timestamp](https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time)
+ // that is up to `message_retention_duration` in the past. If this field is
+ // not set, message retention is controlled by settings on individual
+ // subscriptions. Cannot be more than 31 days or less than 10 minutes.
+ google.protobuf.Duration message_retention_duration = 8
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Output only. An output-only field indicating the state of the topic.
+ State state = 9 [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Optional. Settings for ingestion from a data source into this topic.
+ IngestionDataSourceSettings ingestion_data_source_settings = 10
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Transforms to be applied to messages published to the topic.
+ // Transforms are applied in the order specified.
+ repeated MessageTransform message_transforms = 13
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Input only. Immutable. Tag keys/values directly bound to this
+ // resource. For example:
+ // "123/environment": "production",
+ // "123/costCenter": "marketing"
+ map tags = 14 [
+ (google.api.field_behavior) = INPUT_ONLY,
+ (google.api.field_behavior) = IMMUTABLE,
+ (google.api.field_behavior) = OPTIONAL
+ ];
+}
+
+// A message that is published by publishers and consumed by subscribers. The
+// message must contain either a non-empty data field or at least one attribute.
+// Note that client libraries represent this object differently
+// depending on the language. See the corresponding [client library
+// documentation](https://cloud.google.com/pubsub/docs/reference/libraries) for
+// more information. See [quotas and limits]
+// (https://cloud.google.com/pubsub/quotas) for more information about message
+// limits.
+message PubsubMessage {
+ // Optional. The message data field. If this field is empty, the message must
+ // contain at least one attribute.
+ bytes data = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Attributes for this message. If this field is empty, the message
+ // must contain non-empty data. This can be used to filter messages on the
+ // subscription.
+ map attributes = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // ID of this message, assigned by the server when the message is published.
+ // Guaranteed to be unique within the topic. This value may be read by a
+ // subscriber that receives a `PubsubMessage` via a `Pull` call or a push
+ // delivery. It must not be populated by the publisher in a `Publish` call.
+ string message_id = 3;
+
+ // The time at which the message was published, populated by the server when
+ // it receives the `Publish` call. It must not be populated by the
+ // publisher in a `Publish` call.
+ google.protobuf.Timestamp publish_time = 4;
+
+ // Optional. If non-empty, identifies related messages for which publish order
+ // should be respected. If a `Subscription` has `enable_message_ordering` set
+ // to `true`, messages published with the same non-empty `ordering_key` value
+ // will be delivered to subscribers in the order in which they are received by
+ // the Pub/Sub system. All `PubsubMessage`s published in a given
+ // `PublishRequest` must specify the same `ordering_key` value. For more
+ // information, see [ordering
+ // messages](https://cloud.google.com/pubsub/docs/ordering).
+ string ordering_key = 5 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Request for the GetTopic method.
+message GetTopicRequest {
+ // Required. The name of the topic to get.
+ // Format is `projects/{project}/topics/{topic}`.
+ string topic = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" }
+ ];
+}
+
+// Request for the UpdateTopic method.
+message UpdateTopicRequest {
+ // Required. The updated topic object.
+ Topic topic = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. Indicates which fields in the provided topic to update. Must be
+ // specified and non-empty. Note that if `update_mask` contains
+ // "message_storage_policy" but the `message_storage_policy` is not set in
+ // the `topic` provided above, then the updated value is determined by the
+ // policy configured at the project or organization level.
+ google.protobuf.FieldMask update_mask = 2
+ [(google.api.field_behavior) = REQUIRED];
+}
+
+// Request for the Publish method.
+message PublishRequest {
+ // Required. The messages in the request will be published on this topic.
+ // Format is `projects/{project}/topics/{topic}`.
+ string topic = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" }
+ ];
+
+ // Required. The messages to publish.
+ repeated PubsubMessage messages = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Response for the `Publish` method.
+message PublishResponse {
+ // Optional. The server-assigned ID of each published message, in the same
+ // order as the messages in the request. IDs are guaranteed to be unique
+ // within the topic.
+ repeated string message_ids = 1 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Request for the `ListTopics` method.
+message ListTopicsRequest {
+ // Required. The name of the project in which to list topics.
+ // Format is `projects/{project-id}`.
+ string project = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "cloudresourcemanager.googleapis.com/Project"
+ }
+ ];
+
+ // Optional. Maximum number of topics to return.
+ int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The value returned by the last `ListTopicsResponse`; indicates
+ // that this is a continuation of a prior `ListTopics` call, and that the
+ // system should return the next page of data.
+ string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Response for the `ListTopics` method.
+message ListTopicsResponse {
+ // Optional. The resulting topics.
+ repeated Topic topics = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If not empty, indicates that there may be more topics that match
+ // the request; this value should be passed in a new `ListTopicsRequest`.
+ string next_page_token = 2 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Request for the `ListTopicSubscriptions` method.
+message ListTopicSubscriptionsRequest {
+ // Required. The name of the topic that subscriptions are attached to.
+ // Format is `projects/{project}/topics/{topic}`.
+ string topic = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" }
+ ];
+
+ // Optional. Maximum number of subscription names to return.
+ int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The value returned by the last `ListTopicSubscriptionsResponse`;
+ // indicates that this is a continuation of a prior `ListTopicSubscriptions`
+ // call, and that the system should return the next page of data.
+ string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Response for the `ListTopicSubscriptions` method.
+message ListTopicSubscriptionsResponse {
+ // Optional. The names of subscriptions attached to the topic specified in the
+ // request.
+ repeated string subscriptions = 1 [
+ (google.api.field_behavior) = OPTIONAL,
+ (google.api.resource_reference) = {
+ type: "pubsub.googleapis.com/Subscription"
+ }
+ ];
+
+ // Optional. If not empty, indicates that there may be more subscriptions that
+ // match the request; this value should be passed in a new
+ // `ListTopicSubscriptionsRequest` to get more subscriptions.
+ string next_page_token = 2 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Request for the `ListTopicSnapshots` method.
+message ListTopicSnapshotsRequest {
+ // Required. The name of the topic that snapshots are attached to.
+ // Format is `projects/{project}/topics/{topic}`.
+ string topic = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" }
+ ];
+
+ // Optional. Maximum number of snapshot names to return.
+ int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The value returned by the last `ListTopicSnapshotsResponse`;
+ // indicates that this is a continuation of a prior `ListTopicSnapshots` call,
+ // and that the system should return the next page of data.
+ string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Response for the `ListTopicSnapshots` method.
+message ListTopicSnapshotsResponse {
+ // Optional. The names of the snapshots that match the request.
+ repeated string snapshots = 1 [
+ (google.api.field_behavior) = OPTIONAL,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Snapshot" }
+ ];
+
+ // Optional. If not empty, indicates that there may be more snapshots that
+ // match the request; this value should be passed in a new
+ // `ListTopicSnapshotsRequest` to get more snapshots.
+ string next_page_token = 2 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Request for the `DeleteTopic` method.
+message DeleteTopicRequest {
+ // Required. Name of the topic to delete.
+ // Format is `projects/{project}/topics/{topic}`.
+ string topic = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" }
+ ];
+}
+
+// Request for the DetachSubscription method.
+message DetachSubscriptionRequest {
+ // Required. The subscription to detach.
+ // Format is `projects/{project}/subscriptions/{subscription}`.
+ string subscription = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "pubsub.googleapis.com/Subscription"
+ }
+ ];
+}
+
+// Response for the DetachSubscription method.
+// Reserved for future use.
+message DetachSubscriptionResponse {}
+
+// The service that an application uses to manipulate subscriptions and to
+// consume messages from a subscription via the `Pull` method or by
+// establishing a bi-directional stream using the `StreamingPull` method.
+service Subscriber {
+ option (google.api.default_host) = "pubsub.googleapis.com";
+ option (google.api.oauth_scopes) =
+ "https://www.googleapis.com/auth/cloud-platform,"
+ "https://www.googleapis.com/auth/pubsub";
+
+ // Creates a subscription to a given topic. See the [resource name rules]
+ // (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names).
+ // If the subscription already exists, returns `ALREADY_EXISTS`.
+ // If the corresponding topic doesn't exist, returns `NOT_FOUND`.
+ //
+ // If the name is not provided in the request, the server will assign a random
+ // name for this subscription on the same project as the topic, conforming
+ // to the [resource name format]
+ // (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). The
+ // generated name is populated in the returned Subscription object. Note that
+ // for REST API requests, you must specify a name in the request.
+ rpc CreateSubscription(Subscription) returns (Subscription) {
+ option (google.api.http) = {
+ put: "/v1/{name=projects/*/subscriptions/*}"
+ body: "*"
+ };
+ option (google.api.method_signature) =
+ "name,topic,push_config,ack_deadline_seconds";
+ }
+
+ // Gets the configuration details of a subscription.
+ rpc GetSubscription(GetSubscriptionRequest) returns (Subscription) {
+ option (google.api.http) = {
+ get: "/v1/{subscription=projects/*/subscriptions/*}"
+ };
+ option (google.api.method_signature) = "subscription";
+ }
+
+ // Updates an existing subscription by updating the fields specified in the
+ // update mask. Note that certain properties of a subscription, such as its
+ // topic, are not modifiable.
+ rpc UpdateSubscription(UpdateSubscriptionRequest) returns (Subscription) {
+ option (google.api.http) = {
+ patch: "/v1/{subscription.name=projects/*/subscriptions/*}"
+ body: "*"
+ };
+ option (google.api.method_signature) = "subscription,update_mask";
+ }
+
+ // Lists matching subscriptions.
+ rpc ListSubscriptions(ListSubscriptionsRequest)
+ returns (ListSubscriptionsResponse) {
+ option (google.api.http) = {
+ get: "/v1/{project=projects/*}/subscriptions"
+ };
+ option (google.api.method_signature) = "project";
+ }
+
+ // Deletes an existing subscription. All messages retained in the subscription
+ // are immediately dropped. Calls to `Pull` after deletion will return
+ // `NOT_FOUND`. After a subscription is deleted, a new one may be created with
+ // the same name, but the new one has no association with the old
+ // subscription or its topic unless the same topic is specified.
+ rpc DeleteSubscription(DeleteSubscriptionRequest)
+ returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ delete: "/v1/{subscription=projects/*/subscriptions/*}"
+ };
+ option (google.api.method_signature) = "subscription";
+ }
+
+ // Modifies the ack deadline for a specific message. This method is useful
+ // to indicate that more time is needed to process a message by the
+ // subscriber, or to make the message available for redelivery if the
+ // processing was interrupted. Note that this does not modify the
+ // subscription-level `ackDeadlineSeconds` used for subsequent messages.
+ rpc ModifyAckDeadline(ModifyAckDeadlineRequest)
+ returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ post: "/v1/{subscription=projects/*/subscriptions/*}:modifyAckDeadline"
+ body: "*"
+ };
+ option (google.api.method_signature) =
+ "subscription,ack_ids,ack_deadline_seconds";
+ }
+
+ // Acknowledges the messages associated with the `ack_ids` in the
+ // `AcknowledgeRequest`. The Pub/Sub system can remove the relevant messages
+ // from the subscription.
+ //
+ // Acknowledging a message whose ack deadline has expired may succeed,
+ // but such a message may be redelivered later. Acknowledging a message more
+ // than once will not result in an error.
+ rpc Acknowledge(AcknowledgeRequest) returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ post: "/v1/{subscription=projects/*/subscriptions/*}:acknowledge"
+ body: "*"
+ };
+ option (google.api.method_signature) = "subscription,ack_ids";
+ }
+
+ // Pulls messages from the server.
+ rpc Pull(PullRequest) returns (PullResponse) {
+ option (google.api.http) = {
+ post: "/v1/{subscription=projects/*/subscriptions/*}:pull"
+ body: "*"
+ };
+ option (google.api.method_signature) =
+ "subscription,return_immediately,max_messages";
+ option (google.api.method_signature) = "subscription,max_messages";
+ }
+
+ // Establishes a stream with the server, which sends messages down to the
+ // client. The client streams acknowledgments and ack deadline modifications
+ // back to the server. The server will close the stream and return the status
+ // on any error. The server may close the stream with status `UNAVAILABLE` to
+ // reassign server-side resources, in which case, the client should
+ // re-establish the stream. Flow control can be achieved by configuring the
+ // underlying RPC channel.
+ rpc StreamingPull(stream StreamingPullRequest)
+ returns (stream StreamingPullResponse) {}
+
+ // Modifies the `PushConfig` for a specified subscription.
+ //
+ // This may be used to change a push subscription to a pull one (signified by
+ // an empty `PushConfig`) or vice versa, or change the endpoint URL and other
+ // attributes of a push subscription. Messages will accumulate for delivery
+ // continuously through the call regardless of changes to the `PushConfig`.
+ rpc ModifyPushConfig(ModifyPushConfigRequest)
+ returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ post: "/v1/{subscription=projects/*/subscriptions/*}:modifyPushConfig"
+ body: "*"
+ };
+ option (google.api.method_signature) = "subscription,push_config";
+ }
+
+ // Gets the configuration details of a snapshot. Snapshots are used in
+ // [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations,
+ // which allow you to manage message acknowledgments in bulk. That is, you can
+ // set the acknowledgment state of messages in an existing subscription to the
+ // state captured by a snapshot.
+ rpc GetSnapshot(GetSnapshotRequest) returns (Snapshot) {
+ option (google.api.http) = {
+ get: "/v1/{snapshot=projects/*/snapshots/*}"
+ };
+ option (google.api.method_signature) = "snapshot";
+ }
+
+ // Lists the existing snapshots. Snapshots are used in [Seek](
+ // https://cloud.google.com/pubsub/docs/replay-overview) operations, which
+ // allow you to manage message acknowledgments in bulk. That is, you can set
+ // the acknowledgment state of messages in an existing subscription to the
+ // state captured by a snapshot.
+ rpc ListSnapshots(ListSnapshotsRequest) returns (ListSnapshotsResponse) {
+ option (google.api.http) = {
+ get: "/v1/{project=projects/*}/snapshots"
+ };
+ option (google.api.method_signature) = "project";
+ }
+
+ // Creates a snapshot from the requested subscription. Snapshots are used in
+ // [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations,
+ // which allow you to manage message acknowledgments in bulk. That is, you can
+ // set the acknowledgment state of messages in an existing subscription to the
+ // state captured by a snapshot.
+ // If the snapshot already exists, returns `ALREADY_EXISTS`.
+ // If the requested subscription doesn't exist, returns `NOT_FOUND`.
+ // If the backlog in the subscription is too old -- and the resulting snapshot
+ // would expire in less than 1 hour -- then `FAILED_PRECONDITION` is returned.
+ // See also the `Snapshot.expire_time` field. If the name is not provided in
+ // the request, the server will assign a random
+ // name for this snapshot on the same project as the subscription, conforming
+ // to the [resource name format]
+ // (https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names). The
+ // generated name is populated in the returned Snapshot object. Note that for
+ // REST API requests, you must specify a name in the request.
+ rpc CreateSnapshot(CreateSnapshotRequest) returns (Snapshot) {
+ option (google.api.http) = {
+ put: "/v1/{name=projects/*/snapshots/*}"
+ body: "*"
+ };
+ option (google.api.method_signature) = "name,subscription";
+ }
+
+ // Updates an existing snapshot by updating the fields specified in the update
+ // mask. Snapshots are used in
+ // [Seek](https://cloud.google.com/pubsub/docs/replay-overview) operations,
+ // which allow you to manage message acknowledgments in bulk. That is, you can
+ // set the acknowledgment state of messages in an existing subscription to the
+ // state captured by a snapshot.
+ rpc UpdateSnapshot(UpdateSnapshotRequest) returns (Snapshot) {
+ option (google.api.http) = {
+ patch: "/v1/{snapshot.name=projects/*/snapshots/*}"
+ body: "*"
+ };
+ option (google.api.method_signature) = "snapshot,update_mask";
+ }
+
+ // Removes an existing snapshot. Snapshots are used in [Seek]
+ // (https://cloud.google.com/pubsub/docs/replay-overview) operations, which
+ // allow you to manage message acknowledgments in bulk. That is, you can set
+ // the acknowledgment state of messages in an existing subscription to the
+ // state captured by a snapshot.
+ // When the snapshot is deleted, all messages retained in the snapshot
+ // are immediately dropped. After a snapshot is deleted, a new one may be
+ // created with the same name, but the new one has no association with the old
+ // snapshot or its subscription, unless the same subscription is specified.
+ rpc DeleteSnapshot(DeleteSnapshotRequest) returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ delete: "/v1/{snapshot=projects/*/snapshots/*}"
+ };
+ option (google.api.method_signature) = "snapshot";
+ }
+
+ // Seeks an existing subscription to a point in time or to a given snapshot,
+ // whichever is provided in the request. Snapshots are used in [Seek]
+ // (https://cloud.google.com/pubsub/docs/replay-overview) operations, which
+ // allow you to manage message acknowledgments in bulk. That is, you can set
+ // the acknowledgment state of messages in an existing subscription to the
+ // state captured by a snapshot. Note that both the subscription and the
+ // snapshot must be on the same topic.
+ rpc Seek(SeekRequest) returns (SeekResponse) {
+ option (google.api.http) = {
+ post: "/v1/{subscription=projects/*/subscriptions/*}:seek"
+ body: "*"
+ };
+ }
+}
+
+// A subscription resource. If none of `push_config`, `bigquery_config`, or
+// `cloud_storage_config` is set, then the subscriber will pull and ack messages
+// using API methods. At most one of these fields may be set.
+message Subscription {
+ option (google.api.resource) = {
+ type: "pubsub.googleapis.com/Subscription"
+ pattern: "projects/{project}/subscriptions/{subscription}"
+ plural: "subscriptions"
+ singular: "subscription"
+ };
+
+ // Possible states for a subscription.
+ enum State {
+ // Default value. This value is unused.
+ STATE_UNSPECIFIED = 0;
+
+ // The subscription can actively receive messages
+ ACTIVE = 1;
+
+ // The subscription cannot receive messages because of an error with the
+ // resource to which it pushes messages. See the more detailed error state
+ // in the corresponding configuration.
+ RESOURCE_ERROR = 2;
+ }
+
+ // Information about an associated [Analytics Hub
+ // subscription](https://cloud.google.com/bigquery/docs/analytics-hub-manage-subscriptions).
+ message AnalyticsHubSubscriptionInfo {
+ // Optional. The name of the associated Analytics Hub listing resource.
+ // Pattern:
+ // "projects/{project}/locations/{location}/dataExchanges/{data_exchange}/listings/{listing}"
+ string listing = 1 [
+ (google.api.field_behavior) = OPTIONAL,
+ (google.api.resource_reference) = {
+ type: "analyticshub.googleapis.com/Listing"
+ }
+ ];
+
+ // Optional. The name of the associated Analytics Hub subscription resource.
+ // Pattern:
+ // "projects/{project}/locations/{location}/subscriptions/{subscription}"
+ string subscription = 2 [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Required. The name of the subscription. It must have the format
+ // `"projects/{project}/subscriptions/{subscription}"`. `{subscription}` must
+ // start with a letter, and contain only letters (`[A-Za-z]`), numbers
+ // (`[0-9]`), dashes (`-`), underscores (`_`), periods (`.`), tildes (`~`),
+ // plus (`+`) or percent signs (`%`). It must be between 3 and 255 characters
+ // in length, and it must not start with `"goog"`.
+ string name = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The name of the topic from which this subscription is receiving
+ // messages. Format is `projects/{project}/topics/{topic}`. The value of this
+ // field will be `_deleted-topic_` if the topic has been deleted.
+ string topic = 2 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" }
+ ];
+
+ // Optional. If push delivery is used with this subscription, this field is
+ // used to configure it.
+ PushConfig push_config = 4 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If delivery to BigQuery is used with this subscription, this
+ // field is used to configure it.
+ BigQueryConfig bigquery_config = 18 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If delivery to Google Cloud Storage is used with this
+ // subscription, this field is used to configure it.
+ CloudStorageConfig cloud_storage_config = 22
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The approximate amount of time (on a best-effort basis) Pub/Sub
+ // waits for the subscriber to acknowledge receipt before resending the
+ // message. In the interval after the message is delivered and before it is
+ // acknowledged, it is considered to be _outstanding_. During that time
+ // period, the message will not be redelivered (on a best-effort basis).
+ //
+ // For pull subscriptions, this value is used as the initial value for the ack
+ // deadline. To override this value for a given message, call
+ // `ModifyAckDeadline` with the corresponding `ack_id` if using
+ // non-streaming pull or send the `ack_id` in a
+ // `StreamingModifyAckDeadlineRequest` if using streaming pull.
+ // The minimum custom deadline you can specify is 10 seconds.
+ // The maximum custom deadline you can specify is 600 seconds (10 minutes).
+ // If this parameter is 0, a default value of 10 seconds is used.
+ //
+ // For push delivery, this value is also used to set the request timeout for
+ // the call to the push endpoint.
+ //
+ // If the subscriber never acknowledges the message, the Pub/Sub
+ // system will eventually redeliver the message.
+ int32 ack_deadline_seconds = 5 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Indicates whether to retain acknowledged messages. If true, then
+ // messages are not expunged from the subscription's backlog, even if they are
+ // acknowledged, until they fall out of the `message_retention_duration`
+ // window. This must be true if you would like to [`Seek` to a timestamp]
+ // (https://cloud.google.com/pubsub/docs/replay-overview#seek_to_a_time) in
+ // the past to replay previously-acknowledged messages.
+ bool retain_acked_messages = 7 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. How long to retain unacknowledged messages in the subscription's
+ // backlog, from the moment a message is published. If `retain_acked_messages`
+ // is true, then this also configures the retention of acknowledged messages,
+ // and thus configures how far back in time a `Seek` can be done. Defaults to
+ // 7 days. Cannot be more than 31 days or less than 10 minutes.
+ google.protobuf.Duration message_retention_duration = 8
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. See [Creating and managing
+ // labels](https://cloud.google.com/pubsub/docs/labels).
+ map labels = 9 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If true, messages published with the same `ordering_key` in
+ // `PubsubMessage` will be delivered to the subscribers in the order in which
+ // they are received by the Pub/Sub system. Otherwise, they may be delivered
+ // in any order.
+ bool enable_message_ordering = 10 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. A policy that specifies the conditions for this subscription's
+ // expiration. A subscription is considered active as long as any connected
+ // subscriber is successfully consuming messages from the subscription or is
+ // issuing operations on the subscription. If `expiration_policy` is not set,
+ // a *default policy* with `ttl` of 31 days will be used. The minimum allowed
+ // value for `expiration_policy.ttl` is 1 day. If `expiration_policy` is set,
+ // but `expiration_policy.ttl` is not set, the subscription never expires.
+ ExpirationPolicy expiration_policy = 11
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. An expression written in the Pub/Sub [filter
+ // language](https://cloud.google.com/pubsub/docs/filtering). If non-empty,
+ // then only `PubsubMessage`s whose `attributes` field matches the filter are
+ // delivered on this subscription. If empty, then no messages are filtered
+ // out.
+ string filter = 12 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. A policy that specifies the conditions for dead lettering
+ // messages in this subscription. If dead_letter_policy is not set, dead
+ // lettering is disabled.
+ //
+ // The Pub/Sub service account associated with this subscriptions's
+ // parent project (i.e.,
+ // service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must have
+ // permission to Acknowledge() messages on this subscription.
+ DeadLetterPolicy dead_letter_policy = 13
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. A policy that specifies how Pub/Sub retries message delivery for
+ // this subscription.
+ //
+ // If not set, the default retry policy is applied. This generally implies
+ // that messages will be retried as soon as possible for healthy subscribers.
+ // RetryPolicy will be triggered on NACKs or acknowledgment deadline exceeded
+ // events for a given message.
+ RetryPolicy retry_policy = 14 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Indicates whether the subscription is detached from its topic.
+ // Detached subscriptions don't receive messages from their topic and don't
+ // retain any backlog. `Pull` and `StreamingPull` requests will return
+ // FAILED_PRECONDITION. If the subscription is a push subscription, pushes to
+ // the endpoint will not be made.
+ bool detached = 15 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If true, Pub/Sub provides the following guarantees for the
+ // delivery of a message with a given value of `message_id` on this
+ // subscription:
+ //
+ // * The message sent to a subscriber is guaranteed not to be resent
+ // before the message's acknowledgment deadline expires.
+ // * An acknowledged message will not be resent to a subscriber.
+ //
+ // Note that subscribers may still receive multiple copies of a message
+ // when `enable_exactly_once_delivery` is true if the message was published
+ // multiple times by a publisher client. These copies are considered distinct
+ // by Pub/Sub and have distinct `message_id` values.
+ bool enable_exactly_once_delivery = 16
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Output only. Indicates the minimum duration for which a message is retained
+ // after it is published to the subscription's topic. If this field is set,
+ // messages published to the subscription's topic in the last
+ // `topic_message_retention_duration` are always available to subscribers. See
+ // the `message_retention_duration` field in `Topic`. This field is set only
+ // in responses from the server; it is ignored if it is set in any requests.
+ google.protobuf.Duration topic_message_retention_duration = 17
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Output only. An output-only field indicating whether or not the
+ // subscription can receive messages.
+ State state = 19 [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Output only. Information about the associated Analytics Hub subscription.
+ // Only set if the subscritpion is created by Analytics Hub.
+ AnalyticsHubSubscriptionInfo analytics_hub_subscription_info = 23
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Optional. Transforms to be applied to messages before they are delivered to
+ // subscribers. Transforms are applied in the order specified.
+ repeated MessageTransform message_transforms = 25
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Input only. Immutable. Tag keys/values directly bound to this
+ // resource. For example:
+ // "123/environment": "production",
+ // "123/costCenter": "marketing"
+ map tags = 26 [
+ (google.api.field_behavior) = INPUT_ONLY,
+ (google.api.field_behavior) = IMMUTABLE,
+ (google.api.field_behavior) = OPTIONAL
+ ];
+}
+
+// A policy that specifies how Pub/Sub retries message delivery.
+//
+// Retry delay will be exponential based on provided minimum and maximum
+// backoffs. https://en.wikipedia.org/wiki/Exponential_backoff.
+//
+// RetryPolicy will be triggered on NACKs or acknowledgment deadline exceeded
+// events for a given message.
+//
+// Retry Policy is implemented on a best effort basis. At times, the delay
+// between consecutive deliveries may not match the configuration. That is,
+// delay can be more or less than configured backoff.
+message RetryPolicy {
+ // Optional. The minimum delay between consecutive deliveries of a given
+ // message. Value should be between 0 and 600 seconds. Defaults to 10 seconds.
+ google.protobuf.Duration minimum_backoff = 1
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The maximum delay between consecutive deliveries of a given
+ // message. Value should be between 0 and 600 seconds. Defaults to 600
+ // seconds.
+ google.protobuf.Duration maximum_backoff = 2
+ [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Dead lettering is done on a best effort basis. The same message might be
+// dead lettered multiple times.
+//
+// If validation on any of the fields fails at subscription creation/updation,
+// the create/update subscription request will fail.
+message DeadLetterPolicy {
+ // Optional. The name of the topic to which dead letter messages should be
+ // published. Format is `projects/{project}/topics/{topic}`.The Pub/Sub
+ // service account associated with the enclosing subscription's parent project
+ // (i.e., service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com) must
+ // have permission to Publish() to this topic.
+ //
+ // The operation will fail if the topic does not exist.
+ // Users should ensure that there is a subscription attached to this topic
+ // since messages published to a topic with no subscriptions are lost.
+ string dead_letter_topic = 1 [
+ (google.api.field_behavior) = OPTIONAL,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" }
+ ];
+
+ // Optional. The maximum number of delivery attempts for any message. The
+ // value must be between 5 and 100.
+ //
+ // The number of delivery attempts is defined as 1 + (the sum of number of
+ // NACKs and number of times the acknowledgment deadline has been exceeded
+ // for the message).
+ //
+ // A NACK is any call to ModifyAckDeadline with a 0 deadline. Note that
+ // client libraries may automatically extend ack_deadlines.
+ //
+ // This field will be honored on a best effort basis.
+ //
+ // If this parameter is 0, a default value of 5 is used.
+ int32 max_delivery_attempts = 2 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// A policy that specifies the conditions for resource expiration (i.e.,
+// automatic resource deletion).
+message ExpirationPolicy {
+ // Optional. Specifies the "time-to-live" duration for an associated resource.
+ // The resource expires if it is not active for a period of `ttl`. The
+ // definition of "activity" depends on the type of the associated resource.
+ // The minimum and maximum allowed values for `ttl` depend on the type of the
+ // associated resource, as well. If `ttl` is not set, the associated resource
+ // never expires.
+ google.protobuf.Duration ttl = 1 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Configuration for a push delivery endpoint.
+message PushConfig {
+ // Contains information needed for generating an
+ // [OpenID Connect
+ // token](https://developers.google.com/identity/protocols/OpenIDConnect).
+ message OidcToken {
+ // Optional. [Service account
+ // email](https://cloud.google.com/iam/docs/service-accounts)
+ // used for generating the OIDC token. For more information
+ // on setting up authentication, see
+ // [Push subscriptions](https://cloud.google.com/pubsub/docs/push).
+ string service_account_email = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Audience to be used when generating OIDC token. The audience
+ // claim identifies the recipients that the JWT is intended for. The
+ // audience value is a single case-sensitive string. Having multiple values
+ // (array) for the audience field is not supported. More info about the OIDC
+ // JWT token audience here:
+ // https://tools.ietf.org/html/rfc7519#section-4.1.3 Note: if not specified,
+ // the Push endpoint URL will be used.
+ string audience = 2 [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // The payload to the push endpoint is in the form of the JSON representation
+ // of a PubsubMessage
+ // (https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#pubsubmessage).
+ message PubsubWrapper {}
+
+ // Sets the `data` field as the HTTP body for delivery.
+ message NoWrapper {
+ // Optional. When true, writes the Pub/Sub message metadata to
+ // `x-goog-pubsub-:` headers of the HTTP request. Writes the
+ // Pub/Sub message attributes to `:` headers of the HTTP request.
+ bool write_metadata = 1 [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Optional. A URL locating the endpoint to which messages should be pushed.
+ // For example, a Webhook endpoint might use `https://example.com/push`.
+ string push_endpoint = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Endpoint configuration attributes that can be used to control
+ // different aspects of the message delivery.
+ //
+ // The only currently supported attribute is `x-goog-version`, which you can
+ // use to change the format of the pushed message. This attribute
+ // indicates the version of the data expected by the endpoint. This
+ // controls the shape of the pushed message (i.e., its fields and metadata).
+ //
+ // If not present during the `CreateSubscription` call, it will default to
+ // the version of the Pub/Sub API used to make such call. If not present in a
+ // `ModifyPushConfig` call, its value will not be changed. `GetSubscription`
+ // calls will always return a valid version, even if the subscription was
+ // created without this attribute.
+ //
+ // The only supported values for the `x-goog-version` attribute are:
+ //
+ // * `v1beta1`: uses the push format defined in the v1beta1 Pub/Sub API.
+ // * `v1` or `v1beta2`: uses the push format defined in the v1 Pub/Sub API.
+ //
+ // For example:
+ // `attributes { "x-goog-version": "v1" }`
+ map attributes = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // An authentication method used by push endpoints to verify the source of
+ // push requests. This can be used with push endpoints that are private by
+ // default to allow requests only from the Pub/Sub system, for example.
+ // This field is optional and should be set only by users interested in
+ // authenticated push.
+ oneof authentication_method {
+ // Optional. If specified, Pub/Sub will generate and attach an OIDC JWT
+ // token as an `Authorization` header in the HTTP request for every pushed
+ // message.
+ OidcToken oidc_token = 3 [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // The format of the delivered message to the push endpoint is defined by
+ // the chosen wrapper. When unset, `PubsubWrapper` is used.
+ oneof wrapper {
+ // Optional. When set, the payload to the push endpoint is in the form of
+ // the JSON representation of a PubsubMessage
+ // (https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#pubsubmessage).
+ PubsubWrapper pubsub_wrapper = 4 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. When set, the payload to the push endpoint is not wrapped.
+ NoWrapper no_wrapper = 5 [(google.api.field_behavior) = OPTIONAL];
+ }
+}
+
+// Configuration for a BigQuery subscription.
+message BigQueryConfig {
+ // Possible states for a BigQuery subscription.
+ enum State {
+ // Default value. This value is unused.
+ STATE_UNSPECIFIED = 0;
+
+ // The subscription can actively send messages to BigQuery
+ ACTIVE = 1;
+
+ // Cannot write to the BigQuery table because of permission denied errors.
+ // This can happen if
+ // - Pub/Sub SA has not been granted the [appropriate BigQuery IAM
+ // permissions](https://cloud.google.com/pubsub/docs/create-subscription#assign_bigquery_service_account)
+ // - bigquery.googleapis.com API is not enabled for the project
+ // ([instructions](https://cloud.google.com/service-usage/docs/enable-disable))
+ PERMISSION_DENIED = 2;
+
+ // Cannot write to the BigQuery table because it does not exist.
+ NOT_FOUND = 3;
+
+ // Cannot write to the BigQuery table due to a schema mismatch.
+ SCHEMA_MISMATCH = 4;
+
+ // Cannot write to the destination because enforce_in_transit is set to true
+ // and the destination locations are not in the allowed regions.
+ IN_TRANSIT_LOCATION_RESTRICTION = 5;
+ }
+
+ // Optional. The name of the table to which to write data, of the form
+ // {projectId}.{datasetId}.{tableId}
+ string table = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. When true, use the topic's schema as the columns to write to in
+ // BigQuery, if it exists. `use_topic_schema` and `use_table_schema` cannot be
+ // enabled at the same time.
+ bool use_topic_schema = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. When true, write the subscription name, message_id, publish_time,
+ // attributes, and ordering_key to additional columns in the table. The
+ // subscription name, message_id, and publish_time fields are put in their own
+ // columns while all other message properties (other than data) are written to
+ // a JSON object in the attributes column.
+ bool write_metadata = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. When true and use_topic_schema is true, any fields that are a
+ // part of the topic schema that are not part of the BigQuery table schema are
+ // dropped when writing to BigQuery. Otherwise, the schemas must be kept in
+ // sync and any messages with extra fields are not written and remain in the
+ // subscription's backlog.
+ bool drop_unknown_fields = 4 [(google.api.field_behavior) = OPTIONAL];
+
+ // Output only. An output-only field that indicates whether or not the
+ // subscription can receive messages.
+ State state = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Optional. When true, use the BigQuery table's schema as the columns to
+ // write to in BigQuery. `use_table_schema` and `use_topic_schema` cannot be
+ // enabled at the same time.
+ bool use_table_schema = 6 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The service account to use to write to BigQuery. The subscription
+ // creator or updater that specifies this field must have
+ // `iam.serviceAccounts.actAs` permission on the service account. If not
+ // specified, the Pub/Sub [service
+ // agent](https://cloud.google.com/iam/docs/service-agents),
+ // service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com, is used.
+ string service_account_email = 7 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Configuration for a Cloud Storage subscription.
+message CloudStorageConfig {
+ // Configuration for writing message data in text format.
+ // Message payloads will be written to files as raw text, separated by a
+ // newline.
+ message TextConfig {}
+
+ // Configuration for writing message data in Avro format.
+ // Message payloads and metadata will be written to files as an Avro binary.
+ message AvroConfig {
+ // Optional. When true, write the subscription name, message_id,
+ // publish_time, attributes, and ordering_key as additional fields in the
+ // output. The subscription name, message_id, and publish_time fields are
+ // put in their own fields while all other message properties other than
+ // data (for example, an ordering_key, if present) are added as entries in
+ // the attributes map.
+ bool write_metadata = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. When true, the output Cloud Storage file will be serialized
+ // using the topic schema, if it exists.
+ bool use_topic_schema = 2 [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Possible states for a Cloud Storage subscription.
+ enum State {
+ // Default value. This value is unused.
+ STATE_UNSPECIFIED = 0;
+
+ // The subscription can actively send messages to Cloud Storage.
+ ACTIVE = 1;
+
+ // Cannot write to the Cloud Storage bucket because of permission denied
+ // errors.
+ PERMISSION_DENIED = 2;
+
+ // Cannot write to the Cloud Storage bucket because it does not exist.
+ NOT_FOUND = 3;
+
+ // Cannot write to the destination because enforce_in_transit is set to true
+ // and the destination locations are not in the allowed regions.
+ IN_TRANSIT_LOCATION_RESTRICTION = 4;
+
+ // Cannot write to the Cloud Storage bucket due to an incompatibility
+ // between the topic schema and subscription settings.
+ SCHEMA_MISMATCH = 5;
+ }
+
+ // Required. User-provided name for the Cloud Storage bucket.
+ // The bucket must be created by the user. The bucket name must be without
+ // any prefix like "gs://". See the [bucket naming
+ // requirements] (https://cloud.google.com/storage/docs/buckets#naming).
+ string bucket = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Optional. User-provided prefix for Cloud Storage filename. See the [object
+ // naming requirements](https://cloud.google.com/storage/docs/objects#naming).
+ string filename_prefix = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. User-provided suffix for Cloud Storage filename. See the [object
+ // naming requirements](https://cloud.google.com/storage/docs/objects#naming).
+ // Must not end in "/".
+ string filename_suffix = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. User-provided format string specifying how to represent datetimes
+ // in Cloud Storage filenames. See the [datetime format
+ // guidance](https://cloud.google.com/pubsub/docs/create-cloudstorage-subscription#file_names).
+ string filename_datetime_format = 10 [(google.api.field_behavior) = OPTIONAL];
+
+ // Defaults to text format.
+ oneof output_format {
+ // Optional. If set, message data will be written to Cloud Storage in text
+ // format.
+ TextConfig text_config = 4 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If set, message data will be written to Cloud Storage in Avro
+ // format.
+ AvroConfig avro_config = 5 [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Optional. The maximum duration that can elapse before a new Cloud Storage
+ // file is created. Min 1 minute, max 10 minutes, default 5 minutes. May not
+ // exceed the subscription's acknowledgment deadline.
+ google.protobuf.Duration max_duration = 6
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The maximum bytes that can be written to a Cloud Storage file
+ // before a new file is created. Min 1 KB, max 10 GiB. The max_bytes limit may
+ // be exceeded in cases where messages are larger than the limit.
+ int64 max_bytes = 7 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The maximum number of messages that can be written to a Cloud
+ // Storage file before a new file is created. Min 1000 messages.
+ int64 max_messages = 8 [(google.api.field_behavior) = OPTIONAL];
+
+ // Output only. An output-only field that indicates whether or not the
+ // subscription can receive messages.
+ State state = 9 [(google.api.field_behavior) = OUTPUT_ONLY];
+
+ // Optional. The service account to use to write to Cloud Storage. The
+ // subscription creator or updater that specifies this field must have
+ // `iam.serviceAccounts.actAs` permission on the service account. If not
+ // specified, the Pub/Sub
+ // [service agent](https://cloud.google.com/iam/docs/service-agents),
+ // service-{project_number}@gcp-sa-pubsub.iam.gserviceaccount.com, is used.
+ string service_account_email = 11 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// A message and its corresponding acknowledgment ID.
+message ReceivedMessage {
+ // Optional. This ID can be used to acknowledge the received message.
+ string ack_id = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The message.
+ PubsubMessage message = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The approximate number of times that Pub/Sub has attempted to
+ // deliver the associated message to a subscriber.
+ //
+ // More precisely, this is 1 + (number of NACKs) +
+ // (number of ack_deadline exceeds) for this message.
+ //
+ // A NACK is any call to ModifyAckDeadline with a 0 deadline. An ack_deadline
+ // exceeds event is whenever a message is not acknowledged within
+ // ack_deadline. Note that ack_deadline is initially
+ // Subscription.ackDeadlineSeconds, but may get extended automatically by
+ // the client library.
+ //
+ // Upon the first delivery of a given message, `delivery_attempt` will have a
+ // value of 1. The value is calculated at best effort and is approximate.
+ //
+ // If a DeadLetterPolicy is not set on the subscription, this will be 0.
+ int32 delivery_attempt = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Request for the GetSubscription method.
+message GetSubscriptionRequest {
+ // Required. The name of the subscription to get.
+ // Format is `projects/{project}/subscriptions/{sub}`.
+ string subscription = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "pubsub.googleapis.com/Subscription"
+ }
+ ];
+}
+
+// Request for the UpdateSubscription method.
+message UpdateSubscriptionRequest {
+ // Required. The updated subscription object.
+ Subscription subscription = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. Indicates which fields in the provided subscription to update.
+ // Must be specified and non-empty.
+ google.protobuf.FieldMask update_mask = 2
+ [(google.api.field_behavior) = REQUIRED];
+}
+
+// Request for the `ListSubscriptions` method.
+message ListSubscriptionsRequest {
+ // Required. The name of the project in which to list subscriptions.
+ // Format is `projects/{project-id}`.
+ string project = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "cloudresourcemanager.googleapis.com/Project"
+ }
+ ];
+
+ // Optional. Maximum number of subscriptions to return.
+ int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The value returned by the last `ListSubscriptionsResponse`;
+ // indicates that this is a continuation of a prior `ListSubscriptions` call,
+ // and that the system should return the next page of data.
+ string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Response for the `ListSubscriptions` method.
+message ListSubscriptionsResponse {
+ // Optional. The subscriptions that match the request.
+ repeated Subscription subscriptions = 1
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If not empty, indicates that there may be more subscriptions that
+ // match the request; this value should be passed in a new
+ // `ListSubscriptionsRequest` to get more subscriptions.
+ string next_page_token = 2 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Request for the DeleteSubscription method.
+message DeleteSubscriptionRequest {
+ // Required. The subscription to delete.
+ // Format is `projects/{project}/subscriptions/{sub}`.
+ string subscription = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "pubsub.googleapis.com/Subscription"
+ }
+ ];
+}
+
+// Request for the ModifyPushConfig method.
+message ModifyPushConfigRequest {
+ // Required. The name of the subscription.
+ // Format is `projects/{project}/subscriptions/{sub}`.
+ string subscription = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "pubsub.googleapis.com/Subscription"
+ }
+ ];
+
+ // Required. The push configuration for future deliveries.
+ //
+ // An empty `pushConfig` indicates that the Pub/Sub system should
+ // stop pushing messages from the given subscription and allow
+ // messages to be pulled and acknowledged - effectively pausing
+ // the subscription if `Pull` or `StreamingPull` is not called.
+ PushConfig push_config = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Request for the `Pull` method.
+message PullRequest {
+ // Required. The subscription from which messages should be pulled.
+ // Format is `projects/{project}/subscriptions/{sub}`.
+ string subscription = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "pubsub.googleapis.com/Subscription"
+ }
+ ];
+
+ // Optional. If this field set to true, the system will respond immediately
+ // even if it there are no messages available to return in the `Pull`
+ // response. Otherwise, the system may wait (for a bounded amount of time)
+ // until at least one message is available, rather than returning no messages.
+ // Warning: setting this field to `true` is discouraged because it adversely
+ // impacts the performance of `Pull` operations. We recommend that users do
+ // not set this field.
+ bool return_immediately = 2
+ [deprecated = true, (google.api.field_behavior) = OPTIONAL];
+
+ // Required. The maximum number of messages to return for this request. Must
+ // be a positive integer. The Pub/Sub system may return fewer than the number
+ // specified.
+ int32 max_messages = 3 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Response for the `Pull` method.
+message PullResponse {
+ // Optional. Received Pub/Sub messages. The list will be empty if there are no
+ // more messages available in the backlog, or if no messages could be returned
+ // before the request timeout. For JSON, the response can be entirely
+ // empty. The Pub/Sub system may return fewer than the `maxMessages` requested
+ // even if there are more messages available in the backlog.
+ repeated ReceivedMessage received_messages = 1
+ [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Request for the ModifyAckDeadline method.
+message ModifyAckDeadlineRequest {
+ // Required. The name of the subscription.
+ // Format is `projects/{project}/subscriptions/{sub}`.
+ string subscription = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "pubsub.googleapis.com/Subscription"
+ }
+ ];
+
+ // Required. List of acknowledgment IDs.
+ repeated string ack_ids = 4 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. The new ack deadline with respect to the time this request was
+ // sent to the Pub/Sub system. For example, if the value is 10, the new ack
+ // deadline will expire 10 seconds after the `ModifyAckDeadline` call was
+ // made. Specifying zero might immediately make the message available for
+ // delivery to another subscriber client. This typically results in an
+ // increase in the rate of message redeliveries (that is, duplicates).
+ // The minimum deadline you can specify is 0 seconds.
+ // The maximum deadline you can specify in a single request is 600 seconds
+ // (10 minutes).
+ int32 ack_deadline_seconds = 3 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Request for the Acknowledge method.
+message AcknowledgeRequest {
+ // Required. The subscription whose message is being acknowledged.
+ // Format is `projects/{project}/subscriptions/{sub}`.
+ string subscription = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "pubsub.googleapis.com/Subscription"
+ }
+ ];
+
+ // Required. The acknowledgment ID for the messages being acknowledged that
+ // was returned by the Pub/Sub system in the `Pull` response. Must not be
+ // empty.
+ repeated string ack_ids = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Request for the `StreamingPull` streaming RPC method. This request is used to
+// establish the initial stream as well as to stream acknowledgments and ack
+// deadline modifications from the client to the server.
+message StreamingPullRequest {
+ // Required. The subscription for which to initialize the new stream. This
+ // must be provided in the first request on the stream, and must not be set in
+ // subsequent requests from client to server.
+ // Format is `projects/{project}/subscriptions/{sub}`.
+ string subscription = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "pubsub.googleapis.com/Subscription"
+ }
+ ];
+
+ // Optional. List of acknowledgment IDs for acknowledging previously received
+ // messages (received on this stream or a different stream). If an ack ID has
+ // expired, the corresponding message may be redelivered later. Acknowledging
+ // a message more than once will not result in an error. If the acknowledgment
+ // ID is malformed, the stream will be aborted with status `INVALID_ARGUMENT`.
+ repeated string ack_ids = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The list of new ack deadlines for the IDs listed in
+ // `modify_deadline_ack_ids`. The size of this list must be the same as the
+ // size of `modify_deadline_ack_ids`. If it differs the stream will be aborted
+ // with `INVALID_ARGUMENT`. Each element in this list is applied to the
+ // element in the same position in `modify_deadline_ack_ids`. The new ack
+ // deadline is with respect to the time this request was sent to the Pub/Sub
+ // system. Must be >= 0. For example, if the value is 10, the new ack deadline
+ // will expire 10 seconds after this request is received. If the value is 0,
+ // the message is immediately made available for another streaming or
+ // non-streaming pull request. If the value is < 0 (an error), the stream will
+ // be aborted with status `INVALID_ARGUMENT`.
+ repeated int32 modify_deadline_seconds = 3
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. List of acknowledgment IDs whose deadline will be modified based
+ // on the corresponding element in `modify_deadline_seconds`. This field can
+ // be used to indicate that more time is needed to process a message by the
+ // subscriber, or to make the message available for redelivery if the
+ // processing was interrupted.
+ repeated string modify_deadline_ack_ids = 4
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Required. The ack deadline to use for the stream. This must be provided in
+ // the first request on the stream, but it can also be updated on subsequent
+ // requests from client to server. The minimum deadline you can specify is 10
+ // seconds. The maximum deadline you can specify is 600 seconds (10 minutes).
+ int32 stream_ack_deadline_seconds = 5
+ [(google.api.field_behavior) = REQUIRED];
+
+ // Optional. A unique identifier that is used to distinguish client instances
+ // from each other. Only needs to be provided on the initial request. When a
+ // stream disconnects and reconnects for the same stream, the client_id should
+ // be set to the same value so that state associated with the old stream can
+ // be transferred to the new stream. The same client_id should not be used for
+ // different client instances.
+ string client_id = 6 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Flow control settings for the maximum number of outstanding
+ // messages. When there are `max_outstanding_messages` currently sent to the
+ // streaming pull client that have not yet been acked or nacked, the server
+ // stops sending more messages. The sending of messages resumes once the
+ // number of outstanding messages is less than this value. If the value is
+ // <= 0, there is no limit to the number of outstanding messages. This
+ // property can only be set on the initial StreamingPullRequest. If it is set
+ // on a subsequent request, the stream will be aborted with status
+ // `INVALID_ARGUMENT`.
+ int64 max_outstanding_messages = 7 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Flow control settings for the maximum number of outstanding
+ // bytes. When there are `max_outstanding_bytes` or more worth of messages
+ // currently sent to the streaming pull client that have not yet been acked or
+ // nacked, the server will stop sending more messages. The sending of messages
+ // resumes once the number of outstanding bytes is less than this value. If
+ // the value is <= 0, there is no limit to the number of outstanding bytes.
+ // This property can only be set on the initial StreamingPullRequest. If it is
+ // set on a subsequent request, the stream will be aborted with status
+ // `INVALID_ARGUMENT`.
+ int64 max_outstanding_bytes = 8 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The protocol version used by the client. This property can only
+ // be set on the initial StreamingPullRequest. If it is set on a subsequent
+ // request, the stream will be aborted with status `INVALID_ARGUMENT`.
+ int64 protocol_version = 10 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Response for the `StreamingPull` method. This response is used to stream
+// messages from the server to the client.
+message StreamingPullResponse {
+ // Acknowledgment IDs sent in one or more previous requests to acknowledge a
+ // previously received message.
+ message AcknowledgeConfirmation {
+ // Optional. Successfully processed acknowledgment IDs.
+ repeated string ack_ids = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. List of acknowledgment IDs that were malformed or whose
+ // acknowledgment deadline has expired.
+ repeated string invalid_ack_ids = 2
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. List of acknowledgment IDs that were out of order.
+ repeated string unordered_ack_ids = 3
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. List of acknowledgment IDs that failed processing with
+ // temporary issues.
+ repeated string temporary_failed_ack_ids = 4
+ [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Acknowledgment IDs sent in one or more previous requests to modify the
+ // deadline for a specific message.
+ message ModifyAckDeadlineConfirmation {
+ // Optional. Successfully processed acknowledgment IDs.
+ repeated string ack_ids = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. List of acknowledgment IDs that were malformed or whose
+ // acknowledgment deadline has expired.
+ repeated string invalid_ack_ids = 2
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. List of acknowledgment IDs that failed processing with
+ // temporary issues.
+ repeated string temporary_failed_ack_ids = 3
+ [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Subscription properties sent as part of the response.
+ message SubscriptionProperties {
+ // Optional. True iff exactly once delivery is enabled for this
+ // subscription.
+ bool exactly_once_delivery_enabled = 1
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. True iff message ordering is enabled for this subscription.
+ bool message_ordering_enabled = 2 [(google.api.field_behavior) = OPTIONAL];
+ }
+
+ // Optional. Received Pub/Sub messages.
+ repeated ReceivedMessage received_messages = 1
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. This field will only be set if `enable_exactly_once_delivery` is
+ // set to `true` and is not guaranteed to be populated.
+ AcknowledgeConfirmation acknowledge_confirmation = 5
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. This field will only be set if `enable_exactly_once_delivery` is
+ // set to `true` and is not guaranteed to be populated.
+ ModifyAckDeadlineConfirmation modify_ack_deadline_confirmation = 3
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Properties associated with this subscription.
+ SubscriptionProperties subscription_properties = 4
+ [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Request for the `CreateSnapshot` method.
+message CreateSnapshotRequest {
+ // Required. User-provided name for this snapshot. If the name is not provided
+ // in the request, the server will assign a random name for this snapshot on
+ // the same project as the subscription. Note that for REST API requests, you
+ // must specify a name. See the [resource name
+ // rules](https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names).
+ // Format is `projects/{project}/snapshots/{snap}`.
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Snapshot" }
+ ];
+
+ // Required. The subscription whose backlog the snapshot retains.
+ // Specifically, the created snapshot is guaranteed to retain:
+ // (a) The existing backlog on the subscription. More precisely, this is
+ // defined as the messages in the subscription's backlog that are
+ // unacknowledged upon the successful completion of the
+ // `CreateSnapshot` request; as well as:
+ // (b) Any messages published to the subscription's topic following the
+ // successful completion of the CreateSnapshot request.
+ // Format is `projects/{project}/subscriptions/{sub}`.
+ string subscription = 2 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "pubsub.googleapis.com/Subscription"
+ }
+ ];
+
+ // Optional. See [Creating and managing
+ // labels](https://cloud.google.com/pubsub/docs/labels).
+ map labels = 3 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. Input only. Immutable. Tag keys/values directly bound to this
+ // resource. For example:
+ // "123/environment": "production",
+ // "123/costCenter": "marketing"
+ map tags = 4 [
+ (google.api.field_behavior) = INPUT_ONLY,
+ (google.api.field_behavior) = IMMUTABLE,
+ (google.api.field_behavior) = OPTIONAL
+ ];
+}
+
+// Request for the UpdateSnapshot method.
+message UpdateSnapshotRequest {
+ // Required. The updated snapshot object.
+ Snapshot snapshot = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // Required. Indicates which fields in the provided snapshot to update.
+ // Must be specified and non-empty.
+ google.protobuf.FieldMask update_mask = 2
+ [(google.api.field_behavior) = REQUIRED];
+}
+
+// A snapshot resource. Snapshots are used in
+// [Seek](https://cloud.google.com/pubsub/docs/replay-overview)
+// operations, which allow you to manage message acknowledgments in bulk. That
+// is, you can set the acknowledgment state of messages in an existing
+// subscription to the state captured by a snapshot.
+message Snapshot {
+ option (google.api.resource) = {
+ type: "pubsub.googleapis.com/Snapshot"
+ pattern: "projects/{project}/snapshots/{snapshot}"
+ plural: "snapshots"
+ singular: "snapshot"
+ };
+
+ // Optional. The name of the snapshot.
+ string name = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The name of the topic from which this snapshot is retaining
+ // messages.
+ string topic = 2 [
+ (google.api.field_behavior) = OPTIONAL,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Topic" }
+ ];
+
+ // Optional. The snapshot is guaranteed to exist up until this time.
+ // A newly-created snapshot expires no later than 7 days from the time of its
+ // creation. Its exact lifetime is determined at creation by the existing
+ // backlog in the source subscription. Specifically, the lifetime of the
+ // snapshot is `7 days - (age of oldest unacked message in the subscription)`.
+ // For example, consider a subscription whose oldest unacked message is 3 days
+ // old. If a snapshot is created from this subscription, the snapshot -- which
+ // will always capture this 3-day-old backlog as long as the snapshot
+ // exists -- will expire in 4 days. The service will refuse to create a
+ // snapshot that would expire in less than 1 hour after creation.
+ google.protobuf.Timestamp expire_time = 3
+ [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. See [Creating and managing labels]
+ // (https://cloud.google.com/pubsub/docs/labels).
+ map labels = 4 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Request for the GetSnapshot method.
+message GetSnapshotRequest {
+ // Required. The name of the snapshot to get.
+ // Format is `projects/{project}/snapshots/{snap}`.
+ string snapshot = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Snapshot" }
+ ];
+}
+
+// Request for the `ListSnapshots` method.
+message ListSnapshotsRequest {
+ // Required. The name of the project in which to list snapshots.
+ // Format is `projects/{project-id}`.
+ string project = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "cloudresourcemanager.googleapis.com/Project"
+ }
+ ];
+
+ // Optional. Maximum number of snapshots to return.
+ int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The value returned by the last `ListSnapshotsResponse`; indicates
+ // that this is a continuation of a prior `ListSnapshots` call, and that the
+ // system should return the next page of data.
+ string page_token = 3 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Response for the `ListSnapshots` method.
+message ListSnapshotsResponse {
+ // Optional. The resulting snapshots.
+ repeated Snapshot snapshots = 1 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. If not empty, indicates that there may be more snapshot that
+ // match the request; this value should be passed in a new
+ // `ListSnapshotsRequest`.
+ string next_page_token = 2 [(google.api.field_behavior) = OPTIONAL];
+}
+
+// Request for the `DeleteSnapshot` method.
+message DeleteSnapshotRequest {
+ // Required. The name of the snapshot to delete.
+ // Format is `projects/{project}/snapshots/{snap}`.
+ string snapshot = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Snapshot" }
+ ];
+}
+
+// Request for the `Seek` method.
+message SeekRequest {
+ // Required. The subscription to affect.
+ string subscription = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "pubsub.googleapis.com/Subscription"
+ }
+ ];
+
+ oneof target {
+ // Optional. The time to seek to.
+ // Messages retained in the subscription that were published before this
+ // time are marked as acknowledged, and messages retained in the
+ // subscription that were published after this time are marked as
+ // unacknowledged. Note that this operation affects only those messages
+ // retained in the subscription (configured by the combination of
+ // `message_retention_duration` and `retain_acked_messages`). For example,
+ // if `time` corresponds to a point before the message retention
+ // window (or to a point before the system's notion of the subscription
+ // creation time), only retained messages will be marked as unacknowledged,
+ // and already-expunged messages will not be restored.
+ google.protobuf.Timestamp time = 2 [(google.api.field_behavior) = OPTIONAL];
+
+ // Optional. The snapshot to seek to. The snapshot's topic must be the same
+ // as that of the provided subscription. Format is
+ // `projects/{project}/snapshots/{snap}`.
+ string snapshot = 3 [
+ (google.api.field_behavior) = OPTIONAL,
+ (google.api.resource_reference) = {
+ type: "pubsub.googleapis.com/Snapshot"
+ }
+ ];
+ }
+}
+
+// Response for the `Seek` method (this response is empty).
+message SeekResponse {}
diff --git a/sdk-platform-java/gapic-generator-java/src/test/proto/google/pubsub/v1/schema.proto b/sdk-platform-java/gapic-generator-java/src/test/proto/google/pubsub/v1/schema.proto
new file mode 100644
index 000000000000..37fd2f461c08
--- /dev/null
+++ b/sdk-platform-java/gapic-generator-java/src/test/proto/google/pubsub/v1/schema.proto
@@ -0,0 +1,409 @@
+// Copyright 2025 Google LLC
+//
+// 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 google.pubsub.v1;
+
+import "google/api/annotations.proto";
+import "google/api/client.proto";
+import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
+import "google/protobuf/empty.proto";
+import "google/protobuf/timestamp.proto";
+
+option csharp_namespace = "Google.Cloud.PubSub.V1";
+option go_package = "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb;pubsubpb";
+option java_multiple_files = true;
+option java_outer_classname = "SchemaProto";
+option java_package = "com.google.pubsub.v1";
+option php_namespace = "Google\\Cloud\\PubSub\\V1";
+option ruby_package = "Google::Cloud::PubSub::V1";
+
+// Service for doing schema-related operations.
+service SchemaService {
+ option (google.api.default_host) = "pubsub.googleapis.com";
+ option (google.api.oauth_scopes) =
+ "https://www.googleapis.com/auth/cloud-platform,"
+ "https://www.googleapis.com/auth/pubsub";
+
+ // Creates a schema.
+ rpc CreateSchema(CreateSchemaRequest) returns (Schema) {
+ option (google.api.http) = {
+ post: "/v1/{parent=projects/*}/schemas"
+ body: "schema"
+ };
+ option (google.api.method_signature) = "parent,schema,schema_id";
+ }
+
+ // Gets a schema.
+ rpc GetSchema(GetSchemaRequest) returns (Schema) {
+ option (google.api.http) = {
+ get: "/v1/{name=projects/*/schemas/*}"
+ };
+ option (google.api.method_signature) = "name";
+ }
+
+ // Lists schemas in a project.
+ rpc ListSchemas(ListSchemasRequest) returns (ListSchemasResponse) {
+ option (google.api.http) = {
+ get: "/v1/{parent=projects/*}/schemas"
+ };
+ option (google.api.method_signature) = "parent";
+ }
+
+ // Lists all schema revisions for the named schema.
+ rpc ListSchemaRevisions(ListSchemaRevisionsRequest)
+ returns (ListSchemaRevisionsResponse) {
+ option (google.api.http) = {
+ get: "/v1/{name=projects/*/schemas/*}:listRevisions"
+ };
+ option (google.api.method_signature) = "name";
+ }
+
+ // Commits a new schema revision to an existing schema.
+ rpc CommitSchema(CommitSchemaRequest) returns (Schema) {
+ option (google.api.http) = {
+ post: "/v1/{name=projects/*/schemas/*}:commit"
+ body: "*"
+ };
+ option (google.api.method_signature) = "name,schema";
+ }
+
+ // Creates a new schema revision that is a copy of the provided revision_id.
+ rpc RollbackSchema(RollbackSchemaRequest) returns (Schema) {
+ option (google.api.http) = {
+ post: "/v1/{name=projects/*/schemas/*}:rollback"
+ body: "*"
+ };
+ option (google.api.method_signature) = "name,revision_id";
+ }
+
+ // Deletes a specific schema revision.
+ rpc DeleteSchemaRevision(DeleteSchemaRevisionRequest) returns (Schema) {
+ option (google.api.http) = {
+ delete: "/v1/{name=projects/*/schemas/*}:deleteRevision"
+ };
+ option (google.api.method_signature) = "name,revision_id";
+ }
+
+ // Deletes a schema.
+ rpc DeleteSchema(DeleteSchemaRequest) returns (google.protobuf.Empty) {
+ option (google.api.http) = {
+ delete: "/v1/{name=projects/*/schemas/*}"
+ };
+ option (google.api.method_signature) = "name";
+ }
+
+ // Validates a schema.
+ rpc ValidateSchema(ValidateSchemaRequest) returns (ValidateSchemaResponse) {
+ option (google.api.http) = {
+ post: "/v1/{parent=projects/*}/schemas:validate"
+ body: "*"
+ };
+ option (google.api.method_signature) = "parent,schema";
+ }
+
+ // Validates a message against a schema.
+ rpc ValidateMessage(ValidateMessageRequest)
+ returns (ValidateMessageResponse) {
+ option (google.api.http) = {
+ post: "/v1/{parent=projects/*}/schemas:validateMessage"
+ body: "*"
+ };
+ }
+}
+
+// A schema resource.
+message Schema {
+ option (google.api.resource) = {
+ type: "pubsub.googleapis.com/Schema"
+ pattern: "projects/{project}/schemas/{schema}"
+ };
+
+ // Possible schema definition types.
+ enum Type {
+ // Default value. This value is unused.
+ TYPE_UNSPECIFIED = 0;
+
+ // A Protocol Buffer schema definition.
+ PROTOCOL_BUFFER = 1;
+
+ // An Avro schema definition.
+ AVRO = 2;
+ }
+
+ // Required. Name of the schema.
+ // Format is `projects/{project}/schemas/{schema}`.
+ string name = 1 [(google.api.field_behavior) = REQUIRED];
+
+ // The type of the schema definition.
+ Type type = 2;
+
+ // The definition of the schema. This should contain a string representing
+ // the full definition of the schema that is a valid schema definition of
+ // the type specified in `type`.
+ string definition = 3;
+
+ // Output only. Immutable. The revision ID of the schema.
+ string revision_id = 4 [
+ (google.api.field_behavior) = IMMUTABLE,
+ (google.api.field_behavior) = OUTPUT_ONLY
+ ];
+
+ // Output only. The timestamp that the revision was created.
+ google.protobuf.Timestamp revision_create_time = 6
+ [(google.api.field_behavior) = OUTPUT_ONLY];
+}
+
+// View of Schema object fields to be returned by GetSchema and ListSchemas.
+enum SchemaView {
+ // The default / unset value.
+ // The API will default to the BASIC view.
+ SCHEMA_VIEW_UNSPECIFIED = 0;
+
+ // Include the name and type of the schema, but not the definition.
+ BASIC = 1;
+
+ // Include all Schema object fields.
+ FULL = 2;
+}
+
+// Request for the CreateSchema method.
+message CreateSchemaRequest {
+ // Required. The name of the project in which to create the schema.
+ // Format is `projects/{project-id}`.
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ child_type: "pubsub.googleapis.com/Schema"
+ }
+ ];
+
+ // Required. The schema object to create.
+ //
+ // This schema's `name` parameter is ignored. The schema object returned
+ // by CreateSchema will have a `name` made using the given `parent` and
+ // `schema_id`.
+ Schema schema = 2 [(google.api.field_behavior) = REQUIRED];
+
+ // The ID to use for the schema, which will become the final component of
+ // the schema's resource name.
+ //
+ // See https://cloud.google.com/pubsub/docs/pubsub-basics#resource_names for
+ // resource name constraints.
+ string schema_id = 3;
+}
+
+// Request for the GetSchema method.
+message GetSchemaRequest {
+ // Required. The name of the schema to get.
+ // Format is `projects/{project}/schemas/{schema}`.
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" }
+ ];
+
+ // The set of fields to return in the response. If not set, returns a Schema
+ // with all fields filled out. Set to `BASIC` to omit the `definition`.
+ SchemaView view = 2;
+}
+
+// Request for the `ListSchemas` method.
+message ListSchemasRequest {
+ // Required. The name of the project in which to list schemas.
+ // Format is `projects/{project-id}`.
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "cloudresourcemanager.googleapis.com/Project"
+ }
+ ];
+
+ // The set of Schema fields to return in the response. If not set, returns
+ // Schemas with `name` and `type`, but not `definition`. Set to `FULL` to
+ // retrieve all fields.
+ SchemaView view = 2;
+
+ // Maximum number of schemas to return.
+ int32 page_size = 3;
+
+ // The value returned by the last `ListSchemasResponse`; indicates that
+ // this is a continuation of a prior `ListSchemas` call, and that the
+ // system should return the next page of data.
+ string page_token = 4;
+}
+
+// Response for the `ListSchemas` method.
+message ListSchemasResponse {
+ // The resulting schemas.
+ repeated Schema schemas = 1;
+
+ // If not empty, indicates that there may be more schemas that match the
+ // request; this value should be passed in a new `ListSchemasRequest`.
+ string next_page_token = 2;
+}
+
+// Request for the `ListSchemaRevisions` method.
+message ListSchemaRevisionsRequest {
+ // Required. The name of the schema to list revisions for.
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" }
+ ];
+
+ // The set of Schema fields to return in the response. If not set, returns
+ // Schemas with `name` and `type`, but not `definition`. Set to `FULL` to
+ // retrieve all fields.
+ SchemaView view = 2;
+
+ // The maximum number of revisions to return per page.
+ int32 page_size = 3;
+
+ // The page token, received from a previous ListSchemaRevisions call.
+ // Provide this to retrieve the subsequent page.
+ string page_token = 4;
+}
+
+// Response for the `ListSchemaRevisions` method.
+message ListSchemaRevisionsResponse {
+ // The revisions of the schema.
+ repeated Schema schemas = 1;
+
+ // A token that can be sent as `page_token` to retrieve the next page.
+ // If this field is empty, there are no subsequent pages.
+ string next_page_token = 2;
+}
+
+// Request for CommitSchema method.
+message CommitSchemaRequest {
+ // Required. The name of the schema we are revising.
+ // Format is `projects/{project}/schemas/{schema}`.
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" }
+ ];
+
+ // Required. The schema revision to commit.
+ Schema schema = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Request for the `RollbackSchema` method.
+message RollbackSchemaRequest {
+ // Required. The schema being rolled back with revision id.
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" }
+ ];
+
+ // Required. The revision ID to roll back to.
+ // It must be a revision of the same schema.
+ //
+ // Example: c7cfa2a8
+ string revision_id = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Request for the `DeleteSchemaRevision` method.
+message DeleteSchemaRevisionRequest {
+ // Required. The name of the schema revision to be deleted, with a revision ID
+ // explicitly included.
+ //
+ // Example: `projects/123/schemas/my-schema@c7cfa2a8`
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" }
+ ];
+
+ // Optional. This field is deprecated and should not be used for specifying
+ // the revision ID. The revision ID should be specified via the `name`
+ // parameter.
+ string revision_id = 2
+ [deprecated = true, (google.api.field_behavior) = OPTIONAL];
+}
+
+// Request for the `DeleteSchema` method.
+message DeleteSchemaRequest {
+ // Required. Name of the schema to delete.
+ // Format is `projects/{project}/schemas/{schema}`.
+ string name = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" }
+ ];
+}
+
+// Request for the `ValidateSchema` method.
+message ValidateSchemaRequest {
+ // Required. The name of the project in which to validate schemas.
+ // Format is `projects/{project-id}`.
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "cloudresourcemanager.googleapis.com/Project"
+ }
+ ];
+
+ // Required. The schema object to validate.
+ Schema schema = 2 [(google.api.field_behavior) = REQUIRED];
+}
+
+// Response for the `ValidateSchema` method.
+// Empty for now.
+message ValidateSchemaResponse {}
+
+// Request for the `ValidateMessage` method.
+message ValidateMessageRequest {
+ // Required. The name of the project in which to validate schemas.
+ // Format is `projects/{project-id}`.
+ string parent = 1 [
+ (google.api.field_behavior) = REQUIRED,
+ (google.api.resource_reference) = {
+ type: "cloudresourcemanager.googleapis.com/Project"
+ }
+ ];
+
+ oneof schema_spec {
+ // Name of the schema against which to validate.
+ //
+ // Format is `projects/{project}/schemas/{schema}`.
+ string name = 2 [
+ (google.api.resource_reference) = { type: "pubsub.googleapis.com/Schema" }
+ ];
+
+ // Ad-hoc schema against which to validate
+ Schema schema = 3;
+ }
+
+ // Message to validate against the provided `schema_spec`.
+ bytes message = 4;
+
+ // The encoding expected for messages
+ Encoding encoding = 5;
+}
+
+// Response for the `ValidateMessage` method.
+// Empty for now.
+message ValidateMessageResponse {}
+
+// Possible encoding types for messages.
+enum Encoding {
+ // Unspecified
+ ENCODING_UNSPECIFIED = 0;
+
+ // JSON encoding
+ JSON = 1;
+
+ // Binary encoding, as defined by the schema type. For some schema types,
+ // binary encoding may not be available.
+ BINARY = 2;
+}
diff --git a/sdk-platform-java/java-showcase-3.21.0/gapic-showcase/pom.xml b/sdk-platform-java/java-showcase-3.21.0/gapic-showcase/pom.xml
index 5ad7c459ebba..b89fa9b5e6bb 100644
--- a/sdk-platform-java/java-showcase-3.21.0/gapic-showcase/pom.xml
+++ b/sdk-platform-java/java-showcase-3.21.0/gapic-showcase/pom.xml
@@ -60,6 +60,7 @@
https://raw.githubusercontent.com/googleapis/gapic-showcase/v${gapic-showcase.version}/server/services/compliance_suite.json
src/test/resources
+ true
true
diff --git a/sdk-platform-java/java-showcase-3.25.8/gapic-showcase/pom.xml b/sdk-platform-java/java-showcase-3.25.8/gapic-showcase/pom.xml
index cdd0f3d8b776..1d149aa8ee2c 100644
--- a/sdk-platform-java/java-showcase-3.25.8/gapic-showcase/pom.xml
+++ b/sdk-platform-java/java-showcase-3.25.8/gapic-showcase/pom.xml
@@ -68,6 +68,7 @@
https://raw.githubusercontent.com/googleapis/gapic-showcase/v${gapic-showcase.version}/server/services/compliance_suite.json
src/test/resources
+ true
true