syntax = "proto3";

package yandex.cloud.mdb.postgresql.v1;

import "google/api/annotations.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/wrappers.proto";
import "google/type/timeofday.proto";
import "yandex/cloud/api/operation.proto";
import "yandex/cloud/operation/operation.proto";
import "yandex/cloud/validation.proto";
import "yandex/cloud/mdb/postgresql/v1/backup.proto";
import "yandex/cloud/mdb/postgresql/v1/cluster.proto";
import "yandex/cloud/mdb/postgresql/v1/database.proto";
import "yandex/cloud/mdb/postgresql/v1/user.proto";
import "yandex/cloud/mdb/postgresql/v1/config/postgresql9_6.proto";
import "yandex/cloud/mdb/postgresql/v1/config/postgresql10.proto";
import "yandex/cloud/mdb/postgresql/v1/config/postgresql10_1c.proto";
import "yandex/cloud/mdb/postgresql/v1/config/postgresql11.proto";
import "yandex/cloud/mdb/postgresql/v1/config/postgresql11_1c.proto";
import "yandex/cloud/mdb/postgresql/v1/config/postgresql12.proto";
import "yandex/cloud/mdb/postgresql/v1/config/postgresql12_1c.proto";
import "yandex/cloud/mdb/postgresql/v1/config/postgresql13.proto";
import "yandex/cloud/mdb/postgresql/v1/config/host9_6.proto";
import "yandex/cloud/mdb/postgresql/v1/config/host10.proto";
import "yandex/cloud/mdb/postgresql/v1/config/host10_1c.proto";
import "yandex/cloud/mdb/postgresql/v1/config/host11.proto";
import "yandex/cloud/mdb/postgresql/v1/config/host11_1c.proto";
import "yandex/cloud/mdb/postgresql/v1/config/host12.proto";
import "yandex/cloud/mdb/postgresql/v1/config/host12_1c.proto";
import "yandex/cloud/mdb/postgresql/v1/config/host13.proto";
import "yandex/cloud/mdb/postgresql/v1/maintenance.proto";

option go_package = "github.com/yandex-cloud/go-genproto/yandex/cloud/mdb/postgresql/v1;postgresql";
option java_package = "yandex.cloud.api.mdb.postgresql.v1";

