syntax = "proto3";

package yandex.cloud.mdb.mongodb.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/mongodb/v1/backup.proto";
import "yandex/cloud/mdb/mongodb/v1/cluster.proto";
import "yandex/cloud/mdb/mongodb/v1/database.proto";
import "yandex/cloud/mdb/mongodb/v1/user.proto";
import "yandex/cloud/mdb/mongodb/v1/config/mongodb3_6.proto";
import "yandex/cloud/mdb/mongodb/v1/config/mongodb4_0.proto";
import "yandex/cloud/mdb/mongodb/v1/config/mongodb4_2.proto";
import "yandex/cloud/mdb/mongodb/v1/config/mongodb4_4.proto";
import "yandex/cloud/mdb/mongodb/v1/maintenance.proto";

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

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

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

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

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

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

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

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

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

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

  // Creates a new MongoDB cluster using the specified backup.
  rpc Restore (RestoreClusterRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-mongodb/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-mongodb/v1/clusters/{cluster_id}:rescheduleMaintenance" body: "*"};
    option (yandex.cloud.api.operation) = {
      metadata: "RescheduleMaintenanceMetadata"
      response: "Cluster"
    };
  }

  // Retrieves logs for the specified MongoDB cluster.
  rpc ListLogs (ListClusterLogsRequest) returns (ListClusterLogsResponse) {
    option (google.api.http) = { get: "/managed-mongodb/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-mongodb/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-mongodb/v1/clusters/{cluster_id}/operations" };
  }

  // Retrieves the list of available backups for the specified MongoDB cluster.
  rpc ListBackups (ListClusterBackupsRequest) returns (ListClusterBackupsResponse) {
    option (google.api.http) = { get: "/managed-mongodb/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-mongodb/v1/clusters/{cluster_id}/hosts" };
  }

  // Creates new hosts for a cluster.
  rpc AddHosts (AddClusterHostsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-mongodb/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-mongodb/v1/clusters/{cluster_id}/hosts:batchDelete" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "DeleteClusterHostsMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // Enables sharding for the cluster: creates 3 mongoinfra (or 3 mongocfg and 2 mongos) hosts
  // that would support adding and using shards in the cluster.
  rpc EnableSharding (EnableClusterShardingRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-mongodb/v1/clusters/{cluster_id}:enableSharding" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "EnableClusterShardingMetadata"
      response: "google.protobuf.Empty"
    };
  }
  // Returns the specified shard.
  rpc GetShard (GetClusterShardRequest) returns (Shard) {
    option (google.api.http) = { get: "/managed-mongodb/v1/clusters/{cluster_id}/shards/{shard_name}" };
  }

  // Retrieves a list of shards.
  rpc ListShards (ListClusterShardsRequest) returns (ListClusterShardsResponse) {
    option (google.api.http) = { get: "/managed-mongodb/v1/clusters/{cluster_id}/shards" };
  }

  // Creates a new shard.
  rpc AddShard (AddClusterShardRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-mongodb/v1/clusters/{cluster_id}/shards" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "AddClusterShardMetadata"
      response: "Shard"
    };
  }

  // Deletes the specified shard.
  rpc DeleteShard (DeleteClusterShardRequest) returns (operation.Operation) {
    option (google.api.http) = { delete: "/managed-mongodb/v1/clusters/{cluster_id}/shards/{shard_name}" };
    option (yandex.cloud.api.operation) = {
      metadata: "DeleteClusterShardMetadata"
      response: "google.protobuf.Empty"
    };
  }
  // Resetups hosts.
  rpc ResetupHosts (ResetupHostsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-mongodb/v1/clusters/{cluster_id}:resetupHosts" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "ResetupHostsMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // Restarts hosts.
  rpc RestartHosts (RestartHostsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-mongodb/v1/clusters/{cluster_id}:restartHosts" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "RestartHostsMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // Stepdown hosts.
  rpc StepdownHosts (StepdownHostsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/managed-mongodb/v1/clusters/{cluster_id}:stepdownHosts" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "StepdownHostsMetadata"
      response: "google.protobuf.Empty"
    };
  }
}

message GetClusterRequest {
  // ID of the MongoDB 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 MongoDB 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 MongoDB 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 MongoDB cluster in.
  string folder_id = 1 [(required) = true, (length) = "<=50"];

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

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

  // Custom labels for the MongoDB 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 MongoDB cluster.
  Cluster.Environment environment = 5 [(required) = true];

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

  // Descriptions of databases to be created in the MongoDB cluster.
  repeated DatabaseSpec database_specs = 7 [(size) = ">0"];

  // Descriptions of database users to be created in the MongoDB cluster.
  repeated UserSpec user_specs = 8 [(size) = ">0"];

  // Individual configurations for hosts that should be created for the MongoDB cluster.
  repeated HostSpec host_specs = 9 [(size) = ">0"];

  // 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 MongoDB cluster that is being created.
  string cluster_id = 1;
}

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

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

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

  // Custom labels for the MongoDB 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 MongoDB Cluster resource that is being updated.
  string cluster_id = 1;
}

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

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

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

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

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

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

