diff --git a/.forgejo/workflows/dco.yaml b/.forgejo/workflows/dco.yaml deleted file mode 100644 index 74fba6a..0000000 --- a/.forgejo/workflows/dco.yaml +++ /dev/null @@ -1,19 +0,0 @@ -name: DCO action -on: [pull_request] - -jobs: - dco: - name: DCO - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - name: Setup Go - uses: actions/setup-go@v3 - with: - go-version: '1.22' - - name: Run commit format checker - uses: https://git.frostfs.info/TrueCloudLab/dco-go@v3 - with: - from: 'origin/${{ github.event.pull_request.base.ref }}' diff --git a/.forgejo/workflows/fmt.yaml b/.forgejo/workflows/fmt.yaml deleted file mode 100644 index ddd50a7..0000000 --- a/.forgejo/workflows/fmt.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: Formatters -on: [pull_request] - -jobs: - fmt: - name: Run fmt - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v3 - - name: Install deps - run: | - apt update - apt install -y clang-format - - name: Run fmt - run: | - make fmt - git diff --exit-code --quiet diff --git a/.forgejo/workflows/pre-commit.yaml b/.forgejo/workflows/pre-commit.yaml deleted file mode 100644 index 5bf97eb..0000000 --- a/.forgejo/workflows/pre-commit.yaml +++ /dev/null @@ -1,18 +0,0 @@ -name: Pre-commit hooks -on: [pull_request] - -jobs: - pre-commit: - name: Pre-commit - env: - # Skip pre-commit hooks which are executed by other actions. - SKIP: make-fmt - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v3 - - name: Install deps - run: | - apt update - apt install -y pre-commit - - name: Run pre-commit - run: pre-commit run --all-files --hook-stage manual --color=always diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..29c4211 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @alexvanin @realloc @fyrchik @anatoly-bogatyrev diff --git a/.forgejo/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md similarity index 100% rename from .forgejo/ISSUE_TEMPLATE/bug_report.md rename to .github/ISSUE_TEMPLATE/bug_report.md diff --git a/.forgejo/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml similarity index 100% rename from .forgejo/ISSUE_TEMPLATE/config.yml rename to .github/ISSUE_TEMPLATE/config.yml diff --git a/.forgejo/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md similarity index 100% rename from .forgejo/ISSUE_TEMPLATE/feature_request.md rename to .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.forgejo/logo.svg b/.github/logo.svg similarity index 100% rename from .forgejo/logo.svg rename to .github/logo.svg diff --git a/.forgejo/markdown.tmpl b/.github/markdown.tmpl similarity index 100% rename from .forgejo/markdown.tmpl rename to .github/markdown.tmpl diff --git a/.github/workflows/buf.yml b/.github/workflows/buf.yml new file mode 100644 index 0000000..5d9d740 --- /dev/null +++ b/.github/workflows/buf.yml @@ -0,0 +1,36 @@ +name: Buf lint + +on: + pull_request: + branches: + - master + +jobs: + lint: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - uses: wizhi/setup-buf@v1 + with: + version: 0.20.5 + - run: buf check lint + + breaking: + runs-on: ubuntu-20.04 + steps: + - name: Setup buf + uses: wizhi/setup-buf@v1 + with: + version: 0.20.5 + - name: Check out ref code + uses: actions/checkout@v2 + with: + ref: ${{ github.base_ref }} + path: baseref + - run: cd baseref && buf image build -o image.bin + + - name: Check out code + uses: actions/checkout@v2 + with: + path: prclone + - run: cd prclone && buf check breaking --against-input ../baseref/image.bin diff --git a/.github/workflows/dco.yml b/.github/workflows/dco.yml new file mode 100644 index 0000000..40ed8fc --- /dev/null +++ b/.github/workflows/dco.yml @@ -0,0 +1,21 @@ +name: DCO check + +on: + pull_request: + branches: + - master + +jobs: + commits_check_job: + runs-on: ubuntu-latest + name: Commits Check + steps: + - name: Get PR Commits + id: 'get-pr-commits' + uses: tim-actions/get-pr-commits@master + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: DCO Check + uses: tim-actions/dco@master + with: + commits: ${{ steps.get-pr-commits.outputs.commits }} diff --git a/.gitignore b/.gitignore index 485dee6..c6ef218 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .idea + diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 96f3e27..0000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,24 +0,0 @@ -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 - hooks: - - id: check-added-large-files - - id: check-case-conflict - - id: check-executables-have-shebangs - - id: check-shebang-scripts-are-executable - - id: check-merge-conflict - - id: check-json - - id: check-xml - - id: check-yaml - - id: trailing-whitespace - args: [--markdown-linebreak-ext=md] - - id: end-of-file-fixer - exclude: ".svg$" - - - repo: local - hooks: - - id: make-fmt - name: Run make fmt - entry: make fmt - language: system - pass_filenames: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 70ceb4a..ee28fa6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,7 +61,7 @@ Network magic, main status codes, object locks and notifications. - `LOCK` value of `object.Type` enum (#194) - `Lock` message with payload content of `LOCK` objects (#194) - `LOCKED` and `LOCK_NON_REGULAR_OBJECT` status codes to `Object` section (#194) -- `scheme` field of type `SignatureScheme` to `Signature` message which determines +- `scheme` field of type `SignatureScheme` to `Signature` message which determines signature scheme (#55) - `SignatureRFC6979` message (#203) @@ -166,8 +166,8 @@ values in the objects. ### Changed -- Clarified processing of empty search query in `object.Search` RPC. -- Specified connection of tombstone expiration value with well-known +- Clarified processing of empty search query in `object.Search` RPC. +- Specified connection of tombstone expiration value with well-known `__NEOFS__EXPIRATION_EPOCH` object attribute. ## [2.3.0] - 2021-02-11 - Seonyudo (선유도, 仙遊島) diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index 854e751..0000000 --- a/CODEOWNERS +++ /dev/null @@ -1,3 +0,0 @@ -.* @alexvanin @realloc @fyrchik @a.bogatyrev @TrueCloudLab/storage-sdk-developers -.forgejo/.* @potyarkin -Makefile @potyarkin diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1ca386f..c26de50 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,8 +3,8 @@ First, thank you for contributing! We love and encourage pull requests from everyone. Please follow the guidelines: -- Check the open [issues](https://git.frostfs.info/TrueCloudLab/frostfs-api/issues) and - [pull requests](https://git.frostfs.info/TrueCloudLab/frostfs-api/pulls) for existing +- Check the open [issues](https://github.com/TrueCloudLab/frostfs-api/issues) and + [pull requests](https://github.com/TrueCloudLab/frostfs-api/pulls) for existing discussions. - Open an issue first, to discuss a new feature or enhancement. @@ -25,20 +25,19 @@ Start by forking the `frostfs-api` repository, make changes in a branch and then send a pull request. We encourage pull requests to discuss code changes. Here are the steps in details: -### Set up your repository - -Fork [FrostFS upstream](https://git.frostfs.info/TrueCloudLab/frostfs-api/fork) source +### Set up your GitHub Repository +Fork [NeoFS node upstream](https://github.com/TrueCloudLab/frostfs-api/fork) source repository to your own personal repository. Copy the URL of your fork (you will need it for the `git clone` command below). ```sh -$ git clone https://git.frostfs.info/TrueCloudLab/frostfs-api +$ git clone https://github.com/TrueCloudLab/frostfs-api ``` ### Set up git remote as ``upstream`` ```sh $ cd frostfs-api -$ git remote add upstream https://git.frostfs.info/TrueCloudLab/frostfs-api +$ git remote add upstream https://github.com/TrueCloudLab/frostfs-api $ git fetch upstream $ git merge upstream/master ... @@ -87,7 +86,7 @@ $ git push origin feature/123-something_awesome ``` ### Create a Pull Request -Pull requests can be created via git.frostfs.info. Refer to [this +Pull requests can be created via GitHub. Refer to [this document](https://help.github.com/articles/creating-a-pull-request/) for detailed steps on how to create a pull request. After a Pull Request gets peer reviewed and approved, it will be merged. diff --git a/Makefile b/Makefile old mode 100755 new mode 100644 index 6173f5c..532d8b0 --- a/Makefile +++ b/Makefile @@ -1,35 +1,27 @@ #!/usr/bin/make -f SHELL=bash -include help.mk +# BRanch to match for BReaking changes +BRBR?=master -.PHONY: doc fmt pre-commit unpre-commit pre-commit-run +.PHONY: lint +lint: + buf check lint + buf check breaking --against-input '.git#branch=$(BRBR)' +.PHONY: doc # Regenerate documentation for proto files: doc: @for f in `find . -type f -name '*.proto' -exec dirname {} \; | sort -u `; do \ echo "⇒ Documentation for $$(basename $$f)"; \ protoc \ - --doc_opt=.forgejo/markdown.tmpl,$${f}.md \ + --doc_opt=.github/markdown.tmpl,$${f}.md \ --proto_path=.:/usr/local/include \ --doc_out=proto-docs/ $${f}/*.proto; \ done -# Run clang-format fmt: @for f in `ls **/*.proto`; do \ echo "⇒ Formatting $$f"; \ clang-format -i $$f; \ done - -# Activate pre-commit hooks -pre-commit: - pre-commit install --hook-type pre-commit - -# Deactivate pre-commit hooks -unpre-commit: - pre-commit uninstall --hook-type pre-commit - -# Run pre-commit hooks -pre-commit-run: - @pre-commit run --all-files --hook-stage manual diff --git a/README.md b/README.md index 5447b7b..5a262ae 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,19 @@

-FrostFS +FrostFS

- FrostFS API language-agnostic protocol definitions + FrostFS API language-agnostic protocol definitions