// A set of methods for managing PostgreSQL Cluster resources.
service ClusterService {
  // Returns the specified PostgreSQL Cluster resource.
  //
  // To get the list of available PostgreSQL Cluster resources, make a [List] request.
  rpc Get (GetClusterRequest) returns (Cluster) {
    option (google.api.http) = { get: "/managed-postgresql/v1/clusters/{cluster_id}" };
  }

  // Retrieves the list of PostgreSQL Cluster resources that belong
  // to the specified folder.
  rpc List (ListClustersRequest) returns (ListClustersResponse) {
    option (google.api.http) = { get: "/managed-postgresql/v1/clusters" };
  }

  // Creates a PostgreSQL cluster in the specified folder.
  rpc Create (CreateClusterRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-postgresql/v1/clusters" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "CreateClusterMetadata"
      response: "Cluster"
    };
  }

  // Updates the specified PostgreSQL cluster.
  rpc Update (UpdateClusterRequest) returns (operation.Operation) {
    option (google.api.http) = { patch: "/managed-postgresql/v1/clusters/{cluster_id}" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "UpdateClusterMetadata"
      response: "Cluster"
    };
  }

  // Deletes the specified PostgreSQL cluster.
  rpc Delete (DeleteClusterRequest) returns (operation.Operation) {
    option (google.api.http) = { delete: "/managed-postgresql/v1/clusters/{cluster_id}" };
    option (yandex.cloud.api.operation) = {
      metadata: "DeleteClusterMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // Start the specified PostgreSQL cluster.
  rpc Start (StartClusterRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-postgresql/v1/clusters/{cluster_id}:start" };
    option (yandex.cloud.api.operation) = {
      metadata: "StartClusterMetadata"
      response: "Cluster"
    };
  }

  // Stop the specified PostgreSQL cluster.
  rpc Stop (StopClusterRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-postgresql/v1/clusters/{cluster_id}:stop" };
    option (yandex.cloud.api.operation) = {
      metadata: "StopClusterMetadata"
      response: "Cluster"
    };
  }

  // Moves the specified PostgreSQL cluster to the specified folder.
  rpc Move (MoveClusterRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-postgresql/v1/clusters/{cluster_id}:move" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "MoveClusterMetadata"
      response: "Cluster"
    };
  }

  // Creates a backup for the specified PostgreSQL cluster.
  rpc Backup (BackupClusterRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-postgresql/v1/clusters/{cluster_id}:backup" };
    option (yandex.cloud.api.operation) = {
      metadata: "BackupClusterMetadata"
      response: "Cluster"
    };
  }

  // Creates a new PostgreSQL cluster using the specified backup.
  rpc Restore (RestoreClusterRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-postgresql/v1/clusters:restore" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "RestoreClusterMetadata"
      response: "Cluster"
    };
  }

  // Reschedules planned maintenance operation.
  rpc RescheduleMaintenance (RescheduleMaintenanceRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-postgresql/v1/clusters/{cluster_id}:rescheduleMaintenance" body: "*"};
    option (yandex.cloud.api.operation) = {
      metadata: "RescheduleMaintenanceMetadata"
      response: "Cluster"
    };
  }

  // Start a manual failover on the specified PostgreSQL cluster.
  rpc StartFailover (StartClusterFailoverRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-postgresql/v1/clusters/{cluster_id}:startFailover" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "StartClusterFailoverMetadata"
      response: "Cluster"
    };
  }

  // Retrieves logs for the specified PostgreSQL cluster.
  rpc ListLogs (ListClusterLogsRequest) returns (ListClusterLogsResponse) {
    option (google.api.http) = { get: "/managed-postgresql/v1/clusters/{cluster_id}:logs" };
  }

  // Same as ListLogs but using server-side streaming. Also allows for 'tail -f' semantics.
  rpc StreamLogs (StreamClusterLogsRequest) returns (stream StreamLogRecord) {
    option (google.api.http) = { get: "/managed-postgresql/v1/clusters/{cluster_id}:stream_logs" };
  }

  // Retrieves the list of Operation resources for the specified cluster.
  rpc ListOperations (ListClusterOperationsRequest) returns (ListClusterOperationsResponse) {
    option (google.api.http) = { get: "/managed-postgresql/v1/clusters/{cluster_id}/operations" };
  }

  // Retrieves the list of available backups for the specified PostgreSQL cluster.
  rpc ListBackups (ListClusterBackupsRequest) returns (ListClusterBackupsResponse) {
    option (google.api.http) = { get: "/managed-postgresql/v1/clusters/{cluster_id}/backups" };
  }

  // Retrieves a list of hosts for the specified cluster.
  rpc ListHosts (ListClusterHostsRequest) returns (ListClusterHostsResponse) {
    option (google.api.http) = { get: "/managed-postgresql/v1/clusters/{cluster_id}/hosts" };
  }

  // Creates new hosts for a cluster.
  rpc AddHosts (AddClusterHostsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-postgresql/v1/clusters/{cluster_id}/hosts:batchCreate" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "AddClusterHostsMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // Deletes the specified hosts for a cluster.
  rpc DeleteHosts (DeleteClusterHostsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-postgresql/v1/clusters/{cluster_id}/hosts:batchDelete" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "DeleteClusterHostsMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // Updates the specified hosts.
  rpc UpdateHosts (UpdateClusterHostsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-postgresql/v1/clusters/{cluster_id}/hosts:batchUpdate" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "UpdateClusterHostsMetadata"
      response: "google.protobuf.Empty"
    };
  }
}


message GetClusterRequest {
  // ID of the PostgreSQL Cluster resource to return.
  // To get the cluster ID use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];
}