message MoveClusterRequest {
  // ID of the MongoDB 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 MongoDB 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 MongoDB cluster to back up.
  // To get the MongoDB cluster ID, use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];
}

message BackupClusterMetadata {
  // ID of the MongoDB 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];

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

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

  // Custom labels for the MongoDB 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 new MongoDB cluster.
  Cluster.Environment environment = 5 [(required) = true];

  // Configuration for the MongoDB cluster to be created.
  ConfigSpec config_spec = 6 [(required) = true];

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

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

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

  message RecoveryTargetSpec {
      // Timestamp of the recovery target
      int64 timestamp = 1 [(value) = ">0"];
  }

  // Specification of the moment to which the MongoDB cluster should be restored.
  RecoveryTargetSpec recovery_target_spec = 10;

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

message RestoreClusterMetadata {
  // ID of the new MongoDB 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 RescheduleMaintenanceRequest {
  // ID of the MongoDB 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 MongoDB 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 MongoDB cluster to request logs for.
  // To get the MongoDB 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 MongoDB activity.
    MONGOD = 1;
    MONGOS = 2;
    MONGOCFG = 3;
  }

  // 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"];
}

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 MongoDB 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 MongoDB activity.
    MONGOD = 1;
    MONGOS = 2;
    MONGOCFG = 3;
  }

  // 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.severity] 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.severity IN ('E', 'F')`
  string filter = 7 [(length) = "<=1000"];
}

message ListClusterOperationsRequest {
  // ID of the MongoDB 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 MongoDB 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 MongoDB cluster.
  // To get the MongoDB 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 MongoDB 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 MongoDB cluster.
  // To get the MongoDB 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 MongoDB cluster to add hosts to.
  // To get the MongoDB cluster ID use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

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

message AddClusterHostsMetadata {
  // ID of the MongoDB 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 MongoDB cluster to remove hosts from.
  // To get the MongoDB 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 MongoDB cluster to remove hosts from.
  string cluster_id = 1;

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

message EnableClusterShardingRequest {
  message MongoCfg {
    // Resources for mongocfg hosts.
    Resources resources = 1 [(required) = true];
  }

  message Mongos {
    // Resources for mongos hosts.
    Resources resources = 1 [(required) = true];
  }

  message MongoInfra {
    // Resources for mongoinfra (mongos+mongocfg) hosts.
    Resources resources = 1 [(required) = true];
  }

  // ID of the MongoDB cluster to enable sharding for.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // mongocfg specification for sharding.
  MongoCfg mongocfg = 2;

  // mongos specification for sharding.
  Mongos mongos = 3;

  // Configurations for mongos and mongocfg hosts.
  repeated HostSpec host_specs = 4 [(size) = ">0"];

  // mongos specification for sharding.
  MongoInfra mongoinfra = 5;
}

message EnableClusterShardingMetadata {
  // ID of the MongoDB cluster that sharding is being enabled for.
  string cluster_id = 1;
}

message GetClusterShardRequest {
  // ID of the MongoDB cluster that the shard belongs to.
  // To get the cluster ID use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // Name of the MongoDB shard to return.
  // To get the name of the shard use a [ClusterService.ListShards] request.
  string shard_name = 2 [(required) = true, (length) = "<=63", (pattern) = "[a-zA-Z0-9_-]*"];
}

message ListClusterShardsRequest {
  // ID of the MongoDB cluster to list databases in.
  // To get the 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 [ListClusterShardsResponse.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
  // [ListClusterShardsResponse.next_page_token] returned by a previous list request.
  string page_token = 3 [(length) = "<=100"];
}

message ListClusterShardsResponse {
  // List of MongoDB shards.
  repeated Shard shards = 1;

  // This token allows you to get the next page of results for list requests. If the number of results
  // is larger than [ListClusterShardsRequest.page_size], use the [next_page_token] as the value
  // for the [ListClusterShardsRequest.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 AddClusterShardRequest {
  // ID of the MongoDB cluster to add a shard to.
  // To get the cluster ID, use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // Name of the MongoDB shard to create.
  string shard_name = 2 [(required) = true, (length) = "<=63", (pattern) = "[a-zA-Z0-9_-]*"];

  // Configurations for mongod hosts to be created with the shard.
  repeated HostSpec host_specs = 3 [(size) = ">0"];
}

message AddClusterShardMetadata {
  // ID of the MongoDB cluster that a shard is being added to.
  string cluster_id = 1;

  // Name of the shard being added.
  string shard_name = 2;
}

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

  // Name of the MongoDB shard to delete.
  // To get the name of the shard use a [ClusterService.ListShards] request.
  string shard_name = 2 [(required) = true, (length) = "<=63", (pattern) = "[a-zA-Z0-9_-]*"];
}

message DeleteClusterShardMetadata {
  // ID of the MongoDB cluster that a shard is being deleted in.
  string cluster_id = 1;

  // Name of the shard being deleted.
  string shard_name = 2;
}

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

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

message ResetupHostsMetadata {
  // Required. ID of the MongoDB cluster.
  string cluster_id = 1;

  // Required. The name of hosts to resetup.
  repeated string host_names = 2;
}

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

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

message RestartHostsMetadata {
  // Required. ID of the MongoDB cluster.
  string cluster_id = 1;

  // Required. The name of hosts to restart.
  repeated string host_names = 2;
}

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

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

message StepdownHostsMetadata {
  // Required. ID of the MongoDB cluster.
  string cluster_id = 1;

  // Required. The name of hosts to resetup.
  repeated string host_names = 2;
}

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 network ID is set in the [Cluster.network_id] field.
  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;

  // Type of the host to be deployed.
  Host.Type type = 4;

  // Name of the shard that the host belongs to.
  string shard_name = 5 [(length) = "<=63", (pattern) = "[a-zA-Z0-9_-]*"];
}

