// 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.cloud.datastream.v1;

import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";

option csharp_namespace = "Google.Cloud.Datastream.V1";
option go_package = "cloud.google.com/go/datastream/apiv1/datastreampb;datastreampb";
option java_multiple_files = true;
option java_outer_classname = "DatastreamResourcesProto";
option java_package = "com.google.cloud.datastream.v1";
option php_namespace = "Google\\Cloud\\Datastream\\V1";
option ruby_package = "Google::Cloud::Datastream::V1";
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/Networks"
  pattern: "projects/{project}/global/networks/{network}"
};
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/NetworkAttachment"
  pattern: "projects/{project}/regions/{region}/networkAttachments/{network_attachment}"
};

// Oracle database profile.
message OracleProfile {
  // Required. Hostname for the Oracle connection.
  string hostname = 1 [(google.api.field_behavior) = REQUIRED];

  // Port for the Oracle connection, default value is 1521.
  int32 port = 2;

  // Required. Username for the Oracle connection.
  string username = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. Password for the Oracle connection. Mutually exclusive with the
  // `secret_manager_stored_password` field.
  string password = 4 [(google.api.field_behavior) = OPTIONAL];

  // Required. Database for the Oracle connection.
  string database_service = 5 [(google.api.field_behavior) = REQUIRED];

  // Connection string attributes
  map<string, string> connection_attributes = 6;

  // Optional. SSL configuration for the Oracle connection.
  OracleSslConfig oracle_ssl_config = 7
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Configuration for Oracle ASM connection.
  OracleAsmConfig oracle_asm_config = 8
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. A reference to a Secret Manager resource name storing the Oracle
  // connection password. Mutually exclusive with the `password` field.
  string secret_manager_stored_password = 9
      [(google.api.field_behavior) = OPTIONAL];
}

// Configuration for Oracle Automatic Storage Management (ASM) connection.
message OracleAsmConfig {
  // Required. Hostname for the Oracle ASM connection.
  string hostname = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Port for the Oracle ASM connection.
  int32 port = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. Username for the Oracle ASM connection.
  string username = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. Password for the Oracle ASM connection. Mutually exclusive with
  // the `secret_manager_stored_password` field.
  string password = 4 [(google.api.field_behavior) = OPTIONAL];

  // Required. ASM service name for the Oracle ASM connection.
  string asm_service = 5 [(google.api.field_behavior) = REQUIRED];

  // Optional. Connection string attributes
  map<string, string> connection_attributes = 6
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. SSL configuration for the Oracle connection.
  OracleSslConfig oracle_ssl_config = 7
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. A reference to a Secret Manager resource name storing the Oracle
  // ASM connection password. Mutually exclusive with the `password` field.
  string secret_manager_stored_password = 8
      [(google.api.field_behavior) = OPTIONAL];
}

// MySQL database profile.
message MysqlProfile {
  // Required. Hostname for the MySQL connection.
  string hostname = 1 [(google.api.field_behavior) = REQUIRED];

  // Port for the MySQL connection, default value is 3306.
  int32 port = 2;

  // Required. Username for the MySQL connection.
  string username = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. Input only. Password for the MySQL connection. Mutually exclusive
  // with the `secret_manager_stored_password` field.
  string password = 4 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.field_behavior) = INPUT_ONLY
  ];

  // SSL configuration for the MySQL connection.
  MysqlSslConfig ssl_config = 5;

  // Optional. A reference to a Secret Manager resource name storing the MySQL
  // connection password. Mutually exclusive with the `password` field.
  string secret_manager_stored_password = 6
      [(google.api.field_behavior) = OPTIONAL];
}

// PostgreSQL database profile.
message PostgresqlProfile {
  // Required. Hostname for the PostgreSQL connection.
  string hostname = 1 [(google.api.field_behavior) = REQUIRED];

  // Port for the PostgreSQL connection, default value is 5432.
  int32 port = 2;

  // Required. Username for the PostgreSQL connection.
  string username = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. Password for the PostgreSQL connection. Mutually exclusive with
  // the `secret_manager_stored_password` field.
  string password = 4 [(google.api.field_behavior) = OPTIONAL];

  // Required. Database for the PostgreSQL connection.
  string database = 5 [(google.api.field_behavior) = REQUIRED];

  // Optional. A reference to a Secret Manager resource name storing the
  // PostgreSQL connection password. Mutually exclusive with the `password`
  // field.
  string secret_manager_stored_password = 6
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. SSL configuration for the PostgreSQL connection.
  // In case PostgresqlSslConfig is not set, the connection will use the default
  // SSL mode, which is `prefer` (i.e. this mode will only use encryption if
  // enabled from database side, otherwise will use unencrypted communication)
  PostgresqlSslConfig ssl_config = 7 [(google.api.field_behavior) = OPTIONAL];
}

// SQLServer database profile.
message SqlServerProfile {
  // Required. Hostname for the SQLServer connection.
  string hostname = 1 [(google.api.field_behavior) = REQUIRED];

  // Port for the SQLServer connection, default value is 1433.
  int32 port = 2;

  // Required. Username for the SQLServer connection.
  string username = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. Password for the SQLServer connection. Mutually exclusive with
  // the `secret_manager_stored_password` field.
  string password = 4 [(google.api.field_behavior) = OPTIONAL];

  // Required. Database for the SQLServer connection.
  string database = 5 [(google.api.field_behavior) = REQUIRED];

  // Optional. A reference to a Secret Manager resource name storing the
  // SQLServer connection password. Mutually exclusive with the `password`
  // field.
  string secret_manager_stored_password = 7
      [(google.api.field_behavior) = OPTIONAL];
}

