syntax = "proto3";

package yandex.cloud.vpc.v1;

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

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

// A set of methods for managing Address resources.
service AddressService {
  // Returns the specified Address resource.
  //
  // To get the list of all available Address resources, make a [List] request.
  rpc Get (GetAddressRequest) returns (Address) {
    option (google.api.http) = { get: "/vpc/v1/addresses/{address_id}" };
  }

  // Returns the specified Address resource by a given value.
  //
  // To get the list of all available Address resources, make a [List] request.
  rpc GetByValue (GetAddressByValueRequest) returns (Address) {
    option (google.api.http) = { get: "/vpc/v1/addresses:byValue" };
  }

  // Retrieves the list of Address resources in the specified folder.
  rpc List (ListAddressesRequest) returns (ListAddressesResponse) {
    option (google.api.http) = { get: "/vpc/v1/addresses" };
  }

  // Creates an address in the specified folder and network.
  rpc Create (CreateAddressRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/vpc/v1/addresses" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "CreateAddressMetadata"
      response: "Address"
    };
  }

  // Updates the specified address.
  rpc Update (UpdateAddressRequest) returns (operation.Operation) {
    option (google.api.http) = { patch: "/vpc/v1/addresses/{address_id}" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "UpdateAddressMetadata"
      response: "Address"
    };
  }

  // Deletes the specified address.
  rpc Delete (DeleteAddressRequest) returns (operation.Operation) {
    option (google.api.http) = { delete: "/vpc/v1/addresses/{address_id}" };
    option (yandex.cloud.api.operation) = {
      metadata: "DeleteAddressMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // List operations for the specified address.
  rpc ListOperations (ListAddressOperationsRequest) returns (ListAddressOperationsResponse) {
    option (google.api.http) = { get: "/vpc/v1/addresses/{address_id}/operations" };
  }

  // Move an address to another folder
  rpc Move (MoveAddressRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/vpc/v1/addresses/{address_id}:move" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "MoveAddressMetadata"
      response: "Address"
    };
  }
}

message GetAddressRequest {
  // ID of the Address resource to return.
  //
  // To get Address resource ID make a [AddressService.List] request.
  string address_id = 1 [(required) = true, (length) = "<=50"];
}

message GetAddressByValueRequest {
  // External ipv4 address specification.
  oneof address {
    string external_ipv4_address = 1;
  }
}

message ListAddressesRequest {
  // ID of the folder to list addresses 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 [ListAddressesResponse.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
  // [ListAddressesResponse.next_page_token] returned by a previous list request.
  string page_token = 3 [(length) = "<=100"];

  // A filter expression that filters Address listed in the response.
  //
  // The expression must specify:
  // 1. The field name. Currently you can use filtering only on [Address.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]`.
  // Example of a filter: `name=my-address`.
  string filter = 4;
}

message ListAddressesResponse {
  // List of addresses.
  repeated Address addresses = 1;

  // Token for getting the next page of the list. If the number of results is greater than
  // the specified [ListAddressesRequest.page_size], use `next_page_token` as the value
  // for the [ListAddressesRequest.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 CreateAddressRequest {
  // ID of the folder to create a address in.
  //
  // To get a folder ID make a [yandex.cloud.resourcemanager.v1.FolderService.List] request.
  string folder_id = 1 [(required) = true, (length) = "<=50"];

  // Name of the address.
  // 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 address.
  string description = 3 [(length) = "<=256"];

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

  // External ipv4 address specification.
  oneof address_spec {
    ExternalIpv4AddressSpec external_ipv4_address_spec = 5;
  }
}

message ExternalIpv4AddressSpec {
  // Value of address.
  string address = 1; // if unspecified, one will be automatically allocated from other params

  // Availability zone from which the address will be allocated.
  string zone_id = 2; // only if address unspecified

  // Parameters of the allocated address, for example DDoS Protection.
  AddressRequirements requirements = 3;
}

message CreateAddressMetadata {
  // ID of the address that is being created.
  string address_id = 1;
}

message UpdateAddressRequest {
  // ID of the address to update.
  //
  // To get the address ID make a [AddressService.List] request.
  string address_id = 1 [(required) = true, (length) = "<=50"];

  // Field mask that specifies which attributes of the Address should be updated.
  google.protobuf.FieldMask update_mask = 2;

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

  // New description of the address.
  string description = 4 [(length) = "<=256"];

  // Address labels as `key:value` pairs.
  //
  // Existing set of labels is completely replaced by the provided set, so if you just want
  // to add or remove a label:
  // 1. Get the current set of labels with a [AddressService.Get] request.
  // 2. Add or remove a label in this set.
  // 3. Send the new set in this field.
  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]*"];

  // Specifies if address is reserved or not.
  bool reserved = 6;
}

message UpdateAddressMetadata {
  // ID of the Address that is being updated.
  string address_id = 1;
}

message DeleteAddressRequest {
  // ID of the address to delete.
  //
  // To get a address ID make a [AddressService.List] request.
  string address_id = 1 [(required) = true, (length) = "<=50"];
}

message DeleteAddressMetadata {
  // ID of the address that is being deleted.
  string address_id = 1;
}

message ListAddressOperationsRequest {
  // ID of the address to list operations for.
  //
  // To get a address ID make a [AddressService.List] request.
  string address_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 [ListAddressOperationsResponse.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
  // [ListAddressOperationsResponse.next_page_token] returned by a previous list request.
  string page_token = 3 [(length) = "<=100"];
}

message ListAddressOperationsResponse {
  // List of operations for the specified address.
  repeated operation.Operation operations = 1;

  // Token for getting the next page of the list. If the number of results is greater than
  // the specified [ListAddressOperationsRequest.page_size], use `next_page_token` as the value
  // for the [ListAddressOperationsRequest.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 MoveAddressRequest {
    string address_id = 1 [(required) = true, (length) = "<=50"];
    string destination_folder_id = 2 [(required) = true, (length) = "<=50"];
}

message MoveAddressMetadata {
    string address_id = 1;
}