--- -![Release](https://git.frostfs.info/TrueCloudLab/frostfs-api/badges/release.svg) +![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/TrueCloudLab/frostfs-api?sort=semver) +![License](https://img.shields.io/github/license/TrueCloudLab/frostfs-api.svg?style=popout) ## Overview FrostFS-API repository is the basis for language-specific libraries, e.g.: -- [frostfs-api-go](https://git.frostfs.info/TrueCloudLab/frostfs-api-go) +- [frostfs-api-go](https://github.com/TrueCloudLab/frostfs-api-go) Those libraries contain compiled protocol buffers definitions, wrapped with language-specific code. Use them to integrate applications with FrostFS. diff --git a/accounting/service.proto b/accounting/service.proto index cd49b4d..ac988c9 100644 --- a/accounting/service.proto +++ b/accounting/service.proto @@ -1,4 +1,4 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.accounting; @@ -9,13 +9,13 @@ import "accounting/types.proto"; import "refs/types.proto"; import "session/types.proto"; -// Accounting service provides methods for interaction with FrostFS sidechain -// via other FrostFS nodes to get information about the account balance. Deposit -// and Withdraw operations can't be implemented here, as they require Mainnet -// FrostFS smart contract invocation. Transfer operations between internal -// FrostFS accounts are possible if both use the same token type. +// Accounting service provides methods for interaction with NeoFS sidechain via +// other NeoFS nodes to get information about the account balance. Deposit and +// Withdraw operations can't be implemented here, as they require Mainnet NeoFS +// smart contract invocation. Transfer operations between internal NeoFS +// accounts are possible if both use the same token type. service AccountingService { - // Returns the amount of funds in GAS token for the requested FrostFS account. + // Returns the amount of funds in GAS token for the requested NeoFS account. // // Statuses: // - **OK** (0, SECTION_SUCCESS): @@ -27,9 +27,9 @@ service AccountingService { // BalanceRequest message message BalanceRequest { // To indicate the account for which the balance is requested, its identifier - // is used. It can be any existing account in FrostFS sidechain `Balance` - // smart contract. If omitted, client implementation MUST set it to the - // request's signer `OwnerID`. + // is used. It can be any existing account in NeoFS sidechain `Balance` smart + // contract. If omitted, client implementation MUST set it to the request's + // signer `OwnerID`. message Body { // Valid user identifier in `OwnerID` format for which the balance is // requested. Required field. diff --git a/accounting/types.proto b/accounting/types.proto index 7f5e89c..eadf9a8 100644 --- a/accounting/types.proto +++ b/accounting/types.proto @@ -1,11 +1,11 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.accounting; option go_package = "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/accounting/grpc;accounting"; option csharp_namespace = "Neo.FileStorage.API.Accounting"; -// Standard floating point data type can't be used in FrostFS due to inexactness +// Standard floating point data type can't be used in NeoFS due to inexactness // of the result when doing lots of small number operations. To solve the lost // precision issue, special `Decimal` format is used for monetary computations. // diff --git a/acl/types.proto b/acl/types.proto index 78f247a..e9ea987 100644 --- a/acl/types.proto +++ b/acl/types.proto @@ -1,4 +1,4 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.acl; @@ -6,7 +6,6 @@ option go_package = "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl/grpc;ac option csharp_namespace = "Neo.FileStorage.API.Acl"; import "refs/types.proto"; -import "ape/types.proto"; // Target role of the access control rule in access control list. enum Role { @@ -89,14 +88,14 @@ enum HeaderType { // Filter object headers OBJECT = 2; - // Filter service headers. These are not processed by FrostFS nodes and + // Filter service headers. These are not processed by NeoFS nodes and // exist for service use only. SERVICE = 3; } // Describes a single eACL rule. message EACLRecord { - // FrostFS request Verb to match + // NeoFS request Verb to match Operation operation = 1 [ json_name = "operation" ]; // Rule execution result. Either allows or denies access if filters match. @@ -165,7 +164,7 @@ message EACLRecord { // Extended ACL rules table. A list of ACL rules defined additionally to Basic // ACL. Extended ACL rules can be attached to a container and can be updated // or may be defined in `BearerToken` structure. Please see the corresponding -// FrostFS Technical Specification section for detailed description. +// NeoFS Technical Specification section for detailed description. message EACLTable { // eACL format version. Effectively, the version of API library used to create // eACL Table. @@ -195,9 +194,6 @@ message BearerToken { // container. If it contains `container_id` field, bearer token is only // valid for this specific container. Otherwise, any container of the same // owner is allowed. - // - // Deprecated: eACL tables are no longer relevant - `APEOverrides` should be - // used instead. EACLTable eacl_table = 1 [ json_name = "eaclTable" ]; // `OwnerID` defines to whom the token was issued. It must match the request @@ -222,24 +218,6 @@ message BearerToken { // AllowImpersonate flag to consider token signer as request owner. // If this field is true extended ACL table in token body isn't processed. bool allow_impersonate = 4 [ json_name = "allowImpersonate" ]; - - // APEOverride is the list of APE chains defined for a target. - // These chains are meant to serve as overrides to the already defined (or - // even undefined) APE chains for the target (see contract `Policy`). - // - // The server-side processing of the bearer token with set APE overrides - // must verify if a client is permitted to override chains for the target, - // preventing unauthorized access through the APE mechanism. - message APEOverride { - // Target for which chains are applied. - frostfs.v2.ape.ChainTarget target = 1 [ json_name = "target" ]; - - // The list of APE chains. - repeated frostfs.v2.ape.Chain chains = 2 [ json_name = "chains" ]; - } - - // APE override for the target. - APEOverride ape_override = 5 [ json_name = "apeOverride" ]; } // Bearer Token body Body body = 1 [ json_name = "body" ]; diff --git a/apemanager/service.proto b/apemanager/service.proto index 64c2565..6b9da60 100644 --- a/apemanager/service.proto +++ b/apemanager/service.proto @@ -1,8 +1,8 @@ -edition = "2023"; +syntax = "proto3"; package frostfs.v2.apemanager; -import "ape/types.proto"; +import "apemanager/types.proto"; import "session/types.proto"; option go_package = "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/apemanager/grpc;apemanager"; @@ -52,10 +52,10 @@ service APEManagerService { message AddChainRequest { message Body { // A target for which a rule chain is added. - frostfs.v2.ape.ChainTarget target = 1; + ChainTarget target = 1; // The chain to set for the target. - frostfs.v2.ape.Chain chain = 2; + Chain chain = 2; } // The request's body. @@ -95,7 +95,7 @@ message AddChainResponse { message RemoveChainRequest { message Body { // Target for which a rule chain is removed. - frostfs.v2.ape.ChainTarget target = 1; + ChainTarget target = 1; // Chain ID assigned for the rule chain. bytes chain_id = 2; @@ -135,7 +135,7 @@ message RemoveChainResponse { message ListChainsRequest { message Body { // Target for which rule chains are listed. - frostfs.v2.ape.ChainTarget target = 1; + ChainTarget target = 1; } // The request's body. @@ -154,7 +154,7 @@ message ListChainsRequest { message ListChainsResponse { message Body { // The list of chains defined for the reqeusted target. - repeated frostfs.v2.ape.Chain chains = 1; + repeated Chain chains = 1; } // The response's body. @@ -168,4 +168,4 @@ message ListChainsResponse { // authenticate the nodes of the message route and check the correctness of // transmission. neo.fs.v2.session.ResponseVerificationHeader verify_header = 3; -} +} \ No newline at end of file diff --git a/ape/types.proto b/apemanager/types.proto similarity index 86% rename from ape/types.proto rename to apemanager/types.proto index 2cbc5a9..c064627 100644 --- a/ape/types.proto +++ b/apemanager/types.proto @@ -1,8 +1,8 @@ -edition = "2023"; +syntax = "proto3"; -package frostfs.v2.ape; +package frostfs.v2.apemanager; -option go_package = "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape/grpc;ape"; +option go_package = "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/apemanager/grpc;apemanager"; // TargetType is a type target to which a rule chain is defined. enum TargetType { diff --git a/buf.yaml b/buf.yaml new file mode 100644 index 0000000..2006bea --- /dev/null +++ b/buf.yaml @@ -0,0 +1,10 @@ +lint: + use: + - DEFAULT + - COMMENTS + - ENUM_FIRST_VALUE_ZERO + except: + - PACKAGE_DIRECTORY_MATCH + - PACKAGE_VERSION_SUFFIX + - ENUM_VALUE_PREFIX + - ENUM_ZERO_VALUE_SUFFIX diff --git a/container/service.proto b/container/service.proto index 72b3789..5695b66 100644 --- a/container/service.proto +++ b/container/service.proto @@ -1,17 +1,18 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.container; option go_package = "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container/grpc;container"; option csharp_namespace = "Neo.FileStorage.API.Container"; +import "acl/types.proto"; import "container/types.proto"; import "refs/types.proto"; import "session/types.proto"; // `ContainerService` provides API to interact with `Container` smart contract -// in FrostFS sidechain via other FrostFS nodes. All of those actions can be -// done equivalently by directly issuing transactions and RPC calls to sidechain +// in NeoFS sidechain via other NeoFS nodes. All of those actions can be done +// equivalently by directly issuing transactions and RPC calls to sidechain // nodes. service ContainerService { // `Put` invokes `Container` smart contract's `Put` method and returns @@ -24,7 +25,7 @@ service ContainerService { // request to save the container has been sent to the sidechain; // - Common failures (SECTION_FAILURE_COMMON); // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // container create access denied. + // container create access denied. rpc Put(PutRequest) returns (PutResponse); // `Delete` invokes `Container` smart contract's `Delete` method and returns @@ -37,7 +38,7 @@ service ContainerService { // request to remove the container has been sent to the sidechain; // - Common failures (SECTION_FAILURE_COMMON); // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // container delete access denied. + // container delete access denied. rpc Delete(DeleteRequest) returns (DeleteResponse); // Returns container structure from `Container` smart contract storage. @@ -49,32 +50,57 @@ service ContainerService { // - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ // requested container not found; // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // access to container is denied. + // access to container is denied. rpc Get(GetRequest) returns (GetResponse); - // Returns all owner's containers from `Container` smart contract storage. + // Returns all owner's containers from 'Container` smart contract' storage. // // Statuses: // - **OK** (0, SECTION_SUCCESS): \ // container list has been successfully read; // - Common failures (SECTION_FAILURE_COMMON); // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // container list access denied. + // container list access denied. rpc List(ListRequest) returns (ListResponse); - // Returns all owner's containers from `Container` smart contract storage - // via stream. + // Invokes 'SetEACL' method of 'Container` smart contract and returns response + // immediately. After one more block in sidechain, changes in an Extended ACL + // are added into smart contract storage. // // Statuses: // - **OK** (0, SECTION_SUCCESS): \ - // container list has been successfully read; + // request to save container eACL has been sent to the sidechain; // - Common failures (SECTION_FAILURE_COMMON); // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // container list access denied. - rpc ListStream(ListStreamRequest) returns (stream ListStreamResponse); + // set container eACL access denied. + rpc SetExtendedACL(SetExtendedACLRequest) returns (SetExtendedACLResponse); + + // Returns Extended ACL table and signature from `Container` smart contract + // storage. + // + // Statuses: + // - **OK** (0, SECTION_SUCCESS): \ + // container eACL has been successfully read; + // - Common failures (SECTION_FAILURE_COMMON); + // - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ + // container not found; + // - **EACL_NOT_FOUND** (3073, SECTION_CONTAINER): \ + // eACL table not found; + // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ + // access to container eACL is denied. + rpc GetExtendedACL(GetExtendedACLRequest) returns (GetExtendedACLResponse); + + // Announces the space values used by the container for P2P synchronization. + // + // Statuses: + // - **OK** (0, SECTION_SUCCESS): \ + // estimation of used space has been successfully announced; + // - Common failures (SECTION_FAILURE_COMMON). + rpc AnnounceUsedSpace(AnnounceUsedSpaceRequest) + returns (AnnounceUsedSpaceResponse); } -// New FrostFS Container creation request +// New NeoFS Container creation request message PutRequest { // Container creation request has container structure's signature as a // separate field. It's not stored in sidechain, just verified on container @@ -82,7 +108,7 @@ message PutRequest { // the stable-marshalled container strucutre, hence there is no need for // additional signature checks. message Body { - // Container structure to register in FrostFS + // Container structure to register in NeoFS container.Container container = 1; // Signature of a stable-marshalled container according to RFC-6979. @@ -101,7 +127,7 @@ message PutRequest { neo.fs.v2.session.RequestVerificationHeader verify_header = 3; } -// New FrostFS Container creation response +// New NeoFS Container creation response message PutResponse { // Container put response body contains information about the newly registered // container as seen by `Container` smart contract. `ContainerID` can be @@ -130,7 +156,7 @@ message DeleteRequest { // the container owner's intent. The signature will be verified by `Container` // smart contract, so signing algorithm must be supported by NeoVM. message Body { - // Identifier of the container to delete from FrostFS + // Identifier of the container to delete from NeoFS neo.fs.v2.refs.ContainerID container_id = 1; // `ContainerID` signed with the container owner's key according to @@ -257,14 +283,18 @@ message ListResponse { neo.fs.v2.session.ResponseVerificationHeader verify_header = 3; } -// List containers stream -message ListStreamRequest { - // List containers stream request body. +// Set Extended ACL +message SetExtendedACLRequest { + // Set Extended ACL request body does not have separate `ContainerID` + // reference. It will be taken from `EACLTable.container_id` field. message Body { - // Identifier of the container owner. - neo.fs.v2.refs.OwnerID owner_id = 1; + // Extended ACL table to set for the container + neo.fs.v2.acl.EACLTable eacl = 1; + + // Signature of stable-marshalled Extended ACL table according to RFC-6979. + neo.fs.v2.refs.SignatureRFC6979 signature = 2; } - // Body of list containers stream request message. + // Body of set extended acl request message. Body body = 1; // Carries request meta information. Header data is used only to regulate @@ -277,15 +307,117 @@ message ListStreamRequest { neo.fs.v2.session.RequestVerificationHeader verify_header = 3; } -// List containers stream -message ListStreamResponse { - // List containers stream response body. - message Body { - // List of `ContainerID`s belonging to the requested `OwnerID` - repeated refs.ContainerID container_ids = 1; - } +// Set Extended ACL +message SetExtendedACLResponse { + // `SetExtendedACLResponse` has an empty body because the operation is + // asynchronous and the update should be reflected in `Container` smart + // contract's storage after next block is issued in sidechain. + message Body {} - // Body of list containers stream response message. + // Body of set extended acl response message. + Body body = 1; + + // Carries response meta information. Header data is used only to regulate + // message transport and does not affect request execution. + neo.fs.v2.session.ResponseMetaHeader meta_header = 2; + + // Carries response verification information. This header is used to + // authenticate the nodes of the message route and check the correctness of + // transmission. + neo.fs.v2.session.ResponseVerificationHeader verify_header = 3; +} + +// Get Extended ACL +message GetExtendedACLRequest { + // Get Extended ACL request body + message Body { + // Identifier of the container having Extended ACL + neo.fs.v2.refs.ContainerID container_id = 1; + } + + // Body of get extended acl request message. + Body body = 1; + + // Carries request meta information. Header data is used only to regulate + // message transport and does not affect request execution. + neo.fs.v2.session.RequestMetaHeader meta_header = 2; + + // Carries request verification information. This header is used to + // authenticate the nodes of the message route and check the correctness of + // transmission. + neo.fs.v2.session.RequestVerificationHeader verify_header = 3; +} + +// Get Extended ACL +message GetExtendedACLResponse { + // Get Extended ACL Response body can be empty if the requested container does + // not have Extended ACL Table attached or Extended ACL has not been allowed + // at the time of container creation. + message Body { + // Extended ACL requested, if available + neo.fs.v2.acl.EACLTable eacl = 1; + + // Signature of stable-marshalled Extended ACL according to RFC-6979. + neo.fs.v2.refs.SignatureRFC6979 signature = 2; + + // Session token if Extended ACL was set within a session + neo.fs.v2.session.SessionToken session_token = 3; + } + // Body of get extended acl response message. + Body body = 1; + + // Carries response meta information. Header data is used only to regulate + // message transport and does not affect request execution. + neo.fs.v2.session.ResponseMetaHeader meta_header = 2; + + // Carries response verification information. This header is used to + // authenticate the nodes of the message route and check the correctness of + // transmission. + neo.fs.v2.session.ResponseVerificationHeader verify_header = 3; +} + +// Announce container used space +message AnnounceUsedSpaceRequest { + // Container used space announcement body. + message Body { + // Announcement contains used space information for a single container. + message Announcement { + // Epoch number for which the container size estimation was produced. + uint64 epoch = 1; + + // Identifier of the container. + neo.fs.v2.refs.ContainerID container_id = 2; + + // Used space is a sum of object payload sizes of a specified + // container, stored in the node. It must not include inhumed objects. + uint64 used_space = 3; + } + + // List of announcements. If nodes share several containers, + // announcements are transferred in a batch. + repeated Announcement announcements = 1; + } + + // Body of announce used space request message. + Body body = 1; + + // Carries request meta information. Header data is used only to regulate + // message transport and does not affect request execution. + neo.fs.v2.session.RequestMetaHeader meta_header = 2; + + // Carries request verification information. This header is used to + // authenticate the nodes of the message route and check the correctness of + // transmission. + neo.fs.v2.session.RequestVerificationHeader verify_header = 3; +} + +// Announce container used space +message AnnounceUsedSpaceResponse { + // `AnnounceUsedSpaceResponse` has an empty body because announcements are + // one way communication. + message Body {} + + // Body of announce used space response message. Body body = 1; // Carries response meta information. Header data is used only to regulate diff --git a/container/types.proto b/container/types.proto index d114205..8b4a8a9 100644 --- a/container/types.proto +++ b/container/types.proto @@ -1,4 +1,4 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.container; @@ -50,7 +50,7 @@ message Container { // (`__NEOFS__DISABLE_HOMOMORPHIC_HASHING` is deprecated) \ // Disables homomorphic hashing for the container if the value equals "true" // string. Any other values are interpreted as missing attribute. Container - // could be accepted in a FrostFS network only if the global network hashing + // could be accepted in a NeoFS network only if the global network hashing // configuration value corresponds with that attribute's value. After // container inclusion, network setting is ignored. // diff --git a/doc/release_instructions.md b/doc/release_instructions.md index d4fb9d4..853b08a 100644 --- a/doc/release_instructions.md +++ b/doc/release_instructions.md @@ -1,6 +1,6 @@ # Release instructions -This documents outlines the frostfs-api release process and can be used as a TODO +This documents outlines the neofs-api release process and can be used as a TODO list for a new release. ## Pre-release checks @@ -20,7 +20,7 @@ Add an entry to the CHANGELOG.md following the style established there. Add a codename for releases with the new major version, version and release date in the heading. Write a paragraph describing the most significant changes done in this release. Then add sections with what has been added, changed and removed, -describing each change briefly with a reference to issues, where +describing each change briefly with a reference to GitHub issues, where available. ## Release commit @@ -38,7 +38,7 @@ Release v2.9.0 - Anmyeondo (안면도, 安眠島) Use `vX.Y.Z` tag following the semantic versioning standard. For pre-release versions use `vX.Y.Z-rc.N` scheme. -## Push changes and release tag to repository +## Push changes and release tag to Github This step should bypass the default PR mechanism to get a correct result (so that releasing requires admin privileges for the project), both the `master` @@ -48,9 +48,9 @@ branch update and tag must be pushed simultaneously like this: $ git push origin master v2.7.0 ``` -## Make a proper release +## Make a proper Github release -Edit an automatically-created release on git.frostfs.info +Edit an automatically-created release on Github. Release title has to follow ` ( )` scheme for major releases and just `` for regular point @@ -58,5 +58,6 @@ releases. ## Post-release actions -* Close corresponding X.Y.Z milestone +* Close corresponding X.Y.Z Github milestone * Make announcements in Matrix and Discord channels +* Update [NeoFS Technical Specification](https://github.com/nspcc-dev/neofs-spec) diff --git a/help.mk b/help.mk deleted file mode 100644 index a2ac989..0000000 --- a/help.mk +++ /dev/null @@ -1,11 +0,0 @@ -.PHONY: help - -# Show this help prompt -help: - @echo ' Usage:' - @echo '' - @echo ' make ' - @echo '' - @echo ' Targets:' - @echo '' - @awk '/^#/{ comment = substr($$0,3) } /^[a-zA-Z][a-zA-Z0-9_-]+:/{ print " ", $$1, comment; comment = "" }' $(MAKEFILE_LIST) | column -t -s ':' | grep -v 'IGNORE' | sort | uniq diff --git a/lock/types.proto b/lock/types.proto index dc55276..2fdafa5 100644 --- a/lock/types.proto +++ b/lock/types.proto @@ -1,4 +1,4 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.lock; diff --git a/netmap/service.proto b/netmap/service.proto index c21fb53..f5e7d9f 100644 --- a/netmap/service.proto +++ b/netmap/service.proto @@ -1,4 +1,4 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.netmap; @@ -12,7 +12,7 @@ import "session/types.proto"; // `NetmapService` provides methods to work with `Network Map` and the // information required to build it. The resulting `Network Map` is stored in // sidechain `Netmap` smart contract, while related information can be obtained -// from other FrostFS nodes. +// from other NeoFS nodes. service NetmapService { // Get NodeInfo structure from the particular node directly. // Node information can be taken from `Netmap` smart contract. In some cases, @@ -27,7 +27,7 @@ service NetmapService { // - Common failures (SECTION_FAILURE_COMMON). rpc LocalNodeInfo(LocalNodeInfoRequest) returns (LocalNodeInfoResponse); - // Read recent information about the FrostFS network. + // Read recent information about the NeoFS network. // // Statuses: // - **OK** (0, SECTION_SUCCESS): @@ -35,7 +35,7 @@ service NetmapService { // - Common failures (SECTION_FAILURE_COMMON). rpc NetworkInfo(NetworkInfoRequest) returns (NetworkInfoResponse); - // Returns network map snapshot of the current FrostFS epoch. + // Returns network map snapshot of the current NeoFS epoch. // // Statuses: // - **OK** (0, SECTION_SUCCESS): @@ -65,7 +65,7 @@ message LocalNodeInfoRequest { message LocalNodeInfoResponse { // Local Node Info, including API Version in use. message Body { - // Latest FrostFS API version in use + // Latest NeoFS API version in use neo.fs.v2.refs.Version version = 1; // NodeInfo structure with recent information from node itself diff --git a/netmap/types.proto b/netmap/types.proto index b76b3c1..2180869 100644 --- a/netmap/types.proto +++ b/netmap/types.proto @@ -1,4 +1,4 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.netmap; @@ -36,9 +36,6 @@ enum Operation { // Logical negation NOT = 9; - - // Matches pattern - LIKE = 10; } // Selector modifier shows how the node set will be formed. By default selector @@ -122,7 +119,7 @@ message PlacementPolicy { // bucket repeated Replica replicas = 1 [ json_name = "replicas" ]; - // Container backup factor controls how deep FrostFS will search for nodes + // Container backup factor controls how deep NeoFS will search for nodes // alternatives to include into container's nodes subset uint32 container_backup_factor = 2 [ json_name = "containerBackupFactor" ]; @@ -136,25 +133,25 @@ message PlacementPolicy { bool unique = 5 [ json_name = "unique" ]; } -// FrostFS node description +// NeoFS node description message NodeInfo { - // Public key of the FrostFS node in a binary format + // Public key of the NeoFS node in a binary format bytes public_key = 1 [ json_name = "publicKey" ]; // Ways to connect to a node repeated string addresses = 2 [ json_name = "addresses" ]; - // Administrator-defined Attributes of the FrostFS Storage Node. + // Administrator-defined Attributes of the NeoFS Storage Node. // // `Attribute` is a Key-Value metadata pair. Key name must be a valid UTF-8 // string. Value can't be empty. // // 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 FrostFS + // last one). A string representation of the chain of attributes in NeoFS // Storage Node configuration uses ":" and "/" symbols, e.g.: // - // `FrostFS_NODE_ATTRIBUTE_1=key1:val1/key2:val2` + // `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 @@ -201,8 +198,8 @@ message NodeInfo { // [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2). Calculated // automatically from `UN-LOCODE` attribute. // * Continent \ - // Node's continent name according to the [Seven-Continent - // model](https://en.wikipedia.org/wiki/Continent#Number). Calculated + // Node's continent name according to the [Seven-Continent model] + // (https://en.wikipedia.org/wiki/Continent#Number). Calculated // automatically from `UN-LOCODE` attribute. // * ExternalAddr // Node's preferred way for communications with external clients. @@ -210,7 +207,7 @@ message NodeInfo { // Must contain a comma-separated list of multi-addresses. // // For detailed description of each well-known attribute please see the - // corresponding section in FrostFS Technical Specification. + // corresponding section in NeoFS Technical Specification. message Attribute { // Key of the node attribute string key = 1 [ json_name = "key" ]; @@ -222,13 +219,13 @@ message NodeInfo { // `Country`. repeated string parents = 3 [ json_name = "parents" ]; } - // Carries list of the FrostFS node attributes in a key-value form. Key name + // 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. repeated Attribute attributes = 3 [ json_name = "attributes" ]; - // Represents the enumeration of various states of the FrostFS node. + // Represents the enumeration of various states of the NeoFS node. enum State { // Unknown state UNSPECIFIED = 0; @@ -243,7 +240,7 @@ message NodeInfo { MAINTENANCE = 3; } - // Carries state of the FrostFS node + // Carries state of the NeoFS node State state = 4 [ json_name = "state" ]; } @@ -256,7 +253,7 @@ message Netmap { repeated NodeInfo nodes = 2 [ json_name = "nodes" ]; } -// FrostFS network configuration +// NeoFS network configuration message NetworkConfig { // Single configuration parameter. Key MUST be network-unique. // @@ -275,7 +272,7 @@ message NetworkConfig { // Fee paid for container creation by the container owner. // Value: little-endian integer. Default: 0. // - **EpochDuration** \ - // FrostFS epoch duration measured in Sidechain blocks. + // NeoFS epoch duration measured in Sidechain blocks. // Value: little-endian integer. Default: 0. // - **HomomorphicHashingDisabled** \ // Flag of disabling the homomorphic hashing of objects' payload. @@ -287,39 +284,8 @@ message NetworkConfig { // Flag allowing setting the MAINTENANCE state to storage nodes. // Value: true if any byte != 0. Default: false. // - **MaxObjectSize** \ - // Maximum size of physically stored FrostFS object measured in bytes. + // Maximum size of physically stored NeoFS object measured in bytes. // Value: little-endian integer. Default: 0. - // - // This value refers to the maximum size of a **physically** stored object - // in FrostFS. However, from a user's perspective, the **logical** size of a - // stored object can be significantly larger. The relationship between the - // physical and logical object sizes is governed by the following formula - // - // ```math - // \mathrm{Stored\ Object\ Size} \le - // \frac{ - // \left(\mathrm{Max\ Object\ Size}\right)^2 - // }{ - // \mathrm{Object\ ID\ Size} - // } - // ``` - // - // This arises from the fact that a tombstone, also being an object, stores - // the IDs of inhumed objects and cannot be divided into smaller objects, - // thus having an upper limit for its size. - // - // For example, if: - // * Max Object Size Size = 64 MiB; - // * Object ID Size = 32 B; - // - // then: - // ```math - // \mathrm{Stored\ Object\ Size} \le - // \frac{\left(64\ \mathrm{MiB}\right)^2}{32\ \mathrm{B}} = - // \frac{2^{52}}{2^5}\ \mathrm{B} = - // 2^{47}\ \mathrm{B} = - // 128\ \mathrm{TiB} - // ``` // - **WithdrawFee** \ // Fee paid for withdrawal of funds paid by the account owner. // Value: little-endian integer. Default: 0. @@ -340,18 +306,18 @@ message NetworkConfig { repeated Parameter parameters = 1 [ json_name = "parameters" ]; } -// Information about FrostFS network +// Information about NeoFS network message NetworkInfo { - // Number of the current epoch in the FrostFS network + // Number of the current epoch in the NeoFS network uint64 current_epoch = 1 [ json_name = "currentEpoch" ]; - // Magic number of the sidechain of the FrostFS network + // Magic number of the sidechain of the NeoFS network uint64 magic_number = 2 [ json_name = "magicNumber" ]; - // MillisecondsPerBlock network parameter of the sidechain of the FrostFS + // MillisecondsPerBlock network parameter of the sidechain of the NeoFS // network int64 ms_per_block = 3 [ json_name = "msPerBlock" ]; - // FrostFS network configuration + // NeoFS network configuration NetworkConfig network_config = 4 [ json_name = "networkConfig" ]; } diff --git a/object/service.proto b/object/service.proto index c5e4fc7..1168e4e 100644 --- a/object/service.proto +++ b/object/service.proto @@ -1,4 +1,4 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.object; @@ -46,7 +46,7 @@ service ObjectService { // - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ // object container not found; // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // access to container is denied; + // access to container is denied; // - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ // provided session token has expired. rpc Get(GetRequest) returns (stream GetResponse); @@ -115,7 +115,7 @@ service ObjectService { // - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ // object container not found; // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // access to container is denied; + // access to container is denied; // - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ // provided session token has expired. rpc Delete(DeleteRequest) returns (DeleteResponse); @@ -124,9 +124,6 @@ service ObjectService { // returned. If `main_only` request field is set, the short header with only // the very minimal information will be returned instead. // - // Max header size is currently not limited by this API, but may be restricted - // on the service level. By default, gRPC uses a message size of 4 MiB. - // // Extended headers can change `Head` behaviour: // * [ __SYSTEM__NETMAP_EPOCH ] \ // (`__NEOFS__NETMAP_EPOCH` is deprecated) \ @@ -148,13 +145,13 @@ service ObjectService { // - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ // object container not found; // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // access to container is denied; + // access to container is denied; // - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ // provided session token has expired. rpc Head(HeadRequest) returns (HeadResponse); // Search objects in container. Search query allows to match by Object - // Header's filed values. Please see the corresponding FrostFS Technical + // Header's filed values. Please see the corresponding NeoFS Technical // Specification section for more details. // // Extended headers can change `Search` behaviour: @@ -174,7 +171,7 @@ service ObjectService { // - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ // search container not found; // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // access to container is denied; + // access to container is denied; // - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ // provided session token has expired. rpc Search(SearchRequest) returns (stream SearchResponse); @@ -211,7 +208,7 @@ service ObjectService { // - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ // object container not found; // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // access to container is denied; + // access to container is denied; // - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ // provided session token has expired. rpc GetRange(GetRangeRequest) returns (stream GetRangeResponse); @@ -246,7 +243,7 @@ service ObjectService { // - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ // object container not found; // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // access to container is denied; + // access to container is denied; // - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ // provided session token has expired. rpc GetRangeHash(GetRangeHashRequest) returns (GetRangeHashResponse); @@ -278,7 +275,7 @@ service ObjectService { // - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ // object storage container not found; // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // access to container is denied; + // access to container is denied; // - **TOKEN_NOT_FOUND** (4096, SECTION_SESSION): \ // (for trusted object preparation) session private key does not exist or // has @@ -286,55 +283,6 @@ service ObjectService { // - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ // provided session token has expired. rpc PutSingle(PutSingleRequest) returns (PutSingleResponse); - - // Patch the object. Request uses gRPC stream. First message must set - // the address of the object that is going to get patched. If the object's - // attributes are patched, then these attrubutes must be set only within the - // first stream message. - // - // If the patch request is performed by NOT the object's owner but if the - // actor has the permission to perform the patch, then `OwnerID` of the object - // is changed. In this case the object's owner loses the object's ownership - // after the patch request is successfully done. - // - // As objects are content-addressable the patching causes new object ID - // generation for the patched object. This object id is set witihn - // `PatchResponse`. But the object id may remain unchanged in such cases: - // 1. The chunk of the applying patch contains the same value as the object's - // payload within the same range; - // 2. The patch that reverts the changes applied by preceding patch; - // 3. The application of the same patches for the object a few times. - // - // Extended headers can change `Patch` behaviour: - // * [ __SYSTEM__NETMAP_EPOCH \ - // (`__NEOFS__NETMAP_EPOCH` is deprecated) \ - // Will use the requsted version of Network Map for object placement - // calculation. - // - // Please refer to detailed `XHeader` description. - // - // Statuses: - // - **OK** (0, SECTION_SUCCESS): \ - // object has been successfully patched and saved in the container; - // - Common failures (SECTION_FAILURE_COMMON); - // - **ACCESS_DENIED** (2048, SECTION_OBJECT): \ - // write access to the container is denied; - // - **OBJECT_NOT_FOUND** (2049, SECTION_OBJECT): \ - // object not found in container; - // - **OBJECT_ALREADY_REMOVED** (2052, SECTION_OBJECT): \ - // the requested object has been marked as deleted. - // - **OUT_OF_RANGE** (2053, SECTION_OBJECT): \ - // the requested range is out of bounds; - // - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ - // object storage container not found; - // - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - // access to container is denied; - // - **TOKEN_NOT_FOUND** (4096, SECTION_SESSION): \ - // (for trusted object preparation) session private key does not exist or - // has been deleted; - // - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ - // provided session token has expired. - rpc Patch(stream PatchRequest) returns (PatchResponse); } // GET object request @@ -573,7 +521,6 @@ message HeadResponse { ShortHeader short_header = 2; // Meta information of split hierarchy. - // Indicates that the object is virtual, manual assembly is required. SplitInfo split_info = 3; // Meta information for EC object assembly. @@ -637,8 +584,8 @@ message SearchRequest { // * $Object:split.splitID \ // 16 byte UUIDv4 used to identify the split object hierarchy parts // * $Object:ec.parent \ - // If the object is stored according to EC policy, then ec_parent - // attribute is set to return an id list of all related EC chunks. + // If the object is stored according to EC policy, then ec_parent attribute + // is set to return an id list of all related EC chunks. // // There are some well-known filter aliases to match objects by certain // properties: @@ -869,79 +816,4 @@ message PutSingleResponse { // authenticate the nodes of the message route and check the correctness of // transmission. neo.fs.v2.session.ResponseVerificationHeader verify_header = 3; -} - -// Object PATCH request -message PatchRequest { - // PATCH request body - message Body { - // The address of the object that is requested to get patched. - neo.fs.v2.refs.Address address = 1; - - // New attributes for the object. See `replace_attributes` flag usage to - // define how new attributes should be set. - repeated neo.fs.v2.object.Header.Attribute new_attributes = 2; - - // If this flag is set, then the object's attributes will be entirely - // replaced by `new_attributes` list. The empty `new_attributes` list with - // `replace_attributes = true` just resets attributes list for the object. - // - // Default `false` value for this flag means the attributes will be just - // merged. If the incoming `new_attributes` list contains already existing - // key, then it just replaces it while merging the lists. - bool replace_attributes = 3; - - // New split header for the object. This defines how the object will relate - // to other objects in a split operation. - neo.fs.v2.object.Header.Split new_split_header = 5; - - // The patch for the object's payload. - message Patch { - // The range of the source object for which the payload is replaced by the - // patch's chunk. If the range's `length = 0`, then the patch's chunk is - // just appended to the original payload starting from the `offest` - // without any replace. - Range source_range = 1; - - // The chunk that is being appended to or that replaces the original - // payload on the given range. - bytes chunk = 2; - } - - // The patch that is applied for the object. - Patch patch = 4; - } - - // Body for patch request message. - Body body = 1; - - // Carries request meta information. Header data is used only to regulate - // message transport and does not affect request execution. - neo.fs.v2.session.RequestMetaHeader meta_header = 2; - - // Carries request verification information. This header is used to - // authenticate the nodes of the message route and check the correctness of - // transmission. - neo.fs.v2.session.RequestVerificationHeader verify_header = 3; -} - -// Object PATCH response -message PatchResponse { - // PATCH response body - message Body { - // The object ID of the saved patched object. - neo.fs.v2.refs.ObjectID object_id = 1; - } - - // Body for patch response message. - Body body = 1; - - // Carries response meta information. Header data is used only to regulate - // message transport and does not affect request execution. - neo.fs.v2.session.ResponseMetaHeader meta_header = 2; - - // Carries response verification information. This header is used to - // authenticate the nodes of the message route and check the correctness of - // transmission. - neo.fs.v2.session.ResponseVerificationHeader verify_header = 3; -} +} \ No newline at end of file diff --git a/object/types.proto b/object/types.proto index 62a6792..7591be7 100644 --- a/object/types.proto +++ b/object/types.proto @@ -1,4 +1,4 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.object; @@ -141,8 +141,7 @@ message Header { // * Name \ // Human-friendly name // * FileName \ - // File name to be associated with the object on saving. FileName must not - // contain the delimiting symbol '/'. + // File name to be associated with the object on saving // * FilePath \ // Full path to be associated with the object on saving. Should start with a // '/' and use '/' as a delimiting symbol. Trailing '/' should be @@ -156,7 +155,7 @@ message Header { // MIME Content Type of object's payload // // For detailed description of each well-known attribute please see the - // corresponding section in FrostFS Technical Specification. + // corresponding section in NeoFS Technical Specification. message Attribute { // string key to the object attribute string key = 1 [ json_name = "key" ]; @@ -210,17 +209,13 @@ message Header { // Chunk of a parent header. bytes header = 5 [ json_name = "header" ]; // As the origin object is EC-splitted its identifier is known to all - // chunks as parent. But parent itself can be a part of Split (does not - // relate to EC-split). In this case parent_split_id should be set. + // chunks as parent. But parent itself can be a part of Split (does not relate to EC-split). + // In this case parent_split_id should be set. bytes parent_split_id = 6 [ json_name = "parentSplitID" ]; - // EC-parent's parent ID. parent_split_parent_id is set if EC-parent, - // itself, is a part of Split and if an object ID of its parent is - // presented. The field allows to determine how EC-chunk is placed in Split - // hierarchy. - neo.fs.v2.refs.ObjectID parent_split_parent_id = 7 - [ json_name = "parentSplitParentID" ]; - // EC parent's attributes. - repeated Attribute parent_attributes = 8 [ json_name = "parentAttributes" ]; + // EC-parent's parent ID. parent_split_parent_id is set if EC-parent, itself, is a part of Split and + // if an object ID of its parent is presented. The field allows to determine how EC-chunk is placed + // in Split hierarchy. + neo.fs.v2.refs.ObjectID parent_split_parent_id = 7 [ json_name = "parentSplitParentID" ]; } // Erasure code chunk information. EC ec = 12 [ json_name = "ec" ]; @@ -276,4 +271,4 @@ message ECInfo { } // Chunk stored on the node. repeated Chunk chunks = 1; -} +} \ No newline at end of file diff --git a/proto-docs/accounting.md b/proto-docs/accounting.md index a8bfd16..a23a63c 100644 --- a/proto-docs/accounting.md +++ b/proto-docs/accounting.md @@ -6,19 +6,19 @@ - [accounting/service.proto](#accounting/service.proto) - Services - [AccountingService](#neo.fs.v2.accounting.AccountingService) - + - Messages - [BalanceRequest](#neo.fs.v2.accounting.BalanceRequest) - [BalanceRequest.Body](#neo.fs.v2.accounting.BalanceRequest.Body) - [BalanceResponse](#neo.fs.v2.accounting.BalanceResponse) - [BalanceResponse.Body](#neo.fs.v2.accounting.BalanceResponse.Body) - + - [accounting/types.proto](#accounting/types.proto) - Messages - [Decimal](#neo.fs.v2.accounting.Decimal) - + - [Scalar Value Types](#scalar-value-types) @@ -35,11 +35,11 @@ ### Service "neo.fs.v2.accounting.AccountingService" -Accounting service provides methods for interaction with FrostFS sidechain -via other FrostFS nodes to get information about the account balance. Deposit -and Withdraw operations can't be implemented here, as they require Mainnet -FrostFS smart contract invocation. Transfer operations between internal -FrostFS accounts are possible if both use the same token type. +Accounting service provides methods for interaction with NeoFS sidechain via +other NeoFS nodes to get information about the account balance. Deposit and +Withdraw operations can't be implemented here, as they require Mainnet NeoFS +smart contract invocation. Transfer operations between internal NeoFS +accounts are possible if both use the same token type. ``` rpc Balance(BalanceRequest) returns (BalanceResponse); @@ -48,7 +48,7 @@ rpc Balance(BalanceRequest) returns (BalanceResponse); #### Method Balance -Returns the amount of funds in GAS token for the requested FrostFS account. +Returns the amount of funds in GAS token for the requested NeoFS account. Statuses: - **OK** (0, SECTION_SUCCESS): @@ -78,9 +78,9 @@ BalanceRequest message ### Message BalanceRequest.Body To indicate the account for which the balance is requested, its identifier -is used. It can be any existing account in FrostFS sidechain `Balance` -smart contract. If omitted, client implementation MUST set it to the -request's signer `OwnerID`. +is used. It can be any existing account in NeoFS sidechain `Balance` smart +contract. If omitted, client implementation MUST set it to the request's +signer `OwnerID`. | Field | Type | Label | Description | @@ -131,7 +131,7 @@ rounding. ### Message Decimal -Standard floating point data type can't be used in FrostFS due to inexactness +Standard floating point data type can't be used in NeoFS due to inexactness of the result when doing lots of small number operations. To solve the lost precision issue, special `Decimal` format is used for monetary computations. @@ -170,3 +170,4 @@ description. | bool | | bool | boolean | boolean | | string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | | bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/acl.md b/proto-docs/acl.md index fdc7ade..91fd36b 100644 --- a/proto-docs/acl.md +++ b/proto-docs/acl.md @@ -8,13 +8,12 @@ - Messages - [BearerToken](#neo.fs.v2.acl.BearerToken) - [BearerToken.Body](#neo.fs.v2.acl.BearerToken.Body) - - [BearerToken.Body.APEOverride](#neo.fs.v2.acl.BearerToken.Body.APEOverride) - [BearerToken.Body.TokenLifetime](#neo.fs.v2.acl.BearerToken.Body.TokenLifetime) - [EACLRecord](#neo.fs.v2.acl.EACLRecord) - [EACLRecord.Filter](#neo.fs.v2.acl.EACLRecord.Filter) - [EACLRecord.Target](#neo.fs.v2.acl.EACLRecord.Target) - [EACLTable](#neo.fs.v2.acl.EACLTable) - + - [Scalar Value Types](#scalar-value-types) @@ -58,31 +57,10 @@ container owner with additional information preventing token abuse. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| eacl_table | [EACLTable](#neo.fs.v2.acl.EACLTable) | | Table of Extended ACL rules to use instead of the ones attached to the container. If it contains `container_id` field, bearer token is only valid for this specific container. Otherwise, any container of the same owner is allowed. - -Deprecated: eACL tables are no longer relevant - `APEOverrides` should be used instead. | +| eacl_table | [EACLTable](#neo.fs.v2.acl.EACLTable) | | Table of Extended ACL rules to use instead of the ones attached to the container. If it contains `container_id` field, bearer token is only valid for this specific container. Otherwise, any container of the same owner is allowed. | | owner_id | [neo.fs.v2.refs.OwnerID](#neo.fs.v2.refs.OwnerID) | | `OwnerID` defines to whom the token was issued. It must match the request originator's `OwnerID`. If empty, any token bearer will be accepted. | | lifetime | [BearerToken.Body.TokenLifetime](#neo.fs.v2.acl.BearerToken.Body.TokenLifetime) | | Token expiration and valid time period parameters | | allow_impersonate | [bool](#bool) | | AllowImpersonate flag to consider token signer as request owner. If this field is true extended ACL table in token body isn't processed. | -| ape_override | [BearerToken.Body.APEOverride](#neo.fs.v2.acl.BearerToken.Body.APEOverride) | | APE override for the target. | - - - - -### Message BearerToken.Body.APEOverride -APEOverride is the list of APE chains defined for a target. -These chains are meant to serve as overrides to the already defined (or -even undefined) APE chains for the target (see contract `Policy`). - -The server-side processing of the bearer token with set APE overrides -must verify if a client is permitted to override chains for the target, -preventing unauthorized access through the APE mechanism. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| target | [frostfs.v2.ape.ChainTarget](#frostfs.v2.ape.ChainTarget) | | Target for which chains are applied. | -| chains | [frostfs.v2.ape.Chain](#frostfs.v2.ape.Chain) | repeated | The list of APE chains. | @@ -107,7 +85,7 @@ Describes a single eACL rule. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| operation | [Operation](#neo.fs.v2.acl.Operation) | | FrostFS request Verb to match | +| operation | [Operation](#neo.fs.v2.acl.Operation) | | NeoFS request Verb to match | | action | [Action](#neo.fs.v2.acl.Action) | | Rule execution result. Either allows or denies access if filters match. | | filters | [EACLRecord.Filter](#neo.fs.v2.acl.EACLRecord.Filter) | repeated | List of filters to match and see if rule is applicable | | targets | [EACLRecord.Target](#neo.fs.v2.acl.EACLRecord.Target) | repeated | List of target subjects to apply ACL rule to | @@ -175,7 +153,7 @@ keys to match. Extended ACL rules table. A list of ACL rules defined additionally to Basic ACL. Extended ACL rules can be attached to a container and can be updated or may be defined in `BearerToken` structure. Please see the corresponding -FrostFS Technical Specification section for detailed description. +NeoFS Technical Specification section for detailed description. | Field | Type | Label | Description | @@ -211,7 +189,7 @@ Enumeration of possible sources of Headers to apply filters. | HEADER_UNSPECIFIED | 0 | Unspecified header, default value. | | REQUEST | 1 | Filter request headers | | OBJECT | 2 | Filter object headers | -| SERVICE | 3 | Filter service headers. These are not processed by FrostFS nodes and exist for service use only. | +| SERVICE | 3 | Filter service headers. These are not processed by NeoFS nodes and exist for service use only. | @@ -283,3 +261,4 @@ Target role of the access control rule in access control list. | bool | | bool | boolean | boolean | | string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | | bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/apemanager.md b/proto-docs/apemanager.md index c1cb682..303f7f1 100644 --- a/proto-docs/apemanager.md +++ b/proto-docs/apemanager.md @@ -6,7 +6,7 @@ - [apemanager/service.proto](#apemanager/service.proto) - Services - [APEManagerService](#frostfs.v2.apemanager.APEManagerService) - + - Messages - [AddChainRequest](#frostfs.v2.apemanager.AddChainRequest) - [AddChainRequest.Body](#frostfs.v2.apemanager.AddChainRequest.Body) @@ -20,7 +20,14 @@ - [RemoveChainRequest.Body](#frostfs.v2.apemanager.RemoveChainRequest.Body) - [RemoveChainResponse](#frostfs.v2.apemanager.RemoveChainResponse) - [RemoveChainResponse.Body](#frostfs.v2.apemanager.RemoveChainResponse.Body) + +- [apemanager/types.proto](#apemanager/types.proto) + + - Messages + - [Chain](#frostfs.v2.apemanager.Chain) + - [ChainTarget](#frostfs.v2.apemanager.ChainTarget) + - [Scalar Value Types](#scalar-value-types) @@ -121,8 +128,8 @@ Statuses: | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| target | [frostfs.v2.ape.ChainTarget](#frostfs.v2.ape.ChainTarget) | | A target for which a rule chain is added. | -| chain | [frostfs.v2.ape.Chain](#frostfs.v2.ape.Chain) | | The chain to set for the target. | +| target | [ChainTarget](#frostfs.v2.apemanager.ChainTarget) | | A target for which a rule chain is added. | +| chain | [Chain](#frostfs.v2.apemanager.Chain) | | The chain to set for the target. | @@ -170,7 +177,7 @@ Statuses: | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| target | [frostfs.v2.ape.ChainTarget](#frostfs.v2.ape.ChainTarget) | | Target for which rule chains are listed. | +| target | [ChainTarget](#frostfs.v2.apemanager.ChainTarget) | | Target for which rule chains are listed. | @@ -194,7 +201,7 @@ Statuses: | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| chains | [frostfs.v2.ape.Chain](#frostfs.v2.ape.Chain) | repeated | The list of chains defined for the reqeusted target. | +| chains | [Chain](#frostfs.v2.apemanager.Chain) | repeated | The list of chains defined for the reqeusted target. | @@ -218,7 +225,7 @@ Statuses: | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| target | [frostfs.v2.ape.ChainTarget](#frostfs.v2.ape.ChainTarget) | | Target for which a rule chain is removed. | +| target | [ChainTarget](#frostfs.v2.apemanager.ChainTarget) | | Target for which a rule chain is removed. | | chain_id | [bytes](#bytes) | | Chain ID assigned for the rule chain. | @@ -248,6 +255,58 @@ operation could not be performed is an error returning to a client. + +

Top

+ +## apemanager/types.proto + + + + + + + +### Message Chain +Chain is a chain of rules defined for a specific target. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| raw | [bytes](#bytes) | | Raw representation of a serizalized rule chain. | + + + + +### Message ChainTarget +ChainTarget is an object to which a rule chain is defined. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| type | [TargetType](#frostfs.v2.apemanager.TargetType) | | | +| name | [string](#string) | | | + + + + + + +### TargetType +TargetType is a type target to which a rule chain is defined. + +| Name | Number | Description | +| ---- | ------ | ----------- | +| UNDEFINED | 0 | | +| NAMESPACE | 1 | | +| CONTAINER | 2 | | +| USER | 3 | | +| GROUP | 4 | | + + + + + + ## Scalar Value Types | .proto Type | Notes | C++ Type | Java Type | Python Type | @@ -267,3 +326,4 @@ operation could not be performed is an error returning to a client. | bool | | bool | boolean | boolean | | string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | | bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/audit.md b/proto-docs/audit.md new file mode 100644 index 0000000..99bcfc8 --- /dev/null +++ b/proto-docs/audit.md @@ -0,0 +1,74 @@ +# Protocol Documentation + + +## Table of Contents + +- [audit/types.proto](#audit/types.proto) + + - Messages + - [DataAuditResult](#neo.fs.v2.audit.DataAuditResult) + + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## audit/types.proto + + + + + + + +### Message DataAuditResult +DataAuditResult keeps record of conducted Data Audits. The detailed report is +generated separately. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| version | [neo.fs.v2.refs.Version](#neo.fs.v2.refs.Version) | | Data Audit Result format version. Effectively, the version of API library used to report DataAuditResult structure. | +| audit_epoch | [fixed64](#fixed64) | | Epoch number when the Data Audit was conducted | +| container_id | [neo.fs.v2.refs.ContainerID](#neo.fs.v2.refs.ContainerID) | | Container under audit | +| public_key | [bytes](#bytes) | | Public key of the auditing InnerRing node in a binary format | +| complete | [bool](#bool) | | Shows if Data Audit process was complete in time or if it was cancelled | +| requests | [uint32](#uint32) | | Number of request done at PoR stage | +| retries | [uint32](#uint32) | | Number of retries done at PoR stage | +| pass_sg | [neo.fs.v2.refs.ObjectID](#neo.fs.v2.refs.ObjectID) | repeated | List of Storage Groups that passed audit PoR stage | +| fail_sg | [neo.fs.v2.refs.ObjectID](#neo.fs.v2.refs.ObjectID) | repeated | List of Storage Groups that failed audit PoR stage | +| hit | [uint32](#uint32) | | Number of sampled objects under the audit placed in an optimal way according to the containers placement policy when checking PoP | +| miss | [uint32](#uint32) | | Number of sampled objects under the audit placed in suboptimal way according to the containers placement policy, but still at a satisfactory level when checking PoP | +| fail | [uint32](#uint32) | | Number of sampled objects under the audit stored inconsistently with the placement policy or not found at all when checking PoP | +| pass_nodes | [bytes](#bytes) | repeated | List of storage node public keys that passed at least one PDP | +| fail_nodes | [bytes](#bytes) | repeated | List of storage node public keys that failed at least one PDP | + + + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ Type | Java Type | Python Type | +| ----------- | ----- | -------- | --------- | ----------- | +| double | | double | double | float | +| float | | float | float | float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | +| sfixed32 | Always four bytes. | int32 | int | int | +| sfixed64 | Always eight bytes. | int64 | long | int/long | +| bool | | bool | boolean | boolean | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/ape.md b/proto-docs/bootstrap.md similarity index 65% rename from proto-docs/ape.md rename to proto-docs/bootstrap.md index 9795bc5..ad08a7d 100644 --- a/proto-docs/ape.md +++ b/proto-docs/bootstrap.md @@ -3,63 +3,64 @@ ## Table of Contents -- [ape/types.proto](#ape/types.proto) +- [bootstrap/types.proto](#bootstrap/types.proto) - Messages - - [Chain](#frostfs.v2.ape.Chain) - - [ChainTarget](#frostfs.v2.ape.ChainTarget) - + - [NodeInfo](#bootstrap.NodeInfo) + - [NodeInfo.Attribute](#bootstrap.NodeInfo.Attribute) + - [Scalar Value Types](#scalar-value-types) - +

Top

-## ape/types.proto +## bootstrap/types.proto - + -### Message Chain -Chain is a chain of rules defined for a specific target. +### Message NodeInfo +Groups the information about the NeoFS node. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| raw | [bytes](#bytes) | | Raw representation of a serizalized rule chain. | +| Address | [string](#string) | | Carries network address of the NeoFS node. | +| PublicKey | [bytes](#bytes) | | Carries public key of the NeoFS node in a binary format. | +| Attributes | [NodeInfo.Attribute](#bootstrap.NodeInfo.Attribute) | repeated | Carries list of the NeoFS node attributes in a string key-value format. | +| state | [NodeInfo.State](#bootstrap.NodeInfo.State) | | Carries state of the NeoFS node. | - + -### Message ChainTarget -ChainTarget is an object to which a rule chain is defined. +### Message NodeInfo.Attribute +Groups attributes of the NeoFS node. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| type | [TargetType](#frostfs.v2.ape.TargetType) | | | -| name | [string](#string) | | | +| Key | [string](#string) | | Carries string key to the node attribute. | +| Value | [string](#string) | | Carries string value of the node attribute. | - + -### TargetType -TargetType is a type target to which a rule chain is defined. +### NodeInfo.State +Represents the enumeration of various states of the NeoFS node. | Name | Number | Description | | ---- | ------ | ----------- | -| UNDEFINED | 0 | | -| NAMESPACE | 1 | | -| CONTAINER | 2 | | -| USER | 3 | | -| GROUP | 4 | | +| Unknown | 0 | Undefined state. | +| Online | 1 | Active state on the network. | +| Offline | 2 | Network unavailable state. | @@ -85,3 +86,4 @@ TargetType is a type target to which a rule chain is defined. | bool | | bool | boolean | boolean | | string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | | bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/container.md b/proto-docs/container.md index 7ee5dab..b568eed 100644 --- a/proto-docs/container.md +++ b/proto-docs/container.md @@ -6,12 +6,21 @@ - [container/service.proto](#container/service.proto) - Services - [ContainerService](#neo.fs.v2.container.ContainerService) - + - Messages + - [AnnounceUsedSpaceRequest](#neo.fs.v2.container.AnnounceUsedSpaceRequest) + - [AnnounceUsedSpaceRequest.Body](#neo.fs.v2.container.AnnounceUsedSpaceRequest.Body) + - [AnnounceUsedSpaceRequest.Body.Announcement](#neo.fs.v2.container.AnnounceUsedSpaceRequest.Body.Announcement) + - [AnnounceUsedSpaceResponse](#neo.fs.v2.container.AnnounceUsedSpaceResponse) + - [AnnounceUsedSpaceResponse.Body](#neo.fs.v2.container.AnnounceUsedSpaceResponse.Body) - [DeleteRequest](#neo.fs.v2.container.DeleteRequest) - [DeleteRequest.Body](#neo.fs.v2.container.DeleteRequest.Body) - [DeleteResponse](#neo.fs.v2.container.DeleteResponse) - [DeleteResponse.Body](#neo.fs.v2.container.DeleteResponse.Body) + - [GetExtendedACLRequest](#neo.fs.v2.container.GetExtendedACLRequest) + - [GetExtendedACLRequest.Body](#neo.fs.v2.container.GetExtendedACLRequest.Body) + - [GetExtendedACLResponse](#neo.fs.v2.container.GetExtendedACLResponse) + - [GetExtendedACLResponse.Body](#neo.fs.v2.container.GetExtendedACLResponse.Body) - [GetRequest](#neo.fs.v2.container.GetRequest) - [GetRequest.Body](#neo.fs.v2.container.GetRequest.Body) - [GetResponse](#neo.fs.v2.container.GetResponse) @@ -20,22 +29,22 @@ - [ListRequest.Body](#neo.fs.v2.container.ListRequest.Body) - [ListResponse](#neo.fs.v2.container.ListResponse) - [ListResponse.Body](#neo.fs.v2.container.ListResponse.Body) - - [ListStreamRequest](#neo.fs.v2.container.ListStreamRequest) - - [ListStreamRequest.Body](#neo.fs.v2.container.ListStreamRequest.Body) - - [ListStreamResponse](#neo.fs.v2.container.ListStreamResponse) - - [ListStreamResponse.Body](#neo.fs.v2.container.ListStreamResponse.Body) - [PutRequest](#neo.fs.v2.container.PutRequest) - [PutRequest.Body](#neo.fs.v2.container.PutRequest.Body) - [PutResponse](#neo.fs.v2.container.PutResponse) - [PutResponse.Body](#neo.fs.v2.container.PutResponse.Body) - + - [SetExtendedACLRequest](#neo.fs.v2.container.SetExtendedACLRequest) + - [SetExtendedACLRequest.Body](#neo.fs.v2.container.SetExtendedACLRequest.Body) + - [SetExtendedACLResponse](#neo.fs.v2.container.SetExtendedACLResponse) + - [SetExtendedACLResponse.Body](#neo.fs.v2.container.SetExtendedACLResponse.Body) + - [container/types.proto](#container/types.proto) - Messages - [Container](#neo.fs.v2.container.Container) - [Container.Attribute](#neo.fs.v2.container.Container.Attribute) - + - [Scalar Value Types](#scalar-value-types) @@ -53,8 +62,8 @@ ### Service "neo.fs.v2.container.ContainerService" `ContainerService` provides API to interact with `Container` smart contract -in FrostFS sidechain via other FrostFS nodes. All of those actions can be -done equivalently by directly issuing transactions and RPC calls to sidechain +in NeoFS sidechain via other NeoFS nodes. All of those actions can be done +equivalently by directly issuing transactions and RPC calls to sidechain nodes. ``` @@ -62,7 +71,9 @@ rpc Put(PutRequest) returns (PutResponse); rpc Delete(DeleteRequest) returns (DeleteResponse); rpc Get(GetRequest) returns (GetResponse); rpc List(ListRequest) returns (ListResponse); -rpc ListStream(ListStreamRequest) returns (stream ListStreamResponse); +rpc SetExtendedACL(SetExtendedACLRequest) returns (SetExtendedACLResponse); +rpc GetExtendedACL(GetExtendedACLRequest) returns (GetExtendedACLResponse); +rpc AnnounceUsedSpace(AnnounceUsedSpaceRequest) returns (AnnounceUsedSpaceResponse); ``` @@ -118,7 +129,7 @@ Statuses: | Get | [GetRequest](#neo.fs.v2.container.GetRequest) | [GetResponse](#neo.fs.v2.container.GetResponse) | #### Method List -Returns all owner's containers from `Container` smart contract storage. +Returns all owner's containers from 'Container` smart contract' storage. Statuses: - **OK** (0, SECTION_SUCCESS): \ @@ -130,24 +141,114 @@ Statuses: | Name | Input | Output | | ---- | ----- | ------ | | List | [ListRequest](#neo.fs.v2.container.ListRequest) | [ListResponse](#neo.fs.v2.container.ListResponse) | -#### Method ListStream +#### Method SetExtendedACL -Returns all owner's containers from `Container` smart contract storage -via stream. +Invokes 'SetEACL' method of 'Container` smart contract and returns response +immediately. After one more block in sidechain, changes in an Extended ACL +are added into smart contract storage. Statuses: - **OK** (0, SECTION_SUCCESS): \ - container list has been successfully read; + request to save container eACL has been sent to the sidechain; - Common failures (SECTION_FAILURE_COMMON); - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - container list access denied. + set container eACL access denied. | Name | Input | Output | | ---- | ----- | ------ | -| ListStream | [ListStreamRequest](#neo.fs.v2.container.ListStreamRequest) | [ListStreamResponse](#neo.fs.v2.container.ListStreamResponse) | +| SetExtendedACL | [SetExtendedACLRequest](#neo.fs.v2.container.SetExtendedACLRequest) | [SetExtendedACLResponse](#neo.fs.v2.container.SetExtendedACLResponse) | +#### Method GetExtendedACL + +Returns Extended ACL table and signature from `Container` smart contract +storage. + +Statuses: +- **OK** (0, SECTION_SUCCESS): \ + container eACL has been successfully read; +- Common failures (SECTION_FAILURE_COMMON); +- **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ + container not found; +- **EACL_NOT_FOUND** (3073, SECTION_CONTAINER): \ + eACL table not found; +- **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ + access to container eACL is denied. + +| Name | Input | Output | +| ---- | ----- | ------ | +| GetExtendedACL | [GetExtendedACLRequest](#neo.fs.v2.container.GetExtendedACLRequest) | [GetExtendedACLResponse](#neo.fs.v2.container.GetExtendedACLResponse) | +#### Method AnnounceUsedSpace + +Announces the space values used by the container for P2P synchronization. + +Statuses: +- **OK** (0, SECTION_SUCCESS): \ + estimation of used space has been successfully announced; +- Common failures (SECTION_FAILURE_COMMON). + +| Name | Input | Output | +| ---- | ----- | ------ | +| AnnounceUsedSpace | [AnnounceUsedSpaceRequest](#neo.fs.v2.container.AnnounceUsedSpaceRequest) | [AnnounceUsedSpaceResponse](#neo.fs.v2.container.AnnounceUsedSpaceResponse) | + + +### Message AnnounceUsedSpaceRequest +Announce container used space + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| body | [AnnounceUsedSpaceRequest.Body](#neo.fs.v2.container.AnnounceUsedSpaceRequest.Body) | | Body of announce used space request message. | +| meta_header | [neo.fs.v2.session.RequestMetaHeader](#neo.fs.v2.session.RequestMetaHeader) | | Carries request meta information. Header data is used only to regulate message transport and does not affect request execution. | +| verify_header | [neo.fs.v2.session.RequestVerificationHeader](#neo.fs.v2.session.RequestVerificationHeader) | | Carries request verification information. This header is used to authenticate the nodes of the message route and check the correctness of transmission. | + + + + +### Message AnnounceUsedSpaceRequest.Body +Container used space announcement body. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| announcements | [AnnounceUsedSpaceRequest.Body.Announcement](#neo.fs.v2.container.AnnounceUsedSpaceRequest.Body.Announcement) | repeated | List of announcements. If nodes share several containers, announcements are transferred in a batch. | + + + + +### Message AnnounceUsedSpaceRequest.Body.Announcement +Announcement contains used space information for a single container. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| epoch | [uint64](#uint64) | | Epoch number for which the container size estimation was produced. | +| container_id | [neo.fs.v2.refs.ContainerID](#neo.fs.v2.refs.ContainerID) | | Identifier of the container. | +| used_space | [uint64](#uint64) | | Used space is a sum of object payload sizes of a specified container, stored in the node. It must not include inhumed objects. | + + + + +### Message AnnounceUsedSpaceResponse +Announce container used space + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| body | [AnnounceUsedSpaceResponse.Body](#neo.fs.v2.container.AnnounceUsedSpaceResponse.Body) | | Body of announce used space response message. | +| meta_header | [neo.fs.v2.session.ResponseMetaHeader](#neo.fs.v2.session.ResponseMetaHeader) | | Carries response meta information. Header data is used only to regulate message transport and does not affect request execution. | +| verify_header | [neo.fs.v2.session.ResponseVerificationHeader](#neo.fs.v2.session.ResponseVerificationHeader) | | Carries response verification information. This header is used to authenticate the nodes of the message route and check the correctness of transmission. | + + + + +### Message AnnounceUsedSpaceResponse.Body +`AnnounceUsedSpaceResponse` has an empty body because announcements are +one way communication. + + + ### Message DeleteRequest @@ -171,7 +272,7 @@ smart contract, so signing algorithm must be supported by NeoVM. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| container_id | [neo.fs.v2.refs.ContainerID](#neo.fs.v2.refs.ContainerID) | | Identifier of the container to delete from FrostFS | +| container_id | [neo.fs.v2.refs.ContainerID](#neo.fs.v2.refs.ContainerID) | | Identifier of the container to delete from NeoFS | | signature | [neo.fs.v2.refs.SignatureRFC6979](#neo.fs.v2.refs.SignatureRFC6979) | | `ContainerID` signed with the container owner's key according to RFC-6979. | @@ -197,6 +298,58 @@ and done via consensus in Inner Ring nodes. + + +### Message GetExtendedACLRequest +Get Extended ACL + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| body | [GetExtendedACLRequest.Body](#neo.fs.v2.container.GetExtendedACLRequest.Body) | | Body of get extended acl request message. | +| meta_header | [neo.fs.v2.session.RequestMetaHeader](#neo.fs.v2.session.RequestMetaHeader) | | Carries request meta information. Header data is used only to regulate message transport and does not affect request execution. | +| verify_header | [neo.fs.v2.session.RequestVerificationHeader](#neo.fs.v2.session.RequestVerificationHeader) | | Carries request verification information. This header is used to authenticate the nodes of the message route and check the correctness of transmission. | + + + + +### Message GetExtendedACLRequest.Body +Get Extended ACL request body + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| container_id | [neo.fs.v2.refs.ContainerID](#neo.fs.v2.refs.ContainerID) | | Identifier of the container having Extended ACL | + + + + +### Message GetExtendedACLResponse +Get Extended ACL + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| body | [GetExtendedACLResponse.Body](#neo.fs.v2.container.GetExtendedACLResponse.Body) | | Body of get extended acl response message. | +| meta_header | [neo.fs.v2.session.ResponseMetaHeader](#neo.fs.v2.session.ResponseMetaHeader) | | Carries response meta information. Header data is used only to regulate message transport and does not affect request execution. | +| verify_header | [neo.fs.v2.session.ResponseVerificationHeader](#neo.fs.v2.session.ResponseVerificationHeader) | | Carries response verification information. This header is used to authenticate the nodes of the message route and check the correctness of transmission. | + + + + +### Message GetExtendedACLResponse.Body +Get Extended ACL Response body can be empty if the requested container does +not have Extended ACL Table attached or Extended ACL has not been allowed +at the time of container creation. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| eacl | [neo.fs.v2.acl.EACLTable](#neo.fs.v2.acl.EACLTable) | | Extended ACL requested, if available | +| signature | [neo.fs.v2.refs.SignatureRFC6979](#neo.fs.v2.refs.SignatureRFC6979) | | Signature of stable-marshalled Extended ACL according to RFC-6979. | +| session_token | [neo.fs.v2.session.SessionToken](#neo.fs.v2.session.SessionToken) | | Session token if Extended ACL was set within a session | + + ### Message GetRequest @@ -296,58 +449,10 @@ List containers response body. | container_ids | [neo.fs.v2.refs.ContainerID](#neo.fs.v2.refs.ContainerID) | repeated | List of `ContainerID`s belonging to the requested `OwnerID` | - - -### Message ListStreamRequest -List containers stream - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| body | [ListStreamRequest.Body](#neo.fs.v2.container.ListStreamRequest.Body) | | Body of list containers stream request message. | -| meta_header | [neo.fs.v2.session.RequestMetaHeader](#neo.fs.v2.session.RequestMetaHeader) | | Carries request meta information. Header data is used only to regulate message transport and does not affect request execution. | -| verify_header | [neo.fs.v2.session.RequestVerificationHeader](#neo.fs.v2.session.RequestVerificationHeader) | | Carries request verification information. This header is used to authenticate the nodes of the message route and check the correctness of transmission. | - - - - -### Message ListStreamRequest.Body -List containers stream request body. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| owner_id | [neo.fs.v2.refs.OwnerID](#neo.fs.v2.refs.OwnerID) | | Identifier of the container owner. | - - - - -### Message ListStreamResponse -List containers stream - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| body | [ListStreamResponse.Body](#neo.fs.v2.container.ListStreamResponse.Body) | | Body of list containers stream response message. | -| meta_header | [neo.fs.v2.session.ResponseMetaHeader](#neo.fs.v2.session.ResponseMetaHeader) | | Carries response meta information. Header data is used only to regulate message transport and does not affect request execution. | -| verify_header | [neo.fs.v2.session.ResponseVerificationHeader](#neo.fs.v2.session.ResponseVerificationHeader) | | Carries response verification information. This header is used to authenticate the nodes of the message route and check the correctness of transmission. | - - - - -### Message ListStreamResponse.Body -List containers stream response body. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| container_ids | [neo.fs.v2.refs.ContainerID](#neo.fs.v2.refs.ContainerID) | repeated | List of `ContainerID`s belonging to the requested `OwnerID` | - - ### Message PutRequest -New FrostFS Container creation request +New NeoFS Container creation request | Field | Type | Label | Description | @@ -369,14 +474,14 @@ additional signature checks. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| container | [Container](#neo.fs.v2.container.Container) | | Container structure to register in FrostFS | +| container | [Container](#neo.fs.v2.container.Container) | | Container structure to register in NeoFS | | signature | [neo.fs.v2.refs.SignatureRFC6979](#neo.fs.v2.refs.SignatureRFC6979) | | Signature of a stable-marshalled container according to RFC-6979. | ### Message PutResponse -New FrostFS Container creation response +New NeoFS Container creation response | Field | Type | Label | Description | @@ -399,6 +504,54 @@ returned here to make sure everything has been done as expected. | ----- | ---- | ----- | ----------- | | container_id | [neo.fs.v2.refs.ContainerID](#neo.fs.v2.refs.ContainerID) | | Unique identifier of the newly created container | + + + +### Message SetExtendedACLRequest +Set Extended ACL + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| body | [SetExtendedACLRequest.Body](#neo.fs.v2.container.SetExtendedACLRequest.Body) | | Body of set extended acl request message. | +| meta_header | [neo.fs.v2.session.RequestMetaHeader](#neo.fs.v2.session.RequestMetaHeader) | | Carries request meta information. Header data is used only to regulate message transport and does not affect request execution. | +| verify_header | [neo.fs.v2.session.RequestVerificationHeader](#neo.fs.v2.session.RequestVerificationHeader) | | Carries request verification information. This header is used to authenticate the nodes of the message route and check the correctness of transmission. | + + + + +### Message SetExtendedACLRequest.Body +Set Extended ACL request body does not have separate `ContainerID` +reference. It will be taken from `EACLTable.container_id` field. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| eacl | [neo.fs.v2.acl.EACLTable](#neo.fs.v2.acl.EACLTable) | | Extended ACL table to set for the container | +| signature | [neo.fs.v2.refs.SignatureRFC6979](#neo.fs.v2.refs.SignatureRFC6979) | | Signature of stable-marshalled Extended ACL table according to RFC-6979. | + + + + +### Message SetExtendedACLResponse +Set Extended ACL + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| body | [SetExtendedACLResponse.Body](#neo.fs.v2.container.SetExtendedACLResponse.Body) | | Body of set extended acl response message. | +| meta_header | [neo.fs.v2.session.ResponseMetaHeader](#neo.fs.v2.session.ResponseMetaHeader) | | Carries response meta information. Header data is used only to regulate message transport and does not affect request execution. | +| verify_header | [neo.fs.v2.session.ResponseVerificationHeader](#neo.fs.v2.session.ResponseVerificationHeader) | | Carries response verification information. This header is used to authenticate the nodes of the message route and check the correctness of transmission. | + + + + +### Message SetExtendedACLResponse.Body +`SetExtendedACLResponse` has an empty body because the operation is +asynchronous and the update should be reflected in `Container` smart +contract's storage after next block is issued in sidechain. + + @@ -459,7 +612,7 @@ There are some "well-known" attributes affecting system behaviour: (`__NEOFS__DISABLE_HOMOMORPHIC_HASHING` is deprecated) \ Disables homomorphic hashing for the container if the value equals "true" string. Any other values are interpreted as missing attribute. Container - could be accepted in a FrostFS network only if the global network hashing + could be accepted in a NeoFS network only if the global network hashing configuration value corresponds with that attribute's value. After container inclusion, network setting is ignored. @@ -501,3 +654,4 @@ And some well-known attributes used by applications only: | bool | | bool | boolean | boolean | | string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | | bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/lock.md b/proto-docs/lock.md index ba23306..ae74c5b 100644 --- a/proto-docs/lock.md +++ b/proto-docs/lock.md @@ -7,7 +7,7 @@ - Messages - [Lock](#neo.fs.v2.lock.Lock) - + - [Scalar Value Types](#scalar-value-types) @@ -61,3 +61,4 @@ a lock object via ObjectService.Delete RPC call. | bool | | bool | boolean | boolean | | string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | | bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/netmap.md b/proto-docs/netmap.md index b49287c..fb4eccb 100644 --- a/proto-docs/netmap.md +++ b/proto-docs/netmap.md @@ -6,7 +6,7 @@ - [netmap/service.proto](#netmap/service.proto) - Services - [NetmapService](#neo.fs.v2.netmap.NetmapService) - + - Messages - [LocalNodeInfoRequest](#neo.fs.v2.netmap.LocalNodeInfoRequest) - [LocalNodeInfoRequest.Body](#neo.fs.v2.netmap.LocalNodeInfoRequest.Body) @@ -20,7 +20,7 @@ - [NetworkInfoRequest.Body](#neo.fs.v2.netmap.NetworkInfoRequest.Body) - [NetworkInfoResponse](#neo.fs.v2.netmap.NetworkInfoResponse) - [NetworkInfoResponse.Body](#neo.fs.v2.netmap.NetworkInfoResponse.Body) - + - [netmap/types.proto](#netmap/types.proto) @@ -35,7 +35,7 @@ - [PlacementPolicy](#neo.fs.v2.netmap.PlacementPolicy) - [Replica](#neo.fs.v2.netmap.Replica) - [Selector](#neo.fs.v2.netmap.Selector) - + - [Scalar Value Types](#scalar-value-types) @@ -55,7 +55,7 @@ `NetmapService` provides methods to work with `Network Map` and the information required to build it. The resulting `Network Map` is stored in sidechain `Netmap` smart contract, while related information can be obtained -from other FrostFS nodes. +from other NeoFS nodes. ``` rpc LocalNodeInfo(LocalNodeInfoRequest) returns (LocalNodeInfoResponse); @@ -83,7 +83,7 @@ information about the server has been successfully read; | LocalNodeInfo | [LocalNodeInfoRequest](#neo.fs.v2.netmap.LocalNodeInfoRequest) | [LocalNodeInfoResponse](#neo.fs.v2.netmap.LocalNodeInfoResponse) | #### Method NetworkInfo -Read recent information about the FrostFS network. +Read recent information about the NeoFS network. Statuses: - **OK** (0, SECTION_SUCCESS): @@ -95,7 +95,7 @@ information about the current network state has been successfully read; | NetworkInfo | [NetworkInfoRequest](#neo.fs.v2.netmap.NetworkInfoRequest) | [NetworkInfoResponse](#neo.fs.v2.netmap.NetworkInfoResponse) | #### Method NetmapSnapshot -Returns network map snapshot of the current FrostFS epoch. +Returns network map snapshot of the current NeoFS epoch. Statuses: - **OK** (0, SECTION_SUCCESS): @@ -149,7 +149,7 @@ Local Node Info, including API Version in use. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| version | [neo.fs.v2.refs.Version](#neo.fs.v2.refs.Version) | | Latest FrostFS API version in use | +| version | [neo.fs.v2.refs.Version](#neo.fs.v2.refs.Version) | | Latest NeoFS API version in use | | node_info | [NodeInfo](#neo.fs.v2.netmap.NodeInfo) | | NodeInfo structure with recent information from node itself | @@ -287,7 +287,7 @@ Network map structure ### Message NetworkConfig -FrostFS network configuration +NeoFS network configuration | Field | Type | Label | Description | @@ -315,7 +315,7 @@ System parameters: Fee paid for container creation by the container owner. Value: little-endian integer. Default: 0. - **EpochDuration** \ - FrostFS epoch duration measured in Sidechain blocks. + NeoFS epoch duration measured in Sidechain blocks. Value: little-endian integer. Default: 0. - **HomomorphicHashingDisabled** \ Flag of disabling the homomorphic hashing of objects' payload. @@ -327,39 +327,8 @@ System parameters: Flag allowing setting the MAINTENANCE state to storage nodes. Value: true if any byte != 0. Default: false. - **MaxObjectSize** \ - Maximum size of physically stored FrostFS object measured in bytes. + Maximum size of physically stored NeoFS object measured in bytes. Value: little-endian integer. Default: 0. - - This value refers to the maximum size of a **physically** stored object - in FrostFS. However, from a user's perspective, the **logical** size of a - stored object can be significantly larger. The relationship between the - physical and logical object sizes is governed by the following formula - - ```math - \mathrm{Stored\ Object\ Size} \le - \frac{ - \left(\mathrm{Max\ Object\ Size}\right)^2 - }{ - \mathrm{Object\ ID\ Size} - } - ``` - - This arises from the fact that a tombstone, also being an object, stores - the IDs of inhumed objects and cannot be divided into smaller objects, - thus having an upper limit for its size. - - For example, if: - * Max Object Size Size = 64 MiB; - * Object ID Size = 32 B; - - then: - ```math - \mathrm{Stored\ Object\ Size} \le - \frac{\left(64\ \mathrm{MiB}\right)^2}{32\ \mathrm{B}} = - \frac{2^{52}}{2^5}\ \mathrm{B} = - 2^{47}\ \mathrm{B} = - 128\ \mathrm{TiB} - ``` - **WithdrawFee** \ Fee paid for withdrawal of funds paid by the account owner. Value: little-endian integer. Default: 0. @@ -380,45 +349,45 @@ System parameters: ### Message NetworkInfo -Information about FrostFS network +Information about NeoFS network | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| current_epoch | [uint64](#uint64) | | Number of the current epoch in the FrostFS network | -| magic_number | [uint64](#uint64) | | Magic number of the sidechain of the FrostFS network | -| ms_per_block | [int64](#int64) | | MillisecondsPerBlock network parameter of the sidechain of the FrostFS network | -| network_config | [NetworkConfig](#neo.fs.v2.netmap.NetworkConfig) | | FrostFS network configuration | +| current_epoch | [uint64](#uint64) | | Number of the current epoch in the NeoFS network | +| magic_number | [uint64](#uint64) | | Magic number of the sidechain of the NeoFS network | +| ms_per_block | [int64](#int64) | | MillisecondsPerBlock network parameter of the sidechain of the NeoFS network | +| network_config | [NetworkConfig](#neo.fs.v2.netmap.NetworkConfig) | | NeoFS network configuration | ### Message NodeInfo -FrostFS node description +NeoFS node description | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| public_key | [bytes](#bytes) | | Public key of the FrostFS node in a binary format | +| public_key | [bytes](#bytes) | | Public key of the NeoFS node in a binary format | | addresses | [string](#string) | repeated | Ways to connect to a node | -| attributes | [NodeInfo.Attribute](#neo.fs.v2.netmap.NodeInfo.Attribute) | repeated | Carries list of the FrostFS 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. | -| state | [NodeInfo.State](#neo.fs.v2.netmap.NodeInfo.State) | | Carries state of the FrostFS node | +| attributes | [NodeInfo.Attribute](#neo.fs.v2.netmap.NodeInfo.Attribute) | repeated | 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. | +| state | [NodeInfo.State](#neo.fs.v2.netmap.NodeInfo.State) | | Carries state of the NeoFS node | ### Message NodeInfo.Attribute -Administrator-defined Attributes of the FrostFS Storage Node. +Administrator-defined Attributes of the NeoFS Storage Node. `Attribute` is a Key-Value metadata pair. Key name must be a valid UTF-8 string. Value can't be empty. 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 FrostFS +last one). A string representation of the chain of attributes in NeoFS Storage Node configuration uses ":" and "/" symbols, e.g.: - `FrostFS_NODE_ATTRIBUTE_1=key1:val1/key2:val2` + `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 @@ -465,8 +434,8 @@ explicitly set: [ISO 3166-2](https://en.wikipedia.org/wiki/ISO_3166-2). Calculated automatically from `UN-LOCODE` attribute. * Continent \ - Node's continent name according to the [Seven-Continent - model](https://en.wikipedia.org/wiki/Continent#Number). Calculated + Node's continent name according to the [Seven-Continent model] + (https://en.wikipedia.org/wiki/Continent#Number). Calculated automatically from `UN-LOCODE` attribute. * ExternalAddr Node's preferred way for communications with external clients. @@ -474,7 +443,7 @@ explicitly set: Must contain a comma-separated list of multi-addresses. For detailed description of each well-known attribute please see the -corresponding section in FrostFS Technical Specification. +corresponding section in NeoFS Technical Specification. | Field | Type | Label | Description | @@ -495,7 +464,7 @@ storage policy definition languages. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | replicas | [Replica](#neo.fs.v2.netmap.Replica) | repeated | Rules to set number of object replicas and place each one into a named bucket | -| container_backup_factor | [uint32](#uint32) | | Container backup factor controls how deep FrostFS will search for nodes alternatives to include into container's nodes subset | +| container_backup_factor | [uint32](#uint32) | | Container backup factor controls how deep NeoFS will search for nodes alternatives to include into container's nodes subset | | selectors | [Selector](#neo.fs.v2.netmap.Selector) | repeated | Set of Selectors to form the container's nodes subset | | filters | [Filter](#neo.fs.v2.netmap.Filter) | repeated | List of named filters to reference in selectors | | unique | [bool](#bool) | | Unique flag defines non-overlapping application for replicas | @@ -553,7 +522,7 @@ hash distance. ### NodeInfo.State -Represents the enumeration of various states of the FrostFS node. +Represents the enumeration of various states of the NeoFS node. | Name | Number | Description | | ---- | ------ | ----------- | @@ -581,7 +550,6 @@ Operations on filters | OR | 7 | Logical OR | | AND | 8 | Logical AND | | NOT | 9 | Logical negation | -| LIKE | 10 | Matches pattern | @@ -607,3 +575,4 @@ Operations on filters | bool | | bool | boolean | boolean | | string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | | bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/object.md b/proto-docs/object.md index 14b9ae6..07e3fd0 100644 --- a/proto-docs/object.md +++ b/proto-docs/object.md @@ -6,7 +6,7 @@ - [object/service.proto](#object/service.proto) - Services - [ObjectService](#neo.fs.v2.object.ObjectService) - + - Messages - [DeleteRequest](#neo.fs.v2.object.DeleteRequest) - [DeleteRequest.Body](#neo.fs.v2.object.DeleteRequest.Body) @@ -30,11 +30,6 @@ - [HeadResponse](#neo.fs.v2.object.HeadResponse) - [HeadResponse.Body](#neo.fs.v2.object.HeadResponse.Body) - [HeaderWithSignature](#neo.fs.v2.object.HeaderWithSignature) - - [PatchRequest](#neo.fs.v2.object.PatchRequest) - - [PatchRequest.Body](#neo.fs.v2.object.PatchRequest.Body) - - [PatchRequest.Body.Patch](#neo.fs.v2.object.PatchRequest.Body.Patch) - - [PatchResponse](#neo.fs.v2.object.PatchResponse) - - [PatchResponse.Body](#neo.fs.v2.object.PatchResponse.Body) - [PutRequest](#neo.fs.v2.object.PutRequest) - [PutRequest.Body](#neo.fs.v2.object.PutRequest.Body) - [PutRequest.Body.Init](#neo.fs.v2.object.PutRequest.Body.Init) @@ -50,7 +45,7 @@ - [SearchRequest.Body.Filter](#neo.fs.v2.object.SearchRequest.Body.Filter) - [SearchResponse](#neo.fs.v2.object.SearchResponse) - [SearchResponse.Body](#neo.fs.v2.object.SearchResponse.Body) - + - [object/types.proto](#object/types.proto) @@ -64,7 +59,7 @@ - [Object](#neo.fs.v2.object.Object) - [ShortHeader](#neo.fs.v2.object.ShortHeader) - [SplitInfo](#neo.fs.v2.object.SplitInfo) - + - [Scalar Value Types](#scalar-value-types) @@ -93,7 +88,6 @@ rpc Search(SearchRequest) returns (stream SearchResponse); rpc GetRange(GetRangeRequest) returns (stream GetRangeResponse); rpc GetRangeHash(GetRangeHashRequest) returns (GetRangeHashResponse); rpc PutSingle(PutSingleRequest) returns (PutSingleResponse); -rpc Patch(stream PatchRequest) returns (PatchResponse); ``` @@ -133,7 +127,7 @@ Statuses: - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ object container not found; - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - access to container is denied; + access to container is denied; - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ provided session token has expired. @@ -210,7 +204,7 @@ Statuses: - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ object container not found; - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - access to container is denied; + access to container is denied; - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ provided session token has expired. @@ -223,9 +217,6 @@ Returns the object Headers without data payload. By default full header is returned. If `main_only` request field is set, the short header with only the very minimal information will be returned instead. -Max header size is currently not limited by this API, but may be restricted -on the service level. By default, gRPC uses a message size of 4 MiB. - Extended headers can change `Head` behaviour: * [ __SYSTEM__NETMAP_EPOCH ] \ (`__NEOFS__NETMAP_EPOCH` is deprecated) \ @@ -247,7 +238,7 @@ Statuses: - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ object container not found; - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - access to container is denied; + access to container is denied; - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ provided session token has expired. @@ -257,7 +248,7 @@ Statuses: #### Method Search Search objects in container. Search query allows to match by Object -Header's filed values. Please see the corresponding FrostFS Technical +Header's filed values. Please see the corresponding NeoFS Technical Specification section for more details. Extended headers can change `Search` behaviour: @@ -277,7 +268,7 @@ Statuses: - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ search container not found; - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - access to container is denied; + access to container is denied; - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ provided session token has expired. @@ -318,7 +309,7 @@ Statuses: - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ object container not found; - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - access to container is denied; + access to container is denied; - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ provided session token has expired. @@ -357,7 +348,7 @@ Statuses: - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ object container not found; - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - access to container is denied; + access to container is denied; - **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ provided session token has expired. @@ -393,7 +384,7 @@ Statuses: - **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ object storage container not found; - **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - access to container is denied; + access to container is denied; - **TOKEN_NOT_FOUND** (4096, SECTION_SESSION): \ (for trusted object preparation) session private key does not exist or has @@ -404,59 +395,6 @@ been deleted; | Name | Input | Output | | ---- | ----- | ------ | | PutSingle | [PutSingleRequest](#neo.fs.v2.object.PutSingleRequest) | [PutSingleResponse](#neo.fs.v2.object.PutSingleResponse) | -#### Method Patch - -Patch the object. Request uses gRPC stream. First message must set -the address of the object that is going to get patched. If the object's -attributes are patched, then these attrubutes must be set only within the -first stream message. - -If the patch request is performed by NOT the object's owner but if the -actor has the permission to perform the patch, then `OwnerID` of the object -is changed. In this case the object's owner loses the object's ownership -after the patch request is successfully done. - -As objects are content-addressable the patching causes new object ID -generation for the patched object. This object id is set witihn -`PatchResponse`. But the object id may remain unchanged in such cases: -1. The chunk of the applying patch contains the same value as the object's -payload within the same range; -2. The patch that reverts the changes applied by preceding patch; -3. The application of the same patches for the object a few times. - -Extended headers can change `Patch` behaviour: -* [ __SYSTEM__NETMAP_EPOCH \ - (`__NEOFS__NETMAP_EPOCH` is deprecated) \ - Will use the requsted version of Network Map for object placement - calculation. - -Please refer to detailed `XHeader` description. - -Statuses: -- **OK** (0, SECTION_SUCCESS): \ - object has been successfully patched and saved in the container; -- Common failures (SECTION_FAILURE_COMMON); -- **ACCESS_DENIED** (2048, SECTION_OBJECT): \ - write access to the container is denied; -- **OBJECT_NOT_FOUND** (2049, SECTION_OBJECT): \ - object not found in container; -- **OBJECT_ALREADY_REMOVED** (2052, SECTION_OBJECT): \ - the requested object has been marked as deleted. -- **OUT_OF_RANGE** (2053, SECTION_OBJECT): \ - the requested range is out of bounds; -- **CONTAINER_NOT_FOUND** (3072, SECTION_CONTAINER): \ - object storage container not found; -- **CONTAINER_ACCESS_DENIED** (3074, SECTION_CONTAINER): \ - access to container is denied; -- **TOKEN_NOT_FOUND** (4096, SECTION_SESSION): \ - (for trusted object preparation) session private key does not exist or - has been deleted; -- **TOKEN_EXPIRED** (4097, SECTION_SESSION): \ - provided session token has expired. - -| Name | Input | Output | -| ---- | ----- | ------ | -| Patch | [PatchRequest](#neo.fs.v2.object.PatchRequest) | [PatchResponse](#neo.fs.v2.object.PatchResponse) | @@ -731,7 +669,7 @@ Object HEAD response body | ----- | ---- | ----- | ----------- | | header | [HeaderWithSignature](#neo.fs.v2.object.HeaderWithSignature) | | Full object's `Header` with `ObjectID` signature | | short_header | [ShortHeader](#neo.fs.v2.object.ShortHeader) | | Short object header | -| split_info | [SplitInfo](#neo.fs.v2.object.SplitInfo) | | Meta information of split hierarchy. Indicates that the object is virtual, manual assembly is required. | +| split_info | [SplitInfo](#neo.fs.v2.object.SplitInfo) | | Meta information of split hierarchy. | | ec_info | [ECInfo](#neo.fs.v2.object.ECInfo) | | Meta information for EC object assembly. | @@ -753,71 +691,6 @@ following steps: | signature | [neo.fs.v2.refs.Signature](#neo.fs.v2.refs.Signature) | | Signed `ObjectID` to verify full header's authenticity | - - -### Message PatchRequest -Object PATCH request - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| body | [PatchRequest.Body](#neo.fs.v2.object.PatchRequest.Body) | | Body for patch request message. | -| meta_header | [neo.fs.v2.session.RequestMetaHeader](#neo.fs.v2.session.RequestMetaHeader) | | Carries request meta information. Header data is used only to regulate message transport and does not affect request execution. | -| verify_header | [neo.fs.v2.session.RequestVerificationHeader](#neo.fs.v2.session.RequestVerificationHeader) | | Carries request verification information. This header is used to authenticate the nodes of the message route and check the correctness of transmission. | - - - - -### Message PatchRequest.Body -PATCH request body - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| address | [neo.fs.v2.refs.Address](#neo.fs.v2.refs.Address) | | The address of the object that is requested to get patched. | -| new_attributes | [Header.Attribute](#neo.fs.v2.object.Header.Attribute) | repeated | New attributes for the object. See `replace_attributes` flag usage to define how new attributes should be set. | -| replace_attributes | [bool](#bool) | | If this flag is set, then the object's attributes will be entirely replaced by `new_attributes` list. The empty `new_attributes` list with `replace_attributes = true` just resets attributes list for the object. - -Default `false` value for this flag means the attributes will be just merged. If the incoming `new_attributes` list contains already existing key, then it just replaces it while merging the lists. | -| patch | [PatchRequest.Body.Patch](#neo.fs.v2.object.PatchRequest.Body.Patch) | | The patch that is applied for the object. | - - - - -### Message PatchRequest.Body.Patch -The patch for the object's payload. - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| source_range | [Range](#neo.fs.v2.object.Range) | | The range of the source object for which the payload is replaced by the patch's chunk. If the range's `length = 0`, then the patch's chunk is just appended to the original payload starting from the `offest` without any replace. | -| chunk | [bytes](#bytes) | | The chunk that is being appended to or that replaces the original payload on the given range. | - - - - -### Message PatchResponse -Object PATCH response - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| body | [PatchResponse.Body](#neo.fs.v2.object.PatchResponse.Body) | | Body for patch response message. | -| meta_header | [neo.fs.v2.session.ResponseMetaHeader](#neo.fs.v2.session.ResponseMetaHeader) | | Carries response meta information. Header data is used only to regulate message transport and does not affect request execution. | -| verify_header | [neo.fs.v2.session.ResponseVerificationHeader](#neo.fs.v2.session.ResponseVerificationHeader) | | Carries response verification information. This header is used to authenticate the nodes of the message route and check the correctness of transmission. | - - - - -### Message PatchResponse.Body -PATCH response body - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| object_id | [neo.fs.v2.refs.ObjectID](#neo.fs.v2.refs.ObjectID) | | The object ID of the saved patched object. | - - ### Message PutRequest @@ -1003,8 +876,8 @@ prefix to the name. Here is the list of fields available via this prefix: * $Object:split.splitID \ 16 byte UUIDv4 used to identify the split object hierarchy parts * $Object:ec.parent \ - If the object is stored according to EC policy, then ec_parent - attribute is set to return an id list of all related EC chunks. + If the object is stored according to EC policy, then ec_parent attribute + is set to return an id list of all related EC chunks. There are some well-known filter aliases to match objects by certain properties: @@ -1167,7 +1040,7 @@ And some well-known attributes used by applications only: MIME Content Type of object's payload For detailed description of each well-known attribute please see the -corresponding section in FrostFS Technical Specification. +corresponding section in NeoFS Technical Specification. | Field | Type | Label | Description | @@ -1192,8 +1065,7 @@ All objects belonging to a single EC group have the same `parent` field. | header_length | [uint32](#uint32) | | Total length of a parent header. Used to trim padding zeroes. | | header | [bytes](#bytes) | | Chunk of a parent header. | | parent_split_id | [bytes](#bytes) | | As the origin object is EC-splitted its identifier is known to all chunks as parent. But parent itself can be a part of Split (does not relate to EC-split). In this case parent_split_id should be set. | -| parent_split_parent_id | [neo.fs.v2.refs.ObjectID](#neo.fs.v2.refs.ObjectID) | | EC-parent's parent ID. parent_split_parent_id is set if EC-parent, itself, is a part of Split and if an object ID of its parent is presented. The field allows to determine how EC-chunk is placed in Split hierarchy. | -| parent_attributes | [Header.Attribute](#neo.fs.v2.object.Header.Attribute) | repeated | EC parent's attributes. | +| parent_split_parent_id | [neo.fs.v2.refs.ObjectID](#neo.fs.v2.refs.ObjectID) | | EC-parent's parent ID. parent_split_parent_id is set if EC-parent, itself, is a part of Split and if an object ID of its parent is presented.The field allows to determine how EC-chunk is placed in Split hierarchy. | @@ -1326,3 +1198,4 @@ String presentation of object type is the same as definition: | bool | | bool | boolean | boolean | | string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | | bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/refs.md b/proto-docs/refs.md index 3ad3126..e27d4ba 100644 --- a/proto-docs/refs.md +++ b/proto-docs/refs.md @@ -14,7 +14,7 @@ - [Signature](#neo.fs.v2.refs.Signature) - [SignatureRFC6979](#neo.fs.v2.refs.SignatureRFC6979) - [Version](#neo.fs.v2.refs.Version) - + - [Scalar Value Types](#scalar-value-types) @@ -32,7 +32,7 @@ ### Message Address -Objects in FrostFS are addressed by their ContainerID and ObjectID. +Objects in NeoFS are addressed by their ContainerID and ObjectID. String presentation of `Address` is a concatenation of string encoded `ContainerID` and `ObjectID` delimited by '/' character. @@ -65,7 +65,7 @@ Depending on checksum algorithm type, the string presentation may vary: ### Message ContainerID -FrostFS container identifier. Container structures are immutable and +NeoFS container identifier. Container structures are immutable and content-addressed. `ContainerID` is a 32 byte long @@ -90,9 +90,8 @@ with/without paddings are accepted. ### Message ObjectID -FrostFS Object unique identifier. Objects are immutable and -content-addressed. It means `ObjectID` will change if the `header` or the -`payload` changes. +NeoFS Object unique identifier. Objects are immutable and content-addressed. +It means `ObjectID` will change if the `header` or the `payload` changes. `ObjectID` is a 32 byte long [SHA256](https://csrc.nist.gov/publications/detail/fips/180/4/final) hash of @@ -142,7 +141,7 @@ with/without paddings are accepted. ### Message Signature -Signature of something in FrostFS. +Signature of something in NeoFS. | Field | Type | Label | Description | @@ -231,3 +230,4 @@ pair. | bool | | bool | boolean | boolean | | string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | | bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/service.md b/proto-docs/service.md new file mode 100644 index 0000000..e37ad9f --- /dev/null +++ b/proto-docs/service.md @@ -0,0 +1,125 @@ +# Protocol Documentation + + +## Table of Contents + +- [service/types.proto](#service/types.proto) + + - Messages + - [RequestMetaHeader](#neo.fs.v2.service.RequestMetaHeader) + - [RequestVerificationHeader](#neo.fs.v2.service.RequestVerificationHeader) + - [ResponseMetaHeader](#neo.fs.v2.service.ResponseMetaHeader) + - [ResponseVerificationHeader](#neo.fs.v2.service.ResponseVerificationHeader) + - [XHeader](#neo.fs.v2.service.XHeader) + + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## service/types.proto + + + + + + + +### Message RequestMetaHeader +Information about the request + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| version | [neo.fs.v2.refs.Version](#neo.fs.v2.refs.Version) | | Client API version. | +| epoch | [uint64](#uint64) | | Client local epoch number. Set to 0 if unknown. | +| ttl | [uint32](#uint32) | | Maximum number of nodes in the request route. | +| x_headers | [XHeader](#neo.fs.v2.service.XHeader) | repeated | Request X-Headers. | +| session_token | [neo.fs.v2.session.SessionToken](#neo.fs.v2.session.SessionToken) | | Token is a token of the session within which the request is sent | +| bearer_token | [neo.fs.v2.acl.BearerToken](#neo.fs.v2.acl.BearerToken) | | Bearer is a Bearer token of the request | +| origin | [RequestMetaHeader](#neo.fs.v2.service.RequestMetaHeader) | | RequestMetaHeader of the origin request. | + + + + +### Message RequestVerificationHeader +Verification info for request signed by all intermediate nodes + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| body_signature | [neo.fs.v2.refs.Signature](#neo.fs.v2.refs.Signature) | | Request Body signature. Should be generated once by request initiator. | +| meta_signature | [neo.fs.v2.refs.Signature](#neo.fs.v2.refs.Signature) | | Request Meta signature is added and signed by any intermediate node | +| origin_signature | [neo.fs.v2.refs.Signature](#neo.fs.v2.refs.Signature) | | Sign previous hops | +| origin | [RequestVerificationHeader](#neo.fs.v2.service.RequestVerificationHeader) | | Chain of previous hops signatures | + + + + +### Message ResponseMetaHeader +Information about the response + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| version | [neo.fs.v2.refs.Version](#neo.fs.v2.refs.Version) | | Server API version. | +| epoch | [uint64](#uint64) | | Server local epoch number. | +| ttl | [uint32](#uint32) | | Maximum number of nodes in the response route. | +| x_headers | [XHeader](#neo.fs.v2.service.XHeader) | repeated | Response X-Headers. | +| origin | [ResponseMetaHeader](#neo.fs.v2.service.ResponseMetaHeader) | | Carries response meta header of the origin response. | + + + + +### Message ResponseVerificationHeader +Verification info for response signed by all intermediate nodes + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| body_signature | [neo.fs.v2.refs.Signature](#neo.fs.v2.refs.Signature) | | Response Body signature. Should be generated once by answering node. | +| meta_signature | [neo.fs.v2.refs.Signature](#neo.fs.v2.refs.Signature) | | Response Meta signature is added and signed by any intermediate node | +| origin_signature | [neo.fs.v2.refs.Signature](#neo.fs.v2.refs.Signature) | | Sign previous hops | +| origin | [ResponseVerificationHeader](#neo.fs.v2.service.ResponseVerificationHeader) | | Chain of previous hops signatures | + + + + +### Message XHeader +Extended headers for Request/Response + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | Key of the X-Header. | +| value | [string](#string) | | Value of the X-Header. | + + + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ Type | Java Type | Python Type | +| ----------- | ----- | -------- | --------- | ----------- | +| double | | double | double | float | +| float | | float | float | float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | +| sfixed32 | Always four bytes. | int32 | int | int | +| sfixed64 | Always eight bytes. | int64 | long | int/long | +| bool | | bool | boolean | boolean | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/session.md b/proto-docs/session.md index 984db48..40088d1 100644 --- a/proto-docs/session.md +++ b/proto-docs/session.md @@ -6,13 +6,13 @@ - [session/service.proto](#session/service.proto) - Services - [SessionService](#neo.fs.v2.session.SessionService) - + - Messages - [CreateRequest](#neo.fs.v2.session.CreateRequest) - [CreateRequest.Body](#neo.fs.v2.session.CreateRequest.Body) - [CreateResponse](#neo.fs.v2.session.CreateResponse) - [CreateResponse.Body](#neo.fs.v2.session.CreateResponse.Body) - + - [session/types.proto](#session/types.proto) @@ -28,7 +28,7 @@ - [SessionToken.Body](#neo.fs.v2.session.SessionToken.Body) - [SessionToken.Body.TokenLifetime](#neo.fs.v2.session.SessionToken.Body.TokenLifetime) - [XHeader](#neo.fs.v2.session.XHeader) - + - [Scalar Value Types](#scalar-value-types) @@ -48,7 +48,7 @@ `SessionService` allows to establish a temporary trust relationship between two peer nodes and generate a `SessionToken` as the proof of trust to be attached in requests for further verification. Please see corresponding -section of FrostFS Technical Specification for details. +section of NeoFS Technical Specification for details. ``` rpc Create(CreateRequest) returns (CreateResponse); @@ -168,7 +168,7 @@ Carries objects involved in the object session. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | container | [neo.fs.v2.refs.ContainerID](#neo.fs.v2.refs.ContainerID) | | Indicates which container the session is spread to. Field MUST be set and correct. | -| objects | [neo.fs.v2.refs.ObjectID](#neo.fs.v2.refs.ObjectID) | repeated | Indicates which objects the session is spread to. Objects are expected to be stored in the FrostFS container referenced by `container` field. Each element MUST have correct format. | +| objects | [neo.fs.v2.refs.ObjectID](#neo.fs.v2.refs.ObjectID) | repeated | Indicates which objects the session is spread to. Objects are expected to be stored in the NeoFS container referenced by `container` field. Each element MUST have correct format. | @@ -187,7 +187,7 @@ request meta headers are folded in matryoshka style. | session_token | [SessionToken](#neo.fs.v2.session.SessionToken) | | Session token within which the request is sent | | bearer_token | [neo.fs.v2.acl.BearerToken](#neo.fs.v2.acl.BearerToken) | | `BearerToken` with eACL overrides for the request | | origin | [RequestMetaHeader](#neo.fs.v2.session.RequestMetaHeader) | | `RequestMetaHeader` of the origin request | -| magic_number | [uint64](#uint64) | | FrostFS network magic. Must match the value for the network that the server belongs to. | +| magic_number | [uint64](#uint64) | | NeoFS network magic. Must match the value for the network that the server belongs to. | @@ -237,12 +237,12 @@ Verification info for the response signed by all intermediate nodes ### Message SessionToken -FrostFS Session Token. +NeoFS Session Token. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| body | [SessionToken.Body](#neo.fs.v2.session.SessionToken.Body) | | Session Token contains the proof of trust between peers to be attached in requests for further verification. Please see corresponding section of FrostFS Technical Specification for details. | +| body | [SessionToken.Body](#neo.fs.v2.session.SessionToken.Body) | | Session Token contains the proof of trust between peers to be attached in requests for further verification. Please see corresponding section of NeoFS Technical Specification for details. | | signature | [neo.fs.v2.refs.Signature](#neo.fs.v2.refs.Signature) | | Signature of `SessionToken` information | @@ -338,7 +338,6 @@ Object request verbs | DELETE | 5 | Refers to object.Delete RPC call | | RANGE | 6 | Refers to object.GetRange RPC call | | RANGEHASH | 7 | Refers to object.GetRangeHash RPC call | -| PATCH | 8 | Refers to object.Patch RPC call | @@ -364,3 +363,4 @@ Object request verbs | bool | | bool | boolean | boolean | | string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | | bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/status.md b/proto-docs/status.md index b00d000..c1401bd 100644 --- a/proto-docs/status.md +++ b/proto-docs/status.md @@ -8,7 +8,7 @@ - Messages - [Status](#neo.fs.v2.status.Status) - [Status.Detail](#neo.fs.v2.status.Status.Detail) - + - [Scalar Value Types](#scalar-value-types) @@ -26,12 +26,12 @@ ### Message Status -Declares the general format of the status returns of the FrostFS RPC -protocol. Status is present in all response messages. Each RPC of FrostFS -protocol describes the possible outcomes and details of the operation. +Declares the general format of the status returns of the NeoFS RPC protocol. +Status is present in all response messages. Each RPC of NeoFS protocol +describes the possible outcomes and details of the operation. Each status is assigned a one-to-one numeric code. Any unique result of an -operation in FrostFS is unambiguously associated with the code value. +operation in NeoFS is unambiguously associated with the code value. Numerical set of codes is split into 1024-element sections. An enumeration is defined for each section. Values can be referred to in the following ways: @@ -98,11 +98,9 @@ Section of failed statuses independent of the operation. | Name | Number | Description | | ---- | ------ | ----------- | | INTERNAL | 0 | [**1024**] Internal server error, default failure. Not detailed. If the server cannot match failed outcome to the code, it should use this code. | -| WRONG_MAGIC_NUMBER | 1 | [**1025**] Wrong magic of the FrostFS network. Details: - [**0**] Magic number of the served FrostFS network (big-endian 64-bit unsigned integer). | +| WRONG_MAGIC_NUMBER | 1 | [**1025**] Wrong magic of the NeoFS network. Details: - [**0**] Magic number of the served NeoFS network (big-endian 64-bit unsigned integer). | | SIGNATURE_VERIFICATION_FAIL | 2 | [**1026**] Signature verification failure. | | NODE_UNDER_MAINTENANCE | 3 | [**1027**] Node is under maintenance. | -| INVALID_ARGUMENT | 4 | [**1028**] Invalid argument error. If the server fails on validation of a request parameter as the client sent it incorrectly, then this code should be used. | -| RESOURCE_EXHAUSTED | 5 | [**1029**] Resource exhausted failure. This code should be used if the operation cannot be performed due to a lack of resources. | @@ -166,7 +164,7 @@ Section of statuses for session-related operations. ### Success -Section of FrostFS successful return codes. +Section of NeoFS successful return codes. | Name | Number | Description | | ---- | ------ | ----------- | @@ -196,3 +194,4 @@ Section of FrostFS successful return codes. | bool | | bool | boolean | boolean | | string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | | bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/storagegroup.md b/proto-docs/storagegroup.md new file mode 100644 index 0000000..da765f1 --- /dev/null +++ b/proto-docs/storagegroup.md @@ -0,0 +1,71 @@ +# Protocol Documentation + + +## Table of Contents + +- [storagegroup/types.proto](#storagegroup/types.proto) + + - Messages + - [StorageGroup](#neo.fs.v2.storagegroup.StorageGroup) + + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## storagegroup/types.proto + + + + + + + +### Message StorageGroup +StorageGroup keeps verification information for Data Audit sessions. Objects +that require paid storage guarantees are gathered in `StorageGroups` with +additional information used for the proof of storage. `StorageGroup` only +contains objects from the same container. + +Being an object payload, StorageGroup may have expiration Epoch set with +`__SYSTEM__EXPIRATION_EPOCH` (`__NEOFS__EXPIRATION_EPOCH` is deprecated) well-known attribute. When expired, StorageGroup +will be ignored by InnerRing nodes during Data Audit cycles and will be +deleted by Storage Nodes. + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| validation_data_size | [uint64](#uint64) | | Total size of the payloads of objects in the storage group | +| validation_hash | [neo.fs.v2.refs.Checksum](#neo.fs.v2.refs.Checksum) | | Homomorphic hash from the concatenation of the payloads of the storage group members. The order of concatenation is the same as the order of the members in the `members` field. | +| expiration_epoch | [uint64](#uint64) | | DEPRECATED. Last NeoFS epoch number of the storage group lifetime | +| members | [neo.fs.v2.refs.ObjectID](#neo.fs.v2.refs.ObjectID) | repeated | Strictly ordered list of storage group member objects. Members MUST be unique | + + + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ Type | Java Type | Python Type | +| ----------- | ----- | -------- | --------- | ----------- | +| double | | double | double | float | +| float | | float | float | float | +| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | +| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | +| sfixed32 | Always four bytes. | int32 | int | int | +| sfixed64 | Always eight bytes. | int64 | long | int/long | +| bool | | bool | boolean | boolean | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/proto-docs/tombstone.md b/proto-docs/tombstone.md index 467ad55..7a7761b 100644 --- a/proto-docs/tombstone.md +++ b/proto-docs/tombstone.md @@ -7,7 +7,7 @@ - Messages - [Tombstone](#neo.fs.v2.tombstone.Tombstone) - + - [Scalar Value Types](#scalar-value-types) @@ -26,12 +26,12 @@ ### Message Tombstone Tombstone keeps record of deleted objects for a few epochs until they are -purged from the FrostFS network. +purged from the NeoFS network. | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| expiration_epoch | [uint64](#uint64) | | Last FrostFS epoch number of the tombstone lifetime. It's set by the tombstone creator depending on the current FrostFS network settings. A tombstone object must have the same expiration epoch value in `__SYSTEM__EXPIRATION_EPOCH` (`__NEOFS__EXPIRATION_EPOCH` is deprecated) attribute. Otherwise, the tombstone will be rejected by a storage node. | +| expiration_epoch | [uint64](#uint64) | | Last NeoFS epoch number of the tombstone lifetime. It's set by the tombstone creator depending on the current NeoFS network settings. A tombstone object must have the same expiration epoch value in `__SYSTEM__EXPIRATION_EPOCH` (`__NEOFS__EXPIRATION_EPOCH` is deprecated) attribute. Otherwise, the tombstone will be rejected by a storage node. | | split_id | [bytes](#bytes) | | 16 byte UUID used to identify the split object hierarchy parts. Must be unique inside a container. All objects participating in the split must have the same `split_id` value. | | members | [neo.fs.v2.refs.ObjectID](#neo.fs.v2.refs.ObjectID) | repeated | List of objects to be deleted. | @@ -60,3 +60,4 @@ purged from the FrostFS network. | bool | | bool | boolean | boolean | | string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | | bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | + diff --git a/refs/types.proto b/refs/types.proto index 2464c34..ebc076f 100644 --- a/refs/types.proto +++ b/refs/types.proto @@ -1,11 +1,11 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.refs; option go_package = "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc;refs"; option csharp_namespace = "Neo.FileStorage.API.Refs"; -// Objects in FrostFS are addressed by their ContainerID and ObjectID. +// Objects in NeoFS are addressed by their ContainerID and ObjectID. // // String presentation of `Address` is a concatenation of string encoded // `ContainerID` and `ObjectID` delimited by '/' character. @@ -16,9 +16,8 @@ message Address { ObjectID object_id = 2 [ json_name = "objectID" ]; } -// FrostFS Object unique identifier. Objects are immutable and -// content-addressed. It means `ObjectID` will change if the `header` or the -// `payload` changes. +// NeoFS Object unique identifier. Objects are immutable and content-addressed. +// It means `ObjectID` will change if the `header` or the `payload` changes. // // `ObjectID` is a 32 byte long // [SHA256](https://csrc.nist.gov/publications/detail/fips/180/4/final) hash of @@ -38,7 +37,7 @@ message ObjectID { bytes value = 1 [ json_name = "value" ]; } -// FrostFS container identifier. Container structures are immutable and +// NeoFS container identifier. Container structures are immutable and // content-addressed. // // `ContainerID` is a 32 byte long @@ -91,7 +90,7 @@ message Version { uint32 minor = 2 [ json_name = "minor" ]; } -// Signature of something in FrostFS. +// Signature of something in NeoFS. message Signature { // Public key used for signing bytes key = 1 [ json_name = "key" ]; diff --git a/session/service.proto b/session/service.proto index c9a7948..6e12147 100644 --- a/session/service.proto +++ b/session/service.proto @@ -1,4 +1,4 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.session; @@ -11,7 +11,7 @@ import "session/types.proto"; // `SessionService` allows to establish a temporary trust relationship between // two peer nodes and generate a `SessionToken` as the proof of trust to be // attached in requests for further verification. Please see corresponding -// section of FrostFS Technical Specification for details. +// section of NeoFS Technical Specification for details. service SessionService { // Open a new session between two peers. // diff --git a/session/types.proto b/session/types.proto index 1e5b9db..a878665 100644 --- a/session/types.proto +++ b/session/types.proto @@ -1,4 +1,4 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.session; @@ -36,9 +36,6 @@ message ObjectSessionContext { // Refers to object.GetRangeHash RPC call RANGEHASH = 7; - - // Refers to object.Patch RPC call - PATCH = 8; } // Type of request for which the token is issued Verb verb = 1 [ json_name = "verb" ]; @@ -50,7 +47,7 @@ message ObjectSessionContext { refs.ContainerID container = 1 [ json_name = "container" ]; // Indicates which objects the session is spread to. Objects are expected - // to be stored in the FrostFS container referenced by `container` field. + // to be stored in the NeoFS container referenced by `container` field. // Each element MUST have correct format. repeated refs.ObjectID objects = 2 [ json_name = "objects" ]; } @@ -88,7 +85,7 @@ message ContainerSessionContext { refs.ContainerID container_id = 3 [ json_name = "containerID" ]; } -// FrostFS Session Token. +// NeoFS Session Token. message SessionToken { // Session Token body message Body { @@ -126,7 +123,7 @@ message SessionToken { } // Session Token contains the proof of trust between peers to be attached in // requests for further verification. Please see corresponding section of - // FrostFS Technical Specification for details. + // NeoFS Technical Specification for details. Body body = 1 [ json_name = "body" ]; // Signature of `SessionToken` information @@ -186,7 +183,7 @@ message RequestMetaHeader { // `RequestMetaHeader` of the origin request RequestMetaHeader origin = 7 [ json_name = "origin" ]; - // FrostFS network magic. Must match the value for the network + // NeoFS network magic. Must match the value for the network // that the server belongs to. uint64 magic_number = 8 [ json_name = "magicNumber" ]; } diff --git a/status/types.proto b/status/types.proto index 6a98f84..2205abc 100644 --- a/status/types.proto +++ b/status/types.proto @@ -1,16 +1,16 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.status; option go_package = "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status/grpc;status"; option csharp_namespace = "Neo.FileStorage.API.Status"; -// Declares the general format of the status returns of the FrostFS RPC -// protocol. Status is present in all response messages. Each RPC of FrostFS -// protocol describes the possible outcomes and details of the operation. +// Declares the general format of the status returns of the NeoFS RPC protocol. +// Status is present in all response messages. Each RPC of NeoFS protocol +// describes the possible outcomes and details of the operation. // // Each status is assigned a one-to-one numeric code. Any unique result of an -// operation in FrostFS is unambiguously associated with the code value. +// operation in NeoFS is unambiguously associated with the code value. // // Numerical set of codes is split into 1024-element sections. An enumeration // is defined for each section. Values can be referred to in the following ways: @@ -78,7 +78,7 @@ enum Section { SECTION_APE_MANAGER = 5; } -// Section of FrostFS successful return codes. +// Section of NeoFS successful return codes. enum Success { // [**0**] Default success. Not detailed. // If the server cannot match successful outcome to the code, it should @@ -93,9 +93,9 @@ enum CommonFail { // use this code. INTERNAL = 0; - // [**1025**] Wrong magic of the FrostFS network. + // [**1025**] Wrong magic of the NeoFS network. // Details: - // - [**0**] Magic number of the served FrostFS network (big-endian 64-bit + // - [**0**] Magic number of the served NeoFS network (big-endian 64-bit // unsigned integer). WRONG_MAGIC_NUMBER = 1; @@ -104,15 +104,6 @@ enum CommonFail { // [**1027**] Node is under maintenance. NODE_UNDER_MAINTENANCE = 3; - - // [**1028**] Invalid argument error. If the server fails on validation of a - // request parameter as the client sent it incorrectly, then this code should - // be used. - INVALID_ARGUMENT = 4; - - // [**1029**] Resource exhausted failure. This code should be used - // if the operation cannot be performed due to a lack of resources. - RESOURCE_EXHAUSTED = 5; } // Section of statuses for object-related operations. @@ -163,4 +154,4 @@ enum Session { enum APEManager { // [**5120**] The operation is denied by APE manager. APE_MANAGER_ACCESS_DENIED = 0; -} +} \ No newline at end of file diff --git a/tombstone/types.proto b/tombstone/types.proto index aac19b0..6547958 100644 --- a/tombstone/types.proto +++ b/tombstone/types.proto @@ -1,4 +1,4 @@ -edition = "2023"; +syntax = "proto3"; package neo.fs.v2.tombstone; @@ -8,10 +8,10 @@ option csharp_namespace = "Neo.FileStorage.API.Tombstone"; import "refs/types.proto"; // Tombstone keeps record of deleted objects for a few epochs until they are -// purged from the FrostFS network. +// purged from the NeoFS network. message Tombstone { - // Last FrostFS epoch number of the tombstone lifetime. It's set by the - // tombstone creator depending on the current FrostFS network settings. A + // Last NeoFS epoch number of the tombstone lifetime. It's set by the + // tombstone creator depending on the current NeoFS network settings. A // tombstone object must have the same expiration epoch value in // `__SYSTEM__EXPIRATION_EPOCH` (`__NEOFS__EXPIRATION_EPOCH` is deprecated) // attribute. Otherwise, the tombstone will be rejected by a storage node.