message MongodbSpec3_6 {
  message Mongod {
    // Configuration for mongod 3.6 hosts.
    config.MongodConfig3_6 config = 1;

    // Resources allocated to each mongod host.
    Resources resources = 2;
  }

  message MongoCfg {
    // Configuration for mongocfg 3.6 hosts.
    config.MongoCfgConfig3_6 config = 1;

    // Resources allocated to each mongocfg host.
    Resources resources = 2;
  }

  message Mongos {
    // Configuration for mongos 3.6 hosts.
    config.MongosConfig3_6 config = 1;

    // Resources allocated to each mongos host.
    Resources resources = 2;
  }

  message MongoInfra {
    // Configuration for mongoinfra 3.6 hosts.
    config.MongosConfig3_6 config_mongos = 1;
    config.MongoCfgConfig3_6 config_mongocfg = 2;

    // Resources allocated to each mongoinfra (mongos+mongocfg) host.
    Resources resources = 3;
  }

  // Configuration and resource allocation for mongod 3.6 hosts.
  Mongod mongod = 1;

  // Configuration and resource allocation for mongocfg 3.6 hosts.
  MongoCfg mongocfg = 2;

  // Configuration and resource allocation for mongos 3.6 hosts.
  Mongos mongos = 3;

  // Configuration and resource allocation for mongoinfra (mongos+mongocfg) 3.6 hosts.
  MongoInfra mongoinfra = 4;
}


message MongodbSpec4_0 {
  message Mongod {
    // Configuration for mongod 4.0 hosts.
    config.MongodConfig4_0 config = 1;

    // Resources allocated to each mongod host.
    Resources resources = 2;
  }

  message MongoCfg {
    // Configuration for mongocfg 4.0 hosts.
    config.MongoCfgConfig4_0 config = 1;

    // Resources allocated to each mongocfg host.
    Resources resources = 2;
  }

  message Mongos {
    // Configuration for mongos 4.0 hosts.
    config.MongosConfig4_0 config = 1;

    // Resources allocated to each mongos host.
    Resources resources = 2;
  }

  message MongoInfra {
    // Configuration for mongoinfra 4.0 hosts.
    config.MongosConfig4_0 config_mongos = 1;
    config.MongoCfgConfig4_0 config_mongocfg = 2;

    // Resources allocated to each mongoinfra (mongos+mongocfg) host.
    Resources resources = 3;
  }

  // Configuration and resource allocation for mongod 4.0 hosts.
  Mongod mongod = 1;

  // Configuration and resource allocation for mongocfg 4.0 hosts.
  MongoCfg mongocfg = 2;

  // Configuration and resource allocation for mongos 4.0 hosts.
  Mongos mongos = 3;

  // Configuration and resource allocation for mongoinfra (mongos+mongocfg) 4.0 hosts.
  MongoInfra mongoinfra = 4;
}