message ListClustersRequest {
  // ID of the folder to list PostgreSQL clusters in.
  // To get the folder ID, use a [yandex.cloud.resourcemanager.v1.FolderService.List] request.
  string folder_id = 1 [(required) = true, (length) = "<=50"];

  // The maximum number of results per page to return. If the number of available
  // results is larger than [page_size], the service returns a [ListClustersResponse.next_page_token]
  // that can be used to get the next page of results in subsequent list requests.
  int64 page_size = 2 [(value) = "<=1000"];

  // Page token. To get the next page of results, set [page_token] to the [ListClustersResponse.next_page_token]
  // returned by a previous list request.
  string page_token = 3 [(length) = "<=100"];

  // A filter expression that filters resources listed in the response.
  // The expression must specify:
  // 1. The field name. Currently you can only use filtering with the [Cluster.name] field.
  // 2. An operator. Can be either `=` or `!=` for single values, `IN` or `NOT IN` for lists of values.
  // 3. The value. Must be 1-63 characters long and match the regular expression `^[a-zA-Z0-9_-]+$`.
  string filter = 4 [(length) = "<=1000"];
}

message ListClustersResponse {
  // List of PostgreSQL Cluster resources.
  repeated Cluster clusters = 1;

  // This token allows you to get the next page of results for list requests. If the number of results
  // is larger than [ListClustersRequest.page_size], use the [next_page_token] as the value
  // for the [ListClustersRequest.page_token] parameter in the next list request. Each subsequent
  // list request will have its own [next_page_token] to continue paging through the results.
  string next_page_token = 2;
}

message CreateClusterRequest {
  // ID of the folder to create the PostgreSQL cluster in.
  string folder_id = 1 [(required) = true, (length) = "<=50"];

  // Name of the PostgreSQL cluster. The name must be unique within the folder.
  string name = 2 [(required) = true, (length) = "<=63", (pattern) = "[a-zA-Z0-9_-]*"];

  // Description of the PostgreSQL cluster.
  string description = 3 [(length) = "<=256"];

  // Custom labels for the PostgreSQL cluster as `` key:value `` pairs. Maximum 64 per resource.
  // For example, "project": "mvp" or "source": "dictionary".
  map<string, string> labels = 4 [(yandex.cloud.size) = "<=64", (length) = "<=63", (pattern) = "[-_0-9a-z]*", (map_key).length = "<=63", (map_key).pattern = "[a-z][-_0-9a-z]*"];

  // Deployment environment of the PostgreSQL cluster.
  Cluster.Environment environment = 5 [(required) = true];

  // Configuration and resources for hosts that should be created for the PostgreSQL cluster.
  ConfigSpec config_spec = 6 [(required) = true];

  // Descriptions of databases to be created in the PostgreSQL cluster.
  repeated DatabaseSpec database_specs = 7 [(required) = true];

  // Descriptions of database users to be created in the PostgreSQL cluster.
  repeated UserSpec user_specs = 8 [(required) = true];

  // Individual configurations for hosts that should be created for the PostgreSQL cluster.
  repeated HostSpec host_specs = 9 [(required) = true];

  // ID of the network to create the cluster in.
  string network_id = 10 [(required) = true, (length) = "<=50"];

  // User security groups
  repeated string security_group_ids = 11;

  // Deletion Protection inhibits deletion of the cluster
  bool deletion_protection = 12;
}

message CreateClusterMetadata {
  // ID of the PostgreSQL cluster that is being created.
  string cluster_id = 1;

}

message UpdateClusterRequest {
  // ID of the PostgreSQL Cluster resource to update.
  // To get the PostgreSQL cluster ID, use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // Field mask that specifies which fields of the PostgreSQL Cluster resource should be updated.
  google.protobuf.FieldMask update_mask = 2;

  // New description of the PostgreSQL cluster.
  string description = 3 [(length) = "<=256"];

  // Custom labels for the PostgreSQL cluster as `` key:value `` pairs. Maximum 64 per resource.
  // For example, "project": "mvp" or "source": "dictionary".
  //
  // The new set of labels will completely replace the old ones. To add a label, request the current
  // set with the [ClusterService.Get] method, then send an [ClusterService.Update] request with the new label added to the set.
  map<string, string> labels = 4 [(yandex.cloud.size) = "<=64", (length) = "<=63", (pattern) = "[-_0-9a-z]*", (map_key).length = "<=63", (map_key).pattern = "[a-z][-_0-9a-z]*"];

  // New configuration and resources for hosts in the cluster.
  ConfigSpec config_spec = 5;

  // New name for the cluster.
  string name = 6 [(length) = "<=63", (pattern) = "[a-zA-Z0-9_-]*"];

  // New maintenance window settings for the cluster.
  MaintenanceWindow maintenance_window = 7;

  // User security groups
  repeated string security_group_ids = 8;

  // Deletion Protection inhibits deletion of the cluster
  bool deletion_protection = 9;
}