// Salesforce profile
message SalesforceProfile {
  // Username-password credentials.
  message UserCredentials {
    // Required. Username for the Salesforce connection.
    string username = 1 [(google.api.field_behavior) = REQUIRED];

    // Optional. Password for the Salesforce connection.
    // Mutually exclusive with the `secret_manager_stored_password` field.
    string password = 2 [(google.api.field_behavior) = OPTIONAL];

    // Optional. Security token for the Salesforce connection.
    // Mutually exclusive with the `secret_manager_stored_security_token` field.
    string security_token = 3 [(google.api.field_behavior) = OPTIONAL];

    // Optional. A reference to a Secret Manager resource name storing the
    // Salesforce connection's password. Mutually exclusive with the `password`
    // field.
    string secret_manager_stored_password = 4
        [(google.api.field_behavior) = OPTIONAL];

    // Optional. A reference to a Secret Manager resource name storing the
    // Salesforce connection's security token. Mutually exclusive with the
    // `security_token` field.
    string secret_manager_stored_security_token = 5
        [(google.api.field_behavior) = OPTIONAL];
  }

  // OAuth2 Client Credentials.
  message Oauth2ClientCredentials {
    // Required. Client ID for Salesforce OAuth2 Client Credentials.
    string client_id = 1 [(google.api.field_behavior) = REQUIRED];

    // Optional. Client secret for Salesforce OAuth2 Client Credentials.
    // Mutually exclusive with the `secret_manager_stored_client_secret` field.
    string client_secret = 2 [(google.api.field_behavior) = OPTIONAL];

    // Optional. A reference to a Secret Manager resource name storing the
    // Salesforce OAuth2 client_secret. Mutually exclusive with the
    // `client_secret` field.
    string secret_manager_stored_client_secret = 3
        [(google.api.field_behavior) = OPTIONAL];
  }

  // Required. Domain endpoint for the Salesforce connection.
  string domain = 1 [(google.api.field_behavior) = REQUIRED];

  // Credentials for Salesforce connection.
  oneof credentials {
    // User-password authentication.
    UserCredentials user_credentials = 2;

    // Connected app authentication.
    Oauth2ClientCredentials oauth2_client_credentials = 3;
  }
}

// MongoDB profile.
message MongodbProfile {
  // Required. List of host addresses for a MongoDB cluster.
  // For SRV connection format, this list must contain exactly one DNS host
  // without a port. For Standard connection format, this list must contain all
  // the required hosts in the cluster with their respective ports.
  repeated HostAddress host_addresses = 1
      [(google.api.field_behavior) = REQUIRED];

  // Optional. Name of the replica set. Only needed for self hosted replica set
  // type MongoDB cluster. For SRV connection format, this field must be empty.
  // For Standard connection format, this field must be specified.
  string replica_set = 2 [(google.api.field_behavior) = OPTIONAL];

  // Required. Username for the MongoDB connection.
  string username = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. Password for the MongoDB connection. Mutually exclusive with the
  // `secret_manager_stored_password` field.
  string password = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A reference to a Secret Manager resource name storing the
  // SQLServer connection password. Mutually exclusive with the `password`
  // field.
  string secret_manager_stored_password = 5
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. SSL configuration for the MongoDB connection.
  MongodbSslConfig ssl_config = 6 [(google.api.field_behavior) = OPTIONAL];

  // MongoDB connection format.
  // Must specify either srv_connection_format or standard_connection_format.
  oneof mongodb_connection_format {
    // Srv connection format.
    SrvConnectionFormat srv_connection_format = 101;

    // Standard connection format.
    StandardConnectionFormat standard_connection_format = 102;
  }
}

// A HostAddress represents a transport end point, which is the combination
// of an IP address or hostname and a port number.
message HostAddress {
  // Required. Hostname for the connection.
  string hostname = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. Port for the connection.
  int32 port = 2 [(google.api.field_behavior) = OPTIONAL];
}

// Srv connection format.
message SrvConnectionFormat {}

// Standard connection format.
message StandardConnectionFormat {
  // Optional. Specifies whether the client connects directly to the host[:port]
  // in the connection URI.
  bool direct_connection = 1 [(google.api.field_behavior) = OPTIONAL];
}

// Cloud Storage bucket profile.
message GcsProfile {
  // Required. The Cloud Storage bucket name.
  string bucket = 1 [(google.api.field_behavior) = REQUIRED];

  // The root path inside the Cloud Storage bucket.
  string root_path = 2;
}

// BigQuery warehouse profile.
message BigQueryProfile {}

// Static IP address connectivity. Used when the source database is configured
// to allow incoming connections from the Datastream public IP addresses
// for the region specified in the connection profile.
message StaticServiceIpConnectivity {}

// Forward SSH Tunnel connectivity.
message ForwardSshTunnelConnectivity {
  // Required. Hostname for the SSH tunnel.
  string hostname = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Username for the SSH tunnel.
  string username = 2 [(google.api.field_behavior) = REQUIRED];

  // Port for the SSH tunnel, default value is 22.
  int32 port = 3;

  oneof authentication_method {
    // Input only. SSH password.
    string password = 100 [(google.api.field_behavior) = INPUT_ONLY];

    // Input only. SSH private key.
    string private_key = 101 [(google.api.field_behavior) = INPUT_ONLY];
  }
}

// The VPC Peering configuration is used to create VPC peering between
// Datastream and the consumer's VPC.
message VpcPeeringConfig {
  // Required. Fully qualified name of the VPC that Datastream will peer to.
  // Format: `projects/{project}/global/{networks}/{name}`
  string vpc = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "compute.googleapis.com/Networks"
    }
  ];

  // Required. A free subnet for peering. (CIDR of /29)
  string subnet = 2 [(google.api.field_behavior) = REQUIRED];
}

// The PSC Interface configuration is used to create PSC Interface between
// Datastream and the consumer's PSC.
message PscInterfaceConfig {
  // Required. Fully qualified name of the Network Attachment that Datastream
  // will connect to. Format:
  // `projects/{project}/regions/{region}/networkAttachments/{name}`
  string network_attachment = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "compute.googleapis.com/NetworkAttachment"
    }
  ];
}

// The PrivateConnection resource is used to establish private connectivity
// between Datastream and a customer's network.
message PrivateConnection {
  option (google.api.resource) = {
    type: "datastream.googleapis.com/PrivateConnection"
    pattern: "projects/{project}/locations/{location}/privateConnections/{private_connection}"
  };

  // Private Connection state.
  enum State {
    // Unspecified state.
    STATE_UNSPECIFIED = 0;

    // The private connection is in creation state - creating resources.
    CREATING = 1;

    // The private connection has been created with all of its resources.
    CREATED = 2;

    // The private connection creation has failed.
    FAILED = 3;

    // The private connection is being deleted.
    DELETING = 4;

    // Delete request has failed, resource is in invalid state.
    FAILED_TO_DELETE = 5;
  }

  // Output only. Identifier. The resource's name.
  string name = 1 [
    (google.api.field_behavior) = IDENTIFIER,
    (google.api.field_behavior) = OUTPUT_ONLY
  ];

  // Output only. The create time of the resource.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The update time of the resource.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Labels.
  map<string, string> labels = 4;

  // Required. Display name.
  string display_name = 5 [(google.api.field_behavior) = REQUIRED];

  // Output only. The state of the Private Connection.
  State state = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. In case of error, the details of the error in a user-friendly
  // format.
  Error error = 7 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Reserved for future use.
  optional bool satisfies_pzs = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Reserved for future use.
  optional bool satisfies_pzi = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

  // VPC Peering Config.
  VpcPeeringConfig vpc_peering_config = 100;

  // PSC Interface Config.
  PscInterfaceConfig psc_interface_config = 101;
}

