syntax = "proto3";

package yandex.cloud.compute.v1;

import "google/api/annotations.proto";
import "google/protobuf/field_mask.proto";

import "yandex/cloud/api/operation.proto";
import "yandex/cloud/compute/v1/instance.proto";
import "yandex/cloud/compute/v1/placement_group.proto";
import "yandex/cloud/operation/operation.proto";
import "yandex/cloud/validation.proto";

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

// A set of methods for managing placement groups.
service PlacementGroupService {
  // Returns the specified placement group.
  //
  // To get the list of all available placement groups, make a [List] request.
  rpc Get (GetPlacementGroupRequest) returns (PlacementGroup) {
    option (google.api.http) = { get: "/compute/v1/placementGroups/{placement_group_id}" };
  }

  // Retrieves the list of placement groups in the specified folder.
  rpc List (ListPlacementGroupsRequest) returns (ListPlacementGroupsResponse) {
    option (google.api.http) = { get: "/compute/v1/placementGroups" };
  }

  // Creates a placement group in the specified folder.
  rpc Create (CreatePlacementGroupRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/compute/v1/placementGroups" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "CreatePlacementGroupMetadata"
      response: "PlacementGroup"
    };
  }

  // Updates the specified placement group.
  rpc Update (UpdatePlacementGroupRequest) returns (operation.Operation) {
    option (google.api.http) = { patch: "/compute/v1/placementGroups/{placement_group_id}" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "UpdatePlacementGroupMetadata"
      response: "PlacementGroup"
    };
  }

  // Deletes the specified placement group.
  rpc Delete (DeletePlacementGroupRequest) returns (operation.Operation) {
    option (google.api.http) = { delete: "/compute/v1/placementGroups/{placement_group_id}" };
    option (yandex.cloud.api.operation) = {
      metadata: "DeletePlacementGroupMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // Lists instances for the specified placement group.
  rpc ListInstances (ListPlacementGroupInstancesRequest) returns (ListPlacementGroupInstancesResponse) {
    option (google.api.http) = { get: "/compute/v1/placementGroups/{placement_group_id}/instances" };
  }

  // Lists operations for the specified placement group.
  rpc ListOperations (ListPlacementGroupOperationsRequest) returns (ListPlacementGroupOperationsResponse) {
    option (google.api.http) = { get: "/compute/v1/placementGroups/{placement_group_id}/operations" };
  }
}

message GetPlacementGroupRequest {
  // ID of the placement group to return.
  //
  // To get a placement group ID make a [PlacementGroupService.List] request.
  string placement_group_id = 1;
}

message ListPlacementGroupsRequest {
  // ID of the folder to list placement groups in.
  //
  // To get the folder ID make a [yandex.cloud.resourcemanager.v1.FolderService.List] request.
  string folder_id = 1;

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

  // Page token. To get the next page of results,
  // set [page_token] to the [ListPlacementGroupsResponse.next_page_token]
  // returned by a previous list request.
  string page_token = 3;

  // A filter expression that filters resources listed in the response.
  // Currently you can use filtering only on the [PlacementGroup.name] field.
  string filter = 4;
}

message ListPlacementGroupsResponse {
  // Lists placement groups in the specified folder.
  repeated PlacementGroup placement_groups = 1;

  // Token for getting the next page of the list. If the number of results is greater than
  // the specified [ListPlacementGroupsRequest.page_size], use `next_page_token` as the value
  // for the [ListPlacementGroupsRequest.page_token] parameter in the next list request.
  //
  // Each subsequent page will have its own `next_page_token` to continue paging through the results.
  string next_page_token = 2;
}

message CreatePlacementGroupRequest {
  // ID of the folder to create a placement group in.
  //
  // To get a folder ID, use a [yandex.cloud.resourcemanager.v1.FolderService.List] request.
  string folder_id = 1;

  // Name of the placement group.
  string name = 2;

  // Description of the placement group.
  string description = 3;

  // Resource labels as `key:value` pairs.
  map<string, string> labels = 4;

  // Placement strategy.
  oneof placement_strategy {
    option (exactly_one) = true;

    // Anti-affinity placement strategy (`spread`). Instances are distributed over distinct failure domains.
    SpreadPlacementStrategy spread_placement_strategy = 5;
  }
}

message CreatePlacementGroupMetadata {
  // ID of the placement group that is being created.
  string placement_group_id = 1;
}

message UpdatePlacementGroupRequest {
  // ID of the placement group to update.
  //
  // To get the placement group ID, use an [PlacementGroupService.List] request.
  string placement_group_id = 1;

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

  // Name of the placement group.
  string name = 3;

  // Description of the placement group.
  string description = 4;

  // Resource labels as `key:value` pairs.
  //
  // The existing set of `labels` is completely replaced by the provided set.
  map<string, string> labels = 5;
}

message UpdatePlacementGroupMetadata {
  // ID of the placement group that is being updated.
  string placement_group_id = 1;
}

message DeletePlacementGroupRequest {
  // ID of the placement group to delete.
  //
  // To get the placement group ID, use [PlacementGroupService.List] request.
  string placement_group_id = 1;
}

message DeletePlacementGroupMetadata {
  // ID of the placement group that is being deleted.
  string placement_group_id = 1;
}

message ListPlacementGroupInstancesRequest {
  // ID of the placement group to list instances for.
  //
  // To get the placement group ID, use [PlacementGroupService.List] request.
  string placement_group_id = 1;

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

  // Page token. To get the next page of results,
  // set [page_token] to the [ListPlacementGroupInstancesResponse.next_page_token]
  // returned by a previous list request.
  string page_token = 3;
}

message ListPlacementGroupInstancesResponse {
  // Lists instances for the specified placement group.
  repeated Instance instances = 1;

  // This token allows you to get the next page of results for list requests. If the number of results
  // is more than [ListPlacementGroupInstancesRequest.page_size], use
  // [next_page_token] as the value
  // for the [ListPlacementGroupInstancesRequest.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 ListPlacementGroupOperationsRequest {
  // ID of the placement group to list operations for.
  //
  // To get the placement group ID, use [PlacementGroupService.List] request.
  string placement_group_id = 1;

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

  // Page token. To get the next page of results, set [page_token] to the
  // [ListPlacementGroupOperationsResponse.next_page_token] returned by a previous list request.
  string page_token = 3;
}

message ListPlacementGroupOperationsResponse {
  // List of operations for the specified placement group.
  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 [ListPlacementGroupOperationsRequest.page_size], use the [next_page_token] as the value
  // for the [ListPlacementGroupOperationsRequest.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;
}