message UpdateClusterMetadata {
  // ID of the PostgreSQL Cluster resource that is being updated.
  string cluster_id = 1;
}

message DeleteClusterRequest {
  // ID of the PostgreSQL cluster to delete.
  // To get the PostgreSQL cluster ID, use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];
}

message DeleteClusterMetadata {
  // ID of the PostgreSQL cluster that is being deleted.
  string cluster_id = 1;
}

message StartClusterRequest {
  // ID of the PostgreSQL cluster to start.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];
}

message StartClusterMetadata {
  // ID of the PostgreSQL cluster.
  string cluster_id = 1;
}

message StopClusterRequest {
  // ID of the PostgreSQL cluster to stop.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];
}

message StopClusterMetadata {
  // ID of the PostgreSQL cluster.
  string cluster_id = 1;
}

message MoveClusterRequest {
  // ID of the PostgreSQL cluster to move.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];
  // ID of the destination folder.
  string destination_folder_id = 2 [(required) = true, (length) = "<=50"];
}

message MoveClusterMetadata {
  // ID of the PostgreSQL cluster being moved.
  string cluster_id = 1;
  // ID of the source folder.
  string source_folder_id = 2;
  // ID of the destnation folder.
  string destination_folder_id = 3;
}

message BackupClusterRequest {
  // ID of the PostgreSQL cluster to back up.
  // To get the PostgreSQL cluster ID, use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];
}

message BackupClusterMetadata {
  // ID of the PostgreSQL cluster that is being backed up.
  string cluster_id = 1;
}

message RestoreClusterRequest {
  // ID of the backup to create a cluster from.
  // To get the backup ID, use a [ClusterService.ListBackups] request.
  string backup_id = 1 [(required) = true];

  // Timestamp of the moment to which the PostgreSQL cluster should be restored.
  google.protobuf.Timestamp time = 2 [(required) = true];

  // Flag that indicates whether a database should be restored to the first backup point
  // available just after the timestamp specified in the [time] field instead of just before.
  //
  // Possible values:
  // * false (default) - the restore point refers to the first backup moment before [time].
  // * true - the restore point refers to the first backup point after [time].
  bool time_inclusive = 3;

  // Name of the new PostgreSQL cluster. The name must be unique within the folder.
  string name = 4 [(required) = true, (length) = "<=63", (pattern) = "[a-zA-Z0-9_-]*"];

  // Description of the new PostgreSQL cluster.
  string description = 5 [(length) = "<=256"];

  // Custom labels for the PostgreSQL cluster as `` key:value `` pairs. Maximum 64 per resource.
  // For example, "project": "mvp" or "source": "dictionary".
  map<string, string> labels = 6 [(yandex.cloud.size) = "<=64", (length) = "<=63", (pattern) = "[-_0-9a-z]*", (map_key).length = "<=63", (map_key).pattern = "[a-z][-_0-9a-z]*"];

  // Deployment environment of the new PostgreSQL cluster.
  Cluster.Environment environment = 7;

  // Configuration for the PostgreSQL cluster to be created.
  ConfigSpec config_spec = 8;

  // Configurations for PostgreSQL hosts that should be created for
  // the cluster that is being created from the backup.
  repeated HostSpec host_specs = 9 [(size) = ">0"];

  // ID of the network to create the PostgreSQL cluster in.
  string network_id = 10 [(required) = true, (length) = "<=50"];

  // ID of the folder to create the PostgreSQL cluster in.
  string folder_id = 11 [(length) = "<=50"];

  // User security groups
  repeated string security_group_ids = 12;
}

message RestoreClusterMetadata {
  // ID of the new PostgreSQL cluster that is being created from a backup.
  string cluster_id = 1;

  // ID of the backup that is being used for creating a cluster.
  string backup_id = 2;
}

message StartClusterFailoverRequest {
  // ID of PostgreSQL cluster.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // New master host. Switch to the most up-to-date replica if not provided.
  string host_name = 2 [(length) = "<=253"];
}

message StartClusterFailoverMetadata {
  // ID of the PostgreSQL cluster being failovered.
  string cluster_id = 1;
}
message RescheduleMaintenanceRequest {
  // ID of the PostgreSQL cluster to reschedule the maintenance operation for.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  enum RescheduleType {
    RESCHEDULE_TYPE_UNSPECIFIED = 0;

    // Start the maintenance operation immediately.
    IMMEDIATE = 1;

    // Start the maintenance operation within the next available maintenance window.
    NEXT_AVAILABLE_WINDOW = 2;

    // Start the maintenance operation at the specific time.
    SPECIFIC_TIME = 3;
  }

  // The type of reschedule request.
  RescheduleType reschedule_type = 2[(required) = true];

  // The time until which this maintenance operation should be delayed. The value should be ahead of the first time when the maintenance operation has been scheduled for no more than two weeks. The value can also point to the past moment of time if [reschedule_type.IMMEDIATE] reschedule type is chosen.
  google.protobuf.Timestamp delayed_until = 3;
}

// Rescheduled maintenance operation metadata.
message RescheduleMaintenanceMetadata {
  // Required. ID of the PostgreSQL cluster.
  string cluster_id = 1;

  // Required. The time until which this maintenance operation is to be delayed.
  google.protobuf.Timestamp delayed_until = 4;
}

message LogRecord {
  // Log record timestamp in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format.
  google.protobuf.Timestamp timestamp = 1;

  // Contents of the log record.
  map<string, string> message = 2;
}

message ListClusterLogsRequest {
  // ID of the PostgreSQL cluster to request logs for.
  // To get the PostgreSQL cluster ID use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // Columns from the logs table to request.
  // If no columns are specified, entire log records are returned.
  repeated string column_filter = 2;

  // Type of the service to request logs about.
  ServiceType service_type = 3;

  enum ServiceType {
    SERVICE_TYPE_UNSPECIFIED = 0;

    // Logs of PostgreSQL activity.
    POSTGRESQL = 1;

    // Logs of connection pooler activity.
    POOLER = 2;
  }

  // Start timestamp for the logs request, in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format.
  google.protobuf.Timestamp from_time = 4;

  // End timestamp for the logs request, in [RFC3339](https://www.ietf.org/rfc/rfc3339.txt) text format.
  google.protobuf.Timestamp to_time = 5;

  // The maximum number of results per page to return. If the number of available
  // results is larger than [page_size], the service returns a [ListClusterLogsResponse.next_page_token]
  // that can be used to get the next page of results in subsequent list requests.
  int64 page_size = 6 [(value) = "<=1000"];

  // Page token. To get the next page of results, set [page_token] to the
  // [ListClusterLogsResponse.next_page_token] returned by a previous list request.
  string page_token = 7 [(length) = "<=100"];

  // Always return `next_page_token`, even if current page is empty.
  bool always_next_page_token = 8;
}

message ListClusterLogsResponse {
  // Requested log records.
  repeated LogRecord logs = 1;

  // This token allows you to get the next page of results for list requests. If the number of results
  // is larger than [ListClusterLogsRequest.page_size], use the [next_page_token] as the value
  // for the [ListClusterLogsRequest.page_token] query parameter in the next list request.
  // Each subsequent list request will have its own [next_page_token] to continue paging through the results.
  // This value is interchangeable with `next_record_token` from StreamLogs method.
  string next_page_token = 2;
}

message StreamLogRecord {
  // One of the requested log records.
  LogRecord record = 1;

  // This token allows you to continue streaming logs starting from the exact
  // same record. To continue streaming, specify value of `next_record_token`
  // as value for `record_token` parameter in the next StreamLogs request.
  // This value is interchangeable with `next_page_token` from ListLogs method.
  string next_record_token = 2;
}

message StreamClusterLogsRequest {
  // Required. ID of the PostgreSQL cluster.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // Columns from logs table to get in the response.
  repeated string column_filter = 2;

  ServiceType service_type = 3;

  enum ServiceType {
    SERVICE_TYPE_UNSPECIFIED = 0;

    // Logs of PostgreSQL activity.
    POSTGRESQL = 1;

    // Logs of connection pooler activity.
    POOLER = 2;
  }

  // Start timestamp for the logs request.
  google.protobuf.Timestamp from_time = 4;

  // End timestamp for the logs request.
  // If this field is not set, all existing logs will be sent and then the new ones as
  // they appear. In essence it has 'tail -f' semantics.
  google.protobuf.Timestamp to_time = 5;

  // Record token. Set `record_token` to the `next_record_token` returned by a previous StreamLogs
  // request to start streaming from next log record.
  string record_token = 6 [(length) = "<=100"];

  // A filter expression that filters resources listed in the response.
  // The expression must specify:
  // 1. The field name. Currently filtering can be applied to the [LogRecord.logs.message.hostname],
  // [LogRecord.logs.message.error_severity] (for POSTGRESQL service), [LogRecord.logs.message.level] (for POOLER service) fields.
  // 2. A conditional operator. Can be either `=` or `!=` for single values, `IN` or `NOT IN` for lists of values.
  // 3. The value. Must be 1-63 characters long and match the regular expression `^[a-z0-9.-]{1,61}$`.
  // Examples of a filter:
  // `message.hostname='node1.db.cloud.yandex.net'`
  // `message.error_severity IN ("ERROR", "FATAL", "PANIC") AND message.hostname = "node1.db.cloud.yandex.net"`
  string filter = 7 [(length) = "<=1000"];
}

message ListClusterOperationsRequest {
  // ID of the PostgreSQL Cluster resource to list operations for.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // The maximum number of results per page to return. If the number of available
  // results is larger than [page_size], the service returns a [ListClusterOperationsResponse.next_page_token]
  // that can be used to get the next page of results in subsequent list requests.
  int64 page_size = 2 [(value) = "<=1000"];

  // Page token.  To get the next page of results, set [page_token] to the [ListClusterOperationsResponse.next_page_token]
  // returned by a previous list request.
  string page_token = 3 [(length) = "<=100"];
}

message ListClusterOperationsResponse {
  // List of Operation resources for the specified PostgreSQL cluster.
  repeated operation.Operation operations = 1;

  // This token allows you to get the next page of results for list requests. If the number of results
  // is larger than [ListClusterOperationsRequest.page_size], use the [next_page_token] as the value
  // for the [ListClusterOperationsRequest.page_token] query parameter in the next list request.
  // Each subsequent list request will have its own [next_page_token] to continue paging through the results.
  string next_page_token = 2;
}

message ListClusterBackupsRequest {
  // ID of the PostgreSQL cluster.
  // To get the PostgreSQL cluster ID use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // The maximum number of results per page to return. If the number of available
  // results is larger than [page_size], the service returns a [ListClusterBackupsResponse.next_page_token]
  // that can be used to get the next page of results in subsequent list requests.
  int64 page_size = 2 [(value) = "<=1000"];

  // Page token.  To get the next page of results, set [page_token] to the [ListClusterBackupsResponse.next_page_token]
  // returned by a previous list request.
  string page_token = 3 [(length) = "<=100"];
}

message ListClusterBackupsResponse {
  // List of PostgreSQL Backup resources.
  repeated Backup backups = 1;

  // This token allows you to get the next page of results for list requests. If the number of results
  // is larger than [ListClusterBackupsRequest.page_size], use the [next_page_token] as the value
  // for the [ListClusterBackupsRequest.page_token] query parameter in the next list request.
  // Each subsequent list request will have its own [next_page_token] to continue paging through the results.
  string next_page_token = 2;
}

message ListClusterHostsRequest {
  // ID of the PostgreSQL cluster.
  // To get the PostgreSQL cluster ID use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // The maximum number of results per page to return. If the number of available
  // results is larger than [page_size], the service returns a [ListClusterHostsResponse.next_page_token]
  // that can be used to get the next page of results in subsequent list requests.
  int64 page_size = 2 [(value) = "<=1000"];

  // Page token.  To get the next page of results, set [page_token] to the [ListClusterHostsResponse.next_page_token]
  // returned by a previous list request.
  string page_token = 3 [(length) = "<=100"];
}