// Private Connectivity
message PrivateConnectivity {
  // Required. A reference to a private connection resource.
  // Format: `projects/{project}/locations/{location}/privateConnections/{name}`
  string private_connection = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "datastream.googleapis.com/PrivateConnection"
    }
  ];
}

// The route resource is the child of the private connection resource,
// used for defining a route for a private connection.
message Route {
  option (google.api.resource) = {
    type: "datastream.googleapis.com/Route"
    pattern: "projects/{project}/locations/{location}/privateConnections/{private_connection}/routes/{route}"
  };

  // Output only. Identifier. The resource's name.
  string name = 1 [
    (google.api.field_behavior) = IDENTIFIER,
    (google.api.field_behavior) = OUTPUT_ONLY
  ];

  // Output only. The create time of the resource.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The update time of the resource.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Labels.
  map<string, string> labels = 4;

  // Required. Display name.
  string display_name = 5 [(google.api.field_behavior) = REQUIRED];

  // Required. Destination address for connection
  string destination_address = 6 [(google.api.field_behavior) = REQUIRED];

  // Destination port for connection
  int32 destination_port = 7;
}

// MongoDB SSL configuration information.
message MongodbSslConfig {
  // Optional. Input only. PEM-encoded private key associated with the Client
  // Certificate. If this field is used then the 'client_certificate' and the
  // 'ca_certificate' fields are mandatory.
  string client_key = 1 [
    (google.api.field_behavior) = INPUT_ONLY,
    (google.api.field_behavior) = OPTIONAL
  ];

  // Output only. Indicates whether the client_key field is set.
  bool client_key_set = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Input only. PEM-encoded certificate that will be used by the
  // replica to authenticate against the source database server. If this field
  // is used then the 'client_key' and the 'ca_certificate' fields are
  // mandatory.
  string client_certificate = 3 [
    (google.api.field_behavior) = INPUT_ONLY,
    (google.api.field_behavior) = OPTIONAL
  ];

  // Output only. Indicates whether the client_certificate field is set.
  bool client_certificate_set = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Input only. PEM-encoded certificate of the CA that signed the
  // source database server's certificate.
  string ca_certificate = 5 [
    (google.api.field_behavior) = INPUT_ONLY,
    (google.api.field_behavior) = OPTIONAL
  ];

  // Output only. Indicates whether the ca_certificate field is set.
  bool ca_certificate_set = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Input only. A reference to a Secret Manager resource name storing
  // the PEM-encoded private key associated with the Client Certificate. If this
  // field is used then the 'client_certificate' and the 'ca_certificate' fields
  // are mandatory. Mutually exclusive with the `client_key` field.
  string secret_manager_stored_client_key = 7 [
    (google.api.field_behavior) = INPUT_ONLY,
    (google.api.field_behavior) = OPTIONAL
  ];
}

