syntax = "proto3";

package yandex.cloud.resourcemanager.v1;

import "google/api/annotations.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "yandex/cloud/resourcemanager/v1/cloud.proto";
import "yandex/cloud/api/operation.proto";
import "yandex/cloud/access/access.proto";
import "yandex/cloud/operation/operation.proto";
import "yandex/cloud/validation.proto";

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

// A set of methods for managing Cloud resources.
service CloudService {
  // Returns the specified Cloud resource.
  //
  // To get the list of available Cloud resources, make a [List] request.
  rpc Get (GetCloudRequest) returns (Cloud) {
    option (google.api.http) = { get: "/resource-manager/v1/clouds/{cloud_id}" };
  }

  // Retrieves the list of Cloud resources.
  rpc List (ListCloudsRequest) returns (ListCloudsResponse) {
    option (google.api.http) = { get: "/resource-manager/v1/clouds" };
  }

  // Updates the specified cloud.
  rpc Update (UpdateCloudRequest) returns (operation.Operation) {
    option (google.api.http) = { patch: "/resource-manager/v1/clouds/{cloud_id}" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "UpdateCloudMetadata"
      response: "Cloud"
    };
  }

  // Deletes the specified cloud.
  //
  // The method is temporarily unavailable.
  rpc Delete (DeleteCloudRequest) returns (operation.Operation) {
    option (yandex.cloud.api.operation) = {
      metadata: "DeleteCloudMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // Lists operations for the specified cloud.
  rpc ListOperations (ListCloudOperationsRequest) returns (ListCloudOperationsResponse) {
    option (google.api.http) = { get: "/resource-manager/v1/clouds/{cloud_id}/operations" };
  }

  //access

  // Lists access bindings for the specified cloud.
  rpc ListAccessBindings (access.ListAccessBindingsRequest) returns (access.ListAccessBindingsResponse) {
    option (google.api.http) = { get: "/resource-manager/v1/clouds/{resource_id}:listAccessBindings" };
  }

  // Sets access bindings for the specified cloud.
  rpc SetAccessBindings (access.SetAccessBindingsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/resource-manager/v1/clouds/{resource_id}:setAccessBindings" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "access.SetAccessBindingsMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // Updates access bindings for the specified cloud.
  rpc UpdateAccessBindings (access.UpdateAccessBindingsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/resource-manager/v1/clouds/{resource_id}:updateAccessBindings" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "access.UpdateAccessBindingsMetadata"
      response: "google.protobuf.Empty"
    };
  }
}

message GetCloudRequest {
  // ID of the Cloud resource to return.
  // To get the cloud ID, use a [CloudService.List] request.
  string cloud_id = 1 [(required) = true, (length) = "<=50"];
}

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

  // Page token. Set [page_token]
  // to the [ListCloudsResponse.next_page_token]
  // returned by a previous list request to get the next page of results.
  string page_token = 2 [(length) = "<=100"];

  // A filter expression that filters resources listed in the response.
  // The expression must specify:
  // 1. The field name. Currently you can use filtering only on the [Cloud.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 3-63 characters long and match the regular expression `^[a-z][-a-z0-9]{1,61}[a-z0-9]$`.
  string filter = 3 [(length) = "<=1000"];
}

message ListCloudsResponse {
  // List of Cloud resources.
  repeated Cloud clouds = 1;

  // This token allows you to get the next page of results for list requests. If the number of results
  // is larger than [ListCloudsRequest.page_size], use
  // the [next_page_token] as the value
  // for the [ListCloudsRequest.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 ListCloudOperationsRequest {
  // ID of the Cloud resource to list operations for.
  string cloud_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 [ListCloudOperationsResponse.next_page_token]
  // that can be used to get the next page of results in subsequent list requests.
  // Acceptable values are 0 to 1000, inclusive. Default value: 100.
  int64 page_size = 2 [(value) = "<=1000"];

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

message ListCloudOperationsResponse {
  // List of operations for the specified cloud.
  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 [ListCloudOperationsRequest.page_size], use the [next_page_token] as the value
  // for the [ListCloudOperationsRequest.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 UpdateCloudRequest {
  // ID of the cloud to update.
  // To get the cloud ID, use a [CloudService.List] request.
  string cloud_id = 1 [(required) = true, (length) = "<=50"];

  // Field mask that specifies which fields of the cloud are going to be updated.
  google.protobuf.FieldMask update_mask = 2;

  // Name of the cloud.
  string name = 3 [(pattern) = "[a-z]([-a-z0-9]{0,61}[a-z0-9])?"];

  // Description of the cloud.
  string description = 4 [(length) = "<=256"];
}

message UpdateCloudMetadata {
  // ID of the cloud that is being updated.
  string cloud_id = 1;
}

message DeleteCloudRequest {
  // ID of the cloud to delete.
  // To get the cloud ID, use a [CloudService.List] request.
  string cloud_id = 1 [(required) = true, (length) = "<=50"];

  // The timestamp after which the process of deleting the cloud should begin.
  // Until this timestamp, the cloud goes into the PENDING_DELETION state and all resources in this
  // cloud are stopped. In this state, it is possible to cancel the delete operation without any loss.
  // After this timestamp, the status of the cloud will become DELETING and the process of deleting
  // all the resources  of the cloud will be started. If [delete_after] is not specified it will be
  // (now + 24 hours). To initiate an immediate deletion [delete_after] must be <= now.
  google.protobuf.Timestamp delete_after = 2;
}

message DeleteCloudMetadata {
  // ID of the cloud that is being deleted.
  string cloud_id = 1;
  // The timestamp after which the process of deleting the cloud should begin.
  google.protobuf.Timestamp delete_after = 2;
}