message ListClusterHostsResponse {
  // List of Host resources.
  repeated Host hosts = 1;

  // This token allows you to get the next page of results for list requests. If the number of results
  // is larger than [ListClusterHostsRequest.page_size], use the [next_page_token] as the value
  // for the [ListClusterHostsRequest.page_token] query parameter in the next list request.
  // Each subsequent list request will have its own [next_page_token] to continue paging through the results.
  string next_page_token = 2;
}

message AddClusterHostsRequest {
  // ID of the PostgreSQL cluster to add hosts to.
  // To get the PostgreSQL cluster ID, use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // Configurations for PostgreSQL hosts that should be added to the cluster.
  repeated HostSpec host_specs = 2 [(size) = ">0"];
}

message AddClusterHostsMetadata {
  // ID of the PostgreSQL cluster to which the hosts are being added.
  string cluster_id = 1;

  // Names of hosts that are being added to the cluster.
  repeated string host_names = 2;
}

message DeleteClusterHostsRequest {
  // ID of the PostgreSQL cluster to remove hosts from.
  // To get the PostgreSQL cluster ID, use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // Names of hosts to delete.
  repeated string host_names = 2 [(size) = ">0", (length) = "<=253"];
}

message DeleteClusterHostsMetadata {
  // ID of the PostgreSQL cluster to remove hosts from.
  string cluster_id = 1;

  // Names of hosts that are being deleted.
  repeated string host_names = 2;
}

message UpdateClusterHostsRequest {
  // ID of the PostgreSQL cluster to update hosts in.
  // To get the PostgreSQL cluster ID, use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // New configurations to apply to hosts.
  repeated UpdateHostSpec update_host_specs = 2 [(size) = ">0"];
}

message UpdateClusterHostsMetadata {
  // ID of the PostgreSQL cluster to update hosts in.
  string cluster_id = 1;

  // Names of hosts that are being updated.
  repeated string host_names = 2;
}

message UpdateHostSpec {
  // Name of the host to update.
  // To get the PostgreSQL host name, use a [ClusterService.ListHosts] request.
  string host_name = 1 [(required) = true];

  // [Host.name] of the host to be used as the replication source (for cascading replication).
  // To get the PostgreSQL host name, use a [ClusterService.ListHosts] request.
  string replication_source = 2;

  // The host with the highest priority is the synchronous replica. All others are asynchronous.
  // The synchronous replica replaces the master when needed.
  //
  // When a replica becomes the master, its priority is ignored.
  google.protobuf.Int64Value priority = 3;

  // Configuration of a PostgreSQL server for the host.
  ConfigHostSpec config_spec = 4;
}

message HostSpec {
  // ID of the availability zone where the host resides.
  // To get a list of available zones, use the [yandex.cloud.compute.v1.ZoneService.List] request.
  string zone_id = 1 [(length) = "<=50"];

  // ID of the subnet that the host should belong to. This subnet should be a part
  // of the network that the cluster belongs to.
  // The ID of the network is set in the field [Cluster.network_id].
  string subnet_id = 2 [(length) = "<=50"];

  // Whether the host should get a public IP address on creation.
  //
  // After a host has been created, this setting cannot be changed. To remove an assigned public IP, or to assign
  // a public IP to a host without one, recreate the host with [assign_public_ip] set as needed.
  //
  // Possible values:
  // * false - don't assign a public IP to the host.
  // * true - the host should have a public IP address.
  bool assign_public_ip = 3;

  // [Host.name] of the host to be used as the replication source (for cascading replication).
  string replication_source = 4;

  // Priority of the host as a replica. A higher value corresponds to higher priority.
  //
  // The host with the highest priority is the synchronous replica. All others are asynchronous.
  // The synchronous replica replaces the master when needed.
  //
  // When a replica becomes the master, its priority is ignored.
  google.protobuf.Int64Value priority = 5;

  // Configuration of a PostgreSQL server for the host.
  ConfigHostSpec config_spec = 6;
}