// MySQL SSL configuration information.
message MysqlSslConfig {
  // Optional. Input only. PEM-encoded private key associated with the Client
  // Certificate. If this field is used then the 'client_certificate' and the
  // 'ca_certificate' fields are mandatory.
  string client_key = 1 [
    (google.api.field_behavior) = INPUT_ONLY,
    (google.api.field_behavior) = OPTIONAL
  ];

  // Output only. Indicates whether the client_key field is set.
  bool client_key_set = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Input only. PEM-encoded certificate that will be used by the
  // replica to authenticate against the source database server. If this field
  // is used then the 'client_key' and the 'ca_certificate' fields are
  // mandatory.
  string client_certificate = 3 [
    (google.api.field_behavior) = INPUT_ONLY,
    (google.api.field_behavior) = OPTIONAL
  ];

  // Output only. Indicates whether the client_certificate field is set.
  bool client_certificate_set = 4 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Input only. PEM-encoded certificate of the CA that signed the source
  // database server's certificate.
  string ca_certificate = 5 [(google.api.field_behavior) = INPUT_ONLY];

  // Output only. Indicates whether the ca_certificate field is set.
  bool ca_certificate_set = 6 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Oracle SSL configuration information.
message OracleSslConfig {
  // Input only. PEM-encoded certificate of the CA that signed the source
  // database server's certificate.
  string ca_certificate = 1 [(google.api.field_behavior) = INPUT_ONLY];

  // Output only. Indicates whether the ca_certificate field has been set for
  // this Connection-Profile.
  bool ca_certificate_set = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. The distinguished name (DN) mentioned in the server
  // certificate. This corresponds to SSL_SERVER_CERT_DN sqlnet parameter.
  // Refer
  // https://docs.oracle.com/en/database/oracle/oracle-database/19/netrf/local-naming-parameters-in-tns-ora-file.html#GUID-70AB0695-A9AA-4A94-B141-4C605236EEB7
  // If this field is not provided, the DN matching is not enforced.
  string server_certificate_distinguished_name = 3
      [(google.api.field_behavior) = OPTIONAL];
}

// PostgreSQL SSL configuration information.
message PostgresqlSslConfig {
  // Message represents the option where Datastream will enforce the encryption
  // and authenticate the server identity. ca_certificate must be set if user
  // selects this option.
  message ServerVerification {
    // Required. Input only. PEM-encoded server root CA certificate.
    string ca_certificate = 1 [
      (google.api.field_behavior) = INPUT_ONLY,
      (google.api.field_behavior) = REQUIRED
    ];

    // Optional. The hostname mentioned in the Subject or SAN extension of the
    // server certificate. If this field is not provided, the hostname in the
    // server certificate is not validated.
    string server_certificate_hostname = 2
        [(google.api.field_behavior) = OPTIONAL];
  }

  // Message represents the option where Datastream will enforce the encryption
  // and authenticate the server identity as well as the client identity.
  // ca_certificate, client_certificate and client_key must be set if user
  // selects this option.
  message ServerAndClientVerification {
    // Required. Input only. PEM-encoded certificate used by the source database
    // to authenticate the client identity (i.e., the Datastream's identity).
    // This certificate is signed by either a root certificate trusted by the
    // server or one or more intermediate certificates (which is stored with the
    // leaf certificate) to link the this certificate to the trusted root
    // certificate.
    string client_certificate = 1 [
      (google.api.field_behavior) = INPUT_ONLY,
      (google.api.field_behavior) = REQUIRED
    ];

    // Optional. Input only. PEM-encoded private key associated with the client
    // certificate. This value will be used during the SSL/TLS handshake,
    // allowing the PostgreSQL server to authenticate the client's identity,
    // i.e. identity of the Datastream.
    string client_key = 2 [
      (google.api.field_behavior) = INPUT_ONLY,
      (google.api.field_behavior) = OPTIONAL
    ];

    // Required. Input only. PEM-encoded server root CA certificate.
    string ca_certificate = 3 [
      (google.api.field_behavior) = INPUT_ONLY,
      (google.api.field_behavior) = REQUIRED
    ];

    // Optional. The hostname mentioned in the Subject or SAN extension of the
    // server certificate. If this field is not provided, the hostname in the
    // server certificate is not validated.
    string server_certificate_hostname = 5
        [(google.api.field_behavior) = OPTIONAL];
  }

  // The encryption settings available for PostgreSQL connection profiles.
  // This captures various SSL mode supported by PostgreSQL, which includes
  // TLS encryption with server verification, TLS encryption with both server
  // and client verification and no TLS encryption.
  oneof encryption_setting {
    //  If this field is set, the communication will be encrypted with TLS
    //  encryption and the server identity will be authenticated.
    ServerVerification server_verification = 1;

    // If this field is set, the communication will be encrypted with TLS
    // encryption and both the server identity and the client identity will be
    // authenticated.
    ServerAndClientVerification server_and_client_verification = 2;
  }
}

// A set of reusable connection configurations to be used as a source or
// destination for a stream.
message ConnectionProfile {
  option (google.api.resource) = {
    type: "datastream.googleapis.com/ConnectionProfile"
    pattern: "projects/{project}/locations/{location}/connectionProfiles/{connection_profile}"
  };

  // Output only. Identifier. The resource's name.
  string name = 1 [
    (google.api.field_behavior) = IDENTIFIER,
    (google.api.field_behavior) = OUTPUT_ONLY
  ];

  // Output only. The create time of the resource.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The update time of the resource.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Labels.
  map<string, string> labels = 4;

  // Required. Display name.
  string display_name = 5 [(google.api.field_behavior) = REQUIRED];

  // Output only. Reserved for future use.
  optional bool satisfies_pzs = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Reserved for future use.
  optional bool satisfies_pzi = 7 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Connection configuration for the ConnectionProfile.
  oneof profile {
    // Oracle ConnectionProfile configuration.
    OracleProfile oracle_profile = 100;

    // Cloud Storage ConnectionProfile configuration.
    GcsProfile gcs_profile = 101;

    // MySQL ConnectionProfile configuration.
    MysqlProfile mysql_profile = 102;

    // BigQuery Connection Profile configuration.
    BigQueryProfile bigquery_profile = 103;

    // PostgreSQL Connection Profile configuration.
    PostgresqlProfile postgresql_profile = 104;

    // SQLServer Connection Profile configuration.
    SqlServerProfile sql_server_profile = 105;

    // Salesforce Connection Profile configuration.
    SalesforceProfile salesforce_profile = 107;

    // MongoDB Connection Profile configuration.
    MongodbProfile mongodb_profile = 108;
  }

  // Connectivity options used to establish a connection to the profile.
  oneof connectivity {
    // Static Service IP connectivity.
    StaticServiceIpConnectivity static_service_ip_connectivity = 200;

    // Forward SSH tunnel connectivity.
    ForwardSshTunnelConnectivity forward_ssh_connectivity = 201;

    // Private connectivity.
    PrivateConnectivity private_connectivity = 202;
  }
}

// Oracle Column.
message OracleColumn {
  // Column name.
  string column = 1;

  // The Oracle data type.
  string data_type = 2;

  // Column length.
  int32 length = 3;

  // Column precision.
  int32 precision = 4;

  // Column scale.
  int32 scale = 5;

  // Column encoding.
  string encoding = 6;

  // Whether or not the column represents a primary key.
  bool primary_key = 7;

  // Whether or not the column can accept a null value.
  bool nullable = 8;

  // The ordinal position of the column in the table.
  int32 ordinal_position = 9;
}

// Oracle table.
message OracleTable {
  // Table name.
  string table = 1;

  // Oracle columns in the schema.
  // When unspecified as part of include/exclude objects, includes/excludes
  // everything.
  repeated OracleColumn oracle_columns = 2;
}

// Oracle schema.
message OracleSchema {
  // Schema name.
  string schema = 1;

  // Tables in the schema.
  repeated OracleTable oracle_tables = 2;
}

// Oracle database structure.
message OracleRdbms {
  // Oracle schemas/databases in the database server.
  repeated OracleSchema oracle_schemas = 1;
}

// Oracle data source configuration
message OracleSourceConfig {
  // Configuration to drop large object values.
  message DropLargeObjects {}

  // Configuration to stream large object values.
  message StreamLargeObjects {}

  // Configuration to use LogMiner CDC method.
  message LogMiner {}

  // Configuration to use Binary Log Parser CDC technique.
  message BinaryLogParser {
    // Configuration to use Oracle ASM to access the log files.
    message OracleAsmLogFileAccess {}

    // Configuration to specify the Oracle directories to access the log files.
    message LogFileDirectories {
      // Required. Oracle directory for online logs.
      string online_log_directory = 1 [(google.api.field_behavior) = REQUIRED];

      // Required. Oracle directory for archived logs.
      string archived_log_directory = 2
          [(google.api.field_behavior) = REQUIRED];
    }

    // Configuration to specify how the log file should be accessed.
    oneof log_file_access {
      // Use Oracle ASM.
      OracleAsmLogFileAccess oracle_asm_log_file_access = 1;

      // Use Oracle directories.
      LogFileDirectories log_file_directories = 2;
    }
  }

  // Oracle objects to include in the stream.
  OracleRdbms include_objects = 1;

  // Oracle objects to exclude from the stream.
  OracleRdbms exclude_objects = 2;

  // Maximum number of concurrent CDC tasks. The number should be non-negative.
  // If not set (or set to 0), the system's default value is used.
  int32 max_concurrent_cdc_tasks = 3;

  // Maximum number of concurrent backfill tasks. The number should be
  // non-negative. If not set (or set to 0), the system's default value is used.
  int32 max_concurrent_backfill_tasks = 4;

  // The configuration for handle Oracle large objects.
  oneof large_objects_handling {
    // Drop large object values.
    DropLargeObjects drop_large_objects = 100;

    // Stream large object values.
    StreamLargeObjects stream_large_objects = 102;
  }

  // Configuration to select the CDC method.
  oneof cdc_method {
    // Use LogMiner.
    LogMiner log_miner = 103;

    // Use Binary Log Parser.
    BinaryLogParser binary_log_parser = 104;
  }
}

// PostgreSQL Column.
message PostgresqlColumn {
  // Column name.
  string column = 1;

  // The PostgreSQL data type.
  string data_type = 2;

  // Column length.
  int32 length = 3;

  // Column precision.
  int32 precision = 4;

  // Column scale.
  int32 scale = 5;

  // Whether or not the column represents a primary key.
  bool primary_key = 7;

  // Whether or not the column can accept a null value.
  bool nullable = 8;

  // The ordinal position of the column in the table.
  int32 ordinal_position = 9;
}

// PostgreSQL table.
message PostgresqlTable {
  // Table name.
  string table = 1;

  // PostgreSQL columns in the schema.
  // When unspecified as part of include/exclude objects,
  // includes/excludes everything.
  repeated PostgresqlColumn postgresql_columns = 2;
}

// PostgreSQL schema.
message PostgresqlSchema {
  // Schema name.
  string schema = 1;

  // Tables in the schema.
  repeated PostgresqlTable postgresql_tables = 2;
}

// PostgreSQL database structure.
message PostgresqlRdbms {
  // PostgreSQL schemas in the database server.
  repeated PostgresqlSchema postgresql_schemas = 1;
}

// PostgreSQL data source configuration
message PostgresqlSourceConfig {
  // PostgreSQL objects to include in the stream.
  PostgresqlRdbms include_objects = 1;

  // PostgreSQL objects to exclude from the stream.
  PostgresqlRdbms exclude_objects = 2;

  // Required. Immutable. The name of the logical replication slot that's
  // configured with the pgoutput plugin.
  string replication_slot = 3 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Required. The name of the publication that includes the set of all tables
  // that are defined in the stream's include_objects.
  string publication = 4 [(google.api.field_behavior) = REQUIRED];

  // Maximum number of concurrent backfill tasks. The number should be non
  // negative. If not set (or set to 0), the system's default value will be
  // used.
  int32 max_concurrent_backfill_tasks = 5;
}

// SQLServer Column.
message SqlServerColumn {
  // Column name.
  string column = 1;

  // The SQLServer data type.
  string data_type = 2;

  // Column length.
  int32 length = 3;

  // Column precision.
  int32 precision = 4;

  // Column scale.
  int32 scale = 5;

  // Whether or not the column represents a primary key.
  bool primary_key = 6;

  // Whether or not the column can accept a null value.
  bool nullable = 7;

  // The ordinal position of the column in the table.
  int32 ordinal_position = 8;
}

// SQLServer table.
message SqlServerTable {
  // Table name.
  string table = 1;

  // SQLServer columns in the schema.
  // When unspecified as part of include/exclude objects,
  // includes/excludes everything.
  repeated SqlServerColumn columns = 2;
}

// SQLServer schema.
message SqlServerSchema {
  // Schema name.
  string schema = 1;

  // Tables in the schema.
  repeated SqlServerTable tables = 2;
}

// SQLServer database structure.
message SqlServerRdbms {
  // SQLServer schemas in the database server.
  repeated SqlServerSchema schemas = 1;
}

// SQLServer data source configuration
message SqlServerSourceConfig {
  // SQLServer objects to include in the stream.
  SqlServerRdbms include_objects = 1;

  // SQLServer objects to exclude from the stream.
  SqlServerRdbms exclude_objects = 2;

  // Max concurrent CDC tasks.
  int32 max_concurrent_cdc_tasks = 3;

  // Max concurrent backfill tasks.
  int32 max_concurrent_backfill_tasks = 4;

  // Configuration to select the CDC read method for the stream.
  oneof cdc_method {
    // CDC reader reads from transaction logs.
    SqlServerTransactionLogs transaction_logs = 101;

    // CDC reader reads from change tables.
    SqlServerChangeTables change_tables = 102;
  }
}

// Configuration to use Transaction Logs CDC read method.
message SqlServerTransactionLogs {}

// Configuration to use Change Tables CDC read method.
message SqlServerChangeTables {}

// MySQL Column.
message MysqlColumn {
  // Column name.
  string column = 1;

  // The MySQL data type. Full data types list can be found here:
  // https://dev.mysql.com/doc/refman/8.0/en/data-types.html
  string data_type = 2;

  // Column length.
  int32 length = 3;

  // Column collation.
  string collation = 4;

  // Whether or not the column represents a primary key.
  bool primary_key = 5;

  // Whether or not the column can accept a null value.
  bool nullable = 6;

  // The ordinal position of the column in the table.
  int32 ordinal_position = 7;

  // Column precision.
  int32 precision = 8;

  // Column scale.
  int32 scale = 9;
}

// MySQL table.
message MysqlTable {
  // Table name.
  string table = 1;

  // MySQL columns in the database.
  // When unspecified as part of include/exclude objects, includes/excludes
  // everything.
  repeated MysqlColumn mysql_columns = 2;
}

// MySQL database.
message MysqlDatabase {
  // Database name.
  string database = 1;

  // Tables in the database.
  repeated MysqlTable mysql_tables = 2;
}

// MySQL database structure
message MysqlRdbms {
  // Mysql databases on the server
  repeated MysqlDatabase mysql_databases = 1;
}

// MySQL source configuration
message MysqlSourceConfig {
  // Use Binary log position based replication.
  message BinaryLogPosition {}

  // Use GTID based replication.
  message Gtid {}

  // MySQL objects to retrieve from the source.
  MysqlRdbms include_objects = 1;

  // MySQL objects to exclude from the stream.
  MysqlRdbms exclude_objects = 2;

  // Maximum number of concurrent CDC tasks. The number should be non negative.
  // If not set (or set to 0), the system's default value will be used.
  int32 max_concurrent_cdc_tasks = 3;

  // Maximum number of concurrent backfill tasks. The number should be non
  // negative. If not set (or set to 0), the system's default value will be
  // used.
  int32 max_concurrent_backfill_tasks = 4;

  // The CDC method to use for the stream.
  oneof cdc_method {
    // Use Binary log position based replication.
    BinaryLogPosition binary_log_position = 101;

    // Use GTID based replication.
    Gtid gtid = 102;
  }
}

// Salesforce source configuration
message SalesforceSourceConfig {
  // Salesforce objects to retrieve from the source.
  SalesforceOrg include_objects = 1;

  // Salesforce objects to exclude from the stream.
  SalesforceOrg exclude_objects = 2;

  // Required. Salesforce objects polling interval. The interval at which new
  // changes will be polled for each object. The duration must be between 5
  // minutes and 24 hours.
  google.protobuf.Duration polling_interval = 3
      [(google.api.field_behavior) = REQUIRED];
}

// Salesforce organization structure.
message SalesforceOrg {
  // Salesforce objects in the database server.
  repeated SalesforceObject objects = 1;
}

// Salesforce object.
message SalesforceObject {
  // Object name.
  string object_name = 1;

  // Salesforce fields.
  // When unspecified as part of include objects,
  // includes everything, when unspecified as part of exclude objects,
  // excludes nothing.
  repeated SalesforceField fields = 2;
}

// Salesforce field.
message SalesforceField {
  // Field name.
  string name = 1;

  // The data type.
  string data_type = 2;

  // Indicates whether the field can accept nil values.
  bool nillable = 3;
}

// MongoDB source configuration.
message MongodbSourceConfig {
  // MongoDB collections to include in the stream.
  MongodbCluster include_objects = 1;

  // MongoDB collections to exclude from the stream.
  MongodbCluster exclude_objects = 2;

  // Optional. Maximum number of concurrent backfill tasks. The number should be
  // non-negative and less than or equal to 50. If not set (or set to 0), the
  // system's default value is used
  int32 max_concurrent_backfill_tasks = 3
      [(google.api.field_behavior) = OPTIONAL];
}

// MongoDB Cluster structure.
message MongodbCluster {
  // MongoDB databases in the cluster.
  repeated MongodbDatabase databases = 1;
}

// MongoDB Database.
message MongodbDatabase {
  // Database name.
  string database = 1;

  // Collections in the database.
  repeated MongodbCollection collections = 2;
}

// MongoDB Collection.
message MongodbCollection {
  // Collection name.
  string collection = 1;

  // Fields in the collection.
  repeated MongodbField fields = 2;
}

// MongoDB Field.
message MongodbField {
  // Field name.
  string field = 1;
}

// The configuration of the stream source.
message SourceConfig {
  // Required. Source connection profile resource.
  // Format: `projects/{project}/locations/{location}/connectionProfiles/{name}`
  string source_connection_profile = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "datastream.googleapis.com/ConnectionProfile"
    }
  ];

  // Stream configuration that is specific to the data source type.
  oneof source_stream_config {
    // Oracle data source configuration.
    OracleSourceConfig oracle_source_config = 100;

    // MySQL data source configuration.
    MysqlSourceConfig mysql_source_config = 101;

    // PostgreSQL data source configuration.
    PostgresqlSourceConfig postgresql_source_config = 102;

    // SQLServer data source configuration.
    SqlServerSourceConfig sql_server_source_config = 103;

    // Salesforce data source configuration.
    SalesforceSourceConfig salesforce_source_config = 104;

    // MongoDB data source configuration.
    MongodbSourceConfig mongodb_source_config = 105;
  }
}

