forked from TrueCloudLab/frostfs-sdk-go
Compare commits
47 commits
fix/sessio
...
master
Author | SHA1 | Date | |
---|---|---|---|
552219b8e1 | |||
cfb8a7b914 | |||
4438f115fb | |||
bec77f280a | |||
df2090c2be | |||
7e6592b28e | |||
d589d51509 | |||
25588ee3be | |||
9407f30248 | |||
94c0a607b5 | |||
e45647de3c | |||
611e20587b | |||
eba6831125 | |||
7e3810d654 | |||
cc0fef2c55 | |||
b696d3c70e | |||
1c94309d7a | |||
f43f18ecda | |||
ac8442bf99 | |||
0ad877288e | |||
0e1999c965 | |||
b461aa64b8 | |||
b761fd8070 | |||
94476f9055 | |||
5e759bf089 | |||
d4f5bba459 | |||
e9c1a2ab2b | |||
2cbc585edd | |||
e355e5eeba | |||
f08069ceeb | |||
dad99bad48 | |||
0d3a238d9c | |||
cf64ddfb14 | |||
cf9a54dcda | |||
|
b2a37543d3 | ||
f0ac49b8f0 | |||
54696acf48 | |||
dd88a5c5e0 | |||
4ff9c00de3 | |||
b204a62da1 | |||
377a5a0517 | |||
43c046f343 | |||
|
8c0c7789ca | ||
|
339e2702f8 | ||
|
a1748ae0e7 | ||
|
4c779423f5 | ||
|
45a6e7a7c2 |
229 changed files with 2461 additions and 1466 deletions
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
|
@ -1 +1 @@
|
||||||
* @alexvanin @fyrchik @cthulhu-rider
|
* @TrueCloudLab/storage-core @TrueCloudLab/storage-services
|
||||||
|
|
45
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
45
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: community, triage, bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--- Provide a general summary of the issue in the Title above -->
|
||||||
|
|
||||||
|
## Expected Behavior
|
||||||
|
<!--- If you're describing a bug, tell us what should happen -->
|
||||||
|
<!--- If you're suggesting a change/improvement, tell us how it should work -->
|
||||||
|
|
||||||
|
## Current Behavior
|
||||||
|
<!--- If describing a bug, tell us what happens instead of the expected behavior -->
|
||||||
|
<!--- If suggesting a change/improvement, explain the difference from current behavior -->
|
||||||
|
|
||||||
|
## Possible Solution
|
||||||
|
<!--- Not obligatory -->
|
||||||
|
<!--- If no reason/fix/additions for the bug can be suggested, -->
|
||||||
|
<!--- uncomment the following phrase: -->
|
||||||
|
|
||||||
|
<!--- No fix can be suggested by a QA engineer. Further solutions shall be up to developers. -->
|
||||||
|
|
||||||
|
## Steps to Reproduce (for bugs)
|
||||||
|
<!--- Provide a link to a live example, or an unambiguous set of steps to -->
|
||||||
|
<!--- reproduce this bug. -->
|
||||||
|
|
||||||
|
1.
|
||||||
|
|
||||||
|
## Context
|
||||||
|
<!--- How has this issue affected you? What are you trying to accomplish? -->
|
||||||
|
<!--- Providing context helps us come up with a solution that is most useful in the real world -->
|
||||||
|
|
||||||
|
## Regression
|
||||||
|
<!-- Is this issue a regression? (Yes / No) -->
|
||||||
|
<!-- If Yes, optionally please include version or commit id or PR# that caused this regression, if you have these details. -->
|
||||||
|
|
||||||
|
## Your Environment
|
||||||
|
<!--- Include as many relevant details about the environment you experienced the bug in -->
|
||||||
|
* Version used:
|
||||||
|
* Server setup and configuration:
|
||||||
|
* Operating System and version (`uname -a`):
|
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
1
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
blank_issues_enabled: false
|
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: community, triage
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Is your feature request related to a problem? Please describe.
|
||||||
|
<!--- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
||||||
|
|
||||||
|
## Describe the solution you'd like
|
||||||
|
<!--- A clear and concise description of what you want to happen. -->
|
||||||
|
|
||||||
|
## Describe alternatives you've considered
|
||||||
|
<!--- A clear and concise description of any alternative solutions or features you've considered. -->
|
||||||
|
|
||||||
|
## Additional context
|
||||||
|
<!--- Add any other context or screenshots about the feature request here. -->
|
2
.github/workflows/tests.yml
vendored
2
.github/workflows/tests.yml
vendored
|
@ -15,7 +15,7 @@ jobs:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-20.04
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
go_versions: [ '1.17.x', '1.18.x', '1.19.x' ]
|
go_versions: [ '1.18.x', '1.19.x', '1.20.x' ]
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -20,4 +20,4 @@ vendor/
|
||||||
|
|
||||||
# coverage
|
# coverage
|
||||||
coverage.txt
|
coverage.txt
|
||||||
coverage.html
|
coverage.html
|
||||||
|
|
10
.gitlint
Normal file
10
.gitlint
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
[general]
|
||||||
|
fail-without-commits=true
|
||||||
|
contrib=CC1
|
||||||
|
|
||||||
|
[title-match-regex]
|
||||||
|
regex=^\[\#[0-9Xx]+\]\s
|
||||||
|
|
||||||
|
[ignore-by-title]
|
||||||
|
regex=^Release(.*)
|
||||||
|
ignore=title-match-regex
|
|
@ -24,6 +24,9 @@ linters-settings:
|
||||||
govet:
|
govet:
|
||||||
# report about shadowed variables
|
# report about shadowed variables
|
||||||
check-shadowing: false
|
check-shadowing: false
|
||||||
|
staticcheck:
|
||||||
|
checks: ["all", "-SA1019"] # TODO Enable SA1019 after deprecated warning are fixed.
|
||||||
|
|
||||||
|
|
||||||
linters:
|
linters:
|
||||||
enable:
|
enable:
|
||||||
|
@ -32,15 +35,12 @@ linters:
|
||||||
- revive
|
- revive
|
||||||
|
|
||||||
# some default golangci-lint linters
|
# some default golangci-lint linters
|
||||||
- deadcode
|
|
||||||
- errcheck
|
- errcheck
|
||||||
- gosimple
|
- gosimple
|
||||||
- ineffassign
|
- ineffassign
|
||||||
- staticcheck
|
- staticcheck
|
||||||
- structcheck
|
|
||||||
- typecheck
|
- typecheck
|
||||||
- unused
|
- unused
|
||||||
- varcheck
|
|
||||||
|
|
||||||
# extra linters
|
# extra linters
|
||||||
- exhaustive
|
- exhaustive
|
||||||
|
|
30
.pre-commit-config.yaml
Normal file
30
.pre-commit-config.yaml
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
ci:
|
||||||
|
autofix_prs: false
|
||||||
|
|
||||||
|
repos:
|
||||||
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
|
rev: v4.4.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: ".key$"
|
||||||
|
|
||||||
|
- repo: https://github.com/golangci/golangci-lint
|
||||||
|
rev: v1.51.2
|
||||||
|
hooks:
|
||||||
|
- id: golangci-lint
|
||||||
|
|
||||||
|
- repo: https://github.com/jorisroovers/gitlint
|
||||||
|
rev: v0.18.0
|
||||||
|
hooks:
|
||||||
|
- id: gitlint
|
||||||
|
stages: [commit-msg]
|
2
Makefile
Normal file → Executable file
2
Makefile
Normal file → Executable file
|
@ -37,4 +37,4 @@ help:
|
||||||
@echo ''
|
@echo ''
|
||||||
@echo ' Targets:'
|
@echo ' Targets:'
|
||||||
@echo ''
|
@echo ''
|
||||||
@awk '/^#/{ comment = substr($$0,3) } comment && /^[a-zA-Z][a-zA-Z0-9_-]+ ?:/{ print " ", $$1, comment }' $(MAKEFILE_LIST) | column -t -s ':' | grep -v 'IGNORE' | sort -u
|
@awk '/^#/{ comment = substr($$0,3) } comment && /^[a-zA-Z][a-zA-Z0-9_-]+ ?:/{ print " ", $$1, comment }' $(MAKEFILE_LIST) | column -t -s ':' | grep -v 'IGNORE' | sort -u
|
||||||
|
|
50
README.md
50
README.md
|
@ -1,6 +1,6 @@
|
||||||
# neofs-sdk-go
|
# frostfs-sdk-go
|
||||||
Go implementation of NeoFS SDK. It contains high-level version-independent wrappers
|
Go implementation of FrostFS SDK. It contains high-level version-independent wrappers
|
||||||
for structures from [neofs-api-go](https://github.com/nspcc-dev/neofs-api-go) as well as
|
for structures from [frostfs-api-go](https://git.frostfs.info/TrueCloudLab/frostfs-api-go) as well as
|
||||||
helper functions for simplifying node/dApp implementations.
|
helper functions for simplifying node/dApp implementations.
|
||||||
|
|
||||||
## Repository structure
|
## Repository structure
|
||||||
|
@ -10,39 +10,39 @@ Contains fixed-point `Decimal` type for performing balance calculations.
|
||||||
|
|
||||||
### eacl
|
### eacl
|
||||||
Contains Extended ACL types for fine-grained access control.
|
Contains Extended ACL types for fine-grained access control.
|
||||||
There is also a reference implementation of checking algorithm which is used in NeoFS node.
|
There is also a reference implementation of checking algorithm which is used in FrostFS node.
|
||||||
|
|
||||||
### checksum
|
### checksum
|
||||||
Contains `Checksum` type encapsulating checksum as well as it's kind.
|
Contains `Checksum` type encapsulating checksum as well as it's kind.
|
||||||
Currently Sha256 and [Tillich-Zemor hashsum](https://github.com/nspcc-dev/tzhash) are in use.
|
Currently Sha256 and [Tillich-Zemor hashsum](https://git.frostfs.info/TrueCloudLab/tzhash) are in use.
|
||||||
|
|
||||||
### owner
|
### owner
|
||||||
`owner.ID` type represents single account interacting with NeoFS. In v2 version of protocol
|
`owner.ID` type represents single account interacting with FrostFS. In v2 version of protocol
|
||||||
it is just raw bytes behing [base58-encoded address](https://docs.neo.org/docs/en-us/basic/concept/wallets.html#address)
|
it is just raw bytes behing [base58-encoded address](https://docs.neo.org/docs/en-us/basic/concept/wallets.html#address)
|
||||||
in Neo blockchain. Note that for historical reasons it contains
|
in Neo blockchain. Note that for historical reasons it contains
|
||||||
version prefix and checksum in addition to script-hash.
|
version prefix and checksum in addition to script-hash.
|
||||||
|
|
||||||
### token
|
### token
|
||||||
Contains Bearer token type with several NeoFS-specific methods.
|
Contains Bearer token type with several FrostFS-specific methods.
|
||||||
|
|
||||||
### ns
|
### ns
|
||||||
In NeoFS there are 2 types of name resolution: DNS and NNS. NNS stands for Neo Name Service
|
In FrostFS there are 2 types of name resolution: DNS and NNS. NNS stands for Neo Name Service
|
||||||
is just a [contract](https://github.com/nspcc-dev/neofs-contract/) deployed on a Neo blockchain.
|
is just a [contract](https://git.frostfs.info/TrueCloudLab/frostfs-contract) deployed on a Neo blockchain.
|
||||||
Basically, NNS is just a DNS-on-chain which can be used for resolving container nice-names as well
|
Basically, NNS is just a DNS-on-chain which can be used for resolving container nice-names as well
|
||||||
as any other name in dApps. See our [CoreDNS plugin](https://github.com/nspcc-dev/coredns/tree/master/plugin/nns)
|
as any other name in dApps. See our [CoreDNS plugin](https://github.com/nspcc-dev/coredns/tree/master/plugin/nns)
|
||||||
for the example of how NNS can be integrated in DNS.
|
for the example of how NNS can be integrated in DNS.
|
||||||
|
|
||||||
### session
|
### session
|
||||||
To help lightweight clients interact with NeoFS without sacrificing trust, NeoFS has a concept
|
To help lightweight clients interact with FrostFS without sacrificing trust, FrostFS has a concept
|
||||||
of session token. It is signed by client and allows any node with which a session is established
|
of session token. It is signed by client and allows any node with which a session is established
|
||||||
to perform certain actions on behalf of the user.
|
to perform certain actions on behalf of the user.
|
||||||
|
|
||||||
### client
|
### client
|
||||||
Contains client for working with NeoFS.
|
Contains client for working with FrostFS.
|
||||||
```go
|
```go
|
||||||
var prmInit client.PrmInit
|
var prmInit client.PrmInit
|
||||||
prmInit.SetDefaultPrivateKey(key) // private key for request signing
|
prmInit.SetDefaultPrivateKey(key) // private key for request signing
|
||||||
prmInit.ResolveNeoFSFailures() // enable erroneous status parsing
|
prmInit.ResolveFrostFSFailures() // enable erroneous status parsing
|
||||||
|
|
||||||
var c client.Client
|
var c client.Client
|
||||||
c.Init(prmInit)
|
c.Init(prmInit)
|
||||||
|
@ -54,7 +54,7 @@ err := c.Dial(prmDial)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 5 * time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 5 * time.Second)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
|
@ -70,15 +70,15 @@ fmt.Printf("Balance for %s: %v\n", acc, res.Amount())
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Response status
|
#### Response status
|
||||||
In NeoFS every operation can fail on multiple levels, so a single `error` doesn't suffice,
|
In FrostFS every operation can fail on multiple levels, so a single `error` doesn't suffice,
|
||||||
e.g. consider a case when object was put on 4 out of 5 replicas. Thus, all request execution
|
e.g. consider a case when object was put on 4 out of 5 replicas. Thus, all request execution
|
||||||
details are contained in `Status` returned from every RPC call. dApp can inspect them
|
details are contained in `Status` returned from every RPC call. dApp can inspect them
|
||||||
if needed and perform any desired action. In the case above we may want to report
|
if needed and perform any desired action. In the case above we may want to report
|
||||||
these details to the user as well as retry an operation, possibly with different parameters.
|
these details to the user as well as retry an operation, possibly with different parameters.
|
||||||
Status wire-format is extendable and each node can report any set of details it wants.
|
Status wire-format is extendable and each node can report any set of details it wants.
|
||||||
The set of reserved status codes can be found in
|
The set of reserved status codes can be found in
|
||||||
[NeoFS API](https://github.com/nspcc-dev/neofs-api/blob/master/status/types.proto). There is also
|
[FrostFS API](https://git.frostfs.info/TrueCloudLab/frostfs-api/src/branch/master/status/types.proto). There is also
|
||||||
a `client.PrmInit.ResolveNeoFSFailures()` to seamlessly convert erroneous statuses into Go error type.
|
a `client.PrmInit.ResolveFrostFSFailures()` to seamlessly convert erroneous statuses into Go error type.
|
||||||
|
|
||||||
### policy
|
### policy
|
||||||
Contains helpers allowing conversion of placing policy from/to JSON representation
|
Contains helpers allowing conversion of placing policy from/to JSON representation
|
||||||
|
@ -98,19 +98,19 @@ Contains CRUSH-like implementation of container node selection algorithm. Releva
|
||||||
are described in this paper http://ceur-ws.org/Vol-2344/short10.pdf . Note that it can be
|
are described in this paper http://ceur-ws.org/Vol-2344/short10.pdf . Note that it can be
|
||||||
outdated in some details.
|
outdated in some details.
|
||||||
|
|
||||||
`netmap/json_tests` subfolder contains language-agnostic tests for selection algorithm.
|
`netmap/json_tests` subfolder contains language-agnostic tests for selection algorithm.
|
||||||
|
|
||||||
```go
|
```go
|
||||||
import (
|
import (
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/netmap"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/object"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
||||||
)
|
)
|
||||||
|
|
||||||
func placementNodes(addr *object.Address, p *netmap.PlacementPolicy, neofsNodes []netmap.NodeInfo) {
|
func placementNodes(addr *object.Address, p *netmap.PlacementPolicy, frostfsNodes []netmap.NodeInfo) {
|
||||||
// Convert list of nodes in NeoFS API format to the intermediate representation.
|
// Convert list of nodes in FrostFS API format to the intermediate representation.
|
||||||
nodes := netmap.NodesFromInfo(nodes)
|
nodes := netmap.NodesFromInfo(nodes)
|
||||||
|
|
||||||
// Create new netmap (errors are skipped for the sake of clarity).
|
// Create new netmap (errors are skipped for the sake of clarity).
|
||||||
nm, _ := NewNetmap(nodes)
|
nm, _ := NewNetmap(nodes)
|
||||||
|
|
||||||
// Calculate nodes of container.
|
// Calculate nodes of container.
|
||||||
|
@ -122,13 +122,13 @@ func placementNodes(addr *object.Address, p *netmap.PlacementPolicy, neofsNodes
|
||||||
```
|
```
|
||||||
|
|
||||||
### pool
|
### pool
|
||||||
Simple pool for managing connections to NeoFS nodes.
|
Simple pool for managing connections to FrostFS nodes.
|
||||||
|
|
||||||
### acl, checksum, version, signature
|
### acl, checksum, version, signature
|
||||||
Contain simple API wrappers.
|
Contain simple API wrappers.
|
||||||
|
|
||||||
### logger
|
### logger
|
||||||
Wrapper over `zap.Logger` which is used across NeoFS codebase.
|
Wrapper over `zap.Logger` which is used across FrostFS codebase.
|
||||||
|
|
||||||
### util
|
### util
|
||||||
Utilities for working with signature-related code.
|
Utilities for working with signature-related code.
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
package accounting
|
package accounting
|
||||||
|
|
||||||
import "github.com/nspcc-dev/neofs-api-go/v2/accounting"
|
import "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/accounting"
|
||||||
|
|
||||||
// Decimal represents decimal number for accounting operations.
|
// Decimal represents decimal number for accounting operations.
|
||||||
//
|
//
|
||||||
// Decimal is mutually compatible with github.com/nspcc-dev/neofs-api-go/v2/accounting.Decimal
|
// Decimal is mutually compatible with git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/accounting.Decimal
|
||||||
// message. See ReadFromV2 / WriteToV2 methods.
|
// message. See ReadFromV2 / WriteToV2 methods.
|
||||||
//
|
//
|
||||||
// Instances can be created using built-in var declaration.
|
// Instances can be created using built-in var declaration.
|
||||||
|
@ -15,7 +15,7 @@ import "github.com/nspcc-dev/neofs-api-go/v2/accounting"
|
||||||
type Decimal accounting.Decimal
|
type Decimal accounting.Decimal
|
||||||
|
|
||||||
// ReadFromV2 reads Decimal from the accounting.Decimal message. Checks if the
|
// ReadFromV2 reads Decimal from the accounting.Decimal message. Checks if the
|
||||||
// message conforms to NeoFS API V2 protocol.
|
// message conforms to FrostFS API V2 protocol.
|
||||||
//
|
//
|
||||||
// See also WriteToV2.
|
// See also WriteToV2.
|
||||||
func (d *Decimal) ReadFromV2(m accounting.Decimal) error {
|
func (d *Decimal) ReadFromV2(m accounting.Decimal) error {
|
||||||
|
|
|
@ -3,8 +3,8 @@ package accounting_test
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
v2accounting "github.com/nspcc-dev/neofs-api-go/v2/accounting"
|
v2accounting "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/accounting"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/accounting"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/accounting"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Package accounting provides primitives to perform accounting operations in NeoFS.
|
Package accounting provides primitives to perform accounting operations in FrostFS.
|
||||||
|
|
||||||
Decimal type provides functionality to process user balances. For example, when
|
Decimal type provides functionality to process user balances. For example, when
|
||||||
working with Fixed8 balance precision:
|
working with Fixed8 balance precision:
|
||||||
|
@ -8,12 +8,12 @@ working with Fixed8 balance precision:
|
||||||
dec.SetValue(val)
|
dec.SetValue(val)
|
||||||
dec.SetPrecision(8)
|
dec.SetPrecision(8)
|
||||||
|
|
||||||
Instances can be also used to process NeoFS API V2 protocol messages
|
Instances can be also used to process FrostFS API V2 protocol messages
|
||||||
(see neo.fs.v2.accounting package in https://github.com/nspcc-dev/neofs-api).
|
(see neo.fs.v2.accounting package in https://git.frostfs.info/TrueCloudLab/frostfs-api).
|
||||||
|
|
||||||
On client side:
|
On client side:
|
||||||
|
|
||||||
import "github.com/nspcc-dev/neofs-api-go/v2/accounting"
|
import "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/accounting"
|
||||||
|
|
||||||
var msg accounting.Decimal
|
var msg accounting.Decimal
|
||||||
dec.WriteToV2(&msg)
|
dec.WriteToV2(&msg)
|
||||||
|
|
|
@ -3,7 +3,7 @@ package accountingtest
|
||||||
import (
|
import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/accounting"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/accounting"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Decimal returns random accounting.Decimal.
|
// Decimal returns random accounting.Decimal.
|
||||||
|
|
|
@ -5,7 +5,7 @@ Note that importing the package into source files is highly discouraged.
|
||||||
|
|
||||||
Random instance generation functions can be useful when testing expects any value, e.g.:
|
Random instance generation functions can be useful when testing expects any value, e.g.:
|
||||||
|
|
||||||
import accountingtest "github.com/nspcc-dev/neofs-sdk-go/accounting/test"
|
import accountingtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/accounting/test"
|
||||||
|
|
||||||
dec := accountingtest.Decimal()
|
dec := accountingtest.Decimal()
|
||||||
// test the value
|
// test the value
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Package audit provides features to process data audit in NeoFS system.
|
Package audit provides features to process data audit in FrostFS system.
|
||||||
|
|
||||||
Result type groups values which can be gathered during data audit process:
|
Result type groups values which can be gathered during data audit process:
|
||||||
|
|
||||||
|
|
|
@ -4,16 +4,16 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/audit"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/audit"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/version"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Result represents report on the results of the data audit in NeoFS system.
|
// Result represents report on the results of the data audit in FrostFS system.
|
||||||
//
|
//
|
||||||
// Result is mutually binary-compatible with github.com/nspcc-dev/neofs-api-go/v2/audit.DataAuditResult
|
// Result is mutually binary-compatible with git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/audit.DataAuditResult
|
||||||
// message. See Marshal / Unmarshal methods.
|
// message. See Marshal / Unmarshal methods.
|
||||||
//
|
//
|
||||||
// Instances can be created using built-in var declaration.
|
// Instances can be created using built-in var declaration.
|
||||||
|
@ -23,7 +23,7 @@ type Result struct {
|
||||||
v2 audit.DataAuditResult
|
v2 audit.DataAuditResult
|
||||||
}
|
}
|
||||||
|
|
||||||
// Marshal encodes Result into a canonical NeoFS binary format (Protocol Buffers
|
// Marshal encodes Result into a canonical FrostFS binary format (Protocol Buffers
|
||||||
// with direct field order).
|
// with direct field order).
|
||||||
//
|
//
|
||||||
// Writes version.Current() protocol version into the resulting message if Result
|
// Writes version.Current() protocol version into the resulting message if Result
|
||||||
|
@ -43,7 +43,7 @@ func (r *Result) Marshal() []byte {
|
||||||
|
|
||||||
var errCIDNotSet = errors.New("container ID is not set")
|
var errCIDNotSet = errors.New("container ID is not set")
|
||||||
|
|
||||||
// Unmarshal decodes Result from its canonical NeoFS binary format (Protocol Buffers
|
// Unmarshal decodes Result from its canonical FrostFS binary format (Protocol Buffers
|
||||||
// with direct field order). Returns an error describing a format violation.
|
// with direct field order). Returns an error describing a format violation.
|
||||||
//
|
//
|
||||||
// See also Marshal.
|
// See also Marshal.
|
||||||
|
@ -91,7 +91,7 @@ func (r *Result) Unmarshal(data []byte) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Epoch returns NeoFS epoch when the data associated with the Result was audited.
|
// Epoch returns FrostFS epoch when the data associated with the Result was audited.
|
||||||
//
|
//
|
||||||
// Zero Result has zero epoch.
|
// Zero Result has zero epoch.
|
||||||
//
|
//
|
||||||
|
@ -100,7 +100,7 @@ func (r Result) Epoch() uint64 {
|
||||||
return r.v2.GetAuditEpoch()
|
return r.v2.GetAuditEpoch()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ForEpoch specifies NeoFS epoch when the data associated with the Result was audited.
|
// ForEpoch specifies FrostFS epoch when the data associated with the Result was audited.
|
||||||
//
|
//
|
||||||
// See also Epoch.
|
// See also Epoch.
|
||||||
func (r *Result) ForEpoch(epoch uint64) {
|
func (r *Result) ForEpoch(epoch uint64) {
|
||||||
|
@ -136,8 +136,8 @@ func (r *Result) ForContainer(cnr cid.ID) {
|
||||||
r.v2.SetContainerID(&cidV2)
|
r.v2.SetContainerID(&cidV2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AuditorKey returns public key of the auditing NeoFS Inner Ring node in
|
// AuditorKey returns public key of the auditing FrostFS Inner Ring node in
|
||||||
// a NeoFS binary key format.
|
// a FrostFS binary key format.
|
||||||
//
|
//
|
||||||
// Zero Result has nil key. Return value MUST NOT be mutated: to do this,
|
// Zero Result has nil key. Return value MUST NOT be mutated: to do this,
|
||||||
// first make a copy.
|
// first make a copy.
|
||||||
|
@ -147,8 +147,8 @@ func (r Result) AuditorKey() []byte {
|
||||||
return r.v2.GetPublicKey()
|
return r.v2.GetPublicKey()
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetAuditorKey specifies public key of the auditing NeoFS Inner Ring node in
|
// SetAuditorKey specifies public key of the auditing FrostFS Inner Ring node in
|
||||||
// a NeoFS binary key format.
|
// a FrostFS binary key format.
|
||||||
//
|
//
|
||||||
// Argument MUST NOT be mutated at least until the end of using the Result.
|
// Argument MUST NOT be mutated at least until the end of using the Result.
|
||||||
//
|
//
|
||||||
|
|
|
@ -4,11 +4,11 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/audit"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/audit"
|
||||||
audittest "github.com/nspcc-dev/neofs-sdk-go/audit/test"
|
audittest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/audit/test"
|
||||||
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||||
oidtest "github.com/nspcc-dev/neofs-sdk-go/object/id/test"
|
oidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id/test"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ Note that importing the package into source files is highly discouraged.
|
||||||
|
|
||||||
Random instance generation functions can be useful when testing expects any value, e.g.:
|
Random instance generation functions can be useful when testing expects any value, e.g.:
|
||||||
|
|
||||||
import audittest "github.com/nspcc-dev/neofs-sdk-go/audit/test"
|
import audittest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/audit/test"
|
||||||
|
|
||||||
dec := audittest.Result()
|
dec := audittest.Result()
|
||||||
// test the value
|
// test the value
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package audittest
|
package audittest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/audit"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/audit"
|
||||||
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
oidtest "github.com/nspcc-dev/neofs-sdk-go/object/id/test"
|
oidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Result returns random audit.Result.
|
// Result returns random audit.Result.
|
||||||
|
|
|
@ -5,18 +5,18 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/acl"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto"
|
frostfscrypto "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto"
|
||||||
neofsecdsa "github.com/nspcc-dev/neofs-sdk-go/crypto/ecdsa"
|
frostfsecdsa "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto/ecdsa"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/eacl"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/user"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Token represents bearer token for object service operations.
|
// Token represents bearer token for object service operations.
|
||||||
//
|
//
|
||||||
// Token is mutually compatible with github.com/nspcc-dev/neofs-api-go/v2/acl.BearerToken
|
// Token is mutually compatible with git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl.BearerToken
|
||||||
// message. See ReadFromV2 / WriteToV2 methods.
|
// message. See ReadFromV2 / WriteToV2 methods.
|
||||||
//
|
//
|
||||||
// Instances can be created using built-in var declaration.
|
// Instances can be created using built-in var declaration.
|
||||||
|
@ -136,9 +136,10 @@ func (b Token) WriteToV2(m *acl.BearerToken) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetExp sets "exp" (expiration time) claim which identifies the
|
// SetExp sets "exp" (expiration time) claim which identifies the
|
||||||
// expiration time (in NeoFS epochs) on or after which the Token MUST NOT be
|
// expiration time (in FrostFS epochs) after which the Token MUST NOT be
|
||||||
// accepted for processing. The processing of the "exp" claim requires that the
|
// accepted for processing. The processing of the "exp" claim requires
|
||||||
// current epoch MUST be before the expiration epoch listed in the "exp" claim.
|
// that the current epoch MUST be before or equal to the expiration epoch
|
||||||
|
// listed in the "exp" claim.
|
||||||
//
|
//
|
||||||
// Naming is inspired by https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.4.
|
// Naming is inspired by https://datatracker.ietf.org/doc/html/rfc7519#section-4.1.4.
|
||||||
//
|
//
|
||||||
|
@ -149,7 +150,7 @@ func (b *Token) SetExp(exp uint64) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetNbf sets "nbf" (not before) claim which identifies the time (in
|
// SetNbf sets "nbf" (not before) claim which identifies the time (in
|
||||||
// NeoFS epochs) before which the Token MUST NOT be accepted for processing. The
|
// FrostFS epochs) before which the Token MUST NOT be accepted for processing. The
|
||||||
// processing of the "nbf" claim requires that the current epoch MUST be
|
// processing of the "nbf" claim requires that the current epoch MUST be
|
||||||
// after or equal to the not-before epoch listed in the "nbf" claim.
|
// after or equal to the not-before epoch listed in the "nbf" claim.
|
||||||
//
|
//
|
||||||
|
@ -161,7 +162,7 @@ func (b *Token) SetNbf(nbf uint64) {
|
||||||
b.lifetimeSet = true
|
b.lifetimeSet = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetIat sets "iat" (issued at) claim which identifies the time (in NeoFS
|
// SetIat sets "iat" (issued at) claim which identifies the time (in FrostFS
|
||||||
// epochs) at which the Token was issued. This claim can be used to determine
|
// epochs) at which the Token was issued. This claim can be used to determine
|
||||||
// the age of the Token.
|
// the age of the Token.
|
||||||
//
|
//
|
||||||
|
@ -179,7 +180,7 @@ func (b *Token) SetIat(iat uint64) {
|
||||||
//
|
//
|
||||||
// See also SetExp, SetNbf, SetIat.
|
// See also SetExp, SetNbf, SetIat.
|
||||||
func (b Token) InvalidAt(epoch uint64) bool {
|
func (b Token) InvalidAt(epoch uint64) bool {
|
||||||
return !b.lifetimeSet || b.nbf > epoch || b.iat > epoch || b.exp <= epoch
|
return !b.lifetimeSet || b.nbf > epoch || b.iat > epoch || b.exp < epoch
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetEACLTable sets eacl.Table that replaces the one from the issuer's
|
// SetEACLTable sets eacl.Table that replaces the one from the issuer's
|
||||||
|
@ -188,7 +189,7 @@ func (b Token) InvalidAt(epoch uint64) bool {
|
||||||
// within any issuer's container.
|
// within any issuer's container.
|
||||||
//
|
//
|
||||||
// SetEACLTable MUST be called if Token is going to be transmitted over
|
// SetEACLTable MUST be called if Token is going to be transmitted over
|
||||||
// NeoFS API V2 protocol.
|
// FrostFS API V2 protocol.
|
||||||
//
|
//
|
||||||
// See also EACLTable, AssertContainer.
|
// See also EACLTable, AssertContainer.
|
||||||
func (b *Token) SetEACLTable(table eacl.Table) {
|
func (b *Token) SetEACLTable(table eacl.Table) {
|
||||||
|
@ -248,16 +249,16 @@ func (b Token) AssertUser(id user.ID) bool {
|
||||||
// Returns signature calculation errors.
|
// Returns signature calculation errors.
|
||||||
//
|
//
|
||||||
// Sign MUST be called if Token is going to be transmitted over
|
// Sign MUST be called if Token is going to be transmitted over
|
||||||
// NeoFS API V2 protocol.
|
// FrostFS API V2 protocol.
|
||||||
//
|
//
|
||||||
// Note that any Token mutation is likely to break the signature, so it is
|
// Note that any Token mutation is likely to break the signature, so it is
|
||||||
// expected to be calculated as a final stage of Token formation.
|
// expected to be calculated as a final stage of Token formation.
|
||||||
//
|
//
|
||||||
// See also VerifySignature, Issuer.
|
// See also VerifySignature, Issuer.
|
||||||
func (b *Token) Sign(key ecdsa.PrivateKey) error {
|
func (b *Token) Sign(key ecdsa.PrivateKey) error {
|
||||||
var sig neofscrypto.Signature
|
var sig frostfscrypto.Signature
|
||||||
|
|
||||||
err := sig.Calculate(neofsecdsa.Signer(key), b.signedData())
|
err := sig.Calculate(frostfsecdsa.Signer(key), b.signedData())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -278,13 +279,13 @@ func (b Token) VerifySignature() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
var sig neofscrypto.Signature
|
var sig frostfscrypto.Signature
|
||||||
|
|
||||||
// TODO: (#233) check owner<->key relation
|
// TODO: (#233) check owner<->key relation
|
||||||
return sig.ReadFromV2(b.sig) == nil && sig.Verify(b.signedData())
|
return sig.ReadFromV2(b.sig) == nil && sig.Verify(b.signedData())
|
||||||
}
|
}
|
||||||
|
|
||||||
// Marshal encodes Token into a binary format of the NeoFS API protocol
|
// Marshal encodes Token into a binary format of the FrostFS API protocol
|
||||||
// (Protocol Buffers V3 with direct field order).
|
// (Protocol Buffers V3 with direct field order).
|
||||||
//
|
//
|
||||||
// See also Unmarshal.
|
// See also Unmarshal.
|
||||||
|
@ -295,7 +296,7 @@ func (b Token) Marshal() []byte {
|
||||||
return m.StableMarshal(nil)
|
return m.StableMarshal(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unmarshal decodes NeoFS API protocol binary data into the Token
|
// Unmarshal decodes FrostFS API protocol binary data into the Token
|
||||||
// (Protocol Buffers V3 with direct field order). Returns an error describing
|
// (Protocol Buffers V3 with direct field order). Returns an error describing
|
||||||
// a format violation.
|
// a format violation.
|
||||||
//
|
//
|
||||||
|
@ -311,7 +312,7 @@ func (b *Token) Unmarshal(data []byte) error {
|
||||||
return b.readFromV2(m, false)
|
return b.readFromV2(m, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON encodes Token into a JSON format of the NeoFS API protocol
|
// MarshalJSON encodes Token into a JSON format of the FrostFS API protocol
|
||||||
// (Protocol Buffers V3 JSON).
|
// (Protocol Buffers V3 JSON).
|
||||||
//
|
//
|
||||||
// See also UnmarshalJSON.
|
// See also UnmarshalJSON.
|
||||||
|
@ -322,7 +323,7 @@ func (b Token) MarshalJSON() ([]byte, error) {
|
||||||
return m.MarshalJSON()
|
return m.MarshalJSON()
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalJSON decodes NeoFS API protocol JSON data into the Token
|
// UnmarshalJSON decodes FrostFS API protocol JSON data into the Token
|
||||||
// (Protocol Buffers V3 JSON). Returns an error describing a format violation.
|
// (Protocol Buffers V3 JSON). Returns an error describing a format violation.
|
||||||
//
|
//
|
||||||
// See also MarshalJSON.
|
// See also MarshalJSON.
|
||||||
|
@ -338,7 +339,7 @@ func (b *Token) UnmarshalJSON(data []byte) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SigningKeyBytes returns issuer's public key in a binary format of
|
// SigningKeyBytes returns issuer's public key in a binary format of
|
||||||
// NeoFS API protocol.
|
// FrostFS API protocol.
|
||||||
//
|
//
|
||||||
// Unsigned Token has empty key.
|
// Unsigned Token has empty key.
|
||||||
//
|
//
|
||||||
|
@ -359,7 +360,7 @@ func ResolveIssuer(b Token) (usr user.ID) {
|
||||||
binKey := b.SigningKeyBytes()
|
binKey := b.SigningKeyBytes()
|
||||||
|
|
||||||
if len(binKey) != 0 {
|
if len(binKey) != 0 {
|
||||||
var key neofsecdsa.PublicKey
|
var key frostfsecdsa.PublicKey
|
||||||
if key.Decode(binKey) == nil {
|
if key.Decode(binKey) == nil {
|
||||||
user.IDFromKey(&usr, ecdsa.PublicKey(key))
|
user.IDFromKey(&usr, ecdsa.PublicKey(key))
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,18 +5,18 @@ import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer"
|
||||||
|
bearertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer/test"
|
||||||
|
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
|
frostfscrypto "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto"
|
||||||
|
frostfsecdsa "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto/ecdsa"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
||||||
|
eacltest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl/test"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user"
|
||||||
|
usertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user/test"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/acl"
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/bearer"
|
|
||||||
bearertest "github.com/nspcc-dev/neofs-sdk-go/bearer/test"
|
|
||||||
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
|
||||||
neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto"
|
|
||||||
neofsecdsa "github.com/nspcc-dev/neofs-sdk-go/crypto/ecdsa"
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/eacl"
|
|
||||||
eacltest "github.com/nspcc-dev/neofs-sdk-go/eacl/test"
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/user"
|
|
||||||
usertest "github.com/nspcc-dev/neofs-sdk-go/user/test"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -220,7 +220,7 @@ func TestToken_InvalidAt(t *testing.T) {
|
||||||
require.True(t, val.InvalidAt(1))
|
require.True(t, val.InvalidAt(1))
|
||||||
require.False(t, val.InvalidAt(2))
|
require.False(t, val.InvalidAt(2))
|
||||||
require.False(t, val.InvalidAt(3))
|
require.False(t, val.InvalidAt(3))
|
||||||
require.True(t, val.InvalidAt(4))
|
require.False(t, val.InvalidAt(4))
|
||||||
require.True(t, val.InvalidAt(5))
|
require.True(t, val.InvalidAt(5))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,9 +349,9 @@ func TestToken_ReadFromV2(t *testing.T) {
|
||||||
k, err := keys.NewPrivateKey()
|
k, err := keys.NewPrivateKey()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
signer := neofsecdsa.Signer(k.PrivateKey)
|
signer := frostfsecdsa.Signer(k.PrivateKey)
|
||||||
|
|
||||||
var s neofscrypto.Signature
|
var s frostfscrypto.Signature
|
||||||
|
|
||||||
require.NoError(t, s.Calculate(signer, body.StableMarshal(nil)))
|
require.NoError(t, s.Calculate(signer, body.StableMarshal(nil)))
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ Bearer token must be signed by owner of the container.
|
||||||
Provide signed token in JSON or binary format to the request sender. Request
|
Provide signed token in JSON or binary format to the request sender. Request
|
||||||
sender can attach this bearer token to the object service requests:
|
sender can attach this bearer token to the object service requests:
|
||||||
|
|
||||||
import sdkClient "github.com/nspcc-dev/neofs-sdk-go/client"
|
import sdkClient "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client"
|
||||||
|
|
||||||
var headParams sdkClient.PrmObjectHead
|
var headParams sdkClient.PrmObjectHead
|
||||||
headParams.WithBearerToken(bearerToken)
|
headParams.WithBearerToken(bearerToken)
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package bearertest
|
package bearertest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/bearer"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer"
|
||||||
eacltest "github.com/nspcc-dev/neofs-sdk-go/eacl/test"
|
eacltest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl/test"
|
||||||
usertest "github.com/nspcc-dev/neofs-sdk-go/user/test"
|
usertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Token returns random bearer.Token.
|
// Token returns random bearer.Token.
|
||||||
|
|
|
@ -6,13 +6,13 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
"github.com/nspcc-dev/tzhash/tz"
|
"git.frostfs.info/TrueCloudLab/tzhash/tz"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Checksum represents checksum of some digital data.
|
// Checksum represents checksum of some digital data.
|
||||||
//
|
//
|
||||||
// Checksum is mutually compatible with github.com/nspcc-dev/neofs-api-go/v2/refs.Checksum
|
// Checksum is mutually compatible with git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs.Checksum
|
||||||
// message. See ReadFromV2 / WriteToV2 methods.
|
// message. See ReadFromV2 / WriteToV2 methods.
|
||||||
//
|
//
|
||||||
// Instances can be created using built-in var declaration.
|
// Instances can be created using built-in var declaration.
|
||||||
|
@ -38,7 +38,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// ReadFromV2 reads Checksum from the refs.Checksum message. Checks if the
|
// ReadFromV2 reads Checksum from the refs.Checksum message. Checks if the
|
||||||
// message conforms to NeoFS API V2 protocol.
|
// message conforms to FrostFS API V2 protocol.
|
||||||
//
|
//
|
||||||
// See also WriteToV2.
|
// See also WriteToV2.
|
||||||
func (c *Checksum) ReadFromV2(m refs.Checksum) error {
|
func (c *Checksum) ReadFromV2(m refs.Checksum) error {
|
||||||
|
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
"github.com/nspcc-dev/tzhash/tz"
|
"git.frostfs.info/TrueCloudLab/tzhash/tz"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ExampleCalculate() {
|
func ExampleCalculate() {
|
||||||
|
|
|
@ -5,7 +5,7 @@ Note that importing the package into source files is highly discouraged.
|
||||||
|
|
||||||
Random instance generation functions can be useful when testing expects any value, e.g.:
|
Random instance generation functions can be useful when testing expects any value, e.g.:
|
||||||
|
|
||||||
import checksumtest "github.com/nspcc-dev/neofs-sdk-go/checksum/test"
|
import checksumtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/checksum/test"
|
||||||
|
|
||||||
cs := checksumtest.Checksum()
|
cs := checksumtest.Checksum()
|
||||||
// test the value
|
// test the value
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/checksum"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/checksum"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Checksum returns random checksum.Checksum.
|
// Checksum returns random checksum.Checksum.
|
||||||
|
|
|
@ -3,12 +3,12 @@ package client
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
v2accounting "github.com/nspcc-dev/neofs-api-go/v2/accounting"
|
v2accounting "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/accounting"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/accounting"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/accounting"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/user"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PrmBalanceGet groups parameters of BalanceGet operation.
|
// PrmBalanceGet groups parameters of BalanceGet operation.
|
||||||
|
@ -19,7 +19,7 @@ type PrmBalanceGet struct {
|
||||||
account user.ID
|
account user.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetAccount sets identifier of the NeoFS account for which the balance is requested.
|
// SetAccount sets identifier of the FrostFS account for which the balance is requested.
|
||||||
// Required parameter.
|
// Required parameter.
|
||||||
func (x *PrmBalanceGet) SetAccount(id user.ID) {
|
func (x *PrmBalanceGet) SetAccount(id user.ID) {
|
||||||
x.account = id
|
x.account = id
|
||||||
|
@ -33,20 +33,20 @@ type ResBalanceGet struct {
|
||||||
amount accounting.Decimal
|
amount accounting.Decimal
|
||||||
}
|
}
|
||||||
|
|
||||||
// Amount returns current amount of funds on the NeoFS account as decimal number.
|
// Amount returns current amount of funds on the FrostFS account as decimal number.
|
||||||
func (x ResBalanceGet) Amount() accounting.Decimal {
|
func (x ResBalanceGet) Amount() accounting.Decimal {
|
||||||
return x.amount
|
return x.amount
|
||||||
}
|
}
|
||||||
|
|
||||||
// BalanceGet requests current balance of the NeoFS account.
|
// BalanceGet requests current balance of the FrostFS account.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`,
|
// Any client's internal or transport errors are returned as `error`,
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmBalanceGet docs).
|
// Returns an error if parameters are set incorrectly (see PrmBalanceGet docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -54,9 +54,9 @@ func (x ResBalanceGet) Amount() accounting.Decimal {
|
||||||
func (c *Client) BalanceGet(ctx context.Context, prm PrmBalanceGet) (*ResBalanceGet, error) {
|
func (c *Client) BalanceGet(ctx context.Context, prm PrmBalanceGet) (*ResBalanceGet, error) {
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case !prm.accountSet:
|
case !prm.accountSet:
|
||||||
panic("account not set")
|
return nil, errorAccountNotSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// form request body
|
// form request body
|
||||||
|
|
|
@ -4,18 +4,18 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
v2netmap "github.com/nspcc-dev/neofs-api-go/v2/netmap"
|
v2netmap "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap"
|
||||||
rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
)
|
)
|
||||||
|
|
||||||
// interface of NeoFS API server. Exists for test purposes only.
|
// interface of FrostFS API server. Exists for test purposes only.
|
||||||
type neoFSAPIServer interface {
|
type frostFSAPIServer interface {
|
||||||
netMapSnapshot(context.Context, v2netmap.SnapshotRequest) (*v2netmap.SnapshotResponse, error)
|
netMapSnapshot(context.Context, v2netmap.SnapshotRequest) (*v2netmap.SnapshotResponse, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// wrapper over real client connection which communicates over NeoFS API protocol.
|
// wrapper over real client connection which communicates over FrostFS API protocol.
|
||||||
// Provides neoFSAPIServer for Client instances used in real applications.
|
// Provides frostFSAPIServer for Client instances used in real applications.
|
||||||
type coreServer client.Client
|
type coreServer client.Client
|
||||||
|
|
||||||
// unifies errors of all RPC.
|
// unifies errors of all RPC.
|
||||||
|
@ -23,7 +23,7 @@ func rpcErr(e error) error {
|
||||||
return fmt.Errorf("rpc failure: %w", e)
|
return fmt.Errorf("rpc failure: %w", e)
|
||||||
}
|
}
|
||||||
|
|
||||||
// executes NetmapService.NetmapSnapshot RPC declared in NeoFS API protocol
|
// executes NetmapService.NetmapSnapshot RPC declared in FrostFS API protocol
|
||||||
// using underlying client.Client.
|
// using underlying client.Client.
|
||||||
func (x *coreServer) netMapSnapshot(ctx context.Context, req v2netmap.SnapshotRequest) (*v2netmap.SnapshotResponse, error) {
|
func (x *coreServer) netMapSnapshot(ctx context.Context, req v2netmap.SnapshotRequest) (*v2netmap.SnapshotResponse, error) {
|
||||||
resp, err := rpcapi.NetMapSnapshot((*client.Client)(x), &req, client.WithContext(ctx))
|
resp, err := rpcapi.NetMapSnapshot((*client.Client)(x), &req, client.WithContext(ctx))
|
||||||
|
|
|
@ -7,19 +7,19 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
v2accounting "github.com/nspcc-dev/neofs-api-go/v2/accounting"
|
v2accounting "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/accounting"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Client represents virtual connection to the NeoFS network to communicate
|
// Client represents virtual connection to the FrostFS network to communicate
|
||||||
// with NeoFS server using NeoFS API protocol. It is designed to provide
|
// with FrostFS server using FrostFS API protocol. It is designed to provide
|
||||||
// an abstraction interface from the protocol details of data transfer over
|
// an abstraction interface from the protocol details of data transfer over
|
||||||
// a network in NeoFS.
|
// a network in FrostFS.
|
||||||
//
|
//
|
||||||
// Client can be created using simple Go variable declaration. Before starting
|
// Client can be created using simple Go variable declaration. Before starting
|
||||||
// work with the Client, it SHOULD BE correctly initialized (see Init method).
|
// work with the Client, it SHOULD BE correctly initialized (see Init method).
|
||||||
// Before executing the NeoFS operations using the Client, connection to the
|
// Before executing the FrostFS operations using the Client, connection to the
|
||||||
// server MUST BE correctly established (see Dial method and pay attention
|
// server MUST BE correctly established (see Dial method and pay attention
|
||||||
// to the mandatory parameters). Using the Client before connecting have
|
// to the mandatory parameters). Using the Client before connecting have
|
||||||
// been established can lead to a panic. After the work, the Client SHOULD BE
|
// been established can lead to a panic. After the work, the Client SHOULD BE
|
||||||
|
@ -28,7 +28,7 @@ import (
|
||||||
// during the communication process step strongly discouraged as it leads to
|
// during the communication process step strongly discouraged as it leads to
|
||||||
// undefined behavior.
|
// undefined behavior.
|
||||||
//
|
//
|
||||||
// Each method which produces a NeoFS API call may return a server response.
|
// Each method which produces a FrostFS API call may return a server response.
|
||||||
// Status responses are returned in the result structure, and can be cast
|
// Status responses are returned in the result structure, and can be cast
|
||||||
// to built-in error instance (or in the returned error if the client is
|
// to built-in error instance (or in the returned error if the client is
|
||||||
// configured accordingly). Certain statuses can be checked using `apistatus`
|
// configured accordingly). Certain statuses can be checked using `apistatus`
|
||||||
|
@ -48,7 +48,7 @@ type Client struct {
|
||||||
|
|
||||||
c client.Client
|
c client.Client
|
||||||
|
|
||||||
server neoFSAPIServer
|
server frostFSAPIServer
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init brings the Client instance to its initial state.
|
// Init brings the Client instance to its initial state.
|
||||||
|
@ -61,7 +61,7 @@ func (c *Client) Init(prm PrmInit) {
|
||||||
c.prm = prm
|
c.prm = prm
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dial establishes a connection to the server from the NeoFS network.
|
// Dial establishes a connection to the server from the FrostFS network.
|
||||||
// Returns an error describing failure reason. If failed, the Client
|
// Returns an error describing failure reason. If failed, the Client
|
||||||
// SHOULD NOT be used.
|
// SHOULD NOT be used.
|
||||||
//
|
//
|
||||||
|
@ -69,7 +69,7 @@ func (c *Client) Init(prm PrmInit) {
|
||||||
// argument, otherwise context.Background() is used. Dial returns context
|
// argument, otherwise context.Background() is used. Dial returns context
|
||||||
// errors, see context package docs for details.
|
// errors, see context package docs for details.
|
||||||
//
|
//
|
||||||
// Panics if required parameters are set incorrectly, look carefully
|
// Returns an error if required parameters are set incorrectly, look carefully
|
||||||
// at the method documentation.
|
// at the method documentation.
|
||||||
//
|
//
|
||||||
// One-time method call during application start-up stage (after Init ) is expected.
|
// One-time method call during application start-up stage (after Init ) is expected.
|
||||||
|
@ -78,12 +78,12 @@ func (c *Client) Init(prm PrmInit) {
|
||||||
// See also Init / Close.
|
// See also Init / Close.
|
||||||
func (c *Client) Dial(prm PrmDial) error {
|
func (c *Client) Dial(prm PrmDial) error {
|
||||||
if prm.endpoint == "" {
|
if prm.endpoint == "" {
|
||||||
panic("server address is unset or empty")
|
return errorServerAddrUnset
|
||||||
}
|
}
|
||||||
|
|
||||||
if prm.timeoutDialSet {
|
if prm.timeoutDialSet {
|
||||||
if prm.timeoutDial <= 0 {
|
if prm.timeoutDial <= 0 {
|
||||||
panic("non-positive timeout")
|
return errorNonPositiveTimeout
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
prm.timeoutDial = 5 * time.Second
|
prm.timeoutDial = 5 * time.Second
|
||||||
|
@ -91,7 +91,7 @@ func (c *Client) Dial(prm PrmDial) error {
|
||||||
|
|
||||||
if prm.streamTimeoutSet {
|
if prm.streamTimeoutSet {
|
||||||
if prm.streamTimeout <= 0 {
|
if prm.streamTimeout <= 0 {
|
||||||
panic("non-positive timeout")
|
return errorNonPositiveTimeout
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
prm.streamTimeout = 10 * time.Second
|
prm.streamTimeout = 10 * time.Second
|
||||||
|
@ -103,7 +103,7 @@ func (c *Client) Dial(prm PrmDial) error {
|
||||||
client.WithRWTimeout(prm.streamTimeout),
|
client.WithRWTimeout(prm.streamTimeout),
|
||||||
)...)
|
)...)
|
||||||
|
|
||||||
c.setNeoFSAPIServer((*coreServer)(&c.c))
|
c.setFrostFSAPIServer((*coreServer)(&c.c))
|
||||||
|
|
||||||
if prm.parentCtx == nil {
|
if prm.parentCtx == nil {
|
||||||
prm.parentCtx = context.Background()
|
prm.parentCtx = context.Background()
|
||||||
|
@ -121,15 +121,15 @@ func (c *Client) Dial(prm PrmDial) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// sets underlying provider of neoFSAPIServer. The method is used for testing as an approach
|
// sets underlying provider of frostFSAPIServer. The method is used for testing as an approach
|
||||||
// to skip Dial stage and override NeoFS API server. MUST NOT be used outside test code.
|
// to skip Dial stage and override FrostFS API server. MUST NOT be used outside test code.
|
||||||
// In real applications wrapper over github.com/nspcc-dev/neofs-api-go/v2/rpc/client
|
// In real applications wrapper over git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client
|
||||||
// is statically used.
|
// is statically used.
|
||||||
func (c *Client) setNeoFSAPIServer(server neoFSAPIServer) {
|
func (c *Client) setFrostFSAPIServer(server frostFSAPIServer) {
|
||||||
c.server = server
|
c.server = server
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close closes underlying connection to the NeoFS server. Implements io.Closer.
|
// Close closes underlying connection to the FrostFS server. Implements io.Closer.
|
||||||
// MUST NOT be called before successful Dial. Can be called concurrently
|
// MUST NOT be called before successful Dial. Can be called concurrently
|
||||||
// with server operations processing on running goroutines: in this case
|
// with server operations processing on running goroutines: in this case
|
||||||
// they are likely to fail due to a connection error.
|
// they are likely to fail due to a connection error.
|
||||||
|
@ -146,7 +146,7 @@ func (c *Client) Close() error {
|
||||||
//
|
//
|
||||||
// See also Init.
|
// See also Init.
|
||||||
type PrmInit struct {
|
type PrmInit struct {
|
||||||
resolveNeoFSErrors bool
|
resolveFrostFSErrors bool
|
||||||
|
|
||||||
key ecdsa.PrivateKey
|
key ecdsa.PrivateKey
|
||||||
|
|
||||||
|
@ -163,16 +163,16 @@ func (x *PrmInit) SetDefaultPrivateKey(key ecdsa.PrivateKey) {
|
||||||
x.key = key
|
x.key = key
|
||||||
}
|
}
|
||||||
|
|
||||||
// ResolveNeoFSFailures makes the Client to resolve failure statuses of the
|
// ResolveFrostFSFailures makes the Client to resolve failure statuses of the
|
||||||
// NeoFS protocol into Go built-in errors. These errors are returned from
|
// FrostFS protocol into Go built-in errors. These errors are returned from
|
||||||
// each protocol operation. By default, statuses aren't resolved and written
|
// each protocol operation. By default, statuses aren't resolved and written
|
||||||
// to the resulting structure (see corresponding Res* docs).
|
// to the resulting structure (see corresponding Res* docs).
|
||||||
func (x *PrmInit) ResolveNeoFSFailures() {
|
func (x *PrmInit) ResolveFrostFSFailures() {
|
||||||
x.resolveNeoFSErrors = true
|
x.resolveFrostFSErrors = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetResponseInfoCallback makes the Client to pass ResponseMetaInfo from each
|
// SetResponseInfoCallback makes the Client to pass ResponseMetaInfo from each
|
||||||
// NeoFS server response to f. Nil (default) means ignore response meta info.
|
// FrostFS server response to f. Nil (default) means ignore response meta info.
|
||||||
func (x *PrmInit) SetResponseInfoCallback(f func(ResponseMetaInfo) error) {
|
func (x *PrmInit) SetResponseInfoCallback(f func(ResponseMetaInfo) error) {
|
||||||
x.cbRespInfo = f
|
x.cbRespInfo = f
|
||||||
}
|
}
|
||||||
|
@ -194,7 +194,7 @@ type PrmDial struct {
|
||||||
parentCtx context.Context
|
parentCtx context.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetServerURI sets server URI in the NeoFS network.
|
// SetServerURI sets server URI in the FrostFS network.
|
||||||
// Required parameter.
|
// Required parameter.
|
||||||
//
|
//
|
||||||
// Format of the URI:
|
// Format of the URI:
|
||||||
|
@ -212,7 +212,7 @@ func (x *PrmDial) SetServerURI(endpoint string) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetTLSConfig sets tls.Config to open TLS client connection
|
// SetTLSConfig sets tls.Config to open TLS client connection
|
||||||
// to the NeoFS server. Nil (default) means insecure connection.
|
// to the FrostFS server. Nil (default) means insecure connection.
|
||||||
//
|
//
|
||||||
// See also SetServerURI.
|
// See also SetServerURI.
|
||||||
func (x *PrmDial) SetTLSConfig(tlsConfig *tls.Config) {
|
func (x *PrmDial) SetTLSConfig(tlsConfig *tls.Config) {
|
||||||
|
|
|
@ -7,7 +7,7 @@ import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -28,13 +28,13 @@ func assertStatusErr(tb testing.TB, res interface{ Status() apistatus.Status })
|
||||||
require.Equal(tb, statusErr.Message(), res.Status().(*apistatus.ServerInternal).Message())
|
require.Equal(tb, statusErr.Message(), res.Status().(*apistatus.ServerInternal).Message())
|
||||||
}
|
}
|
||||||
|
|
||||||
func newClient(server neoFSAPIServer) *Client {
|
func newClient(server frostFSAPIServer) *Client {
|
||||||
var prm PrmInit
|
var prm PrmInit
|
||||||
prm.SetDefaultPrivateKey(*key)
|
prm.SetDefaultPrivateKey(*key)
|
||||||
|
|
||||||
var c Client
|
var c Client
|
||||||
c.Init(prm)
|
c.Init(prm)
|
||||||
c.setNeoFSAPIServer(server)
|
c.setFrostFSAPIServer(server)
|
||||||
|
|
||||||
return &c
|
return &c
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,14 +2,15 @@ package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
v2session "github.com/nspcc-dev/neofs-api-go/v2/session"
|
v2session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/signature"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature"
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/version"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
// common interface of resulting structures with API status.
|
// common interface of resulting structures with API status.
|
||||||
|
@ -36,7 +37,7 @@ func (x statusRes) Status() apistatus.Status {
|
||||||
|
|
||||||
// groups meta parameters shared between all Client operations.
|
// groups meta parameters shared between all Client operations.
|
||||||
type prmCommonMeta struct {
|
type prmCommonMeta struct {
|
||||||
// NeoFS request X-Headers
|
// FrostFS request X-Headers
|
||||||
xHeaders []string
|
xHeaders []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,11 +71,21 @@ func writeXHeadersToMeta(xHeaders []string, h *v2session.RequestMetaHeader) {
|
||||||
h.SetXHeaders(hs)
|
h.SetXHeaders(hs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// panic messages.
|
// error messages.
|
||||||
const (
|
var (
|
||||||
panicMsgMissingContext = "missing context"
|
errorMissingContext = errors.New("missing context")
|
||||||
panicMsgMissingContainer = "missing container"
|
errorMissingContainer = errors.New("missing container")
|
||||||
panicMsgMissingObject = "missing object"
|
errorMissingObject = errors.New("missing object")
|
||||||
|
errorAccountNotSet = errors.New("account not set")
|
||||||
|
errorServerAddrUnset = errors.New("server address is unset or empty")
|
||||||
|
errorNonPositiveTimeout = errors.New("non-positive timeout")
|
||||||
|
errorEACLTableNotSet = errors.New("eACL table not set")
|
||||||
|
errorMissingAnnouncements = errors.New("missing announcements")
|
||||||
|
errorZeroRangeLength = errors.New("zero range length")
|
||||||
|
errorMissingRanges = errors.New("missing ranges")
|
||||||
|
errorZeroEpoch = errors.New("zero epoch")
|
||||||
|
errorMissingTrusts = errors.New("missing trusts")
|
||||||
|
errorTrustNotSet = errors.New("current trust value not set")
|
||||||
)
|
)
|
||||||
|
|
||||||
// groups all the details required to send a single request and process a response to it.
|
// groups all the details required to send a single request and process a response to it.
|
||||||
|
@ -100,7 +111,7 @@ type contextCall struct {
|
||||||
// if set, protocol errors will be expanded into a final error
|
// if set, protocol errors will be expanded into a final error
|
||||||
resolveAPIFailures bool
|
resolveAPIFailures bool
|
||||||
|
|
||||||
// NeoFS network magic
|
// FrostFS network magic
|
||||||
netMagic uint64
|
netMagic uint64
|
||||||
|
|
||||||
// Meta parameters
|
// Meta parameters
|
||||||
|
@ -256,7 +267,7 @@ func (c *Client) processResponse(resp responseV2) (apistatus.Status, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
st := apistatus.FromStatusV2(resp.GetMetaHeader().GetStatus())
|
st := apistatus.FromStatusV2(resp.GetMetaHeader().GetStatus())
|
||||||
if c.prm.resolveNeoFSErrors {
|
if c.prm.resolveFrostFSErrors {
|
||||||
return st, apistatus.ErrFromStatus(st)
|
return st, apistatus.ErrFromStatus(st)
|
||||||
}
|
}
|
||||||
return st, nil
|
return st, nil
|
||||||
|
@ -329,14 +340,14 @@ func (x *contextCall) processCall() bool {
|
||||||
// initializes static cross-call parameters inherited from client.
|
// initializes static cross-call parameters inherited from client.
|
||||||
func (c *Client) initCallContext(ctx *contextCall) {
|
func (c *Client) initCallContext(ctx *contextCall) {
|
||||||
ctx.key = c.prm.key
|
ctx.key = c.prm.key
|
||||||
ctx.resolveAPIFailures = c.prm.resolveNeoFSErrors
|
ctx.resolveAPIFailures = c.prm.resolveFrostFSErrors
|
||||||
ctx.callbackResp = c.prm.cbRespInfo
|
ctx.callbackResp = c.prm.cbRespInfo
|
||||||
ctx.netMagic = c.prm.netMagic
|
ctx.netMagic = c.prm.netMagic
|
||||||
}
|
}
|
||||||
|
|
||||||
// ExecRaw executes f with underlying github.com/nspcc-dev/neofs-api-go/v2/rpc/client.Client
|
// ExecRaw executes f with underlying git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client.Client
|
||||||
// instance. Communicate over the Protocol Buffers protocol in a more flexible way:
|
// instance. Communicate over the Protocol Buffers protocol in a more flexible way:
|
||||||
// most often used to transmit data over a fixed version of the NeoFS protocol, as well
|
// most often used to transmit data over a fixed version of the FrostFS protocol, as well
|
||||||
// as to support custom services.
|
// as to support custom services.
|
||||||
//
|
//
|
||||||
// The f must not manipulate the client connection passed into it.
|
// The f must not manipulate the client connection passed into it.
|
||||||
|
@ -345,7 +356,7 @@ func (c *Client) initCallContext(ctx *contextCall) {
|
||||||
// before closing the connection.
|
// before closing the connection.
|
||||||
//
|
//
|
||||||
// See also Dial and Close.
|
// See also Dial and Close.
|
||||||
// See also github.com/nspcc-dev/neofs-api-go/v2/rpc/client package docs.
|
// See also git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client package docs.
|
||||||
func (c *Client) ExecRaw(f func(client *client.Client) error) error {
|
func (c *Client) ExecRaw(f func(client *client.Client) error) error {
|
||||||
return f(&c.c)
|
return f(&c.c)
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,18 +5,18 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
v2container "github.com/nspcc-dev/neofs-api-go/v2/container"
|
v2container "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
v2session "github.com/nspcc-dev/neofs-api-go/v2/session"
|
v2session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/container"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto"
|
frostfscrypto "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto"
|
||||||
neofsecdsa "github.com/nspcc-dev/neofs-sdk-go/crypto/ecdsa"
|
frostfsecdsa "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto/ecdsa"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/eacl"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/session"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/user"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PrmContainerPut groups parameters of ContainerPut operation.
|
// PrmContainerPut groups parameters of ContainerPut operation.
|
||||||
|
@ -30,7 +30,7 @@ type PrmContainerPut struct {
|
||||||
session session.Container
|
session session.Container
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetContainer sets structured information about new NeoFS container.
|
// SetContainer sets structured information about new FrostFS container.
|
||||||
// Required parameter.
|
// Required parameter.
|
||||||
func (x *PrmContainerPut) SetContainer(cnr container.Container) {
|
func (x *PrmContainerPut) SetContainer(cnr container.Container) {
|
||||||
x.cnr = cnr
|
x.cnr = cnr
|
||||||
|
@ -64,12 +64,12 @@ func (x ResContainerPut) ID() cid.ID {
|
||||||
return x.id
|
return x.id
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerPut sends request to save container in NeoFS.
|
// ContainerPut sends request to save container in FrostFS.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Operation is asynchronous and no guaranteed even in the absence of errors.
|
// Operation is asynchronous and no guaranteed even in the absence of errors.
|
||||||
|
@ -77,7 +77,7 @@ func (x ResContainerPut) ID() cid.ID {
|
||||||
//
|
//
|
||||||
// Success can be verified by reading by identifier (see ResContainerPut.ID).
|
// Success can be verified by reading by identifier (see ResContainerPut.ID).
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmContainerPut docs).
|
// Returns an error if parameters are set incorrectly (see PrmContainerPut docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -86,9 +86,9 @@ func (c *Client) ContainerPut(ctx context.Context, prm PrmContainerPut) (*ResCon
|
||||||
// check parameters
|
// check parameters
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case !prm.cnrSet:
|
case !prm.cnrSet:
|
||||||
panic(panicMsgMissingContainer)
|
return nil, errorMissingContainer
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: check private key is set before forming the request
|
// TODO: check private key is set before forming the request
|
||||||
|
@ -96,7 +96,7 @@ func (c *Client) ContainerPut(ctx context.Context, prm PrmContainerPut) (*ResCon
|
||||||
var cnr v2container.Container
|
var cnr v2container.Container
|
||||||
prm.cnr.WriteToV2(&cnr)
|
prm.cnr.WriteToV2(&cnr)
|
||||||
|
|
||||||
var sig neofscrypto.Signature
|
var sig frostfscrypto.Signature
|
||||||
|
|
||||||
err := container.CalculateSignature(&sig, prm.cnr, c.prm.key)
|
err := container.CalculateSignature(&sig, prm.cnr, c.prm.key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -196,15 +196,15 @@ func (x ResContainerGet) Container() container.Container {
|
||||||
return x.cnr
|
return x.cnr
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerGet reads NeoFS container by ID.
|
// ContainerGet reads FrostFS container by ID.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmContainerGet docs).
|
// Returns an error if parameters are set incorrectly (see PrmContainerGet docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -213,9 +213,9 @@ func (x ResContainerGet) Container() container.Container {
|
||||||
func (c *Client) ContainerGet(ctx context.Context, prm PrmContainerGet) (*ResContainerGet, error) {
|
func (c *Client) ContainerGet(ctx context.Context, prm PrmContainerGet) (*ResContainerGet, error) {
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case !prm.idSet:
|
case !prm.idSet:
|
||||||
panic(panicMsgMissingContainer)
|
return nil, errorMissingContainer
|
||||||
}
|
}
|
||||||
|
|
||||||
var cidV2 refs.ContainerID
|
var cidV2 refs.ContainerID
|
||||||
|
@ -275,7 +275,7 @@ type PrmContainerList struct {
|
||||||
ownerID user.ID
|
ownerID user.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetAccount sets identifier of the NeoFS account to list the containers.
|
// SetAccount sets identifier of the FrostFS account to list the containers.
|
||||||
// Required parameter.
|
// Required parameter.
|
||||||
func (x *PrmContainerList) SetAccount(id user.ID) {
|
func (x *PrmContainerList) SetAccount(id user.ID) {
|
||||||
x.ownerID = id
|
x.ownerID = id
|
||||||
|
@ -300,11 +300,11 @@ func (x ResContainerList) Containers() []cid.ID {
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmContainerList docs).
|
// Returns an error if parameters are set incorrectly (see PrmContainerList docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -313,9 +313,9 @@ func (c *Client) ContainerList(ctx context.Context, prm PrmContainerList) (*ResC
|
||||||
// check parameters
|
// check parameters
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case !prm.ownerSet:
|
case !prm.ownerSet:
|
||||||
panic("account not set")
|
return nil, errorAccountNotSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// form request body
|
// form request body
|
||||||
|
@ -377,7 +377,7 @@ type PrmContainerDelete struct {
|
||||||
tok session.Container
|
tok session.Container
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetContainer sets identifier of the NeoFS container to be removed.
|
// SetContainer sets identifier of the FrostFS container to be removed.
|
||||||
// Required parameter.
|
// Required parameter.
|
||||||
func (x *PrmContainerDelete) SetContainer(id cid.ID) {
|
func (x *PrmContainerDelete) SetContainer(id cid.ID) {
|
||||||
x.id = id
|
x.id = id
|
||||||
|
@ -400,12 +400,12 @@ type ResContainerDelete struct {
|
||||||
statusRes
|
statusRes
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerDelete sends request to remove the NeoFS container.
|
// ContainerDelete sends request to remove the FrostFS container.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Operation is asynchronous and no guaranteed even in the absence of errors.
|
// Operation is asynchronous and no guaranteed even in the absence of errors.
|
||||||
|
@ -413,7 +413,7 @@ type ResContainerDelete struct {
|
||||||
//
|
//
|
||||||
// Success can be verified by reading by identifier (see GetContainer).
|
// Success can be verified by reading by identifier (see GetContainer).
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmContainerDelete docs).
|
// Returns an error if parameters are set incorrectly (see PrmContainerDelete docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. Server status return is returned in ResContainerDelete.
|
// Exactly one return value is non-nil. Server status return is returned in ResContainerDelete.
|
||||||
|
@ -425,9 +425,9 @@ func (c *Client) ContainerDelete(ctx context.Context, prm PrmContainerDelete) (*
|
||||||
// check parameters
|
// check parameters
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case !prm.idSet:
|
case !prm.idSet:
|
||||||
panic(panicMsgMissingContainer)
|
return nil, errorMissingContainer
|
||||||
}
|
}
|
||||||
|
|
||||||
// sign container ID
|
// sign container ID
|
||||||
|
@ -438,9 +438,9 @@ func (c *Client) ContainerDelete(ctx context.Context, prm PrmContainerDelete) (*
|
||||||
// don't get confused with stable marshaled protobuf container.ID structure
|
// don't get confused with stable marshaled protobuf container.ID structure
|
||||||
data := cidV2.GetValue()
|
data := cidV2.GetValue()
|
||||||
|
|
||||||
var sig neofscrypto.Signature
|
var sig frostfscrypto.Signature
|
||||||
|
|
||||||
err := sig.Calculate(neofsecdsa.SignerRFC6979(c.prm.key), data)
|
err := sig.Calculate(frostfsecdsa.SignerRFC6979(c.prm.key), data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("calculate signature: %w", err)
|
return nil, fmt.Errorf("calculate signature: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -501,7 +501,7 @@ type PrmContainerEACL struct {
|
||||||
id cid.ID
|
id cid.ID
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetContainer sets identifier of the NeoFS container to read the eACL table.
|
// SetContainer sets identifier of the FrostFS container to read the eACL table.
|
||||||
// Required parameter.
|
// Required parameter.
|
||||||
func (x *PrmContainerEACL) SetContainer(id cid.ID) {
|
func (x *PrmContainerEACL) SetContainer(id cid.ID) {
|
||||||
x.id = id
|
x.id = id
|
||||||
|
@ -520,15 +520,15 @@ func (x ResContainerEACL) Table() eacl.Table {
|
||||||
return x.table
|
return x.table
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerEACL reads eACL table of the NeoFS container.
|
// ContainerEACL reads eACL table of the FrostFS container.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmContainerEACL docs).
|
// Returns an error if parameters are set incorrectly (see PrmContainerEACL docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -539,9 +539,9 @@ func (c *Client) ContainerEACL(ctx context.Context, prm PrmContainerEACL) (*ResC
|
||||||
// check parameters
|
// check parameters
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case !prm.idSet:
|
case !prm.idSet:
|
||||||
panic(panicMsgMissingContainer)
|
return nil, errorMissingContainer
|
||||||
}
|
}
|
||||||
|
|
||||||
var cidV2 refs.ContainerID
|
var cidV2 refs.ContainerID
|
||||||
|
@ -629,12 +629,12 @@ type ResContainerSetEACL struct {
|
||||||
statusRes
|
statusRes
|
||||||
}
|
}
|
||||||
|
|
||||||
// ContainerSetEACL sends request to update eACL table of the NeoFS container.
|
// ContainerSetEACL sends request to update eACL table of the FrostFS container.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Operation is asynchronous and no guaranteed even in the absence of errors.
|
// Operation is asynchronous and no guaranteed even in the absence of errors.
|
||||||
|
@ -642,7 +642,7 @@ type ResContainerSetEACL struct {
|
||||||
//
|
//
|
||||||
// Success can be verified by reading by identifier (see EACL).
|
// Success can be verified by reading by identifier (see EACL).
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmContainerSetEACL docs).
|
// Returns an error if parameters are set incorrectly (see PrmContainerSetEACL docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -651,17 +651,17 @@ func (c *Client) ContainerSetEACL(ctx context.Context, prm PrmContainerSetEACL)
|
||||||
// check parameters
|
// check parameters
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case !prm.tableSet:
|
case !prm.tableSet:
|
||||||
panic("eACL table not set")
|
return nil, errorEACLTableNotSet
|
||||||
}
|
}
|
||||||
|
|
||||||
// sign the eACL table
|
// sign the eACL table
|
||||||
eaclV2 := prm.table.ToV2()
|
eaclV2 := prm.table.ToV2()
|
||||||
|
|
||||||
var sig neofscrypto.Signature
|
var sig frostfscrypto.Signature
|
||||||
|
|
||||||
err := sig.Calculate(neofsecdsa.SignerRFC6979(c.prm.key), eaclV2.StableMarshal(nil))
|
err := sig.Calculate(frostfsecdsa.SignerRFC6979(c.prm.key), eaclV2.StableMarshal(nil))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("calculate signature: %w", err)
|
return nil, fmt.Errorf("calculate signature: %w", err)
|
||||||
}
|
}
|
||||||
|
@ -738,8 +738,8 @@ type ResAnnounceSpace struct {
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Operation is asynchronous and no guaranteed even in the absence of errors.
|
// Operation is asynchronous and no guaranteed even in the absence of errors.
|
||||||
|
@ -747,7 +747,7 @@ type ResAnnounceSpace struct {
|
||||||
//
|
//
|
||||||
// At this moment success can not be checked.
|
// At this moment success can not be checked.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmAnnounceSpace docs).
|
// Returns an error if parameters are set incorrectly (see PrmAnnounceSpace docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -756,18 +756,18 @@ func (c *Client) ContainerAnnounceUsedSpace(ctx context.Context, prm PrmAnnounce
|
||||||
// check parameters
|
// check parameters
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case len(prm.announcements) == 0:
|
case len(prm.announcements) == 0:
|
||||||
panic("missing announcements")
|
return nil, errorMissingAnnouncements
|
||||||
}
|
}
|
||||||
|
|
||||||
// convert list of SDK announcement structures into NeoFS-API v2 list
|
// convert list of SDK announcement structures into FrostFS-API v2 list
|
||||||
v2announce := make([]v2container.UsedSpaceAnnouncement, len(prm.announcements))
|
v2announce := make([]v2container.UsedSpaceAnnouncement, len(prm.announcements))
|
||||||
for i := range prm.announcements {
|
for i := range prm.announcements {
|
||||||
prm.announcements[i].WriteToV2(&v2announce[i])
|
prm.announcements[i].WriteToV2(&v2announce[i])
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepare body of the NeoFS-API v2 request and request itself
|
// prepare body of the FrostFS-API v2 request and request itself
|
||||||
reqBody := new(v2container.AnnounceUsedSpaceRequestBody)
|
reqBody := new(v2container.AnnounceUsedSpaceRequestBody)
|
||||||
reqBody.SetAnnouncements(v2announce)
|
reqBody.SetAnnouncements(v2announce)
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Package client provides NeoFS API client implementation.
|
Package client provides FrostFS API client implementation.
|
||||||
|
|
||||||
The main component is Client type. It is a virtual connection to the network
|
The main component is Client type. It is a virtual connection to the network
|
||||||
and provides methods for executing operations on the server.
|
and provides methods for executing operations on the server.
|
||||||
|
@ -16,7 +16,7 @@ Initialize client state:
|
||||||
|
|
||||||
c.Init(prm)
|
c.Init(prm)
|
||||||
|
|
||||||
Connect to the NeoFS server:
|
Connect to the FrostFS server:
|
||||||
|
|
||||||
var prm client.PrmDial
|
var prm client.PrmDial
|
||||||
prm.SetServerURI("localhost:8080")
|
prm.SetServerURI("localhost:8080")
|
||||||
|
@ -26,7 +26,7 @@ Connect to the NeoFS server:
|
||||||
err := c.Dial(prm)
|
err := c.Dial(prm)
|
||||||
// ...
|
// ...
|
||||||
|
|
||||||
Execute NeoFS operation on the server:
|
Execute FrostFS operation on the server:
|
||||||
|
|
||||||
var prm client.PrmContainerPut
|
var prm client.PrmContainerPut
|
||||||
prm.SetContainer(cnr)
|
prm.SetContainer(cnr)
|
||||||
|
@ -47,8 +47,8 @@ Consume custom service of the server:
|
||||||
rpc CustomRPC(CustomRPCRequest) returns (CustomRPCResponse);
|
rpc CustomRPC(CustomRPCRequest) returns (CustomRPCResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
import "github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
import "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
import "github.com/nspcc-dev/neofs-api-go/v2/rpc/common"
|
import "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/common"
|
||||||
|
|
||||||
req := new(CustomRPCRequest)
|
req := new(CustomRPCRequest)
|
||||||
// ...
|
// ...
|
||||||
|
@ -72,9 +72,9 @@ for the all operations are write-only and the results of the all operations are
|
||||||
read-only. To be able to override client behavior (e.g. for tests), abstract it
|
read-only. To be able to override client behavior (e.g. for tests), abstract it
|
||||||
with an interface:
|
with an interface:
|
||||||
|
|
||||||
import "github.com/nspcc-dev/neofs-sdk-go/client"
|
import "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client"
|
||||||
|
|
||||||
type NeoFSClient interface {
|
type FrostFSClient interface {
|
||||||
// Operations according to the application needs
|
// Operations according to the application needs
|
||||||
CreateContainer(context.Context, container.Container) error
|
CreateContainer(context.Context, container.Container) error
|
||||||
// ...
|
// ...
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
// unwraps err using errors.Unwrap and returns the result.
|
// unwraps err using errors.Unwrap and returns the result.
|
||||||
|
@ -16,7 +16,7 @@ func unwrapErr(err error) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrContainerNotFound checks if err corresponds to NeoFS status
|
// IsErrContainerNotFound checks if err corresponds to FrostFS status
|
||||||
// return corresponding to missing container. Supports wrapped errors.
|
// return corresponding to missing container. Supports wrapped errors.
|
||||||
func IsErrContainerNotFound(err error) bool {
|
func IsErrContainerNotFound(err error) bool {
|
||||||
switch unwrapErr(err).(type) {
|
switch unwrapErr(err).(type) {
|
||||||
|
@ -29,7 +29,7 @@ func IsErrContainerNotFound(err error) bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrEACLNotFound checks if err corresponds to NeoFS status
|
// IsErrEACLNotFound checks if err corresponds to FrostFS status
|
||||||
// return corresponding to missing eACL table. Supports wrapped errors.
|
// return corresponding to missing eACL table. Supports wrapped errors.
|
||||||
func IsErrEACLNotFound(err error) bool {
|
func IsErrEACLNotFound(err error) bool {
|
||||||
switch unwrapErr(err).(type) {
|
switch unwrapErr(err).(type) {
|
||||||
|
@ -42,7 +42,7 @@ func IsErrEACLNotFound(err error) bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrObjectNotFound checks if err corresponds to NeoFS status
|
// IsErrObjectNotFound checks if err corresponds to FrostFS status
|
||||||
// return corresponding to missing object. Supports wrapped errors.
|
// return corresponding to missing object. Supports wrapped errors.
|
||||||
func IsErrObjectNotFound(err error) bool {
|
func IsErrObjectNotFound(err error) bool {
|
||||||
switch unwrapErr(err).(type) {
|
switch unwrapErr(err).(type) {
|
||||||
|
@ -55,7 +55,7 @@ func IsErrObjectNotFound(err error) bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrObjectAlreadyRemoved checks if err corresponds to NeoFS status
|
// IsErrObjectAlreadyRemoved checks if err corresponds to FrostFS status
|
||||||
// return corresponding to already removed object. Supports wrapped errors.
|
// return corresponding to already removed object. Supports wrapped errors.
|
||||||
func IsErrObjectAlreadyRemoved(err error) bool {
|
func IsErrObjectAlreadyRemoved(err error) bool {
|
||||||
switch unwrapErr(err).(type) {
|
switch unwrapErr(err).(type) {
|
||||||
|
@ -68,7 +68,7 @@ func IsErrObjectAlreadyRemoved(err error) bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrSessionExpired checks if err corresponds to NeoFS status return
|
// IsErrSessionExpired checks if err corresponds to FrostFS status return
|
||||||
// corresponding to expired session. Supports wrapped errors.
|
// corresponding to expired session. Supports wrapped errors.
|
||||||
func IsErrSessionExpired(err error) bool {
|
func IsErrSessionExpired(err error) bool {
|
||||||
switch unwrapErr(err).(type) {
|
switch unwrapErr(err).(type) {
|
||||||
|
@ -81,7 +81,7 @@ func IsErrSessionExpired(err error) bool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsErrSessionNotFound checks if err corresponds to NeoFS status return
|
// IsErrSessionNotFound checks if err corresponds to FrostFS status return
|
||||||
// corresponding to missing session. Supports wrapped errors.
|
// corresponding to missing session. Supports wrapped errors.
|
||||||
func IsErrSessionNotFound(err error) bool {
|
func IsErrSessionNotFound(err error) bool {
|
||||||
switch unwrapErr(err).(type) {
|
switch unwrapErr(err).(type) {
|
||||||
|
@ -99,7 +99,7 @@ func newErrMissingResponseField(name string) error {
|
||||||
return fmt.Errorf("missing %s field in the response", name)
|
return fmt.Errorf("missing %s field in the response", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns error describing invalid field (according to the NeoFS protocol)
|
// returns error describing invalid field (according to the FrostFS protocol)
|
||||||
// with the given name and format violation err.
|
// with the given name and format violation err.
|
||||||
func newErrInvalidResponseField(name string, err error) error {
|
func newErrInvalidResponseField(name string, err error) error {
|
||||||
return fmt.Errorf("invalid %s field in the response: %w", name, err)
|
return fmt.Errorf("invalid %s field in the response: %w", name, err)
|
||||||
|
|
|
@ -4,8 +4,8 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client"
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -4,14 +4,14 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
v2netmap "github.com/nspcc-dev/neofs-api-go/v2/netmap"
|
v2netmap "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap"
|
||||||
rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
v2session "github.com/nspcc-dev/neofs-api-go/v2/session"
|
v2session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/signature"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature"
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/netmap"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/version"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PrmEndpointInfo groups parameters of EndpointInfo operation.
|
// PrmEndpointInfo groups parameters of EndpointInfo operation.
|
||||||
|
@ -28,12 +28,12 @@ type ResEndpointInfo struct {
|
||||||
ni netmap.NodeInfo
|
ni netmap.NodeInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
// LatestVersion returns latest NeoFS API protocol's version in use.
|
// LatestVersion returns latest FrostFS API protocol's version in use.
|
||||||
func (x ResEndpointInfo) LatestVersion() version.Version {
|
func (x ResEndpointInfo) LatestVersion() version.Version {
|
||||||
return x.version
|
return x.version
|
||||||
}
|
}
|
||||||
|
|
||||||
// NodeInfo returns information about the NeoFS node served on the remote endpoint.
|
// NodeInfo returns information about the FrostFS node served on the remote endpoint.
|
||||||
func (x ResEndpointInfo) NodeInfo() netmap.NodeInfo {
|
func (x ResEndpointInfo) NodeInfo() netmap.NodeInfo {
|
||||||
return x.ni
|
return x.ni
|
||||||
}
|
}
|
||||||
|
@ -43,11 +43,11 @@ func (x ResEndpointInfo) NodeInfo() netmap.NodeInfo {
|
||||||
// Method can be used as a health check to see if node is alive and responds to requests.
|
// Method can be used as a health check to see if node is alive and responds to requests.
|
||||||
//
|
//
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmEndpointInfo docs).
|
// Returns an error if parameters are set incorrectly (see PrmEndpointInfo docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. Server status return is returned in ResEndpointInfo.
|
// Exactly one return value is non-nil. Server status return is returned in ResEndpointInfo.
|
||||||
|
@ -58,7 +58,7 @@ func (x ResEndpointInfo) NodeInfo() netmap.NodeInfo {
|
||||||
func (c *Client) EndpointInfo(ctx context.Context, prm PrmEndpointInfo) (*ResEndpointInfo, error) {
|
func (c *Client) EndpointInfo(ctx context.Context, prm PrmEndpointInfo) (*ResEndpointInfo, error) {
|
||||||
// check context
|
// check context
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
}
|
}
|
||||||
|
|
||||||
// form request
|
// form request
|
||||||
|
@ -132,19 +132,19 @@ type ResNetworkInfo struct {
|
||||||
info netmap.NetworkInfo
|
info netmap.NetworkInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
// Info returns structured information about the NeoFS network.
|
// Info returns structured information about the FrostFS network.
|
||||||
func (x ResNetworkInfo) Info() netmap.NetworkInfo {
|
func (x ResNetworkInfo) Info() netmap.NetworkInfo {
|
||||||
return x.info
|
return x.info
|
||||||
}
|
}
|
||||||
|
|
||||||
// NetworkInfo requests information about the NeoFS network of which the remote server is a part.
|
// NetworkInfo requests information about the FrostFS network of which the remote server is a part.
|
||||||
//
|
//
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmNetworkInfo docs).
|
// Returns an error if parameters are set incorrectly (see PrmNetworkInfo docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. Server status return is returned in ResNetworkInfo.
|
// Exactly one return value is non-nil. Server status return is returned in ResNetworkInfo.
|
||||||
|
@ -155,7 +155,7 @@ func (x ResNetworkInfo) Info() netmap.NetworkInfo {
|
||||||
func (c *Client) NetworkInfo(ctx context.Context, prm PrmNetworkInfo) (*ResNetworkInfo, error) {
|
func (c *Client) NetworkInfo(ctx context.Context, prm PrmNetworkInfo) (*ResNetworkInfo, error) {
|
||||||
// check context
|
// check context
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
}
|
}
|
||||||
|
|
||||||
// form request
|
// form request
|
||||||
|
@ -220,10 +220,11 @@ func (x ResNetMapSnapshot) NetMap() netmap.NetMap {
|
||||||
// NetMapSnapshot requests current network view of the remote server.
|
// NetMapSnapshot requests current network view of the remote server.
|
||||||
//
|
//
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
|
// Returns an error if parameters are set incorrectly.
|
||||||
// Context is required and MUST NOT be nil. It is used for network communication.
|
// Context is required and MUST NOT be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. Server status return is returned in ResNetMapSnapshot.
|
// Exactly one return value is non-nil. Server status return is returned in ResNetMapSnapshot.
|
||||||
|
@ -234,7 +235,7 @@ func (x ResNetMapSnapshot) NetMap() netmap.NetMap {
|
||||||
func (c *Client) NetMapSnapshot(ctx context.Context, _ PrmNetMapSnapshot) (*ResNetMapSnapshot, error) {
|
func (c *Client) NetMapSnapshot(ctx context.Context, _ PrmNetMapSnapshot) (*ResNetMapSnapshot, error) {
|
||||||
// check context
|
// check context
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
}
|
}
|
||||||
|
|
||||||
// form request body
|
// form request body
|
||||||
|
|
|
@ -6,11 +6,11 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
v2netmap "github.com/nspcc-dev/neofs-api-go/v2/netmap"
|
v2netmap "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/session"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/signature"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature"
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/netmap"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -70,10 +70,9 @@ func TestClient_NetMapSnapshot(t *testing.T) {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
// missing context
|
// missing context
|
||||||
require.PanicsWithValue(t, panicMsgMissingContext, func() {
|
//nolint:staticcheck
|
||||||
//nolint:staticcheck
|
_, err = c.NetMapSnapshot(nil, prm)
|
||||||
_, _ = c.NetMapSnapshot(nil, prm)
|
require.ErrorIs(t, err, errorMissingContext, "")
|
||||||
})
|
|
||||||
|
|
||||||
// request signature
|
// request signature
|
||||||
srv.errTransport = errors.New("any error")
|
srv.errTransport = errors.New("any error")
|
||||||
|
|
|
@ -5,18 +5,18 @@ import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/acl"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
v2object "github.com/nspcc-dev/neofs-api-go/v2/object"
|
v2object "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object"
|
||||||
v2refs "github.com/nspcc-dev/neofs-api-go/v2/refs"
|
v2refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
v2session "github.com/nspcc-dev/neofs-api-go/v2/session"
|
v2session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/signature"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/bearer"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer"
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/session"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PrmObjectDelete groups parameters of ObjectDelete operation.
|
// PrmObjectDelete groups parameters of ObjectDelete operation.
|
||||||
|
@ -55,7 +55,7 @@ func (x *PrmObjectDelete) WithBearerToken(t bearer.Token) {
|
||||||
x.meta.SetBearerToken(&v2token)
|
x.meta.SetBearerToken(&v2token)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromContainer specifies NeoFS container of the object.
|
// FromContainer specifies FrostFS container of the object.
|
||||||
// Required parameter.
|
// Required parameter.
|
||||||
func (x *PrmObjectDelete) FromContainer(id cid.ID) {
|
func (x *PrmObjectDelete) FromContainer(id cid.ID) {
|
||||||
var cidV2 v2refs.ContainerID
|
var cidV2 v2refs.ContainerID
|
||||||
|
@ -100,7 +100,7 @@ func (x ResObjectDelete) Tombstone() oid.ID {
|
||||||
return x.tomb
|
return x.tomb
|
||||||
}
|
}
|
||||||
|
|
||||||
// ObjectDelete marks an object for deletion from the container using NeoFS API protocol.
|
// ObjectDelete marks an object for deletion from the container using FrostFS API protocol.
|
||||||
// As a marker, a special unit called a tombstone is placed in the container.
|
// As a marker, a special unit called a tombstone is placed in the container.
|
||||||
// It confirms the user's intent to delete the object, and is itself a container object.
|
// It confirms the user's intent to delete the object, and is itself a container object.
|
||||||
// Explicit deletion is done asynchronously, and is generally not guaranteed.
|
// Explicit deletion is done asynchronously, and is generally not guaranteed.
|
||||||
|
@ -110,11 +110,11 @@ func (x ResObjectDelete) Tombstone() oid.ID {
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`,
|
// Any client's internal or transport errors are returned as `error`,
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmObjectDelete docs).
|
// Returns an error if parameters are set incorrectly (see PrmObjectDelete docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -126,11 +126,11 @@ func (x ResObjectDelete) Tombstone() oid.ID {
|
||||||
func (c *Client) ObjectDelete(ctx context.Context, prm PrmObjectDelete) (*ResObjectDelete, error) {
|
func (c *Client) ObjectDelete(ctx context.Context, prm PrmObjectDelete) (*ResObjectDelete, error) {
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case prm.addr.GetContainerID() == nil:
|
case prm.addr.GetContainerID() == nil:
|
||||||
panic(panicMsgMissingContainer)
|
return nil, errorMissingContainer
|
||||||
case prm.addr.GetObjectID() == nil:
|
case prm.addr.GetObjectID() == nil:
|
||||||
panic(panicMsgMissingObject)
|
return nil, errorMissingObject
|
||||||
}
|
}
|
||||||
|
|
||||||
// form request body
|
// form request body
|
||||||
|
|
|
@ -7,19 +7,19 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/acl"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
v2object "github.com/nspcc-dev/neofs-api-go/v2/object"
|
v2object "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object"
|
||||||
v2refs "github.com/nspcc-dev/neofs-api-go/v2/refs"
|
v2refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
v2session "github.com/nspcc-dev/neofs-api-go/v2/session"
|
v2session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/signature"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/bearer"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer"
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/object"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
||||||
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/session"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session"
|
||||||
)
|
)
|
||||||
|
|
||||||
// shared parameters of GET/HEAD/RANGE.
|
// shared parameters of GET/HEAD/RANGE.
|
||||||
|
@ -72,7 +72,7 @@ func (x *prmObjectRead) WithBearerToken(t bearer.Token) {
|
||||||
x.meta.SetBearerToken(&v2token)
|
x.meta.SetBearerToken(&v2token)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromContainer specifies NeoFS container of the object.
|
// FromContainer specifies FrostFS container of the object.
|
||||||
// Required parameter.
|
// Required parameter.
|
||||||
func (x *prmObjectRead) FromContainer(id cid.ID) {
|
func (x *prmObjectRead) FromContainer(id cid.ID) {
|
||||||
var cnrV2 v2refs.ContainerID
|
var cnrV2 v2refs.ContainerID
|
||||||
|
@ -100,7 +100,7 @@ type ResObjectGet struct {
|
||||||
statusRes
|
statusRes
|
||||||
}
|
}
|
||||||
|
|
||||||
// ObjectReader is designed to read one object from NeoFS system.
|
// ObjectReader is designed to read one object from FrostFS system.
|
||||||
//
|
//
|
||||||
// Must be initialized using Client.ObjectGetInit, any other
|
// Must be initialized using Client.ObjectGetInit, any other
|
||||||
// usage is unsafe.
|
// usage is unsafe.
|
||||||
|
@ -251,7 +251,7 @@ func (x *ObjectReader) close(ignoreEOF bool) (*ResObjectGet, error) {
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as Go built-in error.
|
// Any client's internal or transport errors are returned as Go built-in error.
|
||||||
// If Client is tuned to resolve NeoFS API statuses, then NeoFS failures
|
// If Client is tuned to resolve FrostFS API statuses, then FrostFS failures
|
||||||
// codes are returned as error.
|
// codes are returned as error.
|
||||||
//
|
//
|
||||||
// Return errors:
|
// Return errors:
|
||||||
|
@ -291,22 +291,22 @@ func (x *ObjectReader) Read(p []byte) (int, error) {
|
||||||
return n, nil
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ObjectGetInit initiates reading an object through a remote server using NeoFS API protocol.
|
// ObjectGetInit initiates reading an object through a remote server using FrostFS API protocol.
|
||||||
//
|
//
|
||||||
// The call only opens the transmission channel, explicit fetching is done using the ObjectReader.
|
// The call only opens the transmission channel, explicit fetching is done using the ObjectReader.
|
||||||
// Exactly one return value is non-nil. Resulting reader must be finally closed.
|
// Exactly one return value is non-nil. Resulting reader must be finally closed.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmObjectGet docs).
|
// Returns an error if parameters are set incorrectly (see PrmObjectGet docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
func (c *Client) ObjectGetInit(ctx context.Context, prm PrmObjectGet) (*ObjectReader, error) {
|
func (c *Client) ObjectGetInit(ctx context.Context, prm PrmObjectGet) (*ObjectReader, error) {
|
||||||
// check parameters
|
// check parameters
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case prm.addr.GetContainerID() == nil:
|
case prm.addr.GetContainerID() == nil:
|
||||||
panic(panicMsgMissingContainer)
|
return nil, errorMissingContainer
|
||||||
case prm.addr.GetObjectID() == nil:
|
case prm.addr.GetObjectID() == nil:
|
||||||
panic(panicMsgMissingObject)
|
return nil, errorMissingObject
|
||||||
}
|
}
|
||||||
|
|
||||||
// form request body
|
// form request body
|
||||||
|
@ -392,15 +392,15 @@ func (x *ResObjectHead) ReadHeader(dst *object.Object) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// ObjectHead reads object header through a remote server using NeoFS API protocol.
|
// ObjectHead reads object header through a remote server using FrostFS API protocol.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`,
|
// Any client's internal or transport errors are returned as `error`,
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmObjectHead docs).
|
// Returns an error if parameters are set incorrectly (see PrmObjectHead docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return errors:
|
// Return errors:
|
||||||
|
@ -417,11 +417,11 @@ func (x *ResObjectHead) ReadHeader(dst *object.Object) bool {
|
||||||
func (c *Client) ObjectHead(ctx context.Context, prm PrmObjectHead) (*ResObjectHead, error) {
|
func (c *Client) ObjectHead(ctx context.Context, prm PrmObjectHead) (*ResObjectHead, error) {
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case prm.addr.GetContainerID() == nil:
|
case prm.addr.GetContainerID() == nil:
|
||||||
panic(panicMsgMissingContainer)
|
return nil, errorMissingContainer
|
||||||
case prm.addr.GetObjectID() == nil:
|
case prm.addr.GetObjectID() == nil:
|
||||||
panic(panicMsgMissingObject)
|
return nil, errorMissingObject
|
||||||
}
|
}
|
||||||
|
|
||||||
var body v2object.HeadRequestBody
|
var body v2object.HeadRequestBody
|
||||||
|
@ -505,7 +505,7 @@ type ResObjectRange struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ObjectRangeReader is designed to read payload range of one object
|
// ObjectRangeReader is designed to read payload range of one object
|
||||||
// from NeoFS system.
|
// from FrostFS system.
|
||||||
//
|
//
|
||||||
// Must be initialized using Client.ObjectRangeInit, any other
|
// Must be initialized using Client.ObjectRangeInit, any other
|
||||||
// usage is unsafe.
|
// usage is unsafe.
|
||||||
|
@ -616,7 +616,7 @@ func (x *ObjectRangeReader) close(ignoreEOF bool) (*ResObjectRange, error) {
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as Go built-in error.
|
// Any client's internal or transport errors are returned as Go built-in error.
|
||||||
// If Client is tuned to resolve NeoFS API statuses, then NeoFS failures
|
// If Client is tuned to resolve FrostFS API statuses, then FrostFS failures
|
||||||
// codes are returned as error.
|
// codes are returned as error.
|
||||||
//
|
//
|
||||||
// Return errors:
|
// Return errors:
|
||||||
|
@ -658,24 +658,24 @@ func (x *ObjectRangeReader) Read(p []byte) (int, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ObjectRangeInit initiates reading an object's payload range through a remote
|
// ObjectRangeInit initiates reading an object's payload range through a remote
|
||||||
// server using NeoFS API protocol.
|
// server using FrostFS API protocol.
|
||||||
//
|
//
|
||||||
// The call only opens the transmission channel, explicit fetching is done using the ObjectRangeReader.
|
// The call only opens the transmission channel, explicit fetching is done using the ObjectRangeReader.
|
||||||
// Exactly one return value is non-nil. Resulting reader must be finally closed.
|
// Exactly one return value is non-nil. Resulting reader must be finally closed.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmObjectRange docs).
|
// Returns an error if parameters are set incorrectly (see PrmObjectRange docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
func (c *Client) ObjectRangeInit(ctx context.Context, prm PrmObjectRange) (*ObjectRangeReader, error) {
|
func (c *Client) ObjectRangeInit(ctx context.Context, prm PrmObjectRange) (*ObjectRangeReader, error) {
|
||||||
// check parameters
|
// check parameters
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case prm.addr.GetContainerID() == nil:
|
case prm.addr.GetContainerID() == nil:
|
||||||
panic(panicMsgMissingContainer)
|
return nil, errorMissingContainer
|
||||||
case prm.addr.GetObjectID() == nil:
|
case prm.addr.GetObjectID() == nil:
|
||||||
panic(panicMsgMissingObject)
|
return nil, errorMissingObject
|
||||||
case prm.rng.GetLength() == 0:
|
case prm.rng.GetLength() == 0:
|
||||||
panic("zero range length")
|
return nil, errorZeroRangeLength
|
||||||
}
|
}
|
||||||
|
|
||||||
// form request body
|
// form request body
|
||||||
|
|
|
@ -2,20 +2,21 @@ package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/ecdsa"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/acl"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
v2object "github.com/nspcc-dev/neofs-api-go/v2/object"
|
v2object "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object"
|
||||||
v2refs "github.com/nspcc-dev/neofs-api-go/v2/refs"
|
v2refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
v2session "github.com/nspcc-dev/neofs-api-go/v2/session"
|
v2session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/signature"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/bearer"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer"
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/session"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PrmObjectHash groups parameters of ObjectHash operation.
|
// PrmObjectHash groups parameters of ObjectHash operation.
|
||||||
|
@ -27,6 +28,16 @@ type PrmObjectHash struct {
|
||||||
csAlgo v2refs.ChecksumType
|
csAlgo v2refs.ChecksumType
|
||||||
|
|
||||||
addr v2refs.Address
|
addr v2refs.Address
|
||||||
|
|
||||||
|
keySet bool
|
||||||
|
key ecdsa.PrivateKey
|
||||||
|
}
|
||||||
|
|
||||||
|
// UseKey specifies private key to sign the requests.
|
||||||
|
// If key is not provided, then Client default key is used.
|
||||||
|
func (x *PrmObjectHash) UseKey(key ecdsa.PrivateKey) {
|
||||||
|
x.keySet = true
|
||||||
|
x.key = key
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarkLocal tells the server to execute the operation locally.
|
// MarkLocal tells the server to execute the operation locally.
|
||||||
|
@ -58,7 +69,7 @@ func (x *PrmObjectHash) WithBearerToken(t bearer.Token) {
|
||||||
x.meta.SetBearerToken(&v2token)
|
x.meta.SetBearerToken(&v2token)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FromContainer specifies NeoFS container of the object.
|
// FromContainer specifies FrostFS container of the object.
|
||||||
// Required parameter.
|
// Required parameter.
|
||||||
func (x *PrmObjectHash) FromContainer(id cid.ID) {
|
func (x *PrmObjectHash) FromContainer(id cid.ID) {
|
||||||
var cidV2 v2refs.ContainerID
|
var cidV2 v2refs.ContainerID
|
||||||
|
@ -132,18 +143,18 @@ func (x ResObjectHash) Checksums() [][]byte {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ObjectHash requests checksum of the range list of the object payload using
|
// ObjectHash requests checksum of the range list of the object payload using
|
||||||
// NeoFS API protocol.
|
// FrostFS API protocol.
|
||||||
//
|
//
|
||||||
// Returns a list of checksums in raw form: the format of hashes and their number
|
// Returns a list of checksums in raw form: the format of hashes and their number
|
||||||
// is left for the caller to check. Client preserves the order of the server's response.
|
// is left for the caller to check. Client preserves the order of the server's response.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`,
|
// Any client's internal or transport errors are returned as `error`,
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmObjectHash docs).
|
// Returns an error if parameters are set incorrectly (see PrmObjectHash docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -156,13 +167,13 @@ func (x ResObjectHash) Checksums() [][]byte {
|
||||||
func (c *Client) ObjectHash(ctx context.Context, prm PrmObjectHash) (*ResObjectHash, error) {
|
func (c *Client) ObjectHash(ctx context.Context, prm PrmObjectHash) (*ResObjectHash, error) {
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case prm.addr.GetContainerID() == nil:
|
case prm.addr.GetContainerID() == nil:
|
||||||
panic(panicMsgMissingContainer)
|
return nil, errorMissingContainer
|
||||||
case prm.addr.GetObjectID() == nil:
|
case prm.addr.GetObjectID() == nil:
|
||||||
panic(panicMsgMissingObject)
|
return nil, errorMissingObject
|
||||||
case len(prm.body.GetRanges()) == 0:
|
case len(prm.body.GetRanges()) == 0:
|
||||||
panic("missing ranges")
|
return nil, errorMissingRanges
|
||||||
}
|
}
|
||||||
|
|
||||||
prm.body.SetAddress(&prm.addr)
|
prm.body.SetAddress(&prm.addr)
|
||||||
|
@ -176,7 +187,12 @@ func (c *Client) ObjectHash(ctx context.Context, prm PrmObjectHash) (*ResObjectH
|
||||||
c.prepareRequest(&req, &prm.meta)
|
c.prepareRequest(&req, &prm.meta)
|
||||||
req.SetBody(&prm.body)
|
req.SetBody(&prm.body)
|
||||||
|
|
||||||
err := signature.SignServiceMessage(&c.prm.key, &req)
|
key := c.prm.key
|
||||||
|
if prm.keySet {
|
||||||
|
key = prm.key
|
||||||
|
}
|
||||||
|
|
||||||
|
err := signature.SignServiceMessage(&key, &req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("sign request: %w", err)
|
return nil, fmt.Errorf("sign request: %w", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,17 +7,17 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/acl"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
v2object "github.com/nspcc-dev/neofs-api-go/v2/object"
|
v2object "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object"
|
||||||
rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
v2session "github.com/nspcc-dev/neofs-api-go/v2/session"
|
v2session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/signature"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/bearer"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer"
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/object"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
||||||
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/session"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PrmObjectPutInit groups parameters of ObjectPutInit operation.
|
// PrmObjectPutInit groups parameters of ObjectPutInit operation.
|
||||||
|
@ -44,7 +44,7 @@ func (x ResObjectPut) StoredObjectID() oid.ID {
|
||||||
return x.obj
|
return x.obj
|
||||||
}
|
}
|
||||||
|
|
||||||
// ObjectWriter is designed to write one object to NeoFS system.
|
// ObjectWriter is designed to write one object to FrostFS system.
|
||||||
//
|
//
|
||||||
// Must be initialized using Client.ObjectPutInit, any other
|
// Must be initialized using Client.ObjectPutInit, any other
|
||||||
// usage is unsafe.
|
// usage is unsafe.
|
||||||
|
@ -181,7 +181,7 @@ func (x *ObjectWriter) WritePayloadChunk(chunk []byte) bool {
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as Go built-in error.
|
// Any client's internal or transport errors are returned as Go built-in error.
|
||||||
// If Client is tuned to resolve NeoFS API statuses, then NeoFS failures
|
// If Client is tuned to resolve FrostFS API statuses, then FrostFS failures
|
||||||
// codes are returned as error.
|
// codes are returned as error.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -230,16 +230,17 @@ func (x *ObjectWriter) Close() (*ResObjectPut, error) {
|
||||||
return &x.res, nil
|
return &x.res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ObjectPutInit initiates writing an object through a remote server using NeoFS API protocol.
|
// ObjectPutInit initiates writing an object through a remote server using FrostFS API protocol.
|
||||||
//
|
//
|
||||||
// The call only opens the transmission channel, explicit recording is done using the ObjectWriter.
|
// The call only opens the transmission channel, explicit recording is done using the ObjectWriter.
|
||||||
// Exactly one return value is non-nil. Resulting writer must be finally closed.
|
// Exactly one return value is non-nil. Resulting writer must be finally closed.
|
||||||
//
|
//
|
||||||
|
// Returns an error if parameters are set incorrectly.
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
func (c *Client) ObjectPutInit(ctx context.Context, prm PrmObjectPutInit) (*ObjectWriter, error) {
|
func (c *Client) ObjectPutInit(ctx context.Context, prm PrmObjectPutInit) (*ObjectWriter, error) {
|
||||||
// check parameters
|
// check parameters
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
}
|
}
|
||||||
|
|
||||||
var w ObjectWriter
|
var w ObjectWriter
|
||||||
|
|
|
@ -7,19 +7,19 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/acl"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
v2object "github.com/nspcc-dev/neofs-api-go/v2/object"
|
v2object "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object"
|
||||||
v2refs "github.com/nspcc-dev/neofs-api-go/v2/refs"
|
v2refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
v2session "github.com/nspcc-dev/neofs-api-go/v2/session"
|
v2session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/signature"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/bearer"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/bearer"
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/object"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
||||||
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/session"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/session"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PrmObjectSearch groups parameters of ObjectSearch operation.
|
// PrmObjectSearch groups parameters of ObjectSearch operation.
|
||||||
|
@ -94,7 +94,7 @@ type ResObjectSearch struct {
|
||||||
statusRes
|
statusRes
|
||||||
}
|
}
|
||||||
|
|
||||||
// ObjectListReader is designed to read list of object identifiers from NeoFS system.
|
// ObjectListReader is designed to read list of object identifiers from FrostFS system.
|
||||||
//
|
//
|
||||||
// Must be initialized using Client.ObjectSearch, any other usage is unsafe.
|
// Must be initialized using Client.ObjectSearch, any other usage is unsafe.
|
||||||
type ObjectListReader struct {
|
type ObjectListReader struct {
|
||||||
|
@ -194,7 +194,7 @@ func (x *ObjectListReader) Iterate(f func(oid.ID) bool) error {
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as Go built-in error.
|
// Any client's internal or transport errors are returned as Go built-in error.
|
||||||
// If Client is tuned to resolve NeoFS API statuses, then NeoFS failures
|
// If Client is tuned to resolve FrostFS API statuses, then FrostFS failures
|
||||||
// codes are returned as error.
|
// codes are returned as error.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -212,21 +212,21 @@ func (x *ObjectListReader) Close() (*ResObjectSearch, error) {
|
||||||
return &x.res, nil
|
return &x.res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ObjectSearchInit initiates object selection through a remote server using NeoFS API protocol.
|
// ObjectSearchInit initiates object selection through a remote server using FrostFS API protocol.
|
||||||
//
|
//
|
||||||
// The call only opens the transmission channel, explicit fetching of matched objects
|
// The call only opens the transmission channel, explicit fetching of matched objects
|
||||||
// is done using the ObjectListReader. Exactly one return value is non-nil.
|
// is done using the ObjectListReader. Exactly one return value is non-nil.
|
||||||
// Resulting reader must be finally closed.
|
// Resulting reader must be finally closed.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmObjectSearch docs).
|
// Returns an error if parameters are set incorrectly (see PrmObjectSearch docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
func (c *Client) ObjectSearchInit(ctx context.Context, prm PrmObjectSearch) (*ObjectListReader, error) {
|
func (c *Client) ObjectSearchInit(ctx context.Context, prm PrmObjectSearch) (*ObjectListReader, error) {
|
||||||
// check parameters
|
// check parameters
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case !prm.cnrSet:
|
case !prm.cnrSet:
|
||||||
panic(panicMsgMissingContainer)
|
return nil, errorMissingContainer
|
||||||
}
|
}
|
||||||
|
|
||||||
var cidV2 v2refs.ContainerID
|
var cidV2 v2refs.ContainerID
|
||||||
|
|
|
@ -7,12 +7,12 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
v2object "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
|
signatureV2 "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/signature"
|
||||||
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||||
|
oidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id/test"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
v2object "github.com/nspcc-dev/neofs-api-go/v2/object"
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
|
||||||
signatureV2 "github.com/nspcc-dev/neofs-api-go/v2/signature"
|
|
||||||
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
|
||||||
oidtest "github.com/nspcc-dev/neofs-sdk-go/object/id/test"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,10 @@ package client
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
v2reputation "github.com/nspcc-dev/neofs-api-go/v2/reputation"
|
v2reputation "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/reputation"
|
||||||
rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/reputation"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/reputation"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PrmAnnounceLocalTrust groups parameters of AnnounceLocalTrust operation.
|
// PrmAnnounceLocalTrust groups parameters of AnnounceLocalTrust operation.
|
||||||
|
@ -18,13 +18,13 @@ type PrmAnnounceLocalTrust struct {
|
||||||
trusts []reputation.Trust
|
trusts []reputation.Trust
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetEpoch sets number of NeoFS epoch in which the trust was assessed.
|
// SetEpoch sets number of FrostFS epoch in which the trust was assessed.
|
||||||
// Required parameter, must not be zero.
|
// Required parameter, must not be zero.
|
||||||
func (x *PrmAnnounceLocalTrust) SetEpoch(epoch uint64) {
|
func (x *PrmAnnounceLocalTrust) SetEpoch(epoch uint64) {
|
||||||
x.epoch = epoch
|
x.epoch = epoch
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetValues sets values describing trust of the client to the NeoFS network participants.
|
// SetValues sets values describing trust of the client to the FrostFS network participants.
|
||||||
// Required parameter. Must not be empty.
|
// Required parameter. Must not be empty.
|
||||||
//
|
//
|
||||||
// Must not be mutated before the end of the operation.
|
// Must not be mutated before the end of the operation.
|
||||||
|
@ -37,15 +37,15 @@ type ResAnnounceLocalTrust struct {
|
||||||
statusRes
|
statusRes
|
||||||
}
|
}
|
||||||
|
|
||||||
// AnnounceLocalTrust sends client's trust values to the NeoFS network participants.
|
// AnnounceLocalTrust sends client's trust values to the FrostFS network participants.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmAnnounceLocalTrust docs).
|
// Returns an error if parameters are set incorrectly (see PrmAnnounceLocalTrust docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -54,11 +54,11 @@ func (c *Client) AnnounceLocalTrust(ctx context.Context, prm PrmAnnounceLocalTru
|
||||||
// check parameters
|
// check parameters
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case prm.epoch == 0:
|
case prm.epoch == 0:
|
||||||
panic("zero epoch")
|
return nil, errorZeroEpoch
|
||||||
case len(prm.trusts) == 0:
|
case len(prm.trusts) == 0:
|
||||||
panic("missing trusts")
|
return nil, errorMissingTrusts
|
||||||
}
|
}
|
||||||
|
|
||||||
// form request body
|
// form request body
|
||||||
|
@ -113,7 +113,7 @@ type PrmAnnounceIntermediateTrust struct {
|
||||||
trust reputation.PeerToPeerTrust
|
trust reputation.PeerToPeerTrust
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetEpoch sets number of NeoFS epoch with which client's calculation algorithm is initialized.
|
// SetEpoch sets number of FrostFS epoch with which client's calculation algorithm is initialized.
|
||||||
// Required parameter, must not be zero.
|
// Required parameter, must not be zero.
|
||||||
func (x *PrmAnnounceIntermediateTrust) SetEpoch(epoch uint64) {
|
func (x *PrmAnnounceIntermediateTrust) SetEpoch(epoch uint64) {
|
||||||
x.epoch = epoch
|
x.epoch = epoch
|
||||||
|
@ -137,16 +137,16 @@ type ResAnnounceIntermediateTrust struct {
|
||||||
statusRes
|
statusRes
|
||||||
}
|
}
|
||||||
|
|
||||||
// AnnounceIntermediateTrust sends global trust values calculated for the specified NeoFS network participants
|
// AnnounceIntermediateTrust sends global trust values calculated for the specified FrostFS network participants
|
||||||
// at some stage of client's calculation algorithm.
|
// at some stage of client's calculation algorithm.
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmAnnounceIntermediateTrust docs).
|
// Returns an error if parameters are set incorrectly (see PrmAnnounceIntermediateTrust docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -155,11 +155,11 @@ func (c *Client) AnnounceIntermediateTrust(ctx context.Context, prm PrmAnnounceI
|
||||||
// check parameters
|
// check parameters
|
||||||
switch {
|
switch {
|
||||||
case ctx == nil:
|
case ctx == nil:
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
case prm.epoch == 0:
|
case prm.epoch == 0:
|
||||||
panic("zero epoch")
|
return nil, errorZeroEpoch
|
||||||
case !prm.trustSet:
|
case !prm.trustSet:
|
||||||
panic("current trust value not set")
|
return nil, errorTrustNotSet
|
||||||
}
|
}
|
||||||
|
|
||||||
var trust v2reputation.PeerToPeerTrust
|
var trust v2reputation.PeerToPeerTrust
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package client
|
package client
|
||||||
|
|
||||||
import "github.com/nspcc-dev/neofs-api-go/v2/session"
|
import "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
|
|
||||||
// ResponseMetaInfo groups meta information about any NeoFS API response.
|
// ResponseMetaInfo groups meta information about any FrostFS API response.
|
||||||
type ResponseMetaInfo struct {
|
type ResponseMetaInfo struct {
|
||||||
key []byte
|
key []byte
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ func (x ResponseMetaInfo) ResponderKey() []byte {
|
||||||
return x.key
|
return x.key
|
||||||
}
|
}
|
||||||
|
|
||||||
// Epoch returns local NeoFS epoch of the server.
|
// Epoch returns local FrostFS epoch of the server.
|
||||||
func (x ResponseMetaInfo) Epoch() uint64 {
|
func (x ResponseMetaInfo) Epoch() uint64 {
|
||||||
return x.epoch
|
return x.epoch
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,11 +4,11 @@ import (
|
||||||
"context"
|
"context"
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
rpcapi "github.com/nspcc-dev/neofs-api-go/v2/rpc"
|
rpcapi "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/client"
|
||||||
v2session "github.com/nspcc-dev/neofs-api-go/v2/session"
|
v2session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/user"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PrmSessionCreate groups parameters of SessionCreate operation.
|
// PrmSessionCreate groups parameters of SessionCreate operation.
|
||||||
|
@ -46,7 +46,7 @@ func (x *ResSessionCreate) setID(id []byte) {
|
||||||
x.id = id
|
x.id = id
|
||||||
}
|
}
|
||||||
|
|
||||||
// ID returns identifier of the opened session in a binary NeoFS API protocol format.
|
// ID returns identifier of the opened session in a binary FrostFS API protocol format.
|
||||||
//
|
//
|
||||||
// Client doesn't retain value so modification is safe.
|
// Client doesn't retain value so modification is safe.
|
||||||
func (x ResSessionCreate) ID() []byte {
|
func (x ResSessionCreate) ID() []byte {
|
||||||
|
@ -57,7 +57,7 @@ func (x *ResSessionCreate) setSessionKey(key []byte) {
|
||||||
x.sessionKey = key
|
x.sessionKey = key
|
||||||
}
|
}
|
||||||
|
|
||||||
// PublicKey returns public key of the opened session in a binary NeoFS API protocol format.
|
// PublicKey returns public key of the opened session in a binary FrostFS API protocol format.
|
||||||
func (x ResSessionCreate) PublicKey() []byte {
|
func (x ResSessionCreate) PublicKey() []byte {
|
||||||
return x.sessionKey
|
return x.sessionKey
|
||||||
}
|
}
|
||||||
|
@ -68,11 +68,11 @@ func (x ResSessionCreate) PublicKey() []byte {
|
||||||
//
|
//
|
||||||
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
// Exactly one return value is non-nil. By default, server status is returned in res structure.
|
||||||
// Any client's internal or transport errors are returned as `error`.
|
// Any client's internal or transport errors are returned as `error`.
|
||||||
// If PrmInit.ResolveNeoFSFailures has been called, unsuccessful
|
// If PrmInit.ResolveFrostFSFailures has been called, unsuccessful
|
||||||
// NeoFS status codes are returned as `error`, otherwise, are included
|
// FrostFS status codes are returned as `error`, otherwise, are included
|
||||||
// in the returned result structure.
|
// in the returned result structure.
|
||||||
//
|
//
|
||||||
// Immediately panics if parameters are set incorrectly (see PrmSessionCreate docs).
|
// Returns an error if parameters are set incorrectly (see PrmSessionCreate docs).
|
||||||
// Context is required and must not be nil. It is used for network communication.
|
// Context is required and must not be nil. It is used for network communication.
|
||||||
//
|
//
|
||||||
// Return statuses:
|
// Return statuses:
|
||||||
|
@ -80,7 +80,7 @@ func (x ResSessionCreate) PublicKey() []byte {
|
||||||
func (c *Client) SessionCreate(ctx context.Context, prm PrmSessionCreate) (*ResSessionCreate, error) {
|
func (c *Client) SessionCreate(ctx context.Context, prm PrmSessionCreate) (*ResSessionCreate, error) {
|
||||||
// check context
|
// check context
|
||||||
if ctx == nil {
|
if ctx == nil {
|
||||||
panic(panicMsgMissingContext)
|
return nil, errorMissingContext
|
||||||
}
|
}
|
||||||
|
|
||||||
ownerKey := c.prm.key.PublicKey
|
ownerKey := c.prm.key.PublicKey
|
||||||
|
|
|
@ -3,7 +3,7 @@ package apistatus
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/status"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ServerInternal describes failure statuses related to internal server errors.
|
// ServerInternal describes failure statuses related to internal server errors.
|
||||||
|
@ -130,10 +130,17 @@ type SignatureVerification struct {
|
||||||
v2 status.Status
|
v2 status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultSignatureVerificationMsg = "signature verification failed"
|
||||||
|
|
||||||
func (x SignatureVerification) Error() string {
|
func (x SignatureVerification) Error() string {
|
||||||
|
msg := x.v2.Message()
|
||||||
|
if msg == "" {
|
||||||
|
msg = defaultSignatureVerificationMsg
|
||||||
|
}
|
||||||
|
|
||||||
return errMessageStatusV2(
|
return errMessageStatusV2(
|
||||||
globalizeCodeV2(status.SignatureVerificationFail, status.GlobalizeCommonFail),
|
globalizeCodeV2(status.SignatureVerificationFail, status.GlobalizeCommonFail),
|
||||||
x.v2.Message(),
|
msg,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,7 +160,7 @@ func (x SignatureVerification) ToStatusV2() *status.Status {
|
||||||
x.v2.SetCode(globalizeCodeV2(status.SignatureVerificationFail, status.GlobalizeCommonFail))
|
x.v2.SetCode(globalizeCodeV2(status.SignatureVerificationFail, status.GlobalizeCommonFail))
|
||||||
|
|
||||||
if x.v2.Message() == "" {
|
if x.v2.Message() == "" {
|
||||||
x.v2.SetMessage("signature verification failed")
|
x.v2.SetMessage(defaultSignatureVerificationMsg)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &x.v2
|
return &x.v2
|
||||||
|
@ -181,11 +188,13 @@ type NodeUnderMaintenance struct {
|
||||||
v2 status.Status
|
v2 status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultNodeUnderMaintenanceMsg = "node is under maintenance"
|
||||||
|
|
||||||
// Error implements the error interface.
|
// Error implements the error interface.
|
||||||
func (x NodeUnderMaintenance) Error() string {
|
func (x NodeUnderMaintenance) Error() string {
|
||||||
msg := x.Message()
|
msg := x.Message()
|
||||||
if msg == "" {
|
if msg == "" {
|
||||||
msg = "node is under maintenance"
|
msg = defaultNodeUnderMaintenanceMsg
|
||||||
}
|
}
|
||||||
|
|
||||||
return errMessageStatusV2(
|
return errMessageStatusV2(
|
||||||
|
@ -202,10 +211,15 @@ func (x *NodeUnderMaintenance) fromStatusV2(st *status.Status) {
|
||||||
// If the value was returned by FromStatusV2, returns the source message.
|
// If the value was returned by FromStatusV2, returns the source message.
|
||||||
// Otherwise, returns message with
|
// Otherwise, returns message with
|
||||||
// - code: NODE_UNDER_MAINTENANCE;
|
// - code: NODE_UNDER_MAINTENANCE;
|
||||||
// - string message: written message via SetMessage;
|
// - string message: written message via SetMessage or
|
||||||
|
// "node is under maintenance" as a default message;
|
||||||
// - details: empty.
|
// - details: empty.
|
||||||
func (x NodeUnderMaintenance) ToStatusV2() *status.Status {
|
func (x NodeUnderMaintenance) ToStatusV2() *status.Status {
|
||||||
x.v2.SetCode(globalizeCodeV2(status.NodeUnderMaintenance, status.GlobalizeCommonFail))
|
x.v2.SetCode(globalizeCodeV2(status.NodeUnderMaintenance, status.GlobalizeCommonFail))
|
||||||
|
if x.v2.Message() == "" {
|
||||||
|
x.v2.SetMessage(defaultNodeUnderMaintenanceMsg)
|
||||||
|
}
|
||||||
|
|
||||||
return &x.v2
|
return &x.v2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,8 @@ package apistatus_test
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/status"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status"
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package apistatus
|
package apistatus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/container"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/status"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ContainerNotFound describes status of the failure because of the missing container.
|
// ContainerNotFound describes status of the failure because of the missing container.
|
||||||
|
@ -11,10 +11,17 @@ type ContainerNotFound struct {
|
||||||
v2 status.Status
|
v2 status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultContainerNotFoundMsg = "container not found"
|
||||||
|
|
||||||
func (x ContainerNotFound) Error() string {
|
func (x ContainerNotFound) Error() string {
|
||||||
|
msg := x.v2.Message()
|
||||||
|
if msg == "" {
|
||||||
|
msg = defaultContainerNotFoundMsg
|
||||||
|
}
|
||||||
|
|
||||||
return errMessageStatusV2(
|
return errMessageStatusV2(
|
||||||
globalizeCodeV2(container.StatusNotFound, container.GlobalizeFail),
|
globalizeCodeV2(container.StatusNotFound, container.GlobalizeFail),
|
||||||
x.v2.Message(),
|
msg,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +38,7 @@ func (x *ContainerNotFound) fromStatusV2(st *status.Status) {
|
||||||
// - details: empty.
|
// - details: empty.
|
||||||
func (x ContainerNotFound) ToStatusV2() *status.Status {
|
func (x ContainerNotFound) ToStatusV2() *status.Status {
|
||||||
x.v2.SetCode(globalizeCodeV2(container.StatusNotFound, container.GlobalizeFail))
|
x.v2.SetCode(globalizeCodeV2(container.StatusNotFound, container.GlobalizeFail))
|
||||||
x.v2.SetMessage("container not found")
|
x.v2.SetMessage(defaultContainerNotFoundMsg)
|
||||||
return &x.v2
|
return &x.v2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,10 +49,17 @@ type EACLNotFound struct {
|
||||||
v2 status.Status
|
v2 status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultEACLNotFoundMsg = "eACL not found"
|
||||||
|
|
||||||
func (x EACLNotFound) Error() string {
|
func (x EACLNotFound) Error() string {
|
||||||
|
msg := x.v2.Message()
|
||||||
|
if msg == "" {
|
||||||
|
msg = defaultEACLNotFoundMsg
|
||||||
|
}
|
||||||
|
|
||||||
return errMessageStatusV2(
|
return errMessageStatusV2(
|
||||||
globalizeCodeV2(container.StatusEACLNotFound, container.GlobalizeFail),
|
globalizeCodeV2(container.StatusEACLNotFound, container.GlobalizeFail),
|
||||||
x.v2.Message(),
|
msg,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,6 +76,6 @@ func (x *EACLNotFound) fromStatusV2(st *status.Status) {
|
||||||
// - details: empty.
|
// - details: empty.
|
||||||
func (x EACLNotFound) ToStatusV2() *status.Status {
|
func (x EACLNotFound) ToStatusV2() *status.Status {
|
||||||
x.v2.SetCode(globalizeCodeV2(container.StatusEACLNotFound, container.GlobalizeFail))
|
x.v2.SetCode(globalizeCodeV2(container.StatusEACLNotFound, container.GlobalizeFail))
|
||||||
x.v2.SetMessage("eACL not found")
|
x.v2.SetMessage(defaultEACLNotFoundMsg)
|
||||||
return &x.v2
|
return &x.v2
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package apistatus
|
package apistatus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/object"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/status"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ObjectLocked describes status of the failure because of the locked object.
|
// ObjectLocked describes status of the failure because of the locked object.
|
||||||
|
@ -11,10 +11,17 @@ type ObjectLocked struct {
|
||||||
v2 status.Status
|
v2 status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultObjectLockedMsg = "object is locked"
|
||||||
|
|
||||||
func (x ObjectLocked) Error() string {
|
func (x ObjectLocked) Error() string {
|
||||||
|
msg := x.v2.Message()
|
||||||
|
if msg == "" {
|
||||||
|
msg = defaultObjectLockedMsg
|
||||||
|
}
|
||||||
|
|
||||||
return errMessageStatusV2(
|
return errMessageStatusV2(
|
||||||
globalizeCodeV2(object.StatusLocked, object.GlobalizeFail),
|
globalizeCodeV2(object.StatusLocked, object.GlobalizeFail),
|
||||||
x.v2.Message(),
|
msg,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +38,7 @@ func (x *ObjectLocked) fromStatusV2(st *status.Status) {
|
||||||
// - details: empty.
|
// - details: empty.
|
||||||
func (x ObjectLocked) ToStatusV2() *status.Status {
|
func (x ObjectLocked) ToStatusV2() *status.Status {
|
||||||
x.v2.SetCode(globalizeCodeV2(object.StatusLocked, object.GlobalizeFail))
|
x.v2.SetCode(globalizeCodeV2(object.StatusLocked, object.GlobalizeFail))
|
||||||
x.v2.SetMessage("object is locked")
|
x.v2.SetMessage(defaultObjectLockedMsg)
|
||||||
return &x.v2
|
return &x.v2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,10 +48,17 @@ type LockNonRegularObject struct {
|
||||||
v2 status.Status
|
v2 status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultLockNonRegularObjectMsg = "locking non-regular object is forbidden"
|
||||||
|
|
||||||
func (x LockNonRegularObject) Error() string {
|
func (x LockNonRegularObject) Error() string {
|
||||||
|
msg := x.v2.Message()
|
||||||
|
if msg == "" {
|
||||||
|
msg = defaultLockNonRegularObjectMsg
|
||||||
|
}
|
||||||
|
|
||||||
return errMessageStatusV2(
|
return errMessageStatusV2(
|
||||||
globalizeCodeV2(object.StatusLockNonRegularObject, object.GlobalizeFail),
|
globalizeCodeV2(object.StatusLockNonRegularObject, object.GlobalizeFail),
|
||||||
x.v2.Message(),
|
msg,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,7 +75,7 @@ func (x *LockNonRegularObject) fromStatusV2(st *status.Status) {
|
||||||
// - details: empty.
|
// - details: empty.
|
||||||
func (x LockNonRegularObject) ToStatusV2() *status.Status {
|
func (x LockNonRegularObject) ToStatusV2() *status.Status {
|
||||||
x.v2.SetCode(globalizeCodeV2(object.StatusLockNonRegularObject, object.GlobalizeFail))
|
x.v2.SetCode(globalizeCodeV2(object.StatusLockNonRegularObject, object.GlobalizeFail))
|
||||||
x.v2.SetMessage("locking non-regular object is forbidden")
|
x.v2.SetMessage(defaultLockNonRegularObjectMsg)
|
||||||
return &x.v2
|
return &x.v2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,10 +85,17 @@ type ObjectAccessDenied struct {
|
||||||
v2 status.Status
|
v2 status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultObjectAccessDeniedMsg = "access to object operation denied"
|
||||||
|
|
||||||
func (x ObjectAccessDenied) Error() string {
|
func (x ObjectAccessDenied) Error() string {
|
||||||
|
msg := x.v2.Message()
|
||||||
|
if msg == "" {
|
||||||
|
msg = defaultObjectAccessDeniedMsg
|
||||||
|
}
|
||||||
|
|
||||||
return errMessageStatusV2(
|
return errMessageStatusV2(
|
||||||
globalizeCodeV2(object.StatusAccessDenied, object.GlobalizeFail),
|
globalizeCodeV2(object.StatusAccessDenied, object.GlobalizeFail),
|
||||||
x.v2.Message(),
|
msg,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,7 +112,7 @@ func (x *ObjectAccessDenied) fromStatusV2(st *status.Status) {
|
||||||
// - details: empty.
|
// - details: empty.
|
||||||
func (x ObjectAccessDenied) ToStatusV2() *status.Status {
|
func (x ObjectAccessDenied) ToStatusV2() *status.Status {
|
||||||
x.v2.SetCode(globalizeCodeV2(object.StatusAccessDenied, object.GlobalizeFail))
|
x.v2.SetCode(globalizeCodeV2(object.StatusAccessDenied, object.GlobalizeFail))
|
||||||
x.v2.SetMessage("access to object operation denied")
|
x.v2.SetMessage(defaultObjectAccessDeniedMsg)
|
||||||
return &x.v2
|
return &x.v2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,10 +133,17 @@ type ObjectNotFound struct {
|
||||||
v2 status.Status
|
v2 status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultObjectNotFoundMsg = "object not found"
|
||||||
|
|
||||||
func (x ObjectNotFound) Error() string {
|
func (x ObjectNotFound) Error() string {
|
||||||
|
msg := x.v2.Message()
|
||||||
|
if msg == "" {
|
||||||
|
msg = defaultObjectNotFoundMsg
|
||||||
|
}
|
||||||
|
|
||||||
return errMessageStatusV2(
|
return errMessageStatusV2(
|
||||||
globalizeCodeV2(object.StatusNotFound, object.GlobalizeFail),
|
globalizeCodeV2(object.StatusNotFound, object.GlobalizeFail),
|
||||||
x.v2.Message(),
|
msg,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,7 +160,7 @@ func (x *ObjectNotFound) fromStatusV2(st *status.Status) {
|
||||||
// - details: empty.
|
// - details: empty.
|
||||||
func (x ObjectNotFound) ToStatusV2() *status.Status {
|
func (x ObjectNotFound) ToStatusV2() *status.Status {
|
||||||
x.v2.SetCode(globalizeCodeV2(object.StatusNotFound, object.GlobalizeFail))
|
x.v2.SetCode(globalizeCodeV2(object.StatusNotFound, object.GlobalizeFail))
|
||||||
x.v2.SetMessage("object not found")
|
x.v2.SetMessage(defaultObjectNotFoundMsg)
|
||||||
return &x.v2
|
return &x.v2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,10 +170,17 @@ type ObjectAlreadyRemoved struct {
|
||||||
v2 status.Status
|
v2 status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultObjectAlreadyRemovedMsg = "object already removed"
|
||||||
|
|
||||||
func (x ObjectAlreadyRemoved) Error() string {
|
func (x ObjectAlreadyRemoved) Error() string {
|
||||||
|
msg := x.v2.Message()
|
||||||
|
if msg == "" {
|
||||||
|
msg = defaultObjectAlreadyRemovedMsg
|
||||||
|
}
|
||||||
|
|
||||||
return errMessageStatusV2(
|
return errMessageStatusV2(
|
||||||
globalizeCodeV2(object.StatusAlreadyRemoved, object.GlobalizeFail),
|
globalizeCodeV2(object.StatusAlreadyRemoved, object.GlobalizeFail),
|
||||||
x.v2.Message(),
|
msg,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,7 +197,7 @@ func (x *ObjectAlreadyRemoved) fromStatusV2(st *status.Status) {
|
||||||
// - details: empty.
|
// - details: empty.
|
||||||
func (x ObjectAlreadyRemoved) ToStatusV2() *status.Status {
|
func (x ObjectAlreadyRemoved) ToStatusV2() *status.Status {
|
||||||
x.v2.SetCode(globalizeCodeV2(object.StatusAlreadyRemoved, object.GlobalizeFail))
|
x.v2.SetCode(globalizeCodeV2(object.StatusAlreadyRemoved, object.GlobalizeFail))
|
||||||
x.v2.SetMessage("object already removed")
|
x.v2.SetMessage(defaultObjectAlreadyRemovedMsg)
|
||||||
return &x.v2
|
return &x.v2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,10 +208,17 @@ type ObjectOutOfRange struct {
|
||||||
v2 status.Status
|
v2 status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultObjectOutOfRangeMsg = "out of range"
|
||||||
|
|
||||||
func (x ObjectOutOfRange) Error() string {
|
func (x ObjectOutOfRange) Error() string {
|
||||||
|
msg := x.v2.Message()
|
||||||
|
if msg == "" {
|
||||||
|
msg = defaultObjectOutOfRangeMsg
|
||||||
|
}
|
||||||
|
|
||||||
return errMessageStatusV2(
|
return errMessageStatusV2(
|
||||||
globalizeCodeV2(object.StatusOutOfRange, object.GlobalizeFail),
|
globalizeCodeV2(object.StatusOutOfRange, object.GlobalizeFail),
|
||||||
x.v2.Message(),
|
msg,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,6 +235,6 @@ func (x *ObjectOutOfRange) fromStatusV2(st *status.Status) {
|
||||||
// - details: empty.
|
// - details: empty.
|
||||||
func (x ObjectOutOfRange) ToStatusV2() *status.Status {
|
func (x ObjectOutOfRange) ToStatusV2() *status.Status {
|
||||||
x.v2.SetCode(globalizeCodeV2(object.StatusOutOfRange, object.GlobalizeFail))
|
x.v2.SetCode(globalizeCodeV2(object.StatusOutOfRange, object.GlobalizeFail))
|
||||||
x.v2.SetMessage("out of range")
|
x.v2.SetMessage(defaultObjectOutOfRangeMsg)
|
||||||
return &x.v2
|
return &x.v2
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@ package apistatus_test
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package apistatus
|
package apistatus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/session"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/status"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SessionTokenNotFound describes status of the failure because of the missing session token.
|
// SessionTokenNotFound describes status of the failure because of the missing session token.
|
||||||
|
@ -11,10 +11,17 @@ type SessionTokenNotFound struct {
|
||||||
v2 status.Status
|
v2 status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultSessionTokenNotFoundMsg = "session token not found"
|
||||||
|
|
||||||
func (x SessionTokenNotFound) Error() string {
|
func (x SessionTokenNotFound) Error() string {
|
||||||
|
msg := x.v2.Message()
|
||||||
|
if msg == "" {
|
||||||
|
msg = defaultSessionTokenNotFoundMsg
|
||||||
|
}
|
||||||
|
|
||||||
return errMessageStatusV2(
|
return errMessageStatusV2(
|
||||||
globalizeCodeV2(session.StatusTokenNotFound, session.GlobalizeFail),
|
globalizeCodeV2(session.StatusTokenNotFound, session.GlobalizeFail),
|
||||||
x.v2.Message(),
|
msg,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +38,7 @@ func (x *SessionTokenNotFound) fromStatusV2(st *status.Status) {
|
||||||
// - details: empty.
|
// - details: empty.
|
||||||
func (x SessionTokenNotFound) ToStatusV2() *status.Status {
|
func (x SessionTokenNotFound) ToStatusV2() *status.Status {
|
||||||
x.v2.SetCode(globalizeCodeV2(session.StatusTokenNotFound, session.GlobalizeFail))
|
x.v2.SetCode(globalizeCodeV2(session.StatusTokenNotFound, session.GlobalizeFail))
|
||||||
x.v2.SetMessage("session token not found")
|
x.v2.SetMessage(defaultSessionTokenNotFoundMsg)
|
||||||
return &x.v2
|
return &x.v2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,10 +48,17 @@ type SessionTokenExpired struct {
|
||||||
v2 status.Status
|
v2 status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const defaultSessionTokenExpiredMsg = "expired session token"
|
||||||
|
|
||||||
func (x SessionTokenExpired) Error() string {
|
func (x SessionTokenExpired) Error() string {
|
||||||
|
msg := x.v2.Message()
|
||||||
|
if msg == "" {
|
||||||
|
msg = defaultSessionTokenExpiredMsg
|
||||||
|
}
|
||||||
|
|
||||||
return errMessageStatusV2(
|
return errMessageStatusV2(
|
||||||
globalizeCodeV2(session.StatusTokenExpired, session.GlobalizeFail),
|
globalizeCodeV2(session.StatusTokenExpired, session.GlobalizeFail),
|
||||||
x.v2.Message(),
|
msg,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,6 +75,6 @@ func (x *SessionTokenExpired) fromStatusV2(st *status.Status) {
|
||||||
// - details: empty.
|
// - details: empty.
|
||||||
func (x SessionTokenExpired) ToStatusV2() *status.Status {
|
func (x SessionTokenExpired) ToStatusV2() *status.Status {
|
||||||
x.v2.SetCode(globalizeCodeV2(session.StatusTokenExpired, session.GlobalizeFail))
|
x.v2.SetCode(globalizeCodeV2(session.StatusTokenExpired, session.GlobalizeFail))
|
||||||
x.v2.SetMessage("expired session token")
|
x.v2.SetMessage(defaultSessionTokenExpiredMsg)
|
||||||
return &x.v2
|
return &x.v2
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package apistatus
|
package apistatus
|
||||||
|
|
||||||
// Status defines a variety of NeoFS API status returns.
|
// Status defines a variety of FrostFS API status returns.
|
||||||
//
|
//
|
||||||
// All statuses are split into two disjoint subsets: successful and failed, and:
|
// All statuses are split into two disjoint subsets: successful and failed, and:
|
||||||
// - statuses that implement the build-in error interface are considered failed statuses;
|
// - statuses that implement the build-in error interface are considered failed statuses;
|
||||||
|
@ -14,7 +14,7 @@ package apistatus
|
||||||
// IsSuccessful function should be used (try to avoid nil comparison).
|
// IsSuccessful function should be used (try to avoid nil comparison).
|
||||||
// It should be noted that using direct typecasting is not a compatible approach.
|
// It should be noted that using direct typecasting is not a compatible approach.
|
||||||
//
|
//
|
||||||
// To transport statuses using the NeoFS API V2 protocol, see StatusV2 interface and FromStatusV2 and ToStatusV2 functions.
|
// To transport statuses using the FrostFS API V2 protocol, see StatusV2 interface and FromStatusV2 and ToStatusV2 functions.
|
||||||
type Status interface{}
|
type Status interface{}
|
||||||
|
|
||||||
// ErrFromStatus converts Status instance to error if it is failed. Returns nil on successful Status.
|
// ErrFromStatus converts Status instance to error if it is failed. Returns nil on successful Status.
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package apistatus
|
package apistatus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/status"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SuccessDefaultV2 represents Status instance of default success. Implements StatusV2.
|
// SuccessDefaultV2 represents Status instance of default success. Implements StatusV2.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package apistatus
|
package apistatus
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/status"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
type unrecognizedStatusV2 struct {
|
type unrecognizedStatusV2 struct {
|
||||||
|
|
|
@ -3,19 +3,19 @@ package apistatus
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/container"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/object"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/session"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/status"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status"
|
||||||
)
|
)
|
||||||
|
|
||||||
// StatusV2 defines a variety of Status instances compatible with NeoFS API V2 protocol.
|
// StatusV2 defines a variety of Status instances compatible with FrostFS API V2 protocol.
|
||||||
//
|
//
|
||||||
// Note: it is not recommended to use this type directly, it is intended for documentation of the library functionality.
|
// Note: it is not recommended to use this type directly, it is intended for documentation of the library functionality.
|
||||||
type StatusV2 interface {
|
type StatusV2 interface {
|
||||||
Status
|
Status
|
||||||
|
|
||||||
// ToStatusV2 returns the status as github.com/nspcc-dev/neofs-api-go/v2/status.Status message structure.
|
// ToStatusV2 returns the status as git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status.Status message structure.
|
||||||
ToStatusV2() *status.Status
|
ToStatusV2() *status.Status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -6,9 +6,9 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Basic represents basic part of the NeoFS container's ACL. It includes
|
// Basic represents basic part of the FrostFS container's ACL. It includes
|
||||||
// common (pretty simple) access rules for operations inside the container.
|
// common (pretty simple) access rules for operations inside the container.
|
||||||
// See NeoFS Specification for details.
|
// See FrostFS Specification for details.
|
||||||
//
|
//
|
||||||
// One can find some similarities with the traditional Unix permission, such as
|
// One can find some similarities with the traditional Unix permission, such as
|
||||||
//
|
//
|
||||||
|
@ -236,7 +236,7 @@ const (
|
||||||
NamePublicAppendExtended = "eacl-public-append"
|
NamePublicAppendExtended = "eacl-public-append"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Frequently used Basic values. Bitmasks are taken from the NeoFS Specification.
|
// Frequently used Basic values. Bitmasks are taken from the FrostFS Specification.
|
||||||
const (
|
const (
|
||||||
Private = Basic(0x1C8C8CCC) // private
|
Private = Basic(0x1C8C8CCC) // private
|
||||||
PrivateExtended = Basic(0x0C8C8CCC) // eacl-private
|
PrivateExtended = Basic(0x0C8C8CCC) // eacl-private
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
Package acl provides functionality to control access to data and operations on them in NeoFS containers.
|
Package acl provides functionality to control access to data and operations on them in FrostFS containers.
|
||||||
|
|
||||||
Type Basic represents basic ACL of the NeoFS container which specifies the general order of data access.
|
Type Basic represents basic ACL of the FrostFS container which specifies the general order of data access.
|
||||||
Basic provides interface of rule composition. Package acl also exports some frequently used settings like
|
Basic provides interface of rule composition. Package acl also exports some frequently used settings like
|
||||||
private or public.
|
private or public.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -8,36 +8,36 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container"
|
||||||
|
v2netmap "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/acl"
|
||||||
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
|
frostfscrypto "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto"
|
||||||
|
frostfsecdsa "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto/ecdsa"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
|
||||||
|
subnetid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/subnet/id"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/container"
|
|
||||||
v2netmap "github.com/nspcc-dev/neofs-api-go/v2/netmap"
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/container/acl"
|
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
|
||||||
neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto"
|
|
||||||
neofsecdsa "github.com/nspcc-dev/neofs-sdk-go/crypto/ecdsa"
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/netmap"
|
|
||||||
subnetid "github.com/nspcc-dev/neofs-sdk-go/subnet/id"
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/user"
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/version"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Container represents descriptor of the NeoFS container. Container logically
|
// Container represents descriptor of the FrostFS container. Container logically
|
||||||
// stores NeoFS objects. Container is one of the basic and at the same time
|
// stores FrostFS objects. Container is one of the basic and at the same time
|
||||||
// necessary data storage units in the NeoFS. Container includes data about the
|
// necessary data storage units in the FrostFS. Container includes data about the
|
||||||
// owner, rules for placing objects and other information necessary for the
|
// owner, rules for placing objects and other information necessary for the
|
||||||
// system functioning.
|
// system functioning.
|
||||||
//
|
//
|
||||||
// Container type instances can represent different container states in the
|
// Container type instances can represent different container states in the
|
||||||
// system, depending on the context. To create new container in NeoFS zero
|
// system, depending on the context. To create new container in FrostFS zero
|
||||||
// instance SHOULD be declared, initialized using Init method and filled using
|
// instance SHOULD be declared, initialized using Init method and filled using
|
||||||
// dedicated methods. Once container is saved in the NeoFS network, it can't be
|
// dedicated methods. Once container is saved in the FrostFS network, it can't be
|
||||||
// changed: containers stored in the system are immutable, and NeoFS is a CAS
|
// changed: containers stored in the system are immutable, and FrostFS is a CAS
|
||||||
// of containers that are identified by a fixed length value (see cid.ID type).
|
// of containers that are identified by a fixed length value (see cid.ID type).
|
||||||
// Instances for existing containers can be initialized using decoding methods
|
// Instances for existing containers can be initialized using decoding methods
|
||||||
// (e.g Unmarshal).
|
// (e.g Unmarshal).
|
||||||
//
|
//
|
||||||
// Container is mutually compatible with github.com/nspcc-dev/neofs-api-go/v2/container.Container
|
// Container is mutually compatible with git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container.Container
|
||||||
// message. See ReadFromV2 / WriteToV2 methods.
|
// message. See ReadFromV2 / WriteToV2 methods.
|
||||||
type Container struct {
|
type Container struct {
|
||||||
v2 container.Container
|
v2 container.Container
|
||||||
|
@ -137,7 +137,7 @@ func (x *Container) readFromV2(m container.Container, checkFieldPresence bool) e
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadFromV2 reads Container from the container.Container message. Checks if the
|
// ReadFromV2 reads Container from the container.Container message. Checks if the
|
||||||
// message conforms to NeoFS API V2 protocol.
|
// message conforms to FrostFS API V2 protocol.
|
||||||
//
|
//
|
||||||
// See also WriteToV2.
|
// See also WriteToV2.
|
||||||
func (x *Container) ReadFromV2(m container.Container) error {
|
func (x *Container) ReadFromV2(m container.Container) error {
|
||||||
|
@ -152,7 +152,7 @@ func (x Container) WriteToV2(m *container.Container) {
|
||||||
*m = x.v2
|
*m = x.v2
|
||||||
}
|
}
|
||||||
|
|
||||||
// Marshal encodes Container into a binary format of the NeoFS API protocol
|
// Marshal encodes Container into a binary format of the FrostFS API protocol
|
||||||
// (Protocol Buffers with direct field order).
|
// (Protocol Buffers with direct field order).
|
||||||
//
|
//
|
||||||
// See also Unmarshal.
|
// See also Unmarshal.
|
||||||
|
@ -160,7 +160,7 @@ func (x Container) Marshal() []byte {
|
||||||
return x.v2.StableMarshal(nil)
|
return x.v2.StableMarshal(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Unmarshal decodes NeoFS API protocol binary format into the Container
|
// Unmarshal decodes FrostFS API protocol binary format into the Container
|
||||||
// (Protocol Buffers with direct field order). Returns an error describing
|
// (Protocol Buffers with direct field order). Returns an error describing
|
||||||
// a format violation.
|
// a format violation.
|
||||||
//
|
//
|
||||||
|
@ -176,7 +176,7 @@ func (x *Container) Unmarshal(data []byte) error {
|
||||||
return x.readFromV2(m, false)
|
return x.readFromV2(m, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalJSON encodes Container into a JSON format of the NeoFS API protocol
|
// MarshalJSON encodes Container into a JSON format of the FrostFS API protocol
|
||||||
// (Protocol Buffers JSON).
|
// (Protocol Buffers JSON).
|
||||||
//
|
//
|
||||||
// See also UnmarshalJSON.
|
// See also UnmarshalJSON.
|
||||||
|
@ -184,7 +184,7 @@ func (x Container) MarshalJSON() ([]byte, error) {
|
||||||
return x.v2.MarshalJSON()
|
return x.v2.MarshalJSON()
|
||||||
}
|
}
|
||||||
|
|
||||||
// UnmarshalJSON decodes NeoFS API protocol JSON format into the Container
|
// UnmarshalJSON decodes FrostFS API protocol JSON format into the Container
|
||||||
// (Protocol Buffers JSON). Returns an error describing a format violation.
|
// (Protocol Buffers JSON). Returns an error describing a format violation.
|
||||||
//
|
//
|
||||||
// See also MarshalJSON.
|
// See also MarshalJSON.
|
||||||
|
@ -192,7 +192,7 @@ func (x *Container) UnmarshalJSON(data []byte) error {
|
||||||
return x.v2.UnmarshalJSON(data)
|
return x.v2.UnmarshalJSON(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Init initializes all internal data of the Container required by NeoFS API
|
// Init initializes all internal data of the Container required by FrostFS API
|
||||||
// protocol. Init MUST be called when creating a new container. Init SHOULD NOT
|
// protocol. Init MUST be called when creating a new container. Init SHOULD NOT
|
||||||
// be called multiple times. Init SHOULD NOT be called if the Container instance
|
// be called multiple times. Init SHOULD NOT be called if the Container instance
|
||||||
// is used for decoding only.
|
// is used for decoding only.
|
||||||
|
@ -212,7 +212,7 @@ func (x *Container) Init() {
|
||||||
|
|
||||||
// SetOwner specifies the owner of the Container. Each Container has exactly
|
// SetOwner specifies the owner of the Container. Each Container has exactly
|
||||||
// one owner, so SetOwner MUST be called for instances to be saved in the
|
// one owner, so SetOwner MUST be called for instances to be saved in the
|
||||||
// NeoFS.
|
// FrostFS.
|
||||||
//
|
//
|
||||||
// See also Owner.
|
// See also Owner.
|
||||||
func (x *Container) SetOwner(owner user.ID) {
|
func (x *Container) SetOwner(owner user.ID) {
|
||||||
|
@ -224,7 +224,7 @@ func (x *Container) SetOwner(owner user.ID) {
|
||||||
|
|
||||||
// Owner returns owner of the Container set using SetOwner.
|
// Owner returns owner of the Container set using SetOwner.
|
||||||
//
|
//
|
||||||
// Zero Container has no owner which is incorrect according to NeoFS API
|
// Zero Container has no owner which is incorrect according to FrostFS API
|
||||||
// protocol.
|
// protocol.
|
||||||
func (x Container) Owner() (res user.ID) {
|
func (x Container) Owner() (res user.ID) {
|
||||||
m := x.v2.GetOwnerID()
|
m := x.v2.GetOwnerID()
|
||||||
|
@ -256,7 +256,7 @@ func (x Container) BasicACL() (res acl.Basic) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetPlacementPolicy sets placement policy for the objects within the Container.
|
// SetPlacementPolicy sets placement policy for the objects within the Container.
|
||||||
// NeoFS storage layer strives to follow the specified policy.
|
// FrostFS storage layer strives to follow the specified policy.
|
||||||
//
|
//
|
||||||
// See also PlacementPolicy.
|
// See also PlacementPolicy.
|
||||||
func (x *Container) SetPlacementPolicy(policy netmap.PlacementPolicy) {
|
func (x *Container) SetPlacementPolicy(policy netmap.PlacementPolicy) {
|
||||||
|
@ -269,7 +269,7 @@ func (x *Container) SetPlacementPolicy(policy netmap.PlacementPolicy) {
|
||||||
// PlacementPolicy returns placement policy set using SetPlacementPolicy.
|
// PlacementPolicy returns placement policy set using SetPlacementPolicy.
|
||||||
//
|
//
|
||||||
// Zero Container has no placement policy which is incorrect according to
|
// Zero Container has no placement policy which is incorrect according to
|
||||||
// NeoFS API protocol.
|
// FrostFS API protocol.
|
||||||
func (x Container) PlacementPolicy() (res netmap.PlacementPolicy) {
|
func (x Container) PlacementPolicy() (res netmap.PlacementPolicy) {
|
||||||
m := x.v2.GetPlacementPolicy()
|
m := x.v2.GetPlacementPolicy()
|
||||||
if m != nil {
|
if m != nil {
|
||||||
|
@ -284,7 +284,7 @@ func (x Container) PlacementPolicy() (res netmap.PlacementPolicy) {
|
||||||
|
|
||||||
// SetAttribute sets Container attribute value by key. Both key and value
|
// SetAttribute sets Container attribute value by key. Both key and value
|
||||||
// MUST NOT be empty. Attributes set by the creator (owner) are most commonly
|
// MUST NOT be empty. Attributes set by the creator (owner) are most commonly
|
||||||
// ignored by the NeoFS system and used for application layer. Some attributes
|
// ignored by the FrostFS system and used for application layer. Some attributes
|
||||||
// are so-called system or well-known attributes: they are reserved for system
|
// are so-called system or well-known attributes: they are reserved for system
|
||||||
// needs. System attributes SHOULD NOT be modified using SetAttribute, use
|
// needs. System attributes SHOULD NOT be modified using SetAttribute, use
|
||||||
// corresponding methods/functions. List of the reserved keys is documented
|
// corresponding methods/functions. List of the reserved keys is documented
|
||||||
|
@ -383,7 +383,7 @@ func CreatedAt(cnr Container) time.Time {
|
||||||
return time.Unix(sec, 0)
|
return time.Unix(sec, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetSubnet places the Container on the specified NeoFS subnet. If called,
|
// SetSubnet places the Container on the specified FrostFS subnet. If called,
|
||||||
// container nodes will only be selected from the given subnet, otherwise from
|
// container nodes will only be selected from the given subnet, otherwise from
|
||||||
// the entire network.
|
// the entire network.
|
||||||
func SetSubnet(cnr *Container, subNet subnetid.ID) {
|
func SetSubnet(cnr *Container, subNet subnetid.ID) {
|
||||||
|
@ -419,11 +419,12 @@ func DisableHomomorphicHashing(cnr *Container) {
|
||||||
//
|
//
|
||||||
// Zero Container has enabled hashing.
|
// Zero Container has enabled hashing.
|
||||||
func IsHomomorphicHashingDisabled(cnr Container) bool {
|
func IsHomomorphicHashingDisabled(cnr Container) bool {
|
||||||
return cnr.Attribute(container.SysAttributeHomomorphicHashing) == attributeHomoHashEnabled
|
return cnr.Attribute(container.SysAttributeHomomorphicHashing) == attributeHomoHashEnabled ||
|
||||||
|
cnr.Attribute(container.SysAttributeHomomorphicHashingNeoFS) == attributeHomoHashEnabled
|
||||||
}
|
}
|
||||||
|
|
||||||
// Domain represents information about container domain registered in the NNS
|
// Domain represents information about container domain registered in the NNS
|
||||||
// contract deployed in the NeoFS network.
|
// contract deployed in the FrostFS network.
|
||||||
type Domain struct {
|
type Domain struct {
|
||||||
name, zone string
|
name, zone string
|
||||||
}
|
}
|
||||||
|
@ -465,10 +466,12 @@ func WriteDomain(cnr *Container, domain Domain) {
|
||||||
// ReadDomain reads Domain from the Container. Returns value with empty name
|
// ReadDomain reads Domain from the Container. Returns value with empty name
|
||||||
// if domain is not specified.
|
// if domain is not specified.
|
||||||
func ReadDomain(cnr Container) (res Domain) {
|
func ReadDomain(cnr Container) (res Domain) {
|
||||||
name := cnr.Attribute(container.SysAttributeName)
|
if name := cnr.Attribute(container.SysAttributeName); name != "" {
|
||||||
if name != "" {
|
|
||||||
res.SetName(name)
|
res.SetName(name)
|
||||||
res.SetZone(cnr.Attribute(container.SysAttributeZone))
|
res.SetZone(cnr.Attribute(container.SysAttributeZone))
|
||||||
|
} else if name = cnr.Attribute(container.SysAttributeNameNeoFS); name != "" {
|
||||||
|
res.SetName(name)
|
||||||
|
res.SetZone(cnr.Attribute(container.SysAttributeZoneNeoFS))
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
|
@ -477,22 +480,22 @@ func ReadDomain(cnr Container) (res Domain) {
|
||||||
// CalculateSignature calculates signature of the Container using provided signer
|
// CalculateSignature calculates signature of the Container using provided signer
|
||||||
// and writes it into dst. Signature instance MUST NOT be nil. CalculateSignature
|
// and writes it into dst. Signature instance MUST NOT be nil. CalculateSignature
|
||||||
// is expected to be called after all the Container data is filled and before
|
// is expected to be called after all the Container data is filled and before
|
||||||
// saving the Container in the NeoFS network. Note that мany subsequent change
|
// saving the Container in the FrostFS network. Note that мany subsequent change
|
||||||
// will most likely break the signature.
|
// will most likely break the signature.
|
||||||
//
|
//
|
||||||
// See also VerifySignature.
|
// See also VerifySignature.
|
||||||
func CalculateSignature(dst *neofscrypto.Signature, cnr Container, signer ecdsa.PrivateKey) error {
|
func CalculateSignature(dst *frostfscrypto.Signature, cnr Container, signer ecdsa.PrivateKey) error {
|
||||||
return dst.Calculate(neofsecdsa.SignerRFC6979(signer), cnr.Marshal())
|
return dst.Calculate(frostfsecdsa.SignerRFC6979(signer), cnr.Marshal())
|
||||||
}
|
}
|
||||||
|
|
||||||
// VerifySignature verifies Container signature calculated using CalculateSignature.
|
// VerifySignature verifies Container signature calculated using CalculateSignature.
|
||||||
// Result means signature correctness.
|
// Result means signature correctness.
|
||||||
func VerifySignature(sig neofscrypto.Signature, cnr Container) bool {
|
func VerifySignature(sig frostfscrypto.Signature, cnr Container) bool {
|
||||||
return sig.Verify(cnr.Marshal())
|
return sig.Verify(cnr.Marshal())
|
||||||
}
|
}
|
||||||
|
|
||||||
// CalculateIDFromBinary calculates identifier of the binary-encoded container
|
// CalculateIDFromBinary calculates identifier of the binary-encoded container
|
||||||
// in CAS of the NeoFS containers and writes it into dst. ID instance MUST NOT
|
// in CAS of the FrostFS containers and writes it into dst. ID instance MUST NOT
|
||||||
// be nil.
|
// be nil.
|
||||||
//
|
//
|
||||||
// See also CalculateID, AssertID.
|
// See also CalculateID, AssertID.
|
||||||
|
@ -509,7 +512,7 @@ func CalculateID(dst *cid.ID, cnr Container) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// AssertID checks if the given Container matches its identifier in CAS of the
|
// AssertID checks if the given Container matches its identifier in CAS of the
|
||||||
// NeoFS containers.
|
// FrostFS containers.
|
||||||
//
|
//
|
||||||
// See also CalculateID.
|
// See also CalculateID.
|
||||||
func AssertID(id cid.ID, cnr Container) bool {
|
func AssertID(id cid.ID, cnr Container) bool {
|
||||||
|
|
|
@ -6,21 +6,21 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
v2container "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container"
|
||||||
|
v2netmap "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
|
||||||
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
|
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
|
containertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/test"
|
||||||
|
frostfscrypto "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto"
|
||||||
|
netmaptest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap/test"
|
||||||
|
subnetid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/subnet/id"
|
||||||
|
subnetidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/subnet/id/test"
|
||||||
|
usertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user/test"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
v2container "github.com/nspcc-dev/neofs-api-go/v2/container"
|
|
||||||
v2netmap "github.com/nspcc-dev/neofs-api-go/v2/netmap"
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/container"
|
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
|
||||||
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
|
||||||
containertest "github.com/nspcc-dev/neofs-sdk-go/container/test"
|
|
||||||
neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto"
|
|
||||||
netmaptest "github.com/nspcc-dev/neofs-sdk-go/netmap/test"
|
|
||||||
subnetid "github.com/nspcc-dev/neofs-sdk-go/subnet/id"
|
|
||||||
subnetidtest "github.com/nspcc-dev/neofs-sdk-go/subnet/id/test"
|
|
||||||
usertest "github.com/nspcc-dev/neofs-sdk-go/user/test"
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/version"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -337,14 +337,14 @@ func TestCalculateSignature(t *testing.T) {
|
||||||
|
|
||||||
val := containertest.Container()
|
val := containertest.Container()
|
||||||
|
|
||||||
var sig neofscrypto.Signature
|
var sig frostfscrypto.Signature
|
||||||
|
|
||||||
require.NoError(t, container.CalculateSignature(&sig, val, key.PrivateKey))
|
require.NoError(t, container.CalculateSignature(&sig, val, key.PrivateKey))
|
||||||
|
|
||||||
var msg refs.Signature
|
var msg refs.Signature
|
||||||
sig.WriteToV2(&msg)
|
sig.WriteToV2(&msg)
|
||||||
|
|
||||||
var sig2 neofscrypto.Signature
|
var sig2 frostfscrypto.Signature
|
||||||
require.NoError(t, sig2.ReadFromV2(msg))
|
require.NoError(t, sig2.ReadFromV2(msg))
|
||||||
|
|
||||||
require.True(t, container.VerifySignature(sig2, val))
|
require.True(t, container.VerifySignature(sig2, val))
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
Package container provides functionality related to the NeoFS containers.
|
Package container provides functionality related to the FrostFS containers.
|
||||||
|
|
||||||
The base type is Container. To create new container in the NeoFS network
|
The base type is Container. To create new container in the FrostFS network
|
||||||
Container instance should be initialized
|
Container instance should be initialized
|
||||||
|
|
||||||
var cnr Container
|
var cnr Container
|
||||||
|
@ -10,7 +10,7 @@ Container instance should be initialized
|
||||||
|
|
||||||
// encode cnr and send
|
// encode cnr and send
|
||||||
|
|
||||||
After the container is persisted in the NeoFS network, applications can process
|
After the container is persisted in the FrostFS network, applications can process
|
||||||
it using the instance of Container types
|
it using the instance of Container types
|
||||||
|
|
||||||
// recv binary container
|
// recv binary container
|
||||||
|
@ -22,12 +22,12 @@ it using the instance of Container types
|
||||||
|
|
||||||
// process the container data
|
// process the container data
|
||||||
|
|
||||||
Instances can be also used to process NeoFS API V2 protocol messages
|
Instances can be also used to process FrostFS API V2 protocol messages
|
||||||
(see neo.fs.v2.container package in https://github.com/nspcc-dev/neofs-api).
|
(see neo.fs.v2.container package in https://git.frostfs.info/TrueCloudLab/frostfs-api).
|
||||||
|
|
||||||
On client side:
|
On client side:
|
||||||
|
|
||||||
import "github.com/nspcc-dev/neofs-api-go/v2/container"
|
import "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container"
|
||||||
|
|
||||||
var msg container.Container
|
var msg container.Container
|
||||||
cnr.WriteToV2(&msg)
|
cnr.WriteToV2(&msg)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Package cid provides primitives to work with container identification in NeoFS.
|
Package cid provides primitives to work with container identification in FrostFS.
|
||||||
|
|
||||||
Using package types in an application is recommended to potentially work with
|
Using package types in an application is recommended to potentially work with
|
||||||
different protocol versions with which these types are compatible.
|
different protocol versions with which these types are compatible.
|
||||||
|
|
|
@ -4,13 +4,13 @@ import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
"github.com/mr-tron/base58"
|
"github.com/mr-tron/base58"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// ID represents NeoFS container identifier.
|
// ID represents FrostFS container identifier.
|
||||||
//
|
//
|
||||||
// ID is mutually compatible with github.com/nspcc-dev/neofs-api-go/v2/refs.ContainerID
|
// ID is mutually compatible with git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs.ContainerID
|
||||||
// message. See ReadFromV2 / WriteToV2 methods.
|
// message. See ReadFromV2 / WriteToV2 methods.
|
||||||
//
|
//
|
||||||
// Instances can be created using built-in var declaration.
|
// Instances can be created using built-in var declaration.
|
||||||
|
@ -22,7 +22,7 @@ type ID [sha256.Size]byte
|
||||||
|
|
||||||
// ReadFromV2 reads ID from the refs.ContainerID message.
|
// ReadFromV2 reads ID from the refs.ContainerID message.
|
||||||
// Returns an error if the message is malformed according
|
// Returns an error if the message is malformed according
|
||||||
// to the NeoFS API V2 protocol.
|
// to the FrostFS API V2 protocol.
|
||||||
//
|
//
|
||||||
// See also WriteToV2.
|
// See also WriteToV2.
|
||||||
func (id *ID) ReadFromV2(m refs.ContainerID) error {
|
func (id *ID) ReadFromV2(m refs.ContainerID) error {
|
||||||
|
@ -83,7 +83,7 @@ func (id ID) Equals(id2 ID) bool {
|
||||||
return id == id2
|
return id == id2
|
||||||
}
|
}
|
||||||
|
|
||||||
// EncodeToString encodes ID into NeoFS API protocol string.
|
// EncodeToString encodes ID into FrostFS API protocol string.
|
||||||
//
|
//
|
||||||
// Zero ID is base58 encoding of 32 zeros.
|
// Zero ID is base58 encoding of 32 zeros.
|
||||||
//
|
//
|
||||||
|
@ -92,7 +92,7 @@ func (id ID) EncodeToString() string {
|
||||||
return base58.Encode(id[:])
|
return base58.Encode(id[:])
|
||||||
}
|
}
|
||||||
|
|
||||||
// DecodeString decodes string into ID according to NeoFS API protocol. Returns
|
// DecodeString decodes string into ID according to FrostFS API protocol. Returns
|
||||||
// an error if s is malformed.
|
// an error if s is malformed.
|
||||||
//
|
//
|
||||||
// See also DecodeString.
|
// See also DecodeString.
|
||||||
|
@ -109,7 +109,7 @@ func (id *ID) DecodeString(s string) error {
|
||||||
//
|
//
|
||||||
// String is designed to be human-readable, and its format MAY differ between
|
// String is designed to be human-readable, and its format MAY differ between
|
||||||
// SDK versions. String MAY return same result as EncodeToString. String MUST NOT
|
// SDK versions. String MAY return same result as EncodeToString. String MUST NOT
|
||||||
// be used to encode ID into NeoFS protocol string.
|
// be used to encode ID into FrostFS protocol string.
|
||||||
func (id ID) String() string {
|
func (id ID) String() string {
|
||||||
return id.EncodeToString()
|
return id.EncodeToString()
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,10 +5,10 @@ import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
|
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
"github.com/mr-tron/base58"
|
"github.com/mr-tron/base58"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
|
||||||
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ Note that importing the package into source files is highly discouraged.
|
||||||
|
|
||||||
Random instance generation functions can be useful when testing expects any value, e.g.:
|
Random instance generation functions can be useful when testing expects any value, e.g.:
|
||||||
|
|
||||||
import cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
import cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
|
|
||||||
cid := cidtest.ID()
|
cid := cidtest.ID()
|
||||||
// test the value
|
// test the value
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ID returns random cid.ID.
|
// ID returns random cid.ID.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/netmap"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ApplyNetworkConfig applies network configuration to the
|
// ApplyNetworkConfig applies network configuration to the
|
||||||
|
|
|
@ -3,9 +3,9 @@ package container_test
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/container"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
|
||||||
containertest "github.com/nspcc-dev/neofs-sdk-go/container/test"
|
containertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/test"
|
||||||
netmaptest "github.com/nspcc-dev/neofs-sdk-go/netmap/test"
|
netmaptest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap/test"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -4,22 +4,22 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/container"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SizeEstimation groups information about estimation of the size of the data
|
// SizeEstimation groups information about estimation of the size of the data
|
||||||
// stored in the NeoFS container.
|
// stored in the FrostFS container.
|
||||||
//
|
//
|
||||||
// SizeEstimation is mutually compatible with github.com/nspcc-dev/neofs-api-go/v2/container.UsedSpaceAnnouncement
|
// SizeEstimation is mutually compatible with git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container.UsedSpaceAnnouncement
|
||||||
// message. See ReadFromV2 / WriteToV2 methods.
|
// message. See ReadFromV2 / WriteToV2 methods.
|
||||||
type SizeEstimation struct {
|
type SizeEstimation struct {
|
||||||
m container.UsedSpaceAnnouncement
|
m container.UsedSpaceAnnouncement
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadFromV2 reads SizeEstimation from the container.UsedSpaceAnnouncement message.
|
// ReadFromV2 reads SizeEstimation from the container.UsedSpaceAnnouncement message.
|
||||||
// Checks if the message conforms to NeoFS API V2 protocol.
|
// Checks if the message conforms to FrostFS API V2 protocol.
|
||||||
//
|
//
|
||||||
// See also WriteToV2.
|
// See also WriteToV2.
|
||||||
func (x *SizeEstimation) ReadFromV2(m container.UsedSpaceAnnouncement) error {
|
func (x *SizeEstimation) ReadFromV2(m container.UsedSpaceAnnouncement) error {
|
||||||
|
@ -63,7 +63,7 @@ func (x SizeEstimation) Epoch() uint64 {
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetContainer specifies the container for which the amount of data is estimated.
|
// SetContainer specifies the container for which the amount of data is estimated.
|
||||||
// Required by the NeoFS API protocol.
|
// Required by the FrostFS API protocol.
|
||||||
//
|
//
|
||||||
// See also Container.
|
// See also Container.
|
||||||
func (x *SizeEstimation) SetContainer(cnr cid.ID) {
|
func (x *SizeEstimation) SetContainer(cnr cid.ID) {
|
||||||
|
@ -76,7 +76,7 @@ func (x *SizeEstimation) SetContainer(cnr cid.ID) {
|
||||||
// Container returns container set using SetContainer.
|
// Container returns container set using SetContainer.
|
||||||
//
|
//
|
||||||
// Zero SizeEstimation is not bound to any container (returns zero) which is
|
// Zero SizeEstimation is not bound to any container (returns zero) which is
|
||||||
// incorrect according to NeoFS API protocol.
|
// incorrect according to FrostFS API protocol.
|
||||||
func (x SizeEstimation) Container() (res cid.ID) {
|
func (x SizeEstimation) Container() (res cid.ID) {
|
||||||
m := x.m.GetContainerID()
|
m := x.m.GetContainerID()
|
||||||
if m != nil {
|
if m != nil {
|
||||||
|
|
|
@ -4,11 +4,11 @@ import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
v2container "github.com/nspcc-dev/neofs-api-go/v2/container"
|
v2container "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/container"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,11 @@ package containertest
|
||||||
import (
|
import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/container"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/container/acl"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/acl"
|
||||||
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
netmaptest "github.com/nspcc-dev/neofs-sdk-go/netmap/test"
|
netmaptest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap/test"
|
||||||
usertest "github.com/nspcc-dev/neofs-sdk-go/user/test"
|
usertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Container returns random container.Container.
|
// Container returns random container.Container.
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
package neofscrypto_test
|
package frostfscrypto_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
|
frostfscrypto "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto"
|
||||||
|
frostfsecdsa "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto/ecdsa"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
|
||||||
neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto"
|
|
||||||
neofsecdsa "github.com/nspcc-dev/neofs-sdk-go/crypto/ecdsa"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -18,18 +18,18 @@ func TestSignature(t *testing.T) {
|
||||||
k, err := keys.NewPrivateKey()
|
k, err := keys.NewPrivateKey()
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
var s neofscrypto.Signature
|
var s frostfscrypto.Signature
|
||||||
var m refs.Signature
|
var m refs.Signature
|
||||||
|
|
||||||
for _, f := range []func() neofscrypto.Signer{
|
for _, f := range []func() frostfscrypto.Signer{
|
||||||
func() neofscrypto.Signer {
|
func() frostfscrypto.Signer {
|
||||||
return neofsecdsa.Signer(k.PrivateKey)
|
return frostfsecdsa.Signer(k.PrivateKey)
|
||||||
},
|
},
|
||||||
func() neofscrypto.Signer {
|
func() frostfscrypto.Signer {
|
||||||
return neofsecdsa.SignerRFC6979(k.PrivateKey)
|
return frostfsecdsa.SignerRFC6979(k.PrivateKey)
|
||||||
},
|
},
|
||||||
func() neofscrypto.Signer {
|
func() frostfscrypto.Signer {
|
||||||
return neofsecdsa.SignerWalletConnect(k.PrivateKey)
|
return frostfsecdsa.SignerWalletConnect(k.PrivateKey)
|
||||||
},
|
},
|
||||||
} {
|
} {
|
||||||
signer := f()
|
signer := f()
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
Package neofscrypto collects NeoFS cryptographic primitives.
|
Package frostfscrypto collects FrostFS cryptographic primitives.
|
||||||
|
|
||||||
Signer type unifies entities for signing NeoFS data.
|
Signer type unifies entities for signing FrostFS data.
|
||||||
|
|
||||||
// instantiate Signer
|
// instantiate Signer
|
||||||
// select data to be signed
|
// select data to be signed
|
||||||
|
@ -24,12 +24,12 @@ PublicKey allows to verify signatures.
|
||||||
isValid := sig.Verify(data)
|
isValid := sig.Verify(data)
|
||||||
// ...
|
// ...
|
||||||
|
|
||||||
Signature can be also used to process NeoFS API V2 protocol messages
|
Signature can be also used to process FrostFS API V2 protocol messages
|
||||||
(see neo.fs.v2.refs package in https://github.com/nspcc-dev/neofs-api).
|
(see neo.fs.v2.refs package in https://git.frostfs.info/TrueCloudLab/frostfs-api).
|
||||||
|
|
||||||
On client side:
|
On client side:
|
||||||
|
|
||||||
import "github.com/nspcc-dev/neofs-api-go/v2/refs"
|
import "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
|
|
||||||
var msg refs.Signature
|
var msg refs.Signature
|
||||||
sig.WriteToV2(&msg)
|
sig.WriteToV2(&msg)
|
||||||
|
@ -40,7 +40,7 @@ On server side:
|
||||||
|
|
||||||
// recv msg
|
// recv msg
|
||||||
|
|
||||||
var sig neofscrypto.Signature
|
var sig frostfscrypto.Signature
|
||||||
sig.ReadFromV2(msg)
|
sig.ReadFromV2(msg)
|
||||||
|
|
||||||
// process sig
|
// process sig
|
||||||
|
@ -48,4 +48,4 @@ On server side:
|
||||||
Using package types in an application is recommended to potentially work with
|
Using package types in an application is recommended to potentially work with
|
||||||
different protocol versions with which these types are compatible.
|
different protocol versions with which these types are compatible.
|
||||||
*/
|
*/
|
||||||
package neofscrypto
|
package frostfscrypto
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
/*
|
/*
|
||||||
Package neofsecdsa collects ECDSA primitives for NeoFS cryptography.
|
Package frostfsecdsa collects ECDSA primitives for FrostFS cryptography.
|
||||||
|
|
||||||
Signer and PublicKey support ECDSA signature algorithm with SHA-512 hashing.
|
Signer and PublicKey support ECDSA signature algorithm with SHA-512 hashing.
|
||||||
SignerRFC6979 and PublicKeyRFC6979 implement signature algorithm described in RFC 6979.
|
SignerRFC6979 and PublicKeyRFC6979 implement signature algorithm described in RFC 6979.
|
||||||
All these types provide corresponding interfaces from neofscrypto package.
|
All these types provide corresponding interfaces from frostfscrypto package.
|
||||||
|
|
||||||
Package import causes registration of next signature schemes via neofscrypto.RegisterScheme:
|
Package import causes registration of next signature schemes via frostfscrypto.RegisterScheme:
|
||||||
- neofscrypto.ECDSA_SHA512
|
- frostfscrypto.ECDSA_SHA512
|
||||||
- neofscrypto.ECDSA_DETERMINISTIC_SHA256
|
- frostfscrypto.ECDSA_DETERMINISTIC_SHA256
|
||||||
*/
|
*/
|
||||||
package neofsecdsa
|
package frostfsecdsa
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
package neofsecdsa
|
package frostfsecdsa
|
||||||
|
|
||||||
import neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto"
|
import frostfscrypto "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto"
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
neofscrypto.RegisterScheme(neofscrypto.ECDSA_SHA512, func() neofscrypto.PublicKey {
|
frostfscrypto.RegisterScheme(frostfscrypto.ECDSA_SHA512, func() frostfscrypto.PublicKey {
|
||||||
return new(PublicKey)
|
return new(PublicKey)
|
||||||
})
|
})
|
||||||
|
|
||||||
neofscrypto.RegisterScheme(neofscrypto.ECDSA_DETERMINISTIC_SHA256, func() neofscrypto.PublicKey {
|
frostfscrypto.RegisterScheme(frostfscrypto.ECDSA_DETERMINISTIC_SHA256, func() frostfscrypto.PublicKey {
|
||||||
return new(PublicKeyRFC6979)
|
return new(PublicKeyRFC6979)
|
||||||
})
|
})
|
||||||
|
|
||||||
neofscrypto.RegisterScheme(neofscrypto.ECDSA_WALLETCONNECT, func() neofscrypto.PublicKey {
|
frostfscrypto.RegisterScheme(frostfscrypto.ECDSA_WALLETCONNECT, func() frostfscrypto.PublicKey {
|
||||||
return new(PublicKeyWalletConnect)
|
return new(PublicKeyWalletConnect)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package neofsecdsa
|
package frostfsecdsa
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
|
@ -11,8 +11,8 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
)
|
)
|
||||||
|
|
||||||
// PublicKey is a wrapper over ecdsa.PublicKey used for NeoFS needs.
|
// PublicKey is a wrapper over ecdsa.PublicKey used for FrostFS needs.
|
||||||
// Provides neofscrypto.PublicKey interface.
|
// Provides frostfscrypto.PublicKey interface.
|
||||||
//
|
//
|
||||||
// Instances MUST be initialized from ecdsa.PublicKey using type conversion.
|
// Instances MUST be initialized from ecdsa.PublicKey using type conversion.
|
||||||
type PublicKey ecdsa.PublicKey
|
type PublicKey ecdsa.PublicKey
|
||||||
|
@ -77,8 +77,8 @@ func (x PublicKey) Verify(data, signature []byte) bool {
|
||||||
return r != nil && s != nil && ecdsa.Verify((*ecdsa.PublicKey)(&x), h[:], r, s)
|
return r != nil && s != nil && ecdsa.Verify((*ecdsa.PublicKey)(&x), h[:], r, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PublicKeyRFC6979 is a wrapper over ecdsa.PublicKey used for NeoFS needs.
|
// PublicKeyRFC6979 is a wrapper over ecdsa.PublicKey used for FrostFS needs.
|
||||||
// Provides neofscrypto.PublicKey interface.
|
// Provides frostfscrypto.PublicKey interface.
|
||||||
//
|
//
|
||||||
// Instances MUST be initialized from ecdsa.PublicKey using type conversion.
|
// Instances MUST be initialized from ecdsa.PublicKey using type conversion.
|
||||||
type PublicKeyRFC6979 ecdsa.PublicKey
|
type PublicKeyRFC6979 ecdsa.PublicKey
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package neofsecdsa
|
package frostfsecdsa
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
|
@ -6,24 +6,24 @@ import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"crypto/sha512"
|
"crypto/sha512"
|
||||||
|
|
||||||
|
frostfscrypto "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Signer wraps ecdsa.PrivateKey and represents signer based on ECDSA with
|
// Signer wraps ecdsa.PrivateKey and represents signer based on ECDSA with
|
||||||
// SHA-512 hashing. Provides neofscrypto.Signer interface.
|
// SHA-512 hashing. Provides frostfscrypto.Signer interface.
|
||||||
//
|
//
|
||||||
// Instances MUST be initialized from ecdsa.PrivateKey using type conversion.
|
// Instances MUST be initialized from ecdsa.PrivateKey using type conversion.
|
||||||
type Signer ecdsa.PrivateKey
|
type Signer ecdsa.PrivateKey
|
||||||
|
|
||||||
// Scheme returns neofscrypto.ECDSA_SHA512.
|
// Scheme returns frostfscrypto.ECDSA_SHA512.
|
||||||
// Implements neofscrypto.Signer.
|
// Implements frostfscrypto.Signer.
|
||||||
func (x Signer) Scheme() neofscrypto.Scheme {
|
func (x Signer) Scheme() frostfscrypto.Scheme {
|
||||||
return neofscrypto.ECDSA_SHA512
|
return frostfscrypto.ECDSA_SHA512
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sign signs data using ECDSA algorithm with SHA-512 hashing.
|
// Sign signs data using ECDSA algorithm with SHA-512 hashing.
|
||||||
// Implements neofscrypto.Signer.
|
// Implements frostfscrypto.Signer.
|
||||||
func (x Signer) Sign(data []byte) ([]byte, error) {
|
func (x Signer) Sign(data []byte) ([]byte, error) {
|
||||||
h := sha512.Sum512(data)
|
h := sha512.Sum512(data)
|
||||||
r, s, err := ecdsa.Sign(rand.Reader, (*ecdsa.PrivateKey)(&x), h[:])
|
r, s, err := ecdsa.Sign(rand.Reader, (*ecdsa.PrivateKey)(&x), h[:])
|
||||||
|
@ -43,26 +43,26 @@ func (x Signer) Sign(data []byte) ([]byte, error) {
|
||||||
return buf, nil
|
return buf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Public initializes PublicKey and returns it as neofscrypto.PublicKey.
|
// Public initializes PublicKey and returns it as frostfscrypto.PublicKey.
|
||||||
// Implements neofscrypto.Signer.
|
// Implements frostfscrypto.Signer.
|
||||||
func (x Signer) Public() neofscrypto.PublicKey {
|
func (x Signer) Public() frostfscrypto.PublicKey {
|
||||||
return (*PublicKey)(&x.PublicKey)
|
return (*PublicKey)(&x.PublicKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SignerRFC6979 wraps ecdsa.PrivateKey and represents signer based on deterministic
|
// SignerRFC6979 wraps ecdsa.PrivateKey and represents signer based on deterministic
|
||||||
// ECDSA with SHA-256 hashing (RFC 6979). Provides neofscrypto.Signer interface.
|
// ECDSA with SHA-256 hashing (RFC 6979). Provides frostfscrypto.Signer interface.
|
||||||
//
|
//
|
||||||
// Instances SHOULD be initialized from ecdsa.PrivateKey using type conversion.
|
// Instances SHOULD be initialized from ecdsa.PrivateKey using type conversion.
|
||||||
type SignerRFC6979 ecdsa.PrivateKey
|
type SignerRFC6979 ecdsa.PrivateKey
|
||||||
|
|
||||||
// Scheme returns neofscrypto.ECDSA_DETERMINISTIC_SHA256.
|
// Scheme returns frostfscrypto.ECDSA_DETERMINISTIC_SHA256.
|
||||||
// Implements neofscrypto.Signer.
|
// Implements frostfscrypto.Signer.
|
||||||
func (x SignerRFC6979) Scheme() neofscrypto.Scheme {
|
func (x SignerRFC6979) Scheme() frostfscrypto.Scheme {
|
||||||
return neofscrypto.ECDSA_DETERMINISTIC_SHA256
|
return frostfscrypto.ECDSA_DETERMINISTIC_SHA256
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sign signs data using deterministic ECDSA algorithm with SHA-256 hashing.
|
// Sign signs data using deterministic ECDSA algorithm with SHA-256 hashing.
|
||||||
// Implements neofscrypto.Signer.
|
// Implements frostfscrypto.Signer.
|
||||||
//
|
//
|
||||||
// See also RFC 6979.
|
// See also RFC 6979.
|
||||||
func (x SignerRFC6979) Sign(data []byte) ([]byte, error) {
|
func (x SignerRFC6979) Sign(data []byte) ([]byte, error) {
|
||||||
|
@ -70,8 +70,8 @@ func (x SignerRFC6979) Sign(data []byte) ([]byte, error) {
|
||||||
return p.Sign(data), nil
|
return p.Sign(data), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Public initializes PublicKeyRFC6979 and returns it as neofscrypto.PublicKey.
|
// Public initializes PublicKeyRFC6979 and returns it as frostfscrypto.PublicKey.
|
||||||
// Implements neofscrypto.Signer.
|
// Implements frostfscrypto.Signer.
|
||||||
func (x SignerRFC6979) Public() neofscrypto.PublicKey {
|
func (x SignerRFC6979) Public() frostfscrypto.PublicKey {
|
||||||
return (*PublicKeyRFC6979)(&x.PublicKey)
|
return (*PublicKeyRFC6979)(&x.PublicKey)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package neofsecdsa
|
package frostfsecdsa
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
|
@ -6,9 +6,9 @@ import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/signature/walletconnect"
|
||||||
|
frostfscrypto "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/util/signature/walletconnect"
|
|
||||||
neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// SignerWalletConnect is similar to SignerRFC6979 with 2 changes:
|
// SignerWalletConnect is similar to SignerRFC6979 with 2 changes:
|
||||||
|
@ -18,28 +18,28 @@ import (
|
||||||
// Instances MUST be initialized from ecdsa.PrivateKey using type conversion.
|
// Instances MUST be initialized from ecdsa.PrivateKey using type conversion.
|
||||||
type SignerWalletConnect ecdsa.PrivateKey
|
type SignerWalletConnect ecdsa.PrivateKey
|
||||||
|
|
||||||
// Scheme returns neofscrypto.ECDSA_WALLETCONNECT.
|
// Scheme returns frostfscrypto.ECDSA_WALLETCONNECT.
|
||||||
// Implements neofscrypto.Signer.
|
// Implements frostfscrypto.Signer.
|
||||||
func (x SignerWalletConnect) Scheme() neofscrypto.Scheme {
|
func (x SignerWalletConnect) Scheme() frostfscrypto.Scheme {
|
||||||
return neofscrypto.ECDSA_WALLETCONNECT
|
return frostfscrypto.ECDSA_WALLETCONNECT
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sign signs data using ECDSA algorithm with SHA-512 hashing.
|
// Sign signs data using ECDSA algorithm with SHA-512 hashing.
|
||||||
// Implements neofscrypto.Signer.
|
// Implements frostfscrypto.Signer.
|
||||||
func (x SignerWalletConnect) Sign(data []byte) ([]byte, error) {
|
func (x SignerWalletConnect) Sign(data []byte) ([]byte, error) {
|
||||||
b64 := make([]byte, base64.StdEncoding.EncodedLen(len(data)))
|
b64 := make([]byte, base64.StdEncoding.EncodedLen(len(data)))
|
||||||
base64.StdEncoding.Encode(b64, data)
|
base64.StdEncoding.Encode(b64, data)
|
||||||
return walletconnect.Sign((*ecdsa.PrivateKey)(&x), b64)
|
return walletconnect.Sign((*ecdsa.PrivateKey)(&x), b64)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Public initializes PublicKey and returns it as neofscrypto.PublicKey.
|
// Public initializes PublicKey and returns it as frostfscrypto.PublicKey.
|
||||||
// Implements neofscrypto.Signer.
|
// Implements frostfscrypto.Signer.
|
||||||
func (x SignerWalletConnect) Public() neofscrypto.PublicKey {
|
func (x SignerWalletConnect) Public() frostfscrypto.PublicKey {
|
||||||
return (*PublicKeyWalletConnect)(&x.PublicKey)
|
return (*PublicKeyWalletConnect)(&x.PublicKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PublicKeyWalletConnect is a wrapper over ecdsa.PublicKey used for NeoFS needs.
|
// PublicKeyWalletConnect is a wrapper over ecdsa.PublicKey used for FrostFS needs.
|
||||||
// Provides neofscrypto.PublicKey interface.
|
// Provides frostfscrypto.PublicKey interface.
|
||||||
//
|
//
|
||||||
// Instances MUST be initialized from ecdsa.PublicKey using type conversion.
|
// Instances MUST be initialized from ecdsa.PublicKey using type conversion.
|
||||||
type PublicKeyWalletConnect ecdsa.PublicKey
|
type PublicKeyWalletConnect ecdsa.PublicKey
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
package neofscrypto
|
package frostfscrypto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Signature represents a confirmation of data integrity received by the
|
// Signature represents a confirmation of data integrity received by the
|
||||||
// digital signature mechanism.
|
// digital signature mechanism.
|
||||||
//
|
//
|
||||||
// Signature is mutually compatible with github.com/nspcc-dev/neofs-api-go/v2/refs.Signature
|
// Signature is mutually compatible with git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs.Signature
|
||||||
// message. See ReadFromV2 / WriteToV2 methods.
|
// message. See ReadFromV2 / WriteToV2 methods.
|
||||||
//
|
//
|
||||||
// Note that direct typecast is not safe and may result in loss of compatibility:
|
// Note that direct typecast is not safe and may result in loss of compatibility:
|
||||||
|
@ -19,7 +19,7 @@ import (
|
||||||
type Signature refs.Signature
|
type Signature refs.Signature
|
||||||
|
|
||||||
// ReadFromV2 reads Signature from the refs.Signature message. Checks if the
|
// ReadFromV2 reads Signature from the refs.Signature message. Checks if the
|
||||||
// message conforms to NeoFS API V2 protocol.
|
// message conforms to FrostFS API V2 protocol.
|
||||||
//
|
//
|
||||||
// See also WriteToV2.
|
// See also WriteToV2.
|
||||||
func (x *Signature) ReadFromV2(m refs.Signature) error {
|
func (x *Signature) ReadFromV2(m refs.Signature) error {
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package neofscrypto
|
package frostfscrypto
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Scheme represents digital signature algorithm with fixed cryptographic hash function.
|
// Scheme represents digital signature algorithm with fixed cryptographic hash function.
|
||||||
|
@ -45,7 +45,7 @@ func RegisterScheme(scheme Scheme, f func() PublicKey) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Signer is an interface of entities that can be used for signing operations
|
// Signer is an interface of entities that can be used for signing operations
|
||||||
// in NeoFS. Unites secret and public parts. For example, an ECDSA private key
|
// in FrostFS. Unites secret and public parts. For example, an ECDSA private key
|
||||||
// or external auth service.
|
// or external auth service.
|
||||||
//
|
//
|
||||||
// See also PublicKey.
|
// See also PublicKey.
|
||||||
|
@ -63,7 +63,7 @@ type Signer interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
// PublicKey represents a public key using fixed signature scheme supported by
|
// PublicKey represents a public key using fixed signature scheme supported by
|
||||||
// NeoFS.
|
// FrostFS.
|
||||||
//
|
//
|
||||||
// See also Signer.
|
// See also Signer.
|
||||||
type PublicKey interface {
|
type PublicKey interface {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package neofscrypto
|
package frostfscrypto
|
||||||
|
|
||||||
import "encoding/hex"
|
import "encoding/hex"
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package eacl
|
package eacl
|
||||||
|
|
||||||
import (
|
import (
|
||||||
v2acl "github.com/nspcc-dev/neofs-api-go/v2/acl"
|
v2acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Action taken if ContainerEACL record matched request.
|
// Action taken if ContainerEACL record matched request.
|
||||||
|
|
|
@ -3,8 +3,8 @@ package eacl_test
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
v2acl "github.com/nspcc-dev/neofs-api-go/v2/acl"
|
v2acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/eacl"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package eacl
|
||||||
import (
|
import (
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
v2acl "github.com/nspcc-dev/neofs-api-go/v2/acl"
|
v2acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Filter defines check conditions if request header is matched or not. Matched
|
// Filter defines check conditions if request header is matched or not. Matched
|
||||||
|
|
|
@ -4,8 +4,8 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/acl"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
v2acl "github.com/nspcc-dev/neofs-api-go/v2/acl"
|
v2acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,13 +3,13 @@ package eacl
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
|
|
||||||
v2acl "github.com/nspcc-dev/neofs-api-go/v2/acl"
|
v2acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/checksum"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/checksum"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/object"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
||||||
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/user"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/version"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Record of the ContainerEACL rule, that defines ContainerEACL action, targets for this action,
|
// Record of the ContainerEACL rule, that defines ContainerEACL action, targets for this action,
|
||||||
|
@ -38,12 +38,12 @@ func (r Record) Filters() []Filter {
|
||||||
return r.filters
|
return r.filters
|
||||||
}
|
}
|
||||||
|
|
||||||
// Operation returns NeoFS request verb to match.
|
// Operation returns FrostFS request verb to match.
|
||||||
func (r Record) Operation() Operation {
|
func (r Record) Operation() Operation {
|
||||||
return r.operation
|
return r.operation
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetOperation sets NeoFS request verb to match.
|
// SetOperation sets FrostFS request verb to match.
|
||||||
func (r *Record) SetOperation(operation Operation) {
|
func (r *Record) SetOperation(operation Operation) {
|
||||||
r.operation = operation
|
r.operation = operation
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,14 +5,14 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
v2acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
|
checksumtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/checksum/test"
|
||||||
|
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object"
|
||||||
|
oidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id/test"
|
||||||
|
usertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user/test"
|
||||||
|
versiontest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version/test"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
v2acl "github.com/nspcc-dev/neofs-api-go/v2/acl"
|
|
||||||
checksumtest "github.com/nspcc-dev/neofs-sdk-go/checksum/test"
|
|
||||||
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/object"
|
|
||||||
oidtest "github.com/nspcc-dev/neofs-sdk-go/object/id/test"
|
|
||||||
usertest "github.com/nspcc-dev/neofs-sdk-go/user/test"
|
|
||||||
versiontest "github.com/nspcc-dev/neofs-sdk-go/version/test"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -4,10 +4,10 @@ import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
v2acl "github.com/nspcc-dev/neofs-api-go/v2/acl"
|
v2acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/version"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Table is a group of ContainerEACL records for single container.
|
// Table is a group of ContainerEACL records for single container.
|
||||||
|
|
|
@ -4,11 +4,11 @@ import (
|
||||||
"crypto/sha256"
|
"crypto/sha256"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/eacl"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
||||||
eacltest "github.com/nspcc-dev/neofs-sdk-go/eacl/test"
|
eacltest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl/test"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/version"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,8 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
|
|
||||||
|
v2acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
v2acl "github.com/nspcc-dev/neofs-api-go/v2/acl"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Target is a group of request senders to match ContainerEACL. Defined by role enum
|
// Target is a group of request senders to match ContainerEACL. Defined by role enum
|
||||||
|
|
|
@ -4,9 +4,9 @@ import (
|
||||||
"crypto/ecdsa"
|
"crypto/ecdsa"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
|
v2acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
"github.com/nspcc-dev/neofs-api-go/v2/acl"
|
|
||||||
v2acl "github.com/nspcc-dev/neofs-api-go/v2/acl"
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,9 @@ import (
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/eacl"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
||||||
versiontest "github.com/nspcc-dev/neofs-sdk-go/version/test"
|
versiontest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version/test"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
package eacltest
|
package eacltest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
cidtest "github.com/nspcc-dev/neofs-sdk-go/container/id/test"
|
cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test"
|
||||||
"github.com/nspcc-dev/neofs-sdk-go/eacl"
|
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/eacl"
|
||||||
usertest "github.com/nspcc-dev/neofs-sdk-go/user/test"
|
usertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user/test"
|
||||||
versiontest "github.com/nspcc-dev/neofs-sdk-go/version/test"
|
versiontest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/version/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Target returns random eacl.Target.
|
// Target returns random eacl.Target.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package eacl
|
package eacl
|
||||||
|
|
||||||
import (
|
import (
|
||||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
cid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Header is an interface of string key-value header.
|
// Header is an interface of string key-value header.
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue