// Copyright 2026 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.cloud.chronicle.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/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "google/rpc/status.proto";

option csharp_namespace = "Google.Cloud.Chronicle.V1";
option go_package = "cloud.google.com/go/chronicle/apiv1/chroniclepb;chroniclepb";
option java_multiple_files = true;
option java_outer_classname = "DataTableProto";
option java_package = "com.google.cloud.chronicle.v1";
option php_namespace = "Google\\Cloud\\Chronicle\\V1";
option ruby_package = "Google::Cloud::Chronicle::V1";

// DataTableManager provides an interface for managing data tables.
service DataTableService {
  option (google.api.default_host) = "chronicle.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/chronicle,"
      "https://www.googleapis.com/auth/chronicle.readonly,"
      "https://www.googleapis.com/auth/cloud-platform";

  // Create a new data table.
  rpc CreateDataTable(CreateDataTableRequest) returns (DataTable) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/instances/*}/dataTables"
      body: "data_table"
    };
    option (google.api.method_signature) = "parent,data_table,data_table_id";
  }

  // List data tables.
  rpc ListDataTables(ListDataTablesRequest) returns (ListDataTablesResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/instances/*}/dataTables"
    };
    option (google.api.method_signature) = "parent";
  }

  // Get data table info.
  rpc GetDataTable(GetDataTableRequest) returns (DataTable) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/instances/*/dataTables/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Update data table.
  rpc UpdateDataTable(UpdateDataTableRequest) returns (DataTable) {
    option (google.api.http) = {
      patch: "/v1/{data_table.name=projects/*/locations/*/instances/*/dataTables/*}"
      body: "data_table"
    };
    option (google.api.method_signature) = "data_table,update_mask";
  }

  // Delete data table.
  rpc DeleteDataTable(DeleteDataTableRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/instances/*/dataTables/*}"
    };
    option (google.api.method_signature) = "name,force";
  }

  // Create a new data table row.
  rpc CreateDataTableRow(CreateDataTableRowRequest) returns (DataTableRow) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/instances/*/dataTables/*}/dataTableRows"
      body: "data_table_row"
    };
    option (google.api.method_signature) = "parent,data_table_row";
  }

  // Update data table row
  rpc UpdateDataTableRow(UpdateDataTableRowRequest) returns (DataTableRow) {
    option (google.api.http) = {
      patch: "/v1/{data_table_row.name=projects/*/locations/*/instances/*/dataTables/*/dataTableRows/*}"
      body: "data_table_row"
    };
    option (google.api.method_signature) = "data_table_row,update_mask";
  }

  // List data table rows.
  rpc ListDataTableRows(ListDataTableRowsRequest)
      returns (ListDataTableRowsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/instances/*/dataTables/*}/dataTableRows"
    };
    option (google.api.method_signature) = "parent";
  }

  // Get data table row
  rpc GetDataTableRow(GetDataTableRowRequest) returns (DataTableRow) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/instances/*/dataTables/*/dataTableRows/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Delete data table row.
  rpc DeleteDataTableRow(DeleteDataTableRowRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/instances/*/dataTables/*/dataTableRows/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Create data table rows in bulk.
  rpc BulkCreateDataTableRows(BulkCreateDataTableRowsRequest)
      returns (BulkCreateDataTableRowsResponse) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/instances/*/dataTables/*}/dataTableRows:bulkCreate"
      body: "*"
    };
    option (google.api.method_signature) = "parent,requests";
  }

  // Get data table rows in bulk.
  rpc BulkGetDataTableRows(BulkGetDataTableRowsRequest)
      returns (BulkGetDataTableRowsResponse) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/instances/*/dataTables/*}/dataTableRows:bulkGet"
      body: "*"
    };
    option (google.api.method_signature) = "parent,requests";
  }

  // Replace all existing data table rows with new data table rows.
  rpc BulkReplaceDataTableRows(BulkReplaceDataTableRowsRequest)
      returns (BulkReplaceDataTableRowsResponse) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/instances/*/dataTables/*}/dataTableRows:bulkReplace"
      body: "*"
    };
    option (google.api.method_signature) = "parent,requests";
  }

  // Update data table rows in bulk.
  rpc BulkUpdateDataTableRows(BulkUpdateDataTableRowsRequest)
      returns (BulkUpdateDataTableRowsResponse) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/instances/*/dataTables/*}/dataTableRows:bulkUpdate"
      body: "*"
    };
    option (google.api.method_signature) = "parent,requests";
  }

  // Get the error for a data table operation.
  rpc GetDataTableOperationErrors(GetDataTableOperationErrorsRequest)
      returns (DataTableOperationErrors) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/instances/*/dataTableOperationErrors/*}"
    };
    option (google.api.method_signature) = "name";
  }
}

// DataTableUpdateSource denotes the source that updated the data table.
enum DataTableUpdateSource {
  // The data table is updated by the user.
  DATA_TABLE_UPDATE_SOURCE_UNSPECIFIED = 0;

  // The data table is updated by the user.
  USER = 1;

  // The data table is updated by the rule.
  RULE = 2;

  // The data table is updated by the search.
  SEARCH = 3;
}

// A request to create DataTable.
message CreateDataTableRequest {
  // Required. The parent resource where this data table will be created.
  // Format: projects/{project}/locations/{location}/instances/{instance}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "chronicle.googleapis.com/DataTable"
    }
  ];

  // Required. The data table being created.
  DataTable data_table = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The ID to use for the data table. This is also the display name
  // for the data table. It must satisfy the following requirements:
  // - Starts with letter.
  // - Contains only letters, numbers and underscore.
  // - Must be unique and has length < 256.
  string data_table_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// A request to get details about a data table.
message GetDataTableRequest {
  // Required. The resource name of the data table to retrieve.
  // Format:
  // projects/{project}/locations/{location}/instances/{instances}/dataTables/{data_table}
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "chronicle.googleapis.com/DataTable"
    }
  ];
}

// A request to update details of data table.
message UpdateDataTableRequest {
  // Required. This field is used to identify the datatable to update.
  // Format:
  // projects/{project}/locations/{locations}/instances/{instance}/dataTables/{data_table}
  DataTable data_table = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. The list of metadata fields to update. Currently data tables only
  // support updating the `description`, `row_time_to_live` and `scope_info`
  // fields. When no field mask is supplied, all non-empty fields will be
  // updated. A field mask of "*" will update all fields, whether empty or not.
  google.protobuf.FieldMask update_mask = 2
      [(google.api.field_behavior) = OPTIONAL];
}

// A request for a list of data tables.
message ListDataTablesRequest {
  // Required. The parent resource where this data table will be created.
  // Format: projects/{project}/locations/{location}/instances/{instance}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "chronicle.googleapis.com/DataTable"
    }
  ];

  // Optional. The maximum number of data tables to return. The service may
  // return fewer than this value. If unspecified, at most 100 data tables will
  // be returned. The maximum value is 1000; values above 1000 will be coerced
  // to 1000.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token, received from a previous `ListDataTables` call.
  // Provide this to retrieve the subsequent page.
  // When paginating, all other parameters provided to
  // `ListDataTables` must match the call that provided the page
  // token.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Configures ordering of DataTables in the response.
  // Note: Our implementation currently supports order by "create_time asc" only
  string order_by = 4 [(google.api.field_behavior) = OPTIONAL];
}

// Request message for deleting data tables.
message DeleteDataTableRequest {
  // Required. The resource name of the data table to delete.
  // Format
  // projects/{project}/locations/{location}/instances/{instances}/dataTables/{data_table}
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "chronicle.googleapis.com/DataTable"
    }
  ];

  // Optional. If set to true, any rows under this data table will also be
  // deleted. (Otherwise, the request will only work if the data table has no
  // rows.)
  bool force = 2 [(google.api.field_behavior) = OPTIONAL];
}

// Response message for listing data tables.
message ListDataTablesResponse {
  // The list of the data tables returned.
  repeated DataTable data_tables = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request to create data table row.
message CreateDataTableRowRequest {
  // Required. The resource id of the data table.
  // Format:
  // /projects/{project}/locations/{location}/instances/{instance}/dataTables/{data_table}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "chronicle.googleapis.com/DataTableRow"
    }
  ];

  // Required. The data table row to create.
  DataTableRow data_table_row = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request to update data table row.
message UpdateDataTableRowRequest {
  // Required. Format:
  // projects/{project}/locations/{location}/instances/{instance}/dataTables/{data_table}/dataTableRows/{data_table_row}
  DataTableRow data_table_row = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. The list of fields to update. Currently data table rows only
  // support updating the `values` field. When no field mask is supplied, all
  // non-empty fields will be updated. A field mask of "*" will update all
  // fields, whether empty or not.
  google.protobuf.FieldMask update_mask = 2
      [(google.api.field_behavior) = OPTIONAL];
}

// Request to list data table rows.
message ListDataTableRowsRequest {
  // Required. The resource id of the data table.
  // Format:
  // projects/{project}/locations/{locations}/instances/{instance}/dataTables/{data_table}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "chronicle.googleapis.com/DataTableRow"
    }
  ];

  // Optional. The maximum number of data table rows to return. The service may
  // return fewer than this value. If unspecified, at most 100 data table rows
  // will be returned. The maximum value is 1000; values above 1000 will be
  // coerced to 1000.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token, received from a previous `ListDataTableRows` call.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Configures ordering of DataTables in the response.
  // Note: Our implementation currently supports order by "create_time asc" only
  string order_by = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Filter facilitating search over data table rows. This filter
  // performs a case-insensitive substring match on the row values.
  string filter = 5 [(google.api.field_behavior) = OPTIONAL];
}

// Response message for listing data table rows.
message ListDataTableRowsResponse {
  // The list of the data table rows returned.
  repeated DataTableRow data_table_rows = 1;

  // Optional. A token, which can be sent as `page_token` to retrieve the next
  // page. If this field is omitted, there are no subsequent pages.
  string next_page_token = 2 [(google.api.field_behavior) = OPTIONAL];
}

// Request to get data table row.
message GetDataTableRowRequest {
  // Required. The resource name of the data table row i,e row_id.
  // Format:
  // projects/{project}/locations/{location}/instances/{instance}/dataTables/{data_table}/dataTableRows/{data_table_row}
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "chronicle.googleapis.com/DataTableRow"
    }
  ];
}

// Request to delete data table row.
message DeleteDataTableRowRequest {
  // Required. The resource name of the data table row i,e row_id.
  // Format:
  // projects/{project}/locations/{location}/instances/{instance}/dataTables/{data_table}/dataTableRows/{data_table_row}
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "chronicle.googleapis.com/DataTableRow"
    }
  ];
}

// Request to create data table rows in bulk.
message BulkCreateDataTableRowsRequest {
  // Required. The resource id of the data table.
  // Format:
  // /projects/{project}/locations/{location}/instances/{instance}/dataTables/{data_table}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "chronicle.googleapis.com/DataTableRow"
    }
  ];

  // Required. Data table rows to create. A maximum of 1000 rows (for sync
  // requests) or 2000 rows (for async requests) can be created in a single
  // request. Total size of the rows should be less than 4MB.
  repeated CreateDataTableRowRequest requests = 2
      [(google.api.field_behavior) = REQUIRED];
}

// Response message with created data table rows.
message BulkCreateDataTableRowsResponse {
  // DataTableRows created
  repeated DataTableRow data_table_rows = 1;
}

// Request to get data table rows in bulk.
message BulkGetDataTableRowsRequest {
  // Required. The resource id of the data table.
  // Format:
  // /projects/{project}/locations/{location}/instances/{instance}/dataTables/{data_table}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "chronicle.googleapis.com/DataTableRow"
    }
  ];

  // Required. Data table rows to get. At max 1,000 rows can be there in a
  // request.
  repeated GetDataTableRowRequest requests = 2
      [(google.api.field_behavior) = REQUIRED];
}

// Response message with data table rows.
message BulkGetDataTableRowsResponse {
  // The requested data table rows.
  repeated DataTableRow data_table_rows = 1;
}

// Request to replace data table rows in bulk.
message BulkReplaceDataTableRowsRequest {
  // Required. The resource id of the data table.
  // Format:
  // /projects/{project}/locations/{location}/instances/{instance}/dataTables/{data_table}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "chronicle.googleapis.com/DataTableRow"
    }
  ];

  // Required. Data table rows to replace the existing data table rows. A
  // maximum of 1000 rows (for sync requests) or 2000 rows (for async requests)
  // can be replaced in a single request. Total size of the rows should be less
  // than 4MB.
  repeated CreateDataTableRowRequest requests = 2
      [(google.api.field_behavior) = REQUIRED];
}

// Response message with data table rows that replaced existing data table rows.
message BulkReplaceDataTableRowsResponse {
  // DataTableRows that replaced existing data table rows
  repeated DataTableRow data_table_rows = 1;
}

// Request to update data table rows in bulk.
message BulkUpdateDataTableRowsRequest {
  // Required. The resource id of the data table.
  // Format:
  // /projects/{project}/locations/{location}/instances/{instance}/dataTables/{data_table}
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "chronicle.googleapis.com/DataTableRow"
    }
  ];

  // Required. Data table rows to update. At max 1,000 rows (or rows with size
  // less than 2MB) can be there in a request.
  repeated UpdateDataTableRowRequest requests = 2
      [(google.api.field_behavior) = REQUIRED];
}

// Response message with updated data table rows.
message BulkUpdateDataTableRowsResponse {
  // DataTableRows updated
  repeated DataTableRow data_table_rows = 1;
}

// DataTableScopeInfo specifies the scope info of the data table.
message DataTableScopeInfo {
  // Required. Contains the list of scope names of the data table. If the list
  // is empty, the data table is treated as unscoped. The scope names should be
  // full resource names and should be of the format:
  // "projects/{project}/locations/{location}/instances/{instance}/dataAccessScopes/{scope_name}"
  repeated string data_access_scopes = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "chronicle.googleapis.com/DataAccessScope"
    }
  ];
}

// DataTable represents the data table resource.
message DataTable {
  option (google.api.resource) = {
    type: "chronicle.googleapis.com/DataTable"
    pattern: "projects/{project}/locations/{location}/instances/{instance}/dataTables/{data_table}"
    plural: "dataTables"
    singular: "dataTable"
  };

  // Identifier. The resource name of the data table
  // Format:
  // "{project}/locations/{location}/instances/{instance}/dataTables/{data_table}"
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Output only. The unique display name of the data table.
  string display_name = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. A user-provided description of the data table.
  string description = 3 [(google.api.field_behavior) = REQUIRED];

  // Output only. Table create time
  google.protobuf.Timestamp create_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Table update time
  google.protobuf.Timestamp update_time = 5
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. Details of all the columns in the table
  repeated DataTableColumnInfo column_info = 6
      [(google.api.field_behavior) = IMMUTABLE];

  // Output only. Data table unique id
  string data_table_uuid = 7 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The resource names for the associated Rules that use this
  // data table. Format:
  // projects/{project}/locations/{location}/instances/{instance}/rules/{rule}.
  // {rule} here refers to the rule id.
  repeated string rules = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The count of rules using the data table.
  int32 rule_associations_count = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. User-provided TTL of the data table.
  string row_time_to_live = 10 [(google.api.field_behavior) = OPTIONAL];

  // Output only. The count of rows in the data table.
  int64 approximate_row_count = 11 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. The scope info of the data table.
  // During data table creation, if this field is not set, the data
  // table without scopes (an unscoped table) will be created for a global
  // user. For a scoped user, this field must be set. During data table
  // update, if scope_info is requested to be updated, this field must be set.
  DataTableScopeInfo scope_info = 12 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Source of the data table update.
  DataTableUpdateSource update_source = 13
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Last update time of the TTL of the data table.
  google.protobuf.Timestamp row_time_to_live_update_time = 14
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// DataTableRow represents a single row in a data table.
message DataTableRow {
  option (google.api.resource) = {
    type: "chronicle.googleapis.com/DataTableRow"
    pattern: "projects/{project}/locations/{location}/instances/{instance}/dataTables/{data_table}/dataTableRows/{data_table_row}"
    plural: "dataTableRows"
    singular: "dataTableRow"
  };

  // Identifier. The resource name of the data table
  // Format:
  // projects/{project}/locations/{location}/instances/{instance}/dataTables/{data_table}/dataTableRows/{data_table_row}
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Required. All column values for a single row. The values should be in the
  // same order as the columns of the data tables.
  repeated string values = 2 [(google.api.field_behavior) = REQUIRED];

  // Output only. DataTableRow create time
  google.protobuf.Timestamp create_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. DataTableRow update time
  google.protobuf.Timestamp update_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. User-provided TTL of the data table row.
  string row_time_to_live = 5 [(google.api.field_behavior) = OPTIONAL];
}

// DataTableColumnInfo represents the column metadata of the
// datatable. The column_index represents the ordering of the
// values in DataTableRow.
message DataTableColumnInfo {
  // DataTableColumnType denotes the type of the column to be referenced in the
  // rule.
  enum DataTableColumnType {
    // The default Data Table Column Type.
    DATA_TABLE_COLUMN_TYPE_UNSPECIFIED = 0;

    // Denotes the type of the column as STRING.
    STRING = 1;

    // Denotes the type of the column as REGEX.
    REGEX = 2;

    // Denotes the type of the column as CIDR.
    CIDR = 3;

    // Denotes the type of the column as NUMBER (includes int and float).
    NUMBER = 4;
  }

  oneof path_or_type {
    // Entity proto field path that the column is mapped to
    string mapped_column_path = 3;

    // Column type can be STRING, CIDR (Ex- 10.1.1.0/24), REGEX
    DataTableColumnType column_type = 4;
  }

  // Required. Column Index. 0,1,2...
  int32 column_index = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Original column name of the Data Table (present in the CSV header
  // in case of creation of data tables using file uploads). It must satisfy the
  // following requirements:
  // - Starts with letter.
  // - Contains only letters, numbers and underscore.
  // - Must be unique and has length < 256.
  string original_column = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. Whether to include this column in the calculation of the row ID.
  // If no columns have key_column = true, all columns will be included in the
  // calculation of the row ID.
  bool key_column = 5 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Whether the column is a repeated values column.
  bool repeated_values = 6 [(google.api.field_behavior) = OPTIONAL];
}

// The request message for GetDataTableOperationErrors.
message GetDataTableOperationErrorsRequest {
  // Required. Resource name for the data table operation errors.
  // Format:
  // projects/{project}/locations/{location}/instances/{instance}/dataTableOperationErrors/{data_table_operation_errors}
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "chronicle.googleapis.com/DataTableOperationErrors"
    }
  ];
}

// The message containing the errors for a data table operation.
message DataTableOperationErrors {
  option (google.api.resource) = {
    type: "chronicle.googleapis.com/DataTableOperationErrors"
    pattern: "projects/{project}/locations/{location}/instances/{instance}/dataTableOperationErrors/{data_table_operation_errors}"
    plural: "dataTableOperationErrors"
    singular: "dataTableOperationErrors"
  };

  // Identifier. Resource name for the data table operation errors.
  // Format:
  // projects/{project}/locations/{location}/instances/{instance}/dataTableOperationErrors/{data_table_operation_errors}
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // The list of errors.
  // Replaces the deprecated `errors` field.
  repeated google.rpc.Status rpc_errors = 3;
}