// AVRO file format configuration.
message AvroFileFormat {}

// JSON file format configuration.
message JsonFileFormat {
  // Schema file format.
  enum SchemaFileFormat {
    // Unspecified schema file format.
    SCHEMA_FILE_FORMAT_UNSPECIFIED = 0;

    // Do not attach schema file.
    NO_SCHEMA_FILE = 1;

    // Avro schema format.
    AVRO_SCHEMA_FILE = 2;
  }

  // Json file compression.
  enum JsonCompression {
    // Unspecified json file compression.
    JSON_COMPRESSION_UNSPECIFIED = 0;

    // Do not compress JSON file.
    NO_COMPRESSION = 1;

    // Gzip compression.
    GZIP = 2;
  }

  // The schema file format along JSON data files.
  SchemaFileFormat schema_file_format = 1;

  // Compression of the loaded JSON file.
  JsonCompression compression = 2;
}

// Google Cloud Storage destination configuration
message GcsDestinationConfig {
  // Path inside the Cloud Storage bucket to write data to.
  string path = 1;

  // The maximum file size to be saved in the bucket.
  int32 file_rotation_mb = 2;

  // The maximum duration for which new events are added before a file is
  // closed and a new file is created. Values within the range of 15-60 seconds
  // are allowed.
  google.protobuf.Duration file_rotation_interval = 3;

  // File Format that the data should be written in.
  oneof file_format {
    // AVRO file format configuration.
    AvroFileFormat avro_file_format = 100;

    // JSON file format configuration.
    JsonFileFormat json_file_format = 101;
  }
}

