2020-08-05 21:52:40 +00:00
|
|
|
syntax = "proto3";
|
|
|
|
|
2020-08-12 21:43:51 +00:00
|
|
|
package neo.fs.v2.netmap;
|
2020-08-05 21:52:40 +00:00
|
|
|
|
2023-03-07 08:50:02 +00:00
|
|
|
option go_package = "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap/grpc;netmap";
|
2021-03-10 10:54:06 +00:00
|
|
|
option csharp_namespace = "Neo.FileStorage.API.Netmap";
|
2020-08-05 21:52:40 +00:00
|
|
|
|
2021-11-17 06:37:07 +00:00
|
|
|
import "refs/types.proto";
|
|
|
|
|
2020-08-23 11:42:01 +00:00
|
|
|
// Operations on filters
|
|
|
|
enum Operation {
|
|
|
|
// No Operation defined
|
|
|
|
OPERATION_UNSPECIFIED = 0;
|
|
|
|
|
|
|
|
// Equal
|
|
|
|
EQ = 1;
|
|
|
|
|
|
|
|
// Not Equal
|
|
|
|
NE = 2;
|
|
|
|
|
|
|
|
// Greater then
|
|
|
|
GT = 3;
|
|
|
|
|
|
|
|
// Greater or equal
|
|
|
|
GE = 4;
|
|
|
|
|
|
|
|
// Less then
|
|
|
|
LT = 5;
|
|
|
|
|
|
|
|
// Less or equal
|
|
|
|
LE = 6;
|
|
|
|
|
|
|
|
// Logical OR
|
|
|
|
OR = 7;
|
|
|
|
|
|
|
|
// Logical AND
|
|
|
|
AND = 8;
|
|
|
|
}
|
|
|
|
|
2020-10-15 07:50:36 +00:00
|
|
|
// Selector modifier shows how the node set will be formed. By default selector
|
|
|
|
// just groups nodes into a bucket by attribute, selecting nodes only by their
|
|
|
|
// hash distance.
|
2021-11-18 10:31:51 +00:00
|
|
|
enum Clause {
|
2022-04-13 06:21:33 +00:00
|
|
|
// No modifier defined. Nodes will be selected from the bucket randomly
|
2020-09-07 11:32:37 +00:00
|
|
|
CLAUSE_UNSPECIFIED = 0;
|
|
|
|
|
|
|
|
// SAME will select only nodes having the same value of bucket attribute
|
|
|
|
SAME = 1;
|
|
|
|
|
|
|
|
// DISTINCT will select nodes having different values of bucket attribute
|
|
|
|
DISTINCT = 2;
|
|
|
|
}
|
|
|
|
|
2022-04-13 06:21:33 +00:00
|
|
|
// This filter will return the subset of nodes from `NetworkMap` or another filter's
|
|
|
|
// results that will satisfy filter's conditions.
|
2020-08-23 11:42:01 +00:00
|
|
|
message Filter {
|
2022-04-13 06:21:33 +00:00
|
|
|
// Name of the filter or a reference to a named filter. '*' means
|
2020-10-15 07:50:36 +00:00
|
|
|
// application to the whole unfiltered NetworkMap. At top level it's used as a
|
|
|
|
// filter name. At lower levels it's considered to be a reference to another
|
|
|
|
// named filter
|
2020-10-19 08:24:58 +00:00
|
|
|
string name = 1 [json_name = "name"];
|
2020-08-23 11:42:01 +00:00
|
|
|
|
|
|
|
// Key to filter
|
2020-10-19 08:24:58 +00:00
|
|
|
string key = 2 [json_name = "key"];
|
2020-08-23 11:42:01 +00:00
|
|
|
|
|
|
|
// Filtering operation
|
2020-10-19 08:24:58 +00:00
|
|
|
Operation op = 3 [json_name = "op"];
|
2020-08-23 11:42:01 +00:00
|
|
|
|
|
|
|
// Value to match
|
2020-10-19 08:24:58 +00:00
|
|
|
string value = 4 [json_name = "value"];
|
2020-08-23 11:42:01 +00:00
|
|
|
|
2020-10-15 07:50:36 +00:00
|
|
|
// List of inner filters. Top level operation will be applied to the whole
|
|
|
|
// list.
|
2020-10-19 08:24:58 +00:00
|
|
|
repeated Filter filters = 5 [json_name = "filters"];
|
2020-08-23 11:42:01 +00:00
|
|
|
}
|
|
|
|
|
2020-10-15 07:50:36 +00:00
|
|
|
// Selector chooses a number of nodes from the bucket taking the nearest nodes
|
|
|
|
// to the provided `ContainerID` by hash distance.
|
2020-08-23 11:42:01 +00:00
|
|
|
message Selector {
|
|
|
|
// Selector name to reference in object placement section
|
2020-10-19 08:24:58 +00:00
|
|
|
string name = 1 [json_name = "name"];
|
2020-08-23 11:42:01 +00:00
|
|
|
|
2020-10-15 07:50:36 +00:00
|
|
|
// How many nodes to select from the bucket
|
2020-10-19 08:24:58 +00:00
|
|
|
uint32 count = 2 [json_name = "count"];
|
2020-08-23 11:42:01 +00:00
|
|
|
|
2020-09-07 11:32:37 +00:00
|
|
|
// Selector modifier showing how to form a bucket
|
2020-10-19 08:24:58 +00:00
|
|
|
Clause clause = 3 [json_name = "clause"];
|
2020-09-07 11:32:37 +00:00
|
|
|
|
2022-04-13 06:21:33 +00:00
|
|
|
// Bucket attribute to select from
|
2020-10-19 08:24:58 +00:00
|
|
|
string attribute = 4 [json_name = "attribute"];
|
2020-08-23 11:42:01 +00:00
|
|
|
|
|
|
|
// Filter reference to select from
|
2020-10-19 08:24:58 +00:00
|
|
|
string filter = 5 [json_name = "filter"];
|
2020-08-23 11:42:01 +00:00
|
|
|
}
|
|
|
|
|
2020-10-15 07:50:36 +00:00
|
|
|
// Number of object replicas in a set of nodes from the defined selector. If no
|
2022-04-13 06:21:33 +00:00
|
|
|
// selector set, the root bucket containing all possible nodes will be used by
|
2020-10-15 07:50:36 +00:00
|
|
|
// default.
|
2020-08-23 11:42:01 +00:00
|
|
|
message Replica {
|
|
|
|
// How many object replicas to put
|
2020-10-19 08:24:58 +00:00
|
|
|
uint32 count = 1 [json_name = "count"];
|
2020-08-23 11:42:01 +00:00
|
|
|
|
2020-10-15 07:50:36 +00:00
|
|
|
// Named selector bucket to put replicas
|
2020-10-19 08:24:58 +00:00
|
|
|
string selector = 2 [json_name = "selector"];
|
2020-08-23 11:42:01 +00:00
|
|
|
}
|
|
|
|
|
2020-10-15 07:50:36 +00:00
|
|
|
// Set of rules to select a subset of nodes from `NetworkMap` able to store
|
|
|
|
// container's objects. The format is simple enough to transpile from different
|
|
|
|
// storage policy definition languages.
|
2020-08-12 21:43:51 +00:00
|
|
|
message PlacementPolicy {
|
2020-10-15 07:50:36 +00:00
|
|
|
// Rules to set number of object replicas and place each one into a named
|
|
|
|
// bucket
|
2020-10-19 08:24:58 +00:00
|
|
|
repeated Replica replicas = 1 [json_name = "replicas"];
|
2020-08-23 11:42:01 +00:00
|
|
|
|
|
|
|
// Container backup factor controls how deep NeoFS will search for nodes
|
2020-10-15 07:50:36 +00:00
|
|
|
// alternatives to include into container's nodes subset
|
2020-10-19 08:24:58 +00:00
|
|
|
uint32 container_backup_factor = 2 [json_name = "containerBackupFactor"];
|
2020-08-23 11:42:01 +00:00
|
|
|
|
|
|
|
// Set of Selectors to form the container's nodes subset
|
2020-10-19 08:24:58 +00:00
|
|
|
repeated Selector selectors = 3 [json_name = "selectors"];
|
2020-08-23 11:42:01 +00:00
|
|
|
|
|
|
|
// List of named filters to reference in selectors
|
2020-10-19 08:24:58 +00:00
|
|
|
repeated Filter filters = 4 [json_name = "filters"];
|
2021-11-17 06:37:07 +00:00
|
|
|
|
|
|
|
// Subnetwork ID to select nodes from. Zero subnet (default) represents
|
|
|
|
// all of the nodes which didn't explicitly opt out of membership.
|
|
|
|
refs.SubnetID subnet_id = 5 [json_name = "subnetId"];
|
2020-08-05 21:52:40 +00:00
|
|
|
}
|
2020-08-05 21:58:09 +00:00
|
|
|
|
2020-08-12 21:43:51 +00:00
|
|
|
// NeoFS node description
|
2020-08-05 21:58:09 +00:00
|
|
|
message NodeInfo {
|
2021-11-18 10:31:51 +00:00
|
|
|
// Public key of the NeoFS node in a binary format
|
2020-10-19 08:24:58 +00:00
|
|
|
bytes public_key = 1 [json_name = "publicKey"];
|
2020-08-31 10:56:03 +00:00
|
|
|
|
|
|
|
// Ways to connect to a node
|
2021-06-23 11:53:21 +00:00
|
|
|
repeated string addresses = 2 [json_name = "addresses"];
|
2020-08-05 21:58:09 +00:00
|
|
|
|
2020-10-13 16:37:14 +00:00
|
|
|
// Administrator-defined Attributes of the NeoFS Storage Node.
|
|
|
|
//
|
2020-12-08 10:48:51 +00:00
|
|
|
// `Attribute` is a Key-Value metadata pair. Key name must be a valid UTF-8
|
|
|
|
// string. Value can't be empty.
|
|
|
|
//
|
2021-08-16 09:02:07 +00:00
|
|
|
// Attributes can be constructed into a chain of attributes: any attribute can
|
|
|
|
// have a parent attribute and a child attribute (except the first and the last
|
|
|
|
// one). A string representation of the chain of attributes in NeoFS Storage
|
|
|
|
// Node configuration uses ":" and "/" symbols, e.g.:
|
|
|
|
//
|
|
|
|
// `NEOFS_NODE_ATTRIBUTE_1=key1:val1/key2:val2`
|
|
|
|
//
|
|
|
|
// Therefore the string attribute representation in the Node configuration must
|
|
|
|
// use "\:", "\/" and "\\" escaped symbols if any of them appears in an attribute's
|
|
|
|
// key or value.
|
|
|
|
//
|
2020-10-13 16:37:14 +00:00
|
|
|
// Node's attributes are mostly used during Storage Policy evaluation to
|
|
|
|
// calculate object's placement and find a set of nodes satisfying policy
|
|
|
|
// requirements. There are some "well-known" node attributes common to all the
|
|
|
|
// Storage Nodes in the network and used implicitly with default values if not
|
|
|
|
// explicitly set:
|
|
|
|
//
|
|
|
|
// * Capacity \
|
|
|
|
// Total available disk space in Gigabytes.
|
|
|
|
// * Price \
|
|
|
|
// Price in GAS tokens for storing one GB of data during one Epoch. In node
|
|
|
|
// attributes it's a string presenting floating point number with comma or
|
|
|
|
// point delimiter for decimal part. In the Network Map it will be saved as
|
|
|
|
// 64-bit unsigned integer representing number of minimal token fractions.
|
2023-03-14 07:24:35 +00:00
|
|
|
// * [ __SYSTEM__SUBNET_%s ] \
|
|
|
|
// (`__NEOFS__SUBNET_%s` is deprecated) \
|
2021-11-18 11:08:31 +00:00
|
|
|
// `True` or `False`. Defines if the node is included in the `%s` subnetwork
|
|
|
|
// or not. `%s` must be an existing subnetwork's ID (non-negative integer number).
|
|
|
|
// A node can be included in more than one subnetwork and, therefore, can contain
|
|
|
|
// more than one subnet attribute. A missing attribute is equivalent to the
|
|
|
|
// presence of the attribute with `False` value (except default zero subnetwork
|
|
|
|
// (with `%s` == 0) for which missing attribute means inclusion in that network).
|
2021-02-10 09:38:06 +00:00
|
|
|
// * UN-LOCODE \
|
2020-10-13 16:37:14 +00:00
|
|
|
// Node's geographic location in
|
|
|
|
// [UN/LOCODE](https://www.unece.org/cefact/codesfortrade/codes_index.html)
|
2021-02-11 11:37:29 +00:00
|
|
|
// format approximated to the nearest point defined in the standard.
|
2021-02-10 09:41:51 +00:00
|
|
|
// * CountryCode \
|
2020-10-13 16:37:14 +00:00
|
|
|
// Country code in
|
|
|
|
// [ISO 3166-1_alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
|
2021-02-11 11:37:29 +00:00
|
|
|
// format. Calculated automatically from `UN-LOCODE` attribute.
|
|
|
|
// * Country \
|
|
|
|
// Country short name in English, as defined in
|
|
|
|
// [ISO-3166](https://www.iso.org/obp/ui/#search). Calculated automatically
|
|
|
|
// from `UN-LOCODE` attribute.
|
2021-02-10 09:45:22 +00:00
|
|
|
// * Location \
|
2021-02-11 11:37:29 +00:00
|
|
|
// Place names are given, whenever possible, in their national language
|
|
|
|
// versions as expressed in the Roman alphabet using the 26 characters of
|
|
|
|
// the character set adopted for international trade data interchange,
|
|
|
|
// written without diacritics . Calculated automatically from `UN-LOCODE`
|
|
|
|
// attribute.
|
2021-02-10 09:47:09 +00:00
|
|
|
// * SubDivCode \
|
2021-02-11 11:37:29 +00:00
|
|
|
// Country's administrative subdivision where node is located. Calculated
|
|
|
|
// automatically from `UN-LOCODE` attribute based on `SubDiv` field.
|
|
|
|
// Presented in [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2)
|
|
|
|
// format.
|
2021-02-10 09:48:23 +00:00
|
|
|
// * SubDiv \
|
2021-02-11 11:37:29 +00:00
|
|
|
// Country's administrative subdivision name, as defined in
|
|
|
|
// [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2). Calculated
|
|
|
|
// automatically from `UN-LOCODE` attribute.
|
2021-02-10 09:49:17 +00:00
|
|
|
// * Continent \
|
2021-02-11 11:37:29 +00:00
|
|
|
// Node's continent name according to the [Seven-Continent model]
|
|
|
|
// (https://en.wikipedia.org/wiki/Continent#Number). Calculated
|
|
|
|
// automatically from `UN-LOCODE` attribute.
|
2022-09-20 10:22:29 +00:00
|
|
|
// * ExternalAddr
|
|
|
|
// Node's preferred way for communications with external clients.
|
|
|
|
// Clients SHOULD use these addresses if possible.
|
|
|
|
// Must contain a comma-separated list of multi-addresses.
|
2020-10-13 16:37:14 +00:00
|
|
|
//
|
|
|
|
// For detailed description of each well-known attribute please see the
|
2022-04-13 06:21:33 +00:00
|
|
|
// corresponding section in NeoFS Technical Specification.
|
2020-08-11 09:03:50 +00:00
|
|
|
message Attribute {
|
2021-11-18 10:31:51 +00:00
|
|
|
// Key of the node attribute
|
2020-10-19 08:24:58 +00:00
|
|
|
string key = 1 [json_name = "key"];
|
2020-08-05 21:58:09 +00:00
|
|
|
|
2021-11-18 10:31:51 +00:00
|
|
|
// Value of the node attribute
|
2020-10-19 08:24:58 +00:00
|
|
|
string value = 2 [json_name = "value"];
|
2020-08-23 11:42:01 +00:00
|
|
|
|
2020-10-13 16:37:14 +00:00
|
|
|
// Parent keys, if any. For example for `City` it could be `Region` and
|
|
|
|
// `Country`.
|
2020-10-19 08:24:58 +00:00
|
|
|
repeated string parents = 3 [json_name = "parents"];
|
2020-08-11 09:03:50 +00:00
|
|
|
}
|
2020-12-11 06:46:00 +00:00
|
|
|
// Carries list of the NeoFS node attributes in a key-value form. Key name
|
|
|
|
// must be a node-unique valid UTF-8 string. Value can't be empty. NodeInfo
|
|
|
|
// structures with duplicated attribute names or attributes with empty values
|
|
|
|
// will be considered invalid.
|
2020-10-19 08:24:58 +00:00
|
|
|
repeated Attribute attributes = 3 [json_name = "attributes"];
|
2020-08-05 21:58:09 +00:00
|
|
|
|
2020-08-11 09:03:50 +00:00
|
|
|
// Represents the enumeration of various states of the NeoFS node.
|
|
|
|
enum State {
|
2021-11-18 10:31:51 +00:00
|
|
|
// Unknown state
|
2020-08-23 11:42:01 +00:00
|
|
|
UNSPECIFIED = 0;
|
2020-08-05 21:58:09 +00:00
|
|
|
|
2021-11-18 10:31:51 +00:00
|
|
|
// Active state in the network
|
2020-08-11 09:03:50 +00:00
|
|
|
ONLINE = 1;
|
2020-08-05 21:58:09 +00:00
|
|
|
|
2021-11-18 10:31:51 +00:00
|
|
|
// Network unavailable state
|
2020-08-11 09:03:50 +00:00
|
|
|
OFFLINE = 2;
|
2022-09-14 15:07:14 +00:00
|
|
|
|
|
|
|
// Maintenance state
|
|
|
|
MAINTENANCE = 3;
|
2020-08-11 09:03:50 +00:00
|
|
|
}
|
2020-08-05 21:58:09 +00:00
|
|
|
|
2021-11-18 10:31:51 +00:00
|
|
|
// Carries state of the NeoFS node
|
2020-10-19 08:24:58 +00:00
|
|
|
State state = 4 [json_name = "state"];
|
2020-08-12 21:43:51 +00:00
|
|
|
}
|
2021-02-17 16:05:06 +00:00
|
|
|
|
2022-07-27 13:27:55 +00:00
|
|
|
// Network map structure
|
|
|
|
message Netmap {
|
|
|
|
// Network map revision number.
|
|
|
|
uint64 epoch = 1 [json_name = "epoch"];
|
|
|
|
|
|
|
|
// Nodes presented in network.
|
|
|
|
repeated NodeInfo nodes = 2 [json_name = "nodes"];
|
|
|
|
}
|
|
|
|
|
2021-09-15 08:23:44 +00:00
|
|
|
// NeoFS network configuration
|
|
|
|
message NetworkConfig {
|
2022-09-23 10:09:32 +00:00
|
|
|
// Single configuration parameter. Key MUST be network-unique.
|
|
|
|
//
|
|
|
|
// System parameters:
|
|
|
|
// - **AuditFee** \
|
|
|
|
// Fee paid by the storage group owner to the Inner Ring member.
|
|
|
|
// Value: little-endian integer. Default: 0.
|
|
|
|
// - **BasicIncomeRate** \
|
|
|
|
// Cost of storing one gigabyte of data for a period of one epoch. Paid by
|
|
|
|
// container owner to container nodes.
|
|
|
|
// Value: little-endian integer. Default: 0.
|
|
|
|
// - **ContainerAliasFee** \
|
|
|
|
// Fee paid for named container's creation by the container owner.
|
|
|
|
// Value: little-endian integer. Default: 0.
|
|
|
|
// - **ContainerFee** \
|
|
|
|
// Fee paid for container creation by the container owner.
|
|
|
|
// Value: little-endian integer. Default: 0.
|
|
|
|
// - **EpochDuration** \
|
|
|
|
// NeoFS epoch duration measured in Sidechain blocks.
|
|
|
|
// Value: little-endian integer. Default: 0.
|
|
|
|
// - **HomomorphicHashingDisabled** \
|
|
|
|
// Flag of disabling the homomorphic hashing of objects' payload.
|
|
|
|
// Value: true if any byte != 0. Default: false.
|
|
|
|
// - **InnerRingCandidateFee** \
|
|
|
|
// Fee for entrance to the Inner Ring paid by the candidate.
|
|
|
|
// Value: little-endian integer. Default: 0.
|
|
|
|
// - **MaintenanceModeAllowed** \
|
|
|
|
// Flag allowing setting the MAINTENANCE state to storage nodes.
|
|
|
|
// Value: true if any byte != 0. Default: false.
|
|
|
|
// - **MaxObjectSize** \
|
|
|
|
// Maximum size of physically stored NeoFS object measured in bytes.
|
|
|
|
// Value: little-endian integer. Default: 0.
|
|
|
|
// - **WithdrawFee** \
|
|
|
|
// Fee paid for withdrawal of funds paid by the account owner.
|
|
|
|
// Value: little-endian integer. Default: 0.
|
2021-09-15 08:23:44 +00:00
|
|
|
message Parameter {
|
2021-11-18 10:31:51 +00:00
|
|
|
// Parameter key. UTF-8 encoded string
|
2021-09-15 08:23:44 +00:00
|
|
|
bytes key = 1 [json_name = "key"];
|
|
|
|
|
2021-11-18 10:31:51 +00:00
|
|
|
// Parameter value
|
2021-09-15 08:23:44 +00:00
|
|
|
bytes value = 2 [json_name = "value"];
|
|
|
|
}
|
2021-11-18 10:31:51 +00:00
|
|
|
// List of parameter values
|
2021-09-15 08:23:44 +00:00
|
|
|
repeated Parameter parameters = 1 [json_name = "parameters"];
|
|
|
|
}
|
|
|
|
|
2021-02-17 16:05:06 +00:00
|
|
|
// Information about NeoFS network
|
|
|
|
message NetworkInfo {
|
2021-11-18 10:31:51 +00:00
|
|
|
// Number of the current epoch in the NeoFS network
|
2021-02-17 16:05:06 +00:00
|
|
|
uint64 current_epoch = 1 [json_name = "currentEpoch"];
|
|
|
|
|
2021-11-18 10:31:51 +00:00
|
|
|
// Magic number of the sidechain of the NeoFS network
|
2021-02-17 16:05:06 +00:00
|
|
|
uint64 magic_number = 2 [json_name = "magicNumber"];
|
2021-09-15 08:15:50 +00:00
|
|
|
|
2021-11-18 10:31:51 +00:00
|
|
|
// MillisecondsPerBlock network parameter of the sidechain of the NeoFS network
|
2021-09-15 08:15:50 +00:00
|
|
|
int64 ms_per_block = 3 [json_name = "msPerBlock"];
|
2021-09-15 08:25:06 +00:00
|
|
|
|
2021-11-18 10:31:51 +00:00
|
|
|
// NeoFS network configuration
|
2021-09-15 08:25:06 +00:00
|
|
|
NetworkConfig network_config = 4 [json_name = "networkConfig"];
|
2021-02-17 16:05:06 +00:00
|
|
|
}
|