message ConfigSpec {
  // Version of PostgreSQL used in the cluster.
  // Possible values: `9.6`, `10`, `10_1c`, `11`, `12`, `13`.
  string version = 1;

  // Configuration of a PostgreSQL cluster.
  oneof postgresql_config {
    // Configuration for a PostgreSQL 9.6 cluster.
    config.PostgresqlConfig9_6 postgresql_config_9_6 = 2 [json_name="postgresqlConfig_9_6"];

    // Configuration for a PostgreSQL 10 1C cluster.
    config.PostgresqlConfig10_1C postgresql_config_10_1c = 10 [json_name="postgresqlConfig_10_1c"];

    // Configuration for a PostgreSQL 10 cluster.
    config.PostgresqlConfig10 postgresql_config_10 = 3 [json_name="postgresqlConfig_10"];

    // Configuration for a PostgreSQL 11 cluster.
    config.PostgresqlConfig11 postgresql_config_11 = 7 [json_name="postgresqlConfig_11"];

    // Configuration for a PostgreSQL 11 1C cluster.
    config.PostgresqlConfig11_1C postgresql_config_11_1c = 13 [json_name="postgresqlConfig_11_1c"];

    // Configuration for a PostgreSQL 12 cluster.
    config.PostgresqlConfig12 postgresql_config_12 = 11 [json_name="postgresqlConfig_12"];

    // Configuration for a PostgreSQL 12 1C cluster.
    config.PostgresqlConfig12_1C postgresql_config_12_1c = 14 [json_name="postgresqlConfig_12_1c"];

    // Configuration for a PostgreSQL 13 1C cluster.
    config.PostgresqlConfig13 postgresql_config_13 = 15 [json_name="postgresqlConfig_13"];
  }

  // Configuration of the connection pooler.
  ConnectionPoolerConfig pooler_config = 4;

  // Resources allocated to PostgreSQL hosts.
  Resources resources = 5;

  // Configuration setting which enables/disables autofailover in cluster.
  google.protobuf.BoolValue autofailover = 6;

  // Time to start the daily backup, in the UTC timezone.
  google.type.TimeOfDay backup_window_start = 8;
  
  // Retention policy of automated backups.
  google.protobuf.Int64Value backup_retain_period_days = 17 [(value) = "7-60"];

  // Access policy to DB
  Access access = 9;

  // Configuration of the performance diagnostics service.
  PerformanceDiagnostics performance_diagnostics = 12;
}

message ConfigHostSpec {
  oneof postgresql_config {
    // Configuration for a host with PostgreSQL 9.6 server deployed.
    config.PostgresqlHostConfig9_6 postgresql_config_9_6 = 1 [json_name="postgresqlHostConfig_9_6"];

    // Configuration for a host with PostgreSQL 10 1C server deployed.
    config.PostgresqlHostConfig10_1C postgresql_config_10_1c = 4 [json_name="postgresqlHostConfig_10_1c"];

    // Configuration for a host with PostgreSQL 10 server deployed.
    config.PostgresqlHostConfig10 postgresql_config_10 = 2 [json_name="postgresqlHostConfig_10"];

    // Configuration for a host with PostgreSQL 11 server deployed.
    config.PostgresqlHostConfig11 postgresql_config_11 = 3 [json_name="postgresqlHostConfig_11"];

    // Configuration for a host with PostgreSQL 11 1C server deployed.
    config.PostgresqlHostConfig11_1C postgresql_config_11_1c = 6 [json_name="postgresqlHostConfig_11_1c"];

    // Configuration for a host with PostgreSQL 12 server deployed.
    config.PostgresqlHostConfig12 postgresql_config_12 = 5 [json_name="postgresqlHostConfig_12"];

    // Configuration for a host with PostgreSQL 12 1C server deployed.
    config.PostgresqlHostConfig12_1C postgresql_config_12_1c = 7 [json_name="postgresqlHostConfig_12_1c"];

    // Configuration for a host with PostgreSQL 13 server deployed.
    config.PostgresqlHostConfig13 postgresql_config_13 = 8 [json_name="postgresqlHostConfig_13"];
  }
}