// BigQuery destination configuration
message BigQueryDestinationConfig {
  // A single target dataset to which all data will be streamed.
  message SingleTargetDataset {
    // The dataset ID of the target dataset.
    // DatasetIds allowed characters:
    // https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#datasetreference.
    string dataset_id = 1;
  }

  // Destination datasets are created so that hierarchy of the destination data
  // objects matches the source hierarchy.
  message SourceHierarchyDatasets {
    // Dataset template used for dynamic dataset creation.
    message DatasetTemplate {
      // Required. The geographic location where the dataset should reside. See
      // https://cloud.google.com/bigquery/docs/locations for supported
      // locations.
      string location = 1 [(google.api.field_behavior) = REQUIRED];

      // If supplied, every created dataset will have its name prefixed by the
      // provided value. The prefix and name will be separated by an underscore.
      // i.e. <prefix>_<dataset_name>.
      string dataset_id_prefix = 2;

      // Describes the Cloud KMS encryption key that will be used to
      // protect destination BigQuery table. The BigQuery Service Account
      // associated with your project requires access to this encryption key.
      // i.e.
      // projects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{cryptoKey}.
      // See https://cloud.google.com/bigquery/docs/customer-managed-encryption
      // for more information.
      string kms_key_name = 3;
    }

    // The dataset template to use for dynamic dataset creation.
    DatasetTemplate dataset_template = 2;

    // Optional. The project id of the BigQuery dataset. If not specified, the
    // project will be inferred from the stream resource.
    optional string project_id = 3 [(google.api.field_behavior) = OPTIONAL];
  }

  // The configuration for BLMT.
  message BlmtConfig {
    // Supported file formats for BigLake managed tables.
    enum FileFormat {
      // Default value.
      FILE_FORMAT_UNSPECIFIED = 0;

      // Parquet file format.
      PARQUET = 1;
    }

    // Supported table formats for BigLake managed tables.
    enum TableFormat {
      // Default value.
      TABLE_FORMAT_UNSPECIFIED = 0;

      // Iceberg table format.
      ICEBERG = 1;
    }

    // Required. The Cloud Storage bucket name.
    string bucket = 1 [(google.api.field_behavior) = REQUIRED];

    // The root path inside the Cloud Storage bucket.
    string root_path = 2;

    // Required. The bigquery connection.
    // Format: `{project}.{location}.{name}`
    string connection_name = 3 [(google.api.field_behavior) = REQUIRED];

    // Required. The file format.
    FileFormat file_format = 4 [(google.api.field_behavior) = REQUIRED];

    // Required. The table format.
    TableFormat table_format = 5 [(google.api.field_behavior) = REQUIRED];
  }

  // AppendOnly mode defines that all changes to a table will be written to the
  // destination table.
  message AppendOnly {}

  // Merge mode defines that all changes to a table will be merged at the
  // destination table.
  message Merge {}

  // Target dataset(s) configuration.
  oneof dataset_config {
    // Single destination dataset.
    SingleTargetDataset single_target_dataset = 201;

    // Source hierarchy datasets.
    SourceHierarchyDatasets source_hierarchy_datasets = 202;
  }

  // The guaranteed data freshness (in seconds) when querying tables created by
  // the stream. Editing this field will only affect new tables created in the
  // future, but existing tables will not be impacted. Lower values mean that
  // queries will return fresher data, but may result in higher cost.
  google.protobuf.Duration data_freshness = 300;

  // Optional. Big Lake Managed Tables (BLMT) configuration.
  BlmtConfig blmt_config = 1 [(google.api.field_behavior) = OPTIONAL];

  oneof write_mode {
    // The standard mode
    Merge merge = 301;

    // Append only mode
    AppendOnly append_only = 302;
  }
}