message MongodbSpec4_2 {
  message Mongod {
    // Configuration for mongod 4.2 hosts.
    config.MongodConfig4_2 config = 1;

    // Resources allocated to each mongod host.
    Resources resources = 2;
  }

  message MongoCfg {
    // Configuration for mongocfg 4.2 hosts.
    config.MongoCfgConfig4_2 config = 1;

    // Resources allocated to each mongocfg host.
    Resources resources = 2;
  }

  message Mongos {
    // Configuration for mongos 4.2 hosts.
    config.MongosConfig4_2 config = 1;

    // Resources allocated to each mongos host.
    Resources resources = 2;
  }

  message MongoInfra {
    // Configuration for mongoinfra 4.2 hosts.
    config.MongosConfig4_2 config_mongos = 1;
    config.MongoCfgConfig4_2 config_mongocfg = 2;

    // Resources allocated to each mongoinfra (mongos+mongocfg) host.
    Resources resources = 3;
  }

  // Configuration and resource allocation for mongod 4.2 hosts.
  Mongod mongod = 1;

  // Configuration and resource allocation for mongocfg 4.2 hosts.
  MongoCfg mongocfg = 2;

  // Configuration and resource allocation for mongos 4.2 hosts.
  Mongos mongos = 3;

  // Configuration and resource allocation for mongoinfra (mongos+mongocfg) 4.2 hosts.
  MongoInfra mongoinfra = 4;
}

message MongodbSpec4_4 {
  message Mongod {
    // Configuration for mongod 4.4 hosts.
    config.MongodConfig4_4 config = 1;

    // Resources allocated to each mongod host.
    Resources resources = 2;
  }

  message MongoCfg {
    // Configuration for mongocfg 4.4 hosts.
    config.MongoCfgConfig4_4 config = 1;

    // Resources allocated to each mongocfg host.
    Resources resources = 2;
  }

  message Mongos {
    // Configuration for mongos 4.4 hosts.
    config.MongosConfig4_4 config = 1;

    // Resources allocated to each mongos host.
    Resources resources = 2;
  }

  message MongoInfra {
    // Configuration for mongoinfra 4.4 hosts.
    config.MongosConfig4_4 config_mongos = 1;
    config.MongoCfgConfig4_4 config_mongocfg = 2;

    // Resources allocated to each mongoinfra (mongos+mongocfg) host.
    Resources resources = 3;
  }

  // Configuration and resource allocation for mongod 4.4 hosts.
  Mongod mongod = 1;

  // Configuration and resource allocation for mongocfg 4.4 hosts.
  MongoCfg mongocfg = 2;

  // Configuration and resource allocation for mongos 4.4 hosts.
  Mongos mongos = 3;

  // Configuration and resource allocation for mongoinfra (mongos+mongocfg) 4.4 hosts.
  MongoInfra mongoinfra = 4;
}

message ConfigSpec {
  // Version of MongoDB used in the cluster. Possible values: `3.6`, `4.0`, `4.2`, `4.4`.
  string version = 1;

  // MongoDB feature compatibility version. See usage details in [MongoDB documentation](https://docs.mongodb.com/manual/reference/command/setFeatureCompatibilityVersion/).
  //
  // Possible values:
  // * `3.6` - persist data compatibility for version 3.6. After setting this option the data will not be compatible with 3.4 or older.
  // * `4.0` - persist data compatibility for version 4.0. After setting this option the data will not be compatible with 3.6 or older.
  // * `4.2` - persist data compatibility for version 4.2. After setting this option the data will not be compatible with 4.0 or older.
  // * `4.4` - persist data compatibility for version 4.4. After setting this option the data will not be compatible with 4.2 or older.
  string feature_compatibility_version = 5;

  oneof mongodb_spec {
    // Configuration and resource allocation for a MongoDB 3.6 cluster.
    MongodbSpec3_6 mongodb_spec_3_6 = 2 [json_name="mongodbSpec_3_6"];

    // Configuration and resource allocation for a MongoDB 4.0 cluster.
    MongodbSpec4_0 mongodb_spec_4_0 = 4 [json_name="mongodbSpec_4_0"];

    // Configuration and resource allocation for a MongoDB 4.2 cluster.
    MongodbSpec4_2 mongodb_spec_4_2 = 7 [json_name="mongodbSpec_4_2"];

    // Configuration and resource allocation for a MongoDB 4.4 cluster.
    MongodbSpec4_4 mongodb_spec_4_4 = 8 [json_name="mongodbSpec_4_4"];
  }

  // Time to start the daily backup, in the UTC timezone.
  google.type.TimeOfDay backup_window_start = 3;

  // Retain period of automatically created backup in days
  google.protobuf.Int64Value backup_retain_period_days = 9 [(value) = "7-35"];

  // Access policy to DB
  Access access = 6;
}
