syntax = "proto3";

package yandex.cloud.loadbalancer.v1;

import "google/api/annotations.proto";
import "google/protobuf/field_mask.proto";
import "yandex/cloud/api/operation.proto";
import "yandex/cloud/validation.proto";
import "yandex/cloud/operation/operation.proto";
import "yandex/cloud/loadbalancer/v1/target_group.proto";

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

// A set of methods for managing TargetGroup resources.
service TargetGroupService {
  // Returns the specified TargetGroup resource.
  rpc Get (GetTargetGroupRequest) returns (TargetGroup) {
    option (google.api.http) = { get: "/load-balancer/v1/targetGroups/{target_group_id}" };
  }

  // Retrieves the list of TargetGroup resources in the specified folder.
  rpc List (ListTargetGroupsRequest) returns (ListTargetGroupsResponse) {
    option (google.api.http) = { get: "/load-balancer/v1/targetGroups" };
  }

  // Creates a target group in the specified folder and adds the specified targets to it.
  rpc Create (CreateTargetGroupRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/load-balancer/v1/targetGroups" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "CreateTargetGroupMetadata"
      response: "TargetGroup"
    };
  }

  // Updates the specified target group.
  rpc Update (UpdateTargetGroupRequest) returns (operation.Operation) {
    option (google.api.http) = { patch: "/load-balancer/v1/targetGroups/{target_group_id}" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "UpdateTargetGroupMetadata"
      response: "TargetGroup"
    };
  }

  // Deletes the specified target group.
  rpc Delete (DeleteTargetGroupRequest) returns (operation.Operation) {
    option (google.api.http) = { delete: "/load-balancer/v1/targetGroups/{target_group_id}" };
    option (yandex.cloud.api.operation) = {
      metadata: "DeleteTargetGroupMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // Adds targets to the target group.
  rpc AddTargets (AddTargetsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/load-balancer/v1/targetGroups/{target_group_id}:addTargets" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "AddTargetsMetadata"
      response: "TargetGroup"
    };
  }

  // Removes targets from the target group.
  rpc RemoveTargets (RemoveTargetsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/load-balancer/v1/targetGroups/{target_group_id}:removeTargets" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "RemoveTargetsMetadata"
      response: "TargetGroup"
    };
  }

  // Lists operations for the specified target group.
  rpc ListOperations (ListTargetGroupOperationsRequest) returns (ListTargetGroupOperationsResponse) {
    option (google.api.http) = { get: "/load-balancer/v1/targetGroups/{target_group_id}/operations" };
  }
}

message GetTargetGroupRequest {
  // ID of the TargetGroup resource to return.
  // To get the target group ID, use a [TargetGroupService.List] request.
  string target_group_id = 1 [(required) = true, (length) = "<=50"];
}

message ListTargetGroupsRequest {
  // ID of the folder to list target groups in. 
  // To get the folder ID, use a [TargetGroupService.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 [ListTargetGroupsResponse.next_page_token]
  // that can be used to get the next page of results in subsequent list requests.
  // Default value: 100.
  int64 page_size = 2 [(value) = "<=1000"];

  // Page token. To get the next page of results, set [page_token] to the 
  // [ListTargetGroupsResponse.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 filter by the [TargetGroup.name] field.
  // 2. An operator. Can be either `=` or `!=` for single values, or `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 = 4 [(length) = "<=1000"];
}

message ListTargetGroupsResponse {
  // List of TargetGroup resources.
  repeated TargetGroup target_groups = 1;

  // This token allows you to get the next page of results for list requests. If the number of results
  // is larger than [ListTargetGroupsRequest.page_size], use
  // the [next_page_token] as the value
  // for the [ListTargetGroupsRequest.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 CreateTargetGroupRequest {
  // ID of the folder to list target groups in. 
  // To get the folder ID, use a [TargetGroupService.List] request.
  string folder_id = 1 [(required) = true, (length) = "<=50"];

  // Name of the target group. 
  // The name must be unique within the folder.
  string name = 2 [(pattern) = "|[a-z][-a-z0-9]{1,61}[a-z0-9]"];

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

  // Resource labels as `` key:value `` pairs.
  map<string, string> labels = 4 [(yandex.cloud.size) = "<=64", (length) = "<=63", (pattern) = "[-_0-9a-z]*", (map_key).length = "1-63", (map_key).pattern = "[a-z][-_0-9a-z]*"];
  
  // ID of the availability zone where the target group resides.
  string region_id = 5 [(length) = "<=50"];

  // List of targets within the target group.
  repeated Target targets = 7;
}

message CreateTargetGroupMetadata {
  // ID of the target group that is being created.
  string target_group_id = 1;
}

message UpdateTargetGroupRequest {
  // ID of the TargetGroup resource to update.
  // To get the target group ID, use a [TargetGroupService.List] request.
  string target_group_id = 1 [(required) = true, (length) = "<=50"];

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

  // Name of the target group. 
  // The name must be unique within the folder.
  string name = 3 [(pattern) = "|[a-z][-a-z0-9]{1,61}[a-z0-9]"];

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

  // Resource labels as `` key:value `` pairs.
  //
  // The existing set of `` labels `` is completely replaced with the provided set.
  map<string, string> labels = 5 [(yandex.cloud.size) = "<=64", (length) = "<=63", (pattern) = "[-_0-9a-z]*", (map_key).length = "1-63", (map_key).pattern = "[a-z][-_0-9a-z]*"];

  // A new list of targets for this target group.
  repeated Target targets = 6;
}

message UpdateTargetGroupMetadata {
  // ID of the target group that is being updated.
  string target_group_id = 1;
}

message DeleteTargetGroupRequest {
  // ID of the target group to delete.
  // To get the target group ID, use a [TargetGroupService.List] request.
  string target_group_id = 1 [(required) = true, (length) = "<=50"];
}

message DeleteTargetGroupMetadata {
  // ID of the target group that is being deleted.
  string target_group_id = 1;
}

message AddTargetsRequest {
  // ID of the TargetGroup resource to add targets to.
  // To get the target group ID, use a [TargetGroupService.List] request.
  string target_group_id = 1 [(required) = true, (length) = "<=50"];

  // List of targets to add to the target group.
  repeated Target targets = 2 [(size) = ">=1"];
}

message AddTargetsMetadata {
  // ID of the target group that targets are being added to.
  string target_group_id = 1;
}

message RemoveTargetsRequest {
  // ID of the target group to remove targets from.
  // To get the target group ID, use a [TargetGroupService.List] request.
  string target_group_id = 1 [(required) = true, (length) = "<=50"];

  // List of targets to remove from the target group.
  repeated Target targets = 2 [(size) = ">=1"];
}

message RemoveTargetsMetadata {
  // ID of the target group that targets are being removed from.
  string target_group_id = 1;
}

message ListTargetGroupOperationsRequest {
  // ID of the TargetGroup resource to update.
  // To get the target group ID, use a [TargetGroupService.List] request.
  string target_group_id = 1 [(required) = true, (length) = "<=50"];

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

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

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