// The configuration of the stream destination.
message DestinationConfig {
  // Required. Destination connection profile resource.
  // Format: `projects/{project}/locations/{location}/connectionProfiles/{name}`
  string destination_connection_profile = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "datastream.googleapis.com/ConnectionProfile"
    }
  ];

  // Stream configuration that is specific to the data destination type.
  oneof destination_stream_config {
    // A configuration for how data should be loaded to Cloud Storage.
    GcsDestinationConfig gcs_destination_config = 100;

    // BigQuery destination configuration.
    BigQueryDestinationConfig bigquery_destination_config = 101;
  }
}

// A resource representing streaming data from a source to a destination.
message Stream {
  option (google.api.resource) = {
    type: "datastream.googleapis.com/Stream"
    pattern: "projects/{project}/locations/{location}/streams/{stream}"
  };

  // Stream state.
  enum State {
    // Unspecified stream state.
    STATE_UNSPECIFIED = 0;

    // The stream has been created but has not yet started streaming data.
    NOT_STARTED = 1;

    // The stream is running.
    RUNNING = 2;

    // The stream is paused.
    PAUSED = 3;

    // The stream is in maintenance mode.
    //
    // Updates are rejected on the resource in this state.
    MAINTENANCE = 4;

    // The stream is experiencing an error that is preventing data from being
    // streamed.
    FAILED = 5;

    // The stream has experienced a terminal failure.
    FAILED_PERMANENTLY = 6;

    // The stream is starting, but not yet running.
    STARTING = 7;

    // The Stream is no longer reading new events, but still writing events in
    // the buffer.
    DRAINING = 8;
  }

  // Backfill strategy to automatically backfill the Stream's objects.
  // Specific objects can be excluded.
  message BackfillAllStrategy {
    // List of objects to exclude.
    oneof excluded_objects {
      // Oracle data source objects to avoid backfilling.
      OracleRdbms oracle_excluded_objects = 1;

      // MySQL data source objects to avoid backfilling.
      MysqlRdbms mysql_excluded_objects = 2;

      // PostgreSQL data source objects to avoid backfilling.
      PostgresqlRdbms postgresql_excluded_objects = 3;

      // SQLServer data source objects to avoid backfilling
      SqlServerRdbms sql_server_excluded_objects = 4;

      // Salesforce data source objects to avoid backfilling
      SalesforceOrg salesforce_excluded_objects = 5;

      // MongoDB data source objects to avoid backfilling
      MongodbCluster mongodb_excluded_objects = 6;
    }
  }

  // Backfill strategy to disable automatic backfill for the Stream's objects.
  message BackfillNoneStrategy {}

  // Output only. Identifier. The stream's name.
  string name = 1 [
    (google.api.field_behavior) = IDENTIFIER,
    (google.api.field_behavior) = OUTPUT_ONLY
  ];

  // Output only. The creation time of the stream.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The last update time of the stream.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Labels.
  map<string, string> labels = 4;

  // Required. Display name.
  string display_name = 5 [(google.api.field_behavior) = REQUIRED];

  // Required. Source connection profile configuration.
  SourceConfig source_config = 6 [(google.api.field_behavior) = REQUIRED];

  // Required. Destination connection profile configuration.
  DestinationConfig destination_config = 7
      [(google.api.field_behavior) = REQUIRED];

  // The state of the stream.
  State state = 8;

  // Stream backfill strategy.
  oneof backfill_strategy {
    // Automatically backfill objects included in the stream source
    // configuration. Specific objects can be excluded.
    BackfillAllStrategy backfill_all = 101;

    // Do not automatically backfill any objects.
    BackfillNoneStrategy backfill_none = 102;
  }

  // Output only. Errors on the Stream.
  repeated Error errors = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. A reference to a KMS encryption key.
  // If provided, it will be used to encrypt the data.
  // If left blank, data will be encrypted using an internal Stream-specific
  // encryption key provisioned through KMS.
  optional string customer_managed_encryption_key = 10
      [(google.api.field_behavior) = IMMUTABLE];

  // Output only. If the stream was recovered, the time of the last recovery.
  // Note: This field is currently experimental.
  google.protobuf.Timestamp last_recovery_time = 13
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Reserved for future use.
  optional bool satisfies_pzs = 15 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Reserved for future use.
  optional bool satisfies_pzi = 16 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// A specific stream object (e.g a specific DB table).
message StreamObject {
  option (google.api.resource) = {
    type: "datastream.googleapis.com/StreamObject"
    pattern: "projects/{project}/locations/{location}/streams/{stream}/objects/{object}"
  };

  // Output only. Identifier. The object resource's name.
  string name = 1 [
    (google.api.field_behavior) = IDENTIFIER,
    (google.api.field_behavior) = OUTPUT_ONLY
  ];

  // Output only. The creation time of the object.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The last update time of the object.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Display name.
  string display_name = 5 [(google.api.field_behavior) = REQUIRED];

  // Output only. Active errors on the object.
  repeated Error errors = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The latest backfill job that was initiated for the stream object.
  BackfillJob backfill_job = 7;

  // The object identifier in the data source.
  SourceObjectIdentifier source_object = 8;
}

// Represents an identifier of an object in the data source.
message SourceObjectIdentifier {
  // Oracle data source object identifier.
  message OracleObjectIdentifier {
    // Required. The schema name.
    string schema = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. The table name.
    string table = 2 [(google.api.field_behavior) = REQUIRED];
  }

  // PostgreSQL data source object identifier.
  message PostgresqlObjectIdentifier {
    // Required. The schema name.
    string schema = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. The table name.
    string table = 2 [(google.api.field_behavior) = REQUIRED];
  }

  // Mysql data source object identifier.
  message MysqlObjectIdentifier {
    // Required. The database name.
    string database = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. The table name.
    string table = 2 [(google.api.field_behavior) = REQUIRED];
  }

  // SQLServer data source object identifier.
  message SqlServerObjectIdentifier {
    // Required. The schema name.
    string schema = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. The table name.
    string table = 2 [(google.api.field_behavior) = REQUIRED];
  }

  // Salesforce data source object identifier.
  message SalesforceObjectIdentifier {
    // Required. The object name.
    string object_name = 1 [(google.api.field_behavior) = REQUIRED];
  }

  // MongoDB data source object identifier.
  message MongodbObjectIdentifier {
    // Required. The database name.
    string database = 1 [(google.api.field_behavior) = REQUIRED];

    // Required. The collection name.
    string collection = 2 [(google.api.field_behavior) = REQUIRED];
  }

  // The identifier for an object in the data source.
  oneof source_identifier {
    // Oracle data source object identifier.
    OracleObjectIdentifier oracle_identifier = 1;

    // Mysql data source object identifier.
    MysqlObjectIdentifier mysql_identifier = 2;

    // PostgreSQL data source object identifier.
    PostgresqlObjectIdentifier postgresql_identifier = 3;

    // SQLServer data source object identifier.
    SqlServerObjectIdentifier sql_server_identifier = 4;

    // Salesforce data source object identifier.
    SalesforceObjectIdentifier salesforce_identifier = 5;

    // MongoDB data source object identifier.
    MongodbObjectIdentifier mongodb_identifier = 6;
  }
}

// Represents a backfill job on a specific stream object.
message BackfillJob {
  // State of the stream object's backfill job.
  enum State {
    // Default value.
    STATE_UNSPECIFIED = 0;

    // Backfill job was never started for the stream object (stream has backfill
    // strategy defined as manual or object was explicitly excluded from
    // automatic backfill).
    NOT_STARTED = 1;

    // Backfill job will start pending available resources.
    PENDING = 2;

    // Backfill job is running.
    ACTIVE = 3;

    // Backfill job stopped (next job run will start from beginning).
    STOPPED = 4;

    // Backfill job failed (due to an error).
    FAILED = 5;

    // Backfill completed successfully.
    COMPLETED = 6;

    // Backfill job failed since the table structure is currently unsupported
    // for backfill.
    UNSUPPORTED = 7;
  }

  // Triggering reason for a backfill job.
  enum Trigger {
    // Default value.
    TRIGGER_UNSPECIFIED = 0;

    // Object backfill job was triggered automatically according to the stream's
    // backfill strategy.
    AUTOMATIC = 1;

    // Object backfill job was triggered manually using the dedicated API.
    MANUAL = 2;
  }

  // Output only. Backfill job state.
  State state = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Backfill job's triggering reason.
  Trigger trigger = 2;

  // Output only. Backfill job's start time.
  google.protobuf.Timestamp last_start_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Backfill job's end time.
  google.protobuf.Timestamp last_end_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Errors which caused the backfill job to fail.
  repeated Error errors = 5 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Represent a user-facing Error.
message Error {
  // A title that explains the reason for the error.
  string reason = 1;

  // A unique identifier for this specific error,
  // allowing it to be traced throughout the system in logs and API responses.
  string error_uuid = 2;

  // A message containing more information about the error that occurred.
  string message = 3;

  // The time when the error occurred.
  google.protobuf.Timestamp error_time = 4;

  // Additional information about the error.
  map<string, string> details = 5;
}

// Contains the current validation results.
message ValidationResult {
  // A list of validations (includes both executed as well as not executed
  // validations).
  repeated Validation validations = 1;
}

// A validation to perform on a stream.
message Validation {
  // Validation execution state.
  enum State {
    // Unspecified state.
    STATE_UNSPECIFIED = 0;

    // Validation did not execute.
    NOT_EXECUTED = 1;

    // Validation failed.
    FAILED = 2;

    // Validation passed.
    PASSED = 3;

    // Validation executed with warnings.
    WARNING = 4;
  }

  // A short description of the validation.
  string description = 1;

  // Output only. Validation execution status.
  State state = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Messages reflecting the validation results.
  repeated ValidationMessage message = 3;

  // A custom code identifying this validation.
  string code = 4;
}

// Represent user-facing validation result message.
message ValidationMessage {
  // Validation message level.
  enum Level {
    // Unspecified level.
    LEVEL_UNSPECIFIED = 0;

    // Potentially cause issues with the Stream.
    WARNING = 1;

    // Definitely cause issues with the Stream.
    ERROR = 2;
  }

  // The result of the validation.
  string message = 1;

  // Message severity level (warning or error).
  Level level = 2;

  // Additional metadata related to the result.
  map<string, string> metadata = 3;

  // A custom code identifying this specific message.
  string code = 4;
}

// The strategy that the stream uses for CDC replication.
message CdcStrategy {
  // CDC strategy to start replicating from the most recent position in the
  // source.
  message MostRecentStartPosition {}

  // CDC strategy to resume replication from the next available position in the
  // source.
  message NextAvailableStartPosition {}

  // CDC strategy to start replicating from a specific position in the source.
  message SpecificStartPosition {
    oneof position {
      // MySQL specific log position to start replicating from.
      MysqlLogPosition mysql_log_position = 101;

      // Oracle SCN to start replicating from.
      OracleScnPosition oracle_scn_position = 102;

      // SqlServer LSN to start replicating from.
      SqlServerLsnPosition sql_server_lsn_position = 103;

      // MySQL GTID set to start replicating from.
      MysqlGtidPosition mysql_gtid_position = 104;
    }
  }

  // The position to start reading from when starting, resuming, or recovering
  // the stream.
  // If not set, the system's default value will be used.
  oneof start_position {
    // Optional. Start replicating from the most recent position in the source.
    MostRecentStartPosition most_recent_start_position = 101
        [(google.api.field_behavior) = OPTIONAL];

    // Optional. Resume replication from the next available position in the
    // source.
    NextAvailableStartPosition next_available_start_position = 102
        [(google.api.field_behavior) = OPTIONAL];

    // Optional. Start replicating from a specific position in the source.
    SpecificStartPosition specific_start_position = 103
        [(google.api.field_behavior) = OPTIONAL];
  }
}

// SQL Server LSN position
message SqlServerLsnPosition {
  // Required. Log sequence number (LSN) from where Logs will be read
  string lsn = 1 [(google.api.field_behavior) = REQUIRED];
}

// Oracle SCN position
message OracleScnPosition {
  // Required. SCN number from where Logs will be read
  int64 scn = 1 [(google.api.field_behavior) = REQUIRED];
}

// MySQL log position
message MysqlLogPosition {
  // Required. The binary log file name.
  string log_file = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. The position within the binary log file. Default is head of file.
  optional int32 log_position = 2 [(google.api.field_behavior) = OPTIONAL];
}

// MySQL GTID position
message MysqlGtidPosition {
  // Required. The gtid set to start replication from.
  string gtid_set = 1 [(google.api.field_behavior) = REQUIRED];
}
