forked from TrueCloudLab/frostfs-api-go
Compare commits
151 commits
Author | SHA1 | Date | |
---|---|---|---|
557267a07b | |||
2bdee4c9e6 | |||
f0fc40e116 | |||
29f2157563 | |||
29c522d5d8 | |||
3e705a3cbe | |||
d9a604fbc1 | |||
b06dad731c | |||
d94b9c6d0d | |||
eeb754c327 | |||
805da79319 | |||
f812b1ae5b | |||
287e98ad67 | |||
c3dbbc5eab | |||
13fa0da374 | |||
c9782cf3ef | |||
c49c482ba6 | |||
0484647aae | |||
9c0007fb1d | |||
bd588fa2e5 | |||
7d71556eee | |||
c11f50efec | |||
9c5e32a183 | |||
5e1c6a908f | |||
a2025376fc | |||
eba18f6e67 | |||
ca33fc4adb | |||
5fece80b42 | |||
11e194d274 | |||
9e82a5a31a | |||
981dc785f3 | |||
866db105ed | |||
937a53683a | |||
4a00ef946f | |||
f484ce6b0b | |||
61f6f0f4a2 | |||
c1b5f46f98 | |||
33653962b7 | |||
a43110e363 | |||
7be31eb847 | |||
adb7c602d7 | |||
a28ceb251a | |||
d112a28d38 | |||
47a48969b0 | |||
19247e8941 | |||
ff4f31b6f3 | |||
a0a9b765f3 | |||
280d052cef | |||
35e7397d48 | |||
174773454e | |||
b72aa14bab | |||
42e50c9633 | |||
611355510c | |||
ebaf78c8fa | |||
1473fa588f | |||
c27b978770 | |||
8609f29a60 | |||
8ce8cd6ec2 | |||
8580b49c8d | |||
9b90d139c5 | |||
3dfa2f4fd6 | |||
f517e39491 | |||
3639563d80 | |||
610c450a65 | |||
3f92d7bfb0 | |||
dafc9e5476 | |||
2f6d3209e1 | |||
9e825239ac | |||
9789b79b1d | |||
0803bc6ded | |||
4fe42ac4ad | |||
063ce11c24 | |||
bc7b49eed2 | |||
b171364079 | |||
0fe6b9adbb | |||
fa8f92d662 | |||
387b850e5e | |||
67c6f305b2 | |||
df9b65324a | |||
4a330a5706 | |||
491a47e7fe | |||
6e9d385f3c | |||
1772b92182 | |||
a85146250b | |||
ea6e390c7b | |||
4d35da7c77 | |||
a7bcad6aa9 | |||
6fb9cae479 | |||
f69ad7ade0 | |||
c1c7b344b9 | |||
634e24aba7 | |||
2a124b95bc | |||
d60ce83e42 | |||
72885aae83 | |||
b46e8cfbda | |||
9cc2095446 | |||
498877e378 | |||
f50872f1bc | |||
309aa4ac78 | |||
17bed735a1 | |||
022f818735 | |||
d989c8d2a3 | |||
0671f42ee1 | |||
9a7b47d769 | |||
67b18d3550 | |||
964c3edb3f | |||
3072090c77 | |||
7a5ee927c8 | |||
7133a01ccf | |||
43ad0f114c | |||
6e92d7d5de | |||
849de02bc3 | |||
59c8421597 | |||
582d94c81c | |||
285516a94e | |||
d5b55d0926 | |||
2cb57a8835 | |||
b17995a238 | |||
3add88d435 | |||
29b2078245 | |||
e9d67aa1b2 | |||
68021b910a | |||
62edd68f47 | |||
8266b31092 | |||
0c67b8fefa | |||
33445c6810 | |||
eba07dee0c | |||
a3e8e0c00c | |||
a3a5046ecc | |||
e9e7901f67 | |||
2aa3ee46e7 | |||
a6e2ab3845 | |||
1cab39337e | |||
63915bb7a5 | |||
d2b7fd3682 | |||
e297616a48 | |||
ff6d8db741 | |||
bd44a3f47b | |||
|
d9347a05f0 | ||
b3ccd0166f | |||
5f318f0b75 | |||
3b938873cc | |||
84dc99a045 | |||
dbcd514748 | |||
d9c5b9c90e | |||
a4e361a2e6 | |||
488ee50f9e | |||
816628d37d | |||
3a7280968b | |||
|
e6522d62a8 | ||
|
e022a2b831 |
246 changed files with 8439 additions and 9536 deletions
70
.forgejo/logo.svg
Normal file
70
.forgejo/logo.svg
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 25.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Слой_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 184.2 51.8" style="enable-background:new 0 0 184.2 51.8;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{display:none;}
|
||||||
|
.st1{display:inline;}
|
||||||
|
.st2{fill:#01E397;}
|
||||||
|
.st3{display:inline;fill:#010032;}
|
||||||
|
.st4{display:inline;fill:#00E599;}
|
||||||
|
.st5{display:inline;fill:#00AF92;}
|
||||||
|
.st6{fill:#00C3E5;}
|
||||||
|
</style>
|
||||||
|
<g id="Layer_2">
|
||||||
|
<g id="Layer_1-2" class="st0">
|
||||||
|
<g class="st1">
|
||||||
|
<path class="st2" d="M146.6,18.3v7.2h10.9V29h-10.9v10.7h-4V14.8h18v3.5H146.6z"/>
|
||||||
|
<path class="st2" d="M180,15.7c1.7,0.9,3,2.2,4,3.8l-3,2.7c-0.6-1.3-1.5-2.4-2.6-3.3c-1.3-0.7-2.8-1-4.3-1
|
||||||
|
c-1.4-0.1-2.8,0.3-4,1.1c-0.9,0.5-1.5,1.5-1.4,2.6c0,1,0.5,1.9,1.4,2.4c1.5,0.8,3.2,1.3,4.9,1.5c1.9,0.3,3.7,0.8,5.4,1.6
|
||||||
|
c1.2,0.5,2.2,1.3,2.9,2.3c0.6,1,1,2.2,0.9,3.4c0,1.4-0.5,2.7-1.3,3.8c-0.9,1.2-2.1,2.1-3.5,2.6c-1.7,0.6-3.4,0.9-5.2,0.8
|
||||||
|
c-5,0-8.6-1.6-10.7-5l2.9-2.8c0.7,1.4,1.8,2.5,3.1,3.3c1.5,0.7,3.1,1.1,4.7,1c1.5,0.1,2.9-0.2,4.2-0.9c0.9-0.5,1.5-1.5,1.5-2.6
|
||||||
|
c0-0.9-0.5-1.8-1.3-2.2c-1.5-0.7-3.1-1.2-4.8-1.5c-1.9-0.3-3.7-0.8-5.5-1.5c-1.2-0.5-2.2-1.4-3-2.4c-0.6-1-1-2.2-0.9-3.4
|
||||||
|
c0-1.4,0.4-2.7,1.2-3.8c0.8-1.2,2-2.2,3.3-2.8c1.6-0.7,3.4-1.1,5.2-1C176.1,14.3,178.2,14.8,180,15.7z"/>
|
||||||
|
</g>
|
||||||
|
<path class="st3" d="M73.3,16.3c1.9,1.9,2.9,4.5,2.7,7.1v15.9h-4V24.8c0-2.6-0.5-4.5-1.6-5.7c-1.2-1.2-2.8-1.8-4.5-1.7
|
||||||
|
c-1.3,0-2.5,0.3-3.7,0.8c-1.2,0.7-2.2,1.7-2.9,2.9c-0.8,1.5-1.1,3.2-1.1,4.9v13.3h-4V15.1l3.6,1.5v1.7c0.8-1.5,2.1-2.6,3.6-3.3
|
||||||
|
c1.5-0.8,3.2-1.2,4.9-1.1C68.9,13.8,71.3,14.7,73.3,16.3z"/>
|
||||||
|
<path class="st3" d="M104.4,28.3H85.6c0.1,2.2,1,4.3,2.5,5.9c1.5,1.4,3.5,2.2,5.6,2.1c1.6,0.1,3.2-0.2,4.6-0.9
|
||||||
|
c1.1-0.6,2-1.6,2.5-2.8l3.3,1.8c-0.9,1.7-2.3,3.1-4,4c-2,1-4.2,1.5-6.4,1.4c-3.7,0-6.7-1.1-8.8-3.4s-3.2-5.5-3.2-9.6s1-7.2,3-9.5
|
||||||
|
s5-3.4,8.7-3.4c2.1-0.1,4.2,0.5,6.1,1.5c1.6,1,3,2.5,3.8,4.2c0.9,1.8,1.3,3.9,1.3,5.9C104.6,26.4,104.6,27.4,104.4,28.3z
|
||||||
|
M88.1,19.3c-1.4,1.5-2.2,3.4-2.4,5.5h15.1c-0.2-2-1-3.9-2.3-5.5c-1.4-1.3-3.2-2-5.1-1.9C91.5,17.3,89.6,18,88.1,19.3z"/>
|
||||||
|
<path class="st3" d="M131,17.3c2.2,2.3,3.2,5.5,3.2,9.5s-1,7.3-3.2,9.6s-5.1,3.4-8.8,3.4s-6.7-1.1-8.9-3.4s-3.2-5.5-3.2-9.6
|
||||||
|
s1.1-7.2,3.2-9.5s5.1-3.4,8.9-3.4S128.9,15,131,17.3z M116.2,19.9c-1.5,2-2.2,4.4-2.1,6.9c-0.2,2.5,0.6,5,2.1,7
|
||||||
|
c1.5,1.7,3.7,2.7,6,2.6c2.3,0.1,4.4-0.9,5.9-2.6c1.5-2,2.3-4.5,2.1-7c0.1-2.5-0.6-4.9-2.1-6.9c-1.5-1.7-3.6-2.7-5.9-2.6
|
||||||
|
C119.9,17.2,117.7,18.2,116.2,19.9z"/>
|
||||||
|
<polygon class="st4" points="0,9.1 0,43.7 22.5,51.8 22.5,16.9 46.8,7.9 24.8,0 "/>
|
||||||
|
<polygon class="st5" points="24.3,17.9 24.3,36.8 46.8,44.9 46.8,9.6 "/>
|
||||||
|
</g>
|
||||||
|
<g>
|
||||||
|
<g>
|
||||||
|
<path class="st6" d="M41.6,17.5H28.2v6.9h10.4v3.3H28.2v10.2h-3.9V14.2h17.2V17.5z"/>
|
||||||
|
<path class="st6" d="M45.8,37.9v-18h3.3l0.4,3.2c0.5-1.2,1.2-2.1,2.1-2.7c0.9-0.6,2.1-0.9,3.5-0.9c0.4,0,0.7,0,1.1,0.1
|
||||||
|
c0.4,0.1,0.7,0.2,0.9,0.3l-0.5,3.4c-0.3-0.1-0.6-0.2-0.9-0.2C55.4,23,54.9,23,54.4,23c-0.7,0-1.5,0.2-2.2,0.6
|
||||||
|
c-0.7,0.4-1.3,1-1.8,1.8s-0.7,1.8-0.7,3v9.5H45.8z"/>
|
||||||
|
<path class="st6" d="M68.6,19.6c1.8,0,3.3,0.4,4.6,1.1c1.3,0.7,2.4,1.8,3.1,3.2s1.1,3.1,1.1,5c0,1.9-0.4,3.6-1.1,5
|
||||||
|
c-0.8,1.4-1.8,2.5-3.1,3.2c-1.3,0.7-2.9,1.1-4.6,1.1s-3.3-0.4-4.6-1.1c-1.3-0.7-2.4-1.8-3.2-3.2c-0.8-1.4-1.2-3.1-1.2-5
|
||||||
|
c0-1.9,0.4-3.6,1.2-5s1.8-2.5,3.2-3.2C65.3,19.9,66.8,19.6,68.6,19.6z M68.6,22.6c-1.1,0-2,0.2-2.8,0.7c-0.8,0.5-1.3,1.2-1.7,2.1
|
||||||
|
s-0.6,2.1-0.6,3.5c0,1.3,0.2,2.5,0.6,3.4s1,1.7,1.7,2.2s1.7,0.7,2.8,0.7c1.1,0,2-0.2,2.7-0.7c0.7-0.5,1.3-1.2,1.7-2.2
|
||||||
|
s0.6-2.1,0.6-3.4c0-1.4-0.2-2.5-0.6-3.5s-1-1.6-1.7-2.1C70.6,22.8,69.6,22.6,68.6,22.6z"/>
|
||||||
|
<path class="st6" d="M89.2,38.3c-1.8,0-3.4-0.3-4.9-1c-1.5-0.7-2.7-1.7-3.5-3l2.7-2.3c0.5,1,1.3,1.8,2.3,2.4
|
||||||
|
c1,0.6,2.2,0.9,3.6,0.9c1.1,0,2-0.2,2.6-0.6c0.6-0.4,1-0.9,1-1.6c0-0.5-0.2-0.9-0.5-1.2s-0.9-0.6-1.7-0.8l-3.8-0.8
|
||||||
|
c-1.9-0.4-3.3-1-4.1-1.9c-0.8-0.9-1.2-1.9-1.2-3.3c0-1,0.3-1.9,0.9-2.7c0.6-0.8,1.4-1.5,2.5-2s2.5-0.8,4-0.8c1.8,0,3.3,0.3,4.6,1
|
||||||
|
c1.3,0.6,2.2,1.5,2.9,2.7l-2.7,2.2c-0.5-1-1.1-1.7-2-2.1c-0.9-0.5-1.8-0.7-2.8-0.7c-0.8,0-1.4,0.1-2,0.3c-0.6,0.2-1,0.5-1.3,0.8
|
||||||
|
c-0.3,0.3-0.4,0.7-0.4,1.2c0,0.5,0.2,0.9,0.5,1.3s1,0.6,1.9,0.8l4.1,0.9c1.7,0.3,2.9,0.9,3.7,1.7c0.7,0.8,1.1,1.8,1.1,2.9
|
||||||
|
c0,1.2-0.3,2.2-0.9,3c-0.6,0.9-1.5,1.6-2.6,2C92.1,38.1,90.7,38.3,89.2,38.3z"/>
|
||||||
|
<path class="st6" d="M112.8,19.9v3H99.3v-3H112.8z M106.6,14.6v17.9c0,0.9,0.2,1.5,0.7,1.9c0.5,0.4,1.1,0.6,1.9,0.6
|
||||||
|
c0.6,0,1.2-0.1,1.7-0.3c0.5-0.2,0.9-0.5,1.3-0.8l0.9,2.8c-0.6,0.5-1.2,0.9-2,1.1c-0.8,0.3-1.7,0.4-2.7,0.4c-1,0-2-0.2-2.8-0.5
|
||||||
|
s-1.5-0.9-2-1.6c-0.5-0.8-0.7-1.7-0.8-3V15.7L106.6,14.6z"/>
|
||||||
|
<path d="M137.9,17.5h-13.3v6.9h10.4v3.3h-10.4v10.2h-3.9V14.2h17.2V17.5z"/>
|
||||||
|
<path d="M150.9,13.8c2.1,0,4,0.4,5.5,1.2c1.6,0.8,2.9,2,4,3.5l-2.6,2.5c-0.9-1.4-1.9-2.4-3.1-3c-1.1-0.6-2.5-0.9-4-0.9
|
||||||
|
c-1.2,0-2.1,0.2-2.8,0.5c-0.7,0.3-1.3,0.7-1.6,1.2c-0.3,0.5-0.5,1.1-0.5,1.7c0,0.7,0.3,1.4,0.8,1.9c0.5,0.6,1.5,1,2.9,1.3
|
||||||
|
l4.8,1.1c2.3,0.5,3.9,1.3,4.9,2.3c1,1,1.4,2.3,1.4,3.9c0,1.5-0.4,2.7-1.2,3.8c-0.8,1.1-1.9,1.9-3.3,2.5s-3.1,0.9-5,0.9
|
||||||
|
c-1.7,0-3.2-0.2-4.5-0.6c-1.3-0.4-2.5-1-3.5-1.8c-1-0.7-1.8-1.6-2.5-2.6l2.7-2.7c0.5,0.8,1.1,1.6,1.9,2.2
|
||||||
|
c0.8,0.7,1.7,1.2,2.7,1.5c1,0.4,2.2,0.5,3.4,0.5c1.1,0,2.1-0.1,2.9-0.4c0.8-0.3,1.4-0.7,1.8-1.2c0.4-0.5,0.6-1.1,0.6-1.9
|
||||||
|
c0-0.7-0.2-1.3-0.7-1.8c-0.5-0.5-1.3-0.9-2.6-1.2l-5.2-1.2c-1.4-0.3-2.6-0.8-3.6-1.3c-0.9-0.6-1.6-1.3-2.1-2.1s-0.7-1.8-0.7-2.8
|
||||||
|
c0-1.3,0.4-2.6,1.1-3.7c0.7-1.1,1.8-2,3.2-2.6C147.3,14.1,148.9,13.8,150.9,13.8z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.5 KiB |
21
.forgejo/workflows/dco.yml
Normal file
21
.forgejo/workflows/dco.yml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
name: DCO action
|
||||||
|
on: [pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
dco:
|
||||||
|
name: DCO
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Setup Go
|
||||||
|
uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: '1.23'
|
||||||
|
|
||||||
|
- name: Run commit format checker
|
||||||
|
uses: https://git.frostfs.info/TrueCloudLab/dco-go@v3
|
||||||
|
with:
|
||||||
|
from: 'origin/${{ github.event.pull_request.base.ref }}'
|
54
.forgejo/workflows/tests.yml
Normal file
54
.forgejo/workflows/tests.yml
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
name: Tests and linters
|
||||||
|
on: [pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
name: Lint
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: '1.23'
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: golangci-lint
|
||||||
|
uses: https://github.com/golangci/golangci-lint-action@v3
|
||||||
|
with:
|
||||||
|
version: latest
|
||||||
|
|
||||||
|
tests:
|
||||||
|
name: Tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
go_versions: [ '1.22', '1.23' ]
|
||||||
|
fail-fast: false
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: '${{ matrix.go_versions }}'
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: make test
|
||||||
|
|
||||||
|
tests-race:
|
||||||
|
name: Tests with -race
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v3
|
||||||
|
with:
|
||||||
|
go-version: '1.23'
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: go test ./... -count=1 -race
|
1
.github/CODEOWNERS
vendored
1
.github/CODEOWNERS
vendored
|
@ -1 +0,0 @@
|
||||||
* @TrueCloudLab/storage-core @TrueCloudLab/storage-services @TrueCloudLab/committers
|
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,4 +1,3 @@
|
||||||
.idea
|
.idea
|
||||||
bin
|
bin
|
||||||
temp
|
temp
|
||||||
/vendor/
|
|
||||||
|
|
10
.gitlint
10
.gitlint
|
@ -1,10 +0,0 @@
|
||||||
[general]
|
|
||||||
fail-without-commits=true
|
|
||||||
contrib=CC1
|
|
||||||
|
|
||||||
[title-match-regex]
|
|
||||||
regex=^\[\#[0-9Xx]+\]\s
|
|
||||||
|
|
||||||
[ignore-by-title]
|
|
||||||
regex=^Release(.*)
|
|
||||||
ignore=title-match-regex
|
|
|
@ -4,18 +4,16 @@
|
||||||
# options for analysis running
|
# options for analysis running
|
||||||
run:
|
run:
|
||||||
# timeout for analysis, e.g. 30s, 5m, default is 1m
|
# timeout for analysis, e.g. 30s, 5m, default is 1m
|
||||||
timeout: 2m
|
timeout: 10m
|
||||||
|
|
||||||
# include test files or not, default is true
|
# include test files or not, default is true
|
||||||
tests: false
|
tests: false
|
||||||
|
|
||||||
skip-files:
|
|
||||||
- (^|.*/)grpc/(.*)
|
|
||||||
|
|
||||||
# output configuration options
|
# output configuration options
|
||||||
output:
|
output:
|
||||||
# colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number"
|
# colored-line-number|line-number|json|tab|checkstyle|code-climate, default is "colored-line-number"
|
||||||
format: tab
|
formats:
|
||||||
|
- format: tab
|
||||||
|
|
||||||
# all available settings of specific linters
|
# all available settings of specific linters
|
||||||
linters-settings:
|
linters-settings:
|
||||||
|
@ -27,6 +25,11 @@ linters-settings:
|
||||||
govet:
|
govet:
|
||||||
# report about shadowed variables
|
# report about shadowed variables
|
||||||
check-shadowing: false
|
check-shadowing: false
|
||||||
|
funlen:
|
||||||
|
lines: 80 # default 60
|
||||||
|
statements: 60 # default 40
|
||||||
|
gocognit:
|
||||||
|
min-complexity: 40 # default 30
|
||||||
|
|
||||||
linters:
|
linters:
|
||||||
enable:
|
enable:
|
||||||
|
@ -37,19 +40,34 @@ linters:
|
||||||
# some default golangci-lint linters
|
# some default golangci-lint linters
|
||||||
- errcheck
|
- errcheck
|
||||||
- gosimple
|
- gosimple
|
||||||
|
- godot
|
||||||
- ineffassign
|
- ineffassign
|
||||||
- staticcheck
|
- staticcheck
|
||||||
- typecheck
|
- typecheck
|
||||||
|
- unused
|
||||||
|
|
||||||
# extra linters
|
# extra linters
|
||||||
|
- bidichk
|
||||||
|
- durationcheck
|
||||||
- exhaustive
|
- exhaustive
|
||||||
|
- copyloopvar
|
||||||
- gofmt
|
- gofmt
|
||||||
- whitespace
|
|
||||||
- goimports
|
- goimports
|
||||||
|
- misspell
|
||||||
|
- predeclared
|
||||||
|
- reassign
|
||||||
|
- whitespace
|
||||||
|
- containedctx
|
||||||
|
- funlen
|
||||||
|
- gocognit
|
||||||
|
- contextcheck
|
||||||
disable-all: true
|
disable-all: true
|
||||||
fast: false
|
fast: false
|
||||||
|
|
||||||
issues:
|
issues:
|
||||||
|
exclude-files:
|
||||||
|
- (^|.*/)grpc/(.*)
|
||||||
|
|
||||||
# Excluding configuration per-path, per-linter, per-text and per-source
|
# Excluding configuration per-path, per-linter, per-text and per-source
|
||||||
exclude-rules:
|
exclude-rules:
|
||||||
- path: v2 # ignore stutters in universal structures due to protobuf compatibility
|
- path: v2 # ignore stutters in universal structures due to protobuf compatibility
|
||||||
|
|
|
@ -18,13 +18,25 @@ repos:
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
exclude: ".key$"
|
exclude: ".key$"
|
||||||
|
|
||||||
|
- repo: local
|
||||||
|
hooks:
|
||||||
|
- id: gofumpt
|
||||||
|
name: gofumpt
|
||||||
|
entry: make fumpt
|
||||||
|
pass_filenames: false
|
||||||
|
types: [go]
|
||||||
|
language: system
|
||||||
|
|
||||||
|
- repo: local
|
||||||
|
hooks:
|
||||||
|
- id: go-unit-tests
|
||||||
|
name: go unit tests
|
||||||
|
entry: make test GOFLAGS=''
|
||||||
|
pass_filenames: false
|
||||||
|
types: [go]
|
||||||
|
language: system
|
||||||
|
|
||||||
- repo: https://github.com/golangci/golangci-lint
|
- repo: https://github.com/golangci/golangci-lint
|
||||||
rev: v1.51.2
|
rev: v1.60.3
|
||||||
hooks:
|
hooks:
|
||||||
- id: golangci-lint
|
- id: golangci-lint
|
||||||
|
|
||||||
- repo: https://github.com/jorisroovers/gitlint
|
|
||||||
rev: v0.18.0
|
|
||||||
hooks:
|
|
||||||
- id: gitlint
|
|
||||||
stages: [commit-msg]
|
|
||||||
|
|
858
CHANGELOG.md
858
CHANGELOG.md
|
@ -5,852 +5,46 @@
|
||||||
### Added
|
### Added
|
||||||
### Fixed
|
### Fixed
|
||||||
### Changed
|
### Changed
|
||||||
### Updated
|
|
||||||
|
|
||||||
## [2.14.0] - 2022-10-17 - Anmado (안마도, 鞍馬島)
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Maintenance status and node state (#415)
|
|
||||||
- `NetmapSnapshot` RPC (#418)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Marshal repeated `[]byte` fields correctly (#413)
|
|
||||||
- Block until client connection is up (#419)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Support new object session context format (#416)
|
|
||||||
- Mark all expiration methods as deprecated (#417)
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
- Minimal go version to 1.17 (#412)
|
|
||||||
- `neofs-crypto` to `v0.4.0` (#412)
|
|
||||||
- `google.golang.org/grpc` to `v1.48.0` (#415)
|
|
||||||
- `google.golang.org/protobuf` to `v1.28.0` (#415)
|
|
||||||
|
|
||||||
## [2.13.1] - 2022-08-01
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- `EACL_NOT_FOUND` status code support (#409)
|
|
||||||
|
|
||||||
## [2.13.0] - 2022-07-04 - Yeonpyeongdo (연평도, 延坪島)
|
|
||||||
|
|
||||||
NeoFS API v2.13 support
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- WalletConnect signature scheme (#386)
|
|
||||||
- `object.StatusOutOfRange` enum value (#407)
|
|
||||||
- Functionality to disable homomorphic hashing in container (#399)
|
|
||||||
- `status.SignatureVerificationFail` enum value (#405)
|
|
||||||
|
|
||||||
## [2.12.2] - 2022-06-03
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- `util/protogen` tool to compile Protocol Buffers with stable marshaling
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- `refs.ObjectIDNestedListMarshal` incorrect encoding (#401)
|
|
||||||
- incorrect conversion of `oneof` field in `GetRangeResponseBody.FromGRPCMessage` (#401)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Setters don't check call on `nil` (#388)
|
|
||||||
- `StableMarshal` methods don't return `error`
|
|
||||||
- `oneof` fields are now randomly initialized in test generators (#401)
|
|
||||||
|
|
||||||
## [2.12.1] - 2022-03-15
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Incompatible changes in signature scheme (#380)
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Public URI-parsing function `client.ParseURI()` (#383)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Slices with pointers `[]*T` replaced with regular structure slices `[]T` in
|
|
||||||
v2 structures (#376)
|
|
||||||
|
|
||||||
## [2.12.0] - 2022-02-25 - Heuksando (흑산도, 黑山島)
|
|
||||||
|
|
||||||
NeoFS API v2.12 support
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Network magic field (`uint64`) to `session.RequestMetaHeader` (#367)
|
|
||||||
- Constants for attributes related to object notifications (#372)
|
|
||||||
- `refs.SignatureScheme` enum and corresponding field to `session.Signature` message (#55)
|
|
||||||
- New status codes in `container`, `object` and `session` packages (#371)
|
|
||||||
- `object.TypeLock` type enum value and `object.Lock` type of its content (#371)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- API of `signature` package (#55)
|
|
||||||
|
|
||||||
### Deprecated
|
|
||||||
- `SessionToken`, `SessionTokenBody` and `SessionTokenContext` types from `session` package
|
|
||||||
|
|
||||||
## [2.11.1] - 2021-12-28
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Timeout for single message transmission in `rpc/client` (#366)
|
|
||||||
|
|
||||||
## [2.11.0] - 2021-12-02 - Sinjido (신지도, 薪智島)
|
|
||||||
|
|
||||||
NeoFS API v2.11 support. High level packages are moved to
|
|
||||||
[neofs-sdk-go](https://github.com/nspcc-dev/neofs-sdk-go) repository.
|
|
||||||
Repository restructured as Go module version 2 and synced with
|
|
||||||
[neofs-api](https://github.com/nspcc-dev/neofs-api) release version.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Protobuf recompile script handles path with special symbols correctly (#354)
|
|
||||||
- `make dep` command (#364)
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Status codes in response messages (#350)
|
|
||||||
- Storage subnetwork types (#355, #356, #360, #362)
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- neofs-api-go is now Go module version 2 (#201)
|
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
- All packages from `pkg` moved to
|
### Updated
|
||||||
[neofs-sdk-go](https://github.com/nspcc-dev/neofs-sdk-go) (#201)
|
|
||||||
|
|
||||||
## [1.30.0] - 2021-10-19 - Udo (우도, 牛島)
|
## [2.16.0] - 2023-09-14 - Academy of Sciences Glacier
|
||||||
|
|
||||||
NeoFS API v2.10 support.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Potential NPE in NEO3Wallet related functions (#340)
|
|
||||||
- Incorrect return of reputation intermediate announcement (#342)
|
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
- Add impersonate flag to bearer token (#17)
|
||||||
|
- `NOT` and `UNIQUE` keywords to the placement policy (#26)
|
||||||
|
- `PutSingle` RPC (#45)
|
||||||
|
|
||||||
- pkg/client callback to parse internal response information (#337)
|
### Fixed
|
||||||
- Service filter type in extended ACL from API v2.10 (#338)
|
|
||||||
- Enhanced network info structures from API v2.10 (#339)
|
|
||||||
- Well-known public-append basic ACL constant (#341)
|
|
||||||
- Native contract names support (#351)
|
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
- `StableSize()` is optimized and no does no allocations (#49)
|
||||||
- Updated grpc to v1.41.0 (#176)
|
- Marshaling code now uses `protowire` package (#50)
|
||||||
|
|
||||||
## [1.29.0] - 2021-08-27 - Anmyeondo (안면도, 安眠島)
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Well-known BasicACL constants to fit the specification (#330, #334).
|
|
||||||
- Linter warnings (#335).
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Support for `COMMON_PREFIX` filter operation for object attributes (#331).
|
|
||||||
- Missing well-known eACL filter setters (#333).
|
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
- Reputation system (#21)
|
||||||
- `FilterObjectParent` well-known object related filter key (#333).
|
|
||||||
|
|
||||||
### Updated
|
### Updated
|
||||||
|
- `github.com/stretchr/testify` to `v1.8.3`
|
||||||
|
- `go.opentelemetry.io/otel` to `v1.15.1`
|
||||||
|
- `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` to `v1.15.1`
|
||||||
|
- `go.opentelemetry.io/otel/exporters/stdout/stdouttrace` to `v1.15.1`
|
||||||
|
- `go.opentelemetry.io/otel/sdk` to `v1.15.1`
|
||||||
|
- `go.opentelemetry.io/otel/trace` to `v1.15.1`
|
||||||
|
- `golang.org/x/sync` to `v0.2.0`
|
||||||
|
- `google.golang.org/grpc` to `v1.55.0`
|
||||||
|
- `google.golang.org/protobuf` to `v1.30.0`
|
||||||
|
|
||||||
- Go version to `1.16` (#335).
|
|
||||||
- Tests in CI to run on `1.16` and `1.17` Go versions (#335).
|
|
||||||
|
|
||||||
## [1.28.3] - 2021-07-07
|
## 2.15.0 - 2023-04-11
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Regression of the session token corruption fix from v1.28.2 ([#326](https://github.com/nspcc-dev/neofs-api-go/issues/326)).
|
|
||||||
|
|
||||||
## [1.28.2] - 2021-07-06
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Data corruption of parameterized session token in `pkg/client.Client` ([#323](https://github.com/nspcc-dev/neofs-api-go/issues/323)).
|
|
||||||
|
|
||||||
## [1.28.1] - 2021-07-01
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Incorrect unsupported version error in `Client.GetContainer` of containers of newer versions.
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- No longer used `pkg.IsSupportedVersion` func.
|
|
||||||
- No longer used `container.NewVerifiedFromV2` func.
|
|
||||||
|
|
||||||
## [1.28.0] - 2021-06-28 - Muuido (무의도, 舞衣島)
|
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
- Basic tracing support (#12)
|
||||||
|
- Optimize signature checking (#3)
|
||||||
|
|
||||||
- `String` / `FromString` methods to work with text format of enums from `pkg`.
|
Initial public release.
|
||||||
- `Marshal(JSON)` / `Unmarshal(JSON)` methods to `container.ContainerContext` type.
|
|
||||||
- Ability to handle the `io.Reader` of the object payload in `Client.GetObject`.
|
|
||||||
- `NumberOfAddresses` / `IterateAddresses` methods to node info types for support of multiple addresses.
|
|
||||||
|
|
||||||
### Fixed
|
## Older versions
|
||||||
|
|
||||||
- Added leading slash to format of gRPC method names.
|
This project is a fork of [NeoFS](https://github.com/nspcc-dev/neofs-api-go) from version v2.14.0.
|
||||||
|
To see CHANGELOG for older versions, refer to https://github.com/nspcc-dev/neofs-api-go/blob/master/CHANGELOG.md.
|
||||||
|
|
||||||
### Updated
|
[Unreleased]: https://git.frostfs.info/TrueCloudLab/frostfs-api-go/compare/v2.16.0...master
|
||||||
|
|
||||||
- Neo Go library to v0.95.3.
|
|
||||||
|
|
||||||
## [1.27.1] - 2021-06-10
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- SDK version was updated (actualized) to `2.7`.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- `pkg` wrappers' `ToV2` methods return `nil` if called on `nil`.
|
|
||||||
- `pkg` wrappers' `NewFromV2` functions constructs `nil` if called with `nil` argument.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Getters and setters for lifetime fields of `pkg/session.Token`.
|
|
||||||
- `MarshalHeaderJSON` method to `pkg/object.Object`.
|
|
||||||
- Generators for types from `pkg` (for testing).
|
|
||||||
- Descriptions of default fields for `pkg` wrappers and unit tests for its constructors.
|
|
||||||
- Unit tests for `ToV2` methods and `NewFromV2` functions.
|
|
||||||
|
|
||||||
## [1.27.0] - 2021-06-03 - Seongmodo (석모도, 席毛島)
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Message structures related to Container service sessions in `v2` and `pkg`.
|
|
||||||
- `session.Token` and `Signature` to `pkg/container.Container` and `pkg/acl/eacl.Table`.
|
|
||||||
- `Conn` method of clients to get the underlying connection.
|
|
||||||
- `WithTLSConfig` client option to specify TLS configuration.
|
|
||||||
- `WithNetworkURIAddress` client option to specify URI of the remote server.
|
|
||||||
- Generators of random container IDs, owner IDs and session tokens (for testing).
|
|
||||||
|
|
||||||
### Replaced
|
|
||||||
|
|
||||||
- `pkg/token.SessionToken` type to `pkg/session` package as `Token`. Old type is deprecated.
|
|
||||||
- `pkg/container.ID` type to `pkg/container/id` package. Old type is deprecated.
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
|
|
||||||
- NEO Go library to v0.95.1.
|
|
||||||
|
|
||||||
## [1.26.1] - 2021-05-19
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Updated neo-go to v0.95.0 release.
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- `pkg/errors` dependency (stdlib errors used instead).
|
|
||||||
|
|
||||||
## [1.26.0] - 2021-05-07 - Daecheongdo (대청도, 大靑島)
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Implementation of `v2/reputation` package.
|
|
||||||
- Implementation of reputation methods in `pkg/client`.
|
|
||||||
- Float64 stable marshaling wrappers in `util/proto`.
|
|
||||||
|
|
||||||
## [1.25.0] - 2021-03-22 - Jebudo (제부도, 濟扶島)
|
|
||||||
|
|
||||||
Raw client and support of NeoFS API v2.5.0 "Jebudo" release.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Raw client for peer to peer communication.
|
|
||||||
- `client.WithKey` option to sign messages with different keys within single
|
|
||||||
client.
|
|
||||||
- `Content-Type` well-known object attribute constant.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Refactored `v2` sub-packages to support single raw client in all RPC methods.
|
|
||||||
- Client constructor returns `Client` interface instead of structure.
|
|
||||||
|
|
||||||
## [1.24.0] - 2021-02-26 - Ganghwado (강화도, 江華島)
|
|
||||||
|
|
||||||
Support changes from NeoFS API v2.4.0 "Ganghwado" release.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- `netmap.NetworkInfo` definitions in `v2` and `pkg/netmap`.
|
|
||||||
- `netmap.NetworkInfo` RPC support in `pkg/client`.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Updated in-line docs from NeoFS API "Ganghwado" release.
|
|
||||||
|
|
||||||
## [1.23.0] - 2021-02-11 - Seonyudo (선유도, 仙遊島)
|
|
||||||
|
|
||||||
Support changes from NeoFS API v2.3.0 "Seonyudo" release.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Fulfill backup factor for default attribute in placement.
|
|
||||||
- Support of `Container.AnnounceUsedSpace` RPC from NeoFS API.
|
|
||||||
- New `pkg/client.Client.AnnounceContainerUsedSpace` method.
|
|
||||||
- Support of `STRING_NOT_EQUAL` and `NOT_PRESENT` object search filters.
|
|
||||||
- Implementation of `json.Marshaler`/`json.Unmarshaler` on `v2/object/SearchFilter`.
|
|
||||||
- Implementation of `json.Marshaler`/`json.Unmarshaler` on `pkg/object/SearchFilters`.
|
|
||||||
- Named constants of well-known node attributes in `pkg/netmap`.
|
|
||||||
|
|
||||||
### Renamed
|
|
||||||
|
|
||||||
- `pkg/netmap/PriceAttr` to `pkg/netmap/AttrPrice`.
|
|
||||||
- `pkg/netmap/CapacityAttr` to `pkg/netmap/AttrCapacity`.
|
|
||||||
|
|
||||||
## [1.22.2] - 2021-01-27
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Fix size limit for grpc messages in object.Put operation.
|
|
||||||
- Fix `GetContainerNode()` function, so that it does not modify placement policy.
|
|
||||||
|
|
||||||
## [1.22.1] - 2021-01-15
|
|
||||||
|
|
||||||
Support changes from NeoFS API v2.2.1 release.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Constant prefix of the reserved keys to X-headers (`__NEOFS__`).
|
|
||||||
- Constant string key to netmap epoch X-header (`__NEOFS__NETMAP_EPOCH`).
|
|
||||||
- Constant string key to netmap lookup depth X-header (`__NEOFS__NETMAP_LOOKUP_DEPTH`).
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Linter's configuration in `.golangci.yml`.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Remarks of the updated linter.
|
|
||||||
|
|
||||||
## [1.22.0] - 2020-12-30 - Yeouido (여의도, 汝矣島)
|
|
||||||
|
|
||||||
Support changes from NeoFS API v2.2.0 "Yeouido" release.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Payload hash field to `ShortHeader` message.
|
|
||||||
- Payload homomorphic hash field to `ShortHeader` message.
|
|
||||||
- Support of `StorageGroup` message.
|
|
||||||
- Support of `DataAuditResult` message.
|
|
||||||
- Stringer and string parser for `Checksum` type of client library.
|
|
||||||
- Stringer and string parser for `Type` message.
|
|
||||||
- Stringer and string parser for `Type` type of client library.
|
|
||||||
- `AddTypeFilter` method on `SearchFilters` type of client library
|
|
||||||
that adds filter by object type.
|
|
||||||
- Utility functions for working with `fixed64` protobuf type to `proto` library.
|
|
||||||
- Converters for `repeated` object ID messages in `v2` library.
|
|
||||||
|
|
||||||
## [1.21.2] - 2020-12-24
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- `Container.NonceUUID` getter of container nonce in UUID format.
|
|
||||||
- `Container.SetNonceUUID` setter of container nonce in UUID format.
|
|
||||||
- `NewVerifiedContainerFromV2` container constructor that preliminary
|
|
||||||
checks if container message argument meets NeoFS API V2 specification.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- `Container.Nonce`/`Container.SetNonce` marked as deprecated.
|
|
||||||
- `Client.GetContainer` method returns an error if received
|
|
||||||
container does not meet NeoFS API specification.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- `pkg.SDKVersion` to return version with minor `1`.
|
|
||||||
- `pkg.IsSupportedVersion` to consider `2.1` as supported.
|
|
||||||
|
|
||||||
## [1.21.1] - 2020-12-18
|
|
||||||
|
|
||||||
Support neofs-api v2.1.1.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- `client.GetVerifiedContainerStructure` function to check
|
|
||||||
that the container structure matches the requested identifier.
|
|
||||||
|
|
||||||
## [1.21.0] - 2020-12-11 - Modo (모도, 茅島)
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- `SplitID` message support
|
|
||||||
- Search filter by `SplitID` field
|
|
||||||
- `SplitInfo` message support and related error
|
|
||||||
- `Raw` flag support in `Client.GetObject(Header)`
|
|
||||||
- Getters for parameter structures in `pkg/client` package
|
|
||||||
- `Tombstone` message support
|
|
||||||
- Tombstone address target parameter of `Client.DeleteObject` method
|
|
||||||
- `client.DeleteObject` helpful function
|
|
||||||
- Usage of default value for backup factor in placement builder
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- Object search filter by `CHILDFREE` property
|
|
||||||
|
|
||||||
### Renamed
|
|
||||||
|
|
||||||
- `AddLeafFilter` to `AddPhyFilter`
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- NPE in `eacl.NewTargetFromV2` function
|
|
||||||
- Processing `REP X` policies in placement builder
|
|
||||||
|
|
||||||
|
|
||||||
## [1.20.3] - 2020-11-25
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- `AddObjectIDFilter` method of `SearchFilters` type
|
|
||||||
- `WithDialTimeout` option of v2 and SDK `Client`'s
|
|
||||||
- `GetEACLWithSignature` method of SDK `Client` type
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- incorrect signature verification algorithm in `GetEACL` method of SDK `Client`
|
|
||||||
|
|
||||||
## [1.20.2] - 2020-11-17
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Readme badges
|
|
||||||
|
|
||||||
## [1.20.1] - 2020-11-17
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Signature check of head response in `pkg/client` (#202)
|
|
||||||
|
|
||||||
## [1.20.0] - 2020-11-16 - Jindo (진도, 珍島)
|
|
||||||
|
|
||||||
Major API refactoring and simplification. From now on this library will have
|
|
||||||
backward compatibility and support of major versions of NeoFS-API by having
|
|
||||||
**version specific** files in `vN` dirs and **version independent** SDK
|
|
||||||
structures and client in `pkg`. This version supports NeoFS-API v2.0.X
|
|
||||||
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- cross-protocol ```v2``` message types
|
|
||||||
- utility functions for message signing/verification
|
|
||||||
- ```v2```/ ```gRPC``` back and forth conversions
|
|
||||||
- primary SDK
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
- v0 and v1 NeoFS API is not supported anymore
|
|
||||||
|
|
||||||
## [1.3.0] - 2020-07-23
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Format of ```refs.OwnerID``` based on NEO3.
|
|
||||||
- Binary format of extended ACL table.
|
|
||||||
- ```acl``` package structure.
|
|
||||||
|
|
||||||
## [1.2.0] - 2020-07-08
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Extended ACL types.
|
|
||||||
- Getters and setters of ```EACLTable``` and its internal messages.
|
|
||||||
- Wrappers over ```EACLTable``` and its internal messages.
|
|
||||||
- Getters, setters and marshaling methods of wrappers.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Mechanism for signing requests on the principle of Matryoshka.
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
|
|
||||||
- NeoFS API v1.1.0 => 1.2.0
|
|
||||||
|
|
||||||
## [1.1.0] - 2020-06-18
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- `container.SetExtendedACL` rpc.
|
|
||||||
- `container.GetExtendedACL` rpc.
|
|
||||||
- Bearer token to all request messages.
|
|
||||||
- X-headers to all request messages.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Implementation and signatures of Sign/Verify request functions.
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
|
|
||||||
- NeoFS API v1.0.0 => 1.1.0
|
|
||||||
|
|
||||||
## [1.0.0] - 2020-05-26
|
|
||||||
|
|
||||||
- Bump major release
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
|
|
||||||
- NeoFS API v0.7.5 => v1.0.0
|
|
||||||
- github.com/golang/protobuf v1.4.0 => v1.4.2
|
|
||||||
- github.com/prometheus/client_golang v1.5.1 => v1.6.0
|
|
||||||
- github.com/spf13/viper v1.6.2 => v1.7.0
|
|
||||||
- google.golang.org/grpc v1.28.1 => v1.29.1
|
|
||||||
|
|
||||||
## [0.7.6] - 2020-05-19
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- `session.PublicSessionToken` function for session public key bytes receiving.
|
|
||||||
- The implementation of `service.DataWithSignKeyAccumulator` methods on `object.IntegrityHeader`.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- The implementation of `AddSignKey` method on `service.signedSessionToken` structure.
|
|
||||||
- `session.PrivateTOken` interface methods group.
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
|
|
||||||
- `OwnerKey` from `service.SessionToken` signed payload.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Incorrect `object.HeadRequest.ReadSignedData` method implementation.
|
|
||||||
|
|
||||||
## [0.7.5] - 2020-05-16
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Owner key to the `SessionToken` signed payload.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- `OwnerKeyContainer` interface embedded to `SessionTokenInfo` interface.
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
|
|
||||||
- NeoFS API v0.7.5
|
|
||||||
|
|
||||||
## [0.7.4] - 2020-05-12
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Stringify for `object.Object`.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Mechanism for creating and verifying request message signatures.
|
|
||||||
- Implementation and interface of private token storage.
|
|
||||||
- File structure of packages.
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
|
|
||||||
- NeoFS API v0.7.4
|
|
||||||
|
|
||||||
## [0.7.1] - 2020-04-20
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- Method to change current node state. (`state.ChangeState`)
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
|
|
||||||
- NeoFS API v0.7.1
|
|
||||||
|
|
||||||
## [0.7.0] - 2020-04-16
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
- NeoFS API v0.7.0
|
|
||||||
|
|
||||||
## [0.6.2] - 2020-04-16
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
- NeoFS API v0.6.1
|
|
||||||
- Protobuf v1.4.0
|
|
||||||
- Netmap v1.7.0
|
|
||||||
- Prometheus Client v1.5.1
|
|
||||||
- Testify v1.5.1
|
|
||||||
- gRPC v1.28.1
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- formatting
|
|
||||||
- test coverage for Object.PutRequest.CID method
|
|
||||||
|
|
||||||
## [0.6.1] - 2020-04-10
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- License changed to Apache 2.0
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- NPE in PutRequest.CID()
|
|
||||||
|
|
||||||
|
|
||||||
## [0.6.0] - 2020-04-03
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- `RequestType` for object service requests
|
|
||||||
- `Type()` function in `Request` interface
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Synced proto files with `neofs-api v0.6.0`
|
|
||||||
|
|
||||||
## [0.5.0] - 2020-03-31
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Rename repo to `neofs-api-go`
|
|
||||||
- Used public proto files
|
|
||||||
|
|
||||||
## [0.4.2] - 2020-03-16
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- NPE bug with CID method of object.PutRequest
|
|
||||||
|
|
||||||
## [0.4.1] - 2020-03-02
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Updated neofs-crypto library to v0.3.0
|
|
||||||
|
|
||||||
## [0.4.0] - 2020-02-18
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Meta header for all gRPC responses. It contains epoch stamp and version number.
|
|
||||||
### Changed
|
|
||||||
- Endianness in accounting cheque. Now it uses little endian for cheaper
|
|
||||||
decoding in neofs smart-contract.
|
|
||||||
|
|
||||||
## [0.3.2] - 2020-02-10
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- gRPC method DumpVars to State service
|
|
||||||
- add method `EncodeVariables` to encode debug variables to JSON (slice of bytes)
|
|
||||||
- increase test coverage for state package
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
- state proto file
|
|
||||||
- documentation for state service and messages
|
|
||||||
|
|
||||||
## [0.3.1] - 2020-02-07
|
|
||||||
### Fixed
|
|
||||||
- bug with `tz.Concat`
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
- dependencies:
|
|
||||||
- github.com/nspcc-dev/tzhash `v1.3.0 => v1.4.0`
|
|
||||||
- github.com/prometheus/client_golang `v1.4.0 => v1.4.1`
|
|
||||||
- google.golang.org/grpc `v1.27.0 => v1.27.1`
|
|
||||||
|
|
||||||
## [0.3.0] - 2020-02-05
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
- proto files
|
|
||||||
- dependencies
|
|
||||||
- github.com/golang/protobuf `v1.3.2 => v1.3.3`
|
|
||||||
- github.com/pkg/errors `v0.8.1 => v0.9.1`
|
|
||||||
- github.com/prometheus/client_golang `v1.2.1 => v1.4.0`
|
|
||||||
- github.com/prometheus/client_model `v0.0.0-20190812154241-14fe0d1b01d4 => v0.2.0`
|
|
||||||
- github.com/spf13/viper `v1.6.1 => v1.6.2`
|
|
||||||
- google.golang.org/grpc `v1.24.0 => v1.27.0`
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- make object.GetRange to be server-side streaming RPC
|
|
||||||
- GetRange response struct
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- badges to readme
|
|
||||||
|
|
||||||
## [0.2.14] - 2020-02-04
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Readme
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Filename header
|
|
||||||
|
|
||||||
### Updated
|
|
||||||
- Object.Search now uses streams
|
|
||||||
|
|
||||||
## [0.2.13] - 2020-02-03
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Code format
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Use separated proto repository
|
|
||||||
- Rename neofs-proto to neofs-api
|
|
||||||
|
|
||||||
## [0.2.12] - 2020-01-27
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Bug with ByteSize (0 bytes returns NaN)
|
|
||||||
|
|
||||||
## [0.2.11] - 2020-01-21
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Raw flag in object head and get queries with docs
|
|
||||||
|
|
||||||
## [0.2.10] - 2020-01-17
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Private token contructor now takes public keys as an argument
|
|
||||||
|
|
||||||
## [0.2.9] - 2020-01-17
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Docs for container ACL field
|
|
||||||
- Public key header in the object with docs
|
|
||||||
- Public key field in the session token with docs
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Routine to verify correct object checks if integrity header is last and
|
|
||||||
may use public key header if verification header is not present
|
|
||||||
- Routine to verify correct session token checks if keys in the token
|
|
||||||
associated with owner id
|
|
||||||
- Updated neofs-crypto to v0.2.3
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
- Timestamp in object tombstone header
|
|
||||||
|
|
||||||
## [0.2.8] - 2019-12-21
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Container access control type definitions
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Used sync.Pool for Sign/VerifyRequestHeader
|
|
||||||
- VerifiableRequest.Marshal method replace with MarshalTo and Size
|
|
||||||
|
|
||||||
## [0.2.7] - 2019-12-17
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
- Bug with DecodeMetrics (empty metrics returns)
|
|
||||||
|
|
||||||
## [0.2.6] - 2019-12-17
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Request to dump node config
|
|
||||||
|
|
||||||
## [0.2.5] - 2019-12-05
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
- proto.Message in Maintainable/Verifiable requests
|
|
||||||
|
|
||||||
## [0.2.4] - 2019-12-03
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- StorageGroup library
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Storage group part of object library moved into separate package
|
|
||||||
- Updated proto documentation
|
|
||||||
|
|
||||||
## [0.2.3] - 2019-11-28
|
|
||||||
|
|
||||||
### Removed
|
|
||||||
- service: SignRequest / VerifyRequest and accompanying code
|
|
||||||
- proto: Signature field from requests
|
|
||||||
- object: bytefmt package not used anymore
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- service: rename EpochRequest to EpochHeader and merge with MetaHeader
|
|
||||||
- service: get status error even if it is wrapped
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- service: RequestVerificationHeader's method to validate owner
|
|
||||||
- service: test coverage for CheckOwner
|
|
||||||
- service: test coverage for wrapped status errors
|
|
||||||
|
|
||||||
## [0.2.2] - 2019-11-22
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- ProcessRequestTTL don't changes status errors from TTLCondition
|
|
||||||
|
|
||||||
## [0.2.1] - 2019-11-22
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Removed SendPutRequest
|
|
||||||
- MakePutRequestHeader sets only object and token
|
|
||||||
|
|
||||||
## [0.2.0] - 2019-11-21
|
|
||||||
|
|
||||||
### Added
|
|
||||||
- Container not found error
|
|
||||||
- GitHub Actions as CI and Codecov
|
|
||||||
- Auto-generated proto documentation
|
|
||||||
- RequestMetaHeader to all RPC requests
|
|
||||||
- RequestVerificationHeader to all RPC requests
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
- Moved TTL and Epoch fields to RequestMetaHeader
|
|
||||||
- Renamed Version in object.SearchRequest to QueryVersion
|
|
||||||
- Removed SetTTL, GetTTL, SetEpoch, GetEpoch from all RPC requests
|
|
||||||
|
|
||||||
## 0.1.0 - 2019-11-18
|
|
||||||
|
|
||||||
Initial public release
|
|
||||||
|
|
||||||
[0.2.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.1.0...v0.2.0
|
|
||||||
[0.2.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.0...v0.2.1
|
|
||||||
[0.2.2]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.1...v0.2.2
|
|
||||||
[0.2.3]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.2...v0.2.3
|
|
||||||
[0.2.4]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.3...v0.2.4
|
|
||||||
[0.2.5]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.4...v0.2.5
|
|
||||||
[0.2.6]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.5...v0.2.6
|
|
||||||
[0.2.7]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.6...v0.2.7
|
|
||||||
[0.2.8]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.7...v0.2.8
|
|
||||||
[0.2.9]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.8...v0.2.9
|
|
||||||
[0.2.10]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.9...v0.2.10
|
|
||||||
[0.2.11]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.10...v0.2.11
|
|
||||||
[0.2.12]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.11...v0.2.12
|
|
||||||
[0.2.13]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.12...v0.2.13
|
|
||||||
[0.2.14]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.13...v0.2.14
|
|
||||||
[0.3.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.2.14...v0.3.0
|
|
||||||
[0.3.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.3.0...v0.3.1
|
|
||||||
[0.3.2]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.3.1...v0.3.2
|
|
||||||
[0.4.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.3.2...v0.4.0
|
|
||||||
[0.4.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.4.0...v0.4.1
|
|
||||||
[0.4.2]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.4.1...v0.4.2
|
|
||||||
[0.5.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.4.2...v0.5.0
|
|
||||||
[0.6.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.5.0...v0.6.0
|
|
||||||
[0.6.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.6.0...v0.6.1
|
|
||||||
[0.6.2]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.6.1...v0.6.2
|
|
||||||
[0.7.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.6.2...v0.7.0
|
|
||||||
[0.7.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.7.0...v0.7.1
|
|
||||||
[0.7.4]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.7.1...v0.7.4
|
|
||||||
[0.7.5]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.7.4...v0.7.5
|
|
||||||
[0.7.6]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.7.5...v0.7.6
|
|
||||||
[1.0.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v0.7.6...v1.0.0
|
|
||||||
[1.1.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.0.0...v1.1.0
|
|
||||||
[1.2.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.1.0...v1.2.0
|
|
||||||
[1.3.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.2.0...v1.3.0
|
|
||||||
[1.20.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.3.0...v1.20.0
|
|
||||||
[1.20.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.20.0...v1.20.1
|
|
||||||
[1.20.2]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.20.1...v1.20.2
|
|
||||||
[1.20.3]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.20.2...v1.20.3
|
|
||||||
[1.21.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.20.3...v1.21.0
|
|
||||||
[1.21.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.21.0...v1.21.1
|
|
||||||
[1.21.2]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.21.1...v1.21.2
|
|
||||||
[1.22.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.21.2...v1.22.0
|
|
||||||
[1.22.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.22.0...v1.22.1
|
|
||||||
[1.22.2]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.22.1...v1.22.2
|
|
||||||
[1.23.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.22.2...v1.23.0
|
|
||||||
[1.24.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.23.0...v1.24.0
|
|
||||||
[1.25.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.24.0...v1.25.0
|
|
||||||
[1.26.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.25.0...v1.26.0
|
|
||||||
[1.26.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.26.0...v1.26.1
|
|
||||||
[1.27.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.26.1...v1.27.0
|
|
||||||
[1.27.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.27.0...v1.27.1
|
|
||||||
[1.28.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.27.1...v1.28.0
|
|
||||||
[1.28.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.28.0...v1.28.1
|
|
||||||
[1.28.2]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.28.1...v1.28.2
|
|
||||||
[1.28.3]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.28.2...v1.28.3
|
|
||||||
[1.29.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.28.3...v1.29.0
|
|
||||||
[1.30.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.29.0...v1.30.0
|
|
||||||
[2.11.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v1.30.0...v2.11.0
|
|
||||||
[2.11.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v2.11.0...v2.11.1
|
|
||||||
[2.12.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v2.11.1...v2.12.0
|
|
||||||
[2.12.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v2.12.0...v2.12.1
|
|
||||||
[2.12.2]: https://github.com/nspcc-dev/neofs-api-go/compare/v2.12.1...v2.12.2
|
|
||||||
[2.13.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v2.12.2...v2.13.0
|
|
||||||
[2.13.1]: https://github.com/nspcc-dev/neofs-api-go/compare/v2.13.0...v2.13.1
|
|
||||||
[2.14.0]: https://github.com/nspcc-dev/neofs-api-go/compare/v2.13.1...v2.14.0
|
|
||||||
|
|
2
CODEOWNERS
Normal file
2
CODEOWNERS
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
.* @TrueCloudLab/storage-core-committers @TrueCloudLab/storage-core-developers @TrueCloudLab/storage-services-committers @TrueCloudLab/storage-services-developers
|
||||||
|
.forgejo/.* @potyarkin
|
|
@ -3,8 +3,8 @@
|
||||||
First, thank you for contributing! We love and encourage pull requests from
|
First, thank you for contributing! We love and encourage pull requests from
|
||||||
everyone. Please follow the guidelines:
|
everyone. Please follow the guidelines:
|
||||||
|
|
||||||
- Check the open [issues](https://github.com/TrueCloudLab/frostfs-api-go/issues) and
|
- Check the open [issues](https://git.frostfs.info/TrueCloudLab/frostfs-api-go/issues) and
|
||||||
[pull requests](https://github.com/TrueCloudLab/frostfs-api-go/pulls) for existing
|
[pull requests](https://git.frostfs.info/TrueCloudLab/frostfs-api-go/pulls) for existing
|
||||||
discussions.
|
discussions.
|
||||||
|
|
||||||
- Open an issue first, to discuss a new feature or enhancement.
|
- Open an issue first, to discuss a new feature or enhancement.
|
||||||
|
@ -25,19 +25,20 @@ Start by forking the `frostfs-api-go` repository, make changes in a branch and t
|
||||||
send a pull request. We encourage pull requests to discuss code changes. Here
|
send a pull request. We encourage pull requests to discuss code changes. Here
|
||||||
are the steps in details:
|
are the steps in details:
|
||||||
|
|
||||||
### Set up your GitHub Repository
|
### Set up your repository
|
||||||
Fork [FrostFS node upstream](https://github.com/TrueCloudLab/frostfs-api-go/fork) source
|
|
||||||
|
Fork [FrostFS node upstream](https://git.frostfs.info/TrueCloudLab/frostfs-api-go/fork) source
|
||||||
repository to your own personal repository. Copy the URL of your fork (you will
|
repository to your own personal repository. Copy the URL of your fork (you will
|
||||||
need it for the `git clone` command below).
|
need it for the `git clone` command below).
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
$ git clone https://github.com/TrueCloudLab/frostfs-api-go
|
$ git clone https://git.frostfs.info/TrueCloudLab/frostfs-api-go
|
||||||
```
|
```
|
||||||
|
|
||||||
### Set up git remote as ``upstream``
|
### Set up git remote as ``upstream``
|
||||||
```sh
|
```sh
|
||||||
$ cd frostfs-api-go
|
$ cd frostfs-api-go
|
||||||
$ git remote add upstream https://github.com/TrueCloudLab/frostfs-api-go
|
$ git remote add upstream https://git.frostfs.info/TrueCloudLab/frostfs-api-go
|
||||||
$ git fetch upstream
|
$ git fetch upstream
|
||||||
$ git merge upstream/master
|
$ git merge upstream/master
|
||||||
...
|
...
|
||||||
|
@ -86,7 +87,7 @@ $ git push origin feature/123-something_awesome
|
||||||
```
|
```
|
||||||
|
|
||||||
### Create a Pull Request
|
### Create a Pull Request
|
||||||
Pull requests can be created via GitHub. Refer to [this
|
Pull requests can be created via git.frostfs.info. Refer to [this
|
||||||
document](https://help.github.com/articles/creating-a-pull-request/) for
|
document](https://help.github.com/articles/creating-a-pull-request/) for
|
||||||
detailed steps on how to create a pull request. After a Pull Request gets peer
|
detailed steps on how to create a pull request. After a Pull Request gets peer
|
||||||
reviewed and approved, it will be merged.
|
reviewed and approved, it will be merged.
|
||||||
|
|
80
Makefile
80
Makefile
|
@ -2,61 +2,95 @@
|
||||||
SHELL = bash
|
SHELL = bash
|
||||||
|
|
||||||
VERSION ?= $(shell git describe --tags --match "v*" --abbrev=8 --dirty --always)
|
VERSION ?= $(shell git describe --tags --match "v*" --abbrev=8 --dirty --always)
|
||||||
|
PROTOC_VERSION ?= 27.2
|
||||||
|
PROTOC_GEN_GO_VERSION ?= $(shell go list -f '{{.Version}}' -m google.golang.org/protobuf)
|
||||||
|
PROTOC_OS_VERSION=osx-x86_64
|
||||||
|
ifeq ($(shell uname), Linux)
|
||||||
|
PROTOC_OS_VERSION=linux-x86_64
|
||||||
|
endif
|
||||||
|
|
||||||
.PHONY: dep fmts fmt imports protoc test lint version help
|
BIN = bin
|
||||||
|
PROTOBUF_DIR ?= $(abspath $(BIN))/protobuf
|
||||||
|
PROTOC_DIR ?= $(PROTOBUF_DIR)/protoc-v$(PROTOC_VERSION)
|
||||||
|
PROTOC_GEN_GO_DIR ?= $(PROTOBUF_DIR)/protoc-gen-go-$(PROTOC_GEN_GO_VERSION)
|
||||||
|
|
||||||
|
.PHONY: dep fmts fumpt imports protoc test lint version help $(BIN)/protogen protoc-test
|
||||||
|
|
||||||
# Pull go dependencies
|
# Pull go dependencies
|
||||||
dep:
|
dep:
|
||||||
@printf "⇒ Tidy requirements : "
|
@printf "⇒ Tidy requirements : "
|
||||||
CGO_ENABLED=0 \
|
CGO_ENABLED=0 \
|
||||||
GO111MODULE=on \
|
|
||||||
go mod tidy -v && echo OK
|
go mod tidy -v && echo OK
|
||||||
@printf "⇒ Download requirements: "
|
@printf "⇒ Download requirements: "
|
||||||
CGO_ENABLED=0 \
|
CGO_ENABLED=0 \
|
||||||
GO111MODULE=on \
|
|
||||||
go mod download && echo OK
|
go mod download && echo OK
|
||||||
@printf "⇒ Install test requirements: "
|
@printf "⇒ Install test requirements: "
|
||||||
CGO_ENABLED=0 \
|
CGO_ENABLED=0 \
|
||||||
GO111MODULE=on \
|
|
||||||
go test ./... && echo OK
|
go test ./... && echo OK
|
||||||
|
|
||||||
# Run all code formatters
|
# Run all code formatters
|
||||||
fmts: fmt imports
|
fmts: fumpt imports
|
||||||
|
|
||||||
# Reformat code
|
|
||||||
fmt:
|
|
||||||
@echo "⇒ Processing gofmt check"
|
|
||||||
@for f in `find . -type f -name '*.go' -not -path './vendor/*' -not -name '*.pb.go' -prune`; do \
|
|
||||||
GO111MODULE=on gofmt -s -w $$f; \
|
|
||||||
done
|
|
||||||
|
|
||||||
# Reformat imports
|
# Reformat imports
|
||||||
imports:
|
imports:
|
||||||
@echo "⇒ Processing goimports check"
|
@echo "⇒ Processing goimports check"
|
||||||
@for f in `find . -type f -name '*.go' -not -path './vendor/*' -not -name '*.pb.go' -prune`; do \
|
@for f in `find . -type f -name '*.go' -not -name '*.pb.go' -prune`; do \
|
||||||
GO111MODULE=on goimports -w $$f; \
|
goimports -w $$f; \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Run gofumpt
|
||||||
|
fumpt:
|
||||||
|
@echo "⇒ Processing gofumpt check"
|
||||||
|
@gofumpt -l -w .
|
||||||
|
|
||||||
|
# Install protoc
|
||||||
|
protoc-install:
|
||||||
|
@rm -rf $(PROTOBUF_DIR)
|
||||||
|
@mkdir -p $(PROTOBUF_DIR)
|
||||||
|
@echo "⇒ Installing protoc... "
|
||||||
|
@wget -q -O $(PROTOBUF_DIR)/protoc-$(PROTOC_VERSION).zip 'https://github.com/protocolbuffers/protobuf/releases/download/v$(PROTOC_VERSION)/protoc-$(PROTOC_VERSION)-$(PROTOC_OS_VERSION).zip'
|
||||||
|
@unzip -q -o $(PROTOBUF_DIR)/protoc-$(PROTOC_VERSION).zip -d $(PROTOC_DIR)
|
||||||
|
@rm $(PROTOBUF_DIR)/protoc-$(PROTOC_VERSION).zip
|
||||||
|
@echo "⇒ Installing protoc-gen-go..."
|
||||||
|
@GOBIN=$(PROTOC_GEN_GO_DIR) go install -v google.golang.org/protobuf/...@$(PROTOC_GEN_GO_VERSION)
|
||||||
|
|
||||||
|
|
||||||
# Regenerate code for proto files
|
# Regenerate code for proto files
|
||||||
protoc:
|
protoc:
|
||||||
@GOPRIVATE=github.com/TrueCloudLab go mod vendor
|
@if [ ! -d "$(PROTOC_DIR)" ] || [ ! -d "$(PROTOC_GEN_GO_DIR)" ]; then \
|
||||||
# Install specific version for protobuf lib
|
make protoc-install; \
|
||||||
@go list -f '{{.Path}}/...@{{.Version}}' -m google.golang.org/protobuf | xargs go install -v
|
fi
|
||||||
# Protoc generate
|
# Protoc generate
|
||||||
@for f in `find . -type f -name '*.proto' -not -path './vendor/*'`; do \
|
@for f in `find . -type f -name '*.proto' -not -path './bin/*' -not -path './util/proto/test/*'`; do \
|
||||||
echo "⇒ Processing $$f "; \
|
echo "⇒ Processing $$f "; \
|
||||||
protoc \
|
$(PROTOC_DIR)/bin/protoc \
|
||||||
--proto_path=.:./vendor:/usr/local/include \
|
--proto_path=.:$(PROTOC_DIR)/include:/usr/local/include \
|
||||||
--go_out=. --go_opt=paths=source_relative \
|
--plugin=protoc-gen-go-frostfs=$(abspath ./bin/protogen) \
|
||||||
|
--go-frostfs_out=fuzz=true:. \
|
||||||
|
--go-frostfs_opt=paths=source_relative \
|
||||||
--go-grpc_opt=require_unimplemented_servers=false \
|
--go-grpc_opt=require_unimplemented_servers=false \
|
||||||
--go-grpc_out=. --go-grpc_opt=paths=source_relative $$f; \
|
--go-grpc_out=. --go-grpc_opt=paths=source_relative $$f; \
|
||||||
done
|
done
|
||||||
rm -rf vendor
|
|
||||||
|
$(BIN)/protogen:
|
||||||
|
@go build -v -trimpath \
|
||||||
|
-o $(BIN)/protogen \
|
||||||
|
./util/protogen
|
||||||
|
|
||||||
|
protoc-test: protoc $(BIN)/protogen
|
||||||
|
@$(PROTOC_DIR)/bin/protoc \
|
||||||
|
--go_out=. --go_opt=paths=source_relative \
|
||||||
|
--plugin=protoc-gen-go-frostfs=$(abspath $(BIN)/protogen) \
|
||||||
|
--go-frostfs_opt=Mutil/proto/test/test.proto=git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/proto/test/custom \
|
||||||
|
--go-frostfs_opt=module=git.frostfs.info/TrueCloudLab/frostfs-api-go/v2 \
|
||||||
|
--go-frostfs_out=. --go-frostfs_opt=paths=import \
|
||||||
|
./util/proto/test/test.proto
|
||||||
|
|
||||||
# Run Unit Test with go test
|
# Run Unit Test with go test
|
||||||
|
test: GOFLAGS ?= "-count=1"
|
||||||
test:
|
test:
|
||||||
@echo "⇒ Running go test"
|
@echo "⇒ Running go test"
|
||||||
@GO111MODULE=on go test ./...
|
@GOFLAGS="$(GOFLAGS)" go test ./...
|
||||||
|
|
||||||
# Run linters
|
# Run linters
|
||||||
lint:
|
lint:
|
||||||
|
|
16
README.md
16
README.md
|
@ -1,27 +1,25 @@
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="./.github/logo.svg" width="500px" alt="FrostFS">
|
<img src="./.forgejo/logo.svg" width="500px" alt="FrostFS">
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
Low-level Golang API for <a href="https://frostfs.info">FrostFS</a>
|
Low-level Golang API for <a href="https://frostfs.info">FrostFS</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
![Tests](https://github.com/TrueCloudLab/frostfs-api-go/workflows/frostfs-api-go%20tests/badge.svg)
|
![Tests](https://git.frostfs.info/TrueCloudLab/frostfs-api-go/badges/workflows/tests.yml/badge.svg)
|
||||||
[![codecov](https://codecov.io/gh/TrueCloudLab/frostfs-api-go/branch/master/graph/badge.svg)](https://codecov.io/gh/TrueCloudLab/frostfs-api-go)
|
[![Report](https://goreportcard.com/badge/git.frostfs.info/TrueCloudLab/frostfs-api-go)](https://goreportcard.com/report/git.frostfs.info/TrueCloudLab/frostfs-api-go)
|
||||||
[![Report](https://goreportcard.com/badge/github.com/TrueCloudLab/frostfs-api-go)](https://goreportcard.com/report/github.com/TrueCloudLab/frostfs-api-go)
|
[![Release](https://git.frostfs.info/TrueCloudLab/frostfs-api-go/badges/release.svg)](https://git.frostfs.info/TrueCloudLab/frostfs-api-go)
|
||||||
[![GitHub release](https://img.shields.io/github/release/TrueCloudLab/frostfs-api-go.svg)](https://github.com/TrueCloudLab/frostfs-api-go)
|
|
||||||
![GitHub license](https://img.shields.io/github/license/TrueCloudLab/frostfs-api-go.svg?style=popout)
|
|
||||||
|
|
||||||
# Overview
|
# Overview
|
||||||
|
|
||||||
Go implementation of recent [FrostFS API](https://github.com/TrueCloudLab/frostfs-api)
|
Go implementation of recent [FrostFS API](https://git.frostfs.info/TrueCloudLab/frostfs-api)
|
||||||
versions. For a more high-level SDK see [FrostFS SDK](https://github.com/TrueCloudLab/frostfs-sdk-go).
|
versions. For a more high-level SDK see [FrostFS SDK](https://git.frostfs.info/TrueCloudLab/frostfs-sdk-go).
|
||||||
|
|
||||||
## Frostfs-Api compatibility
|
## Frostfs-Api compatibility
|
||||||
|
|
||||||
|frostfs-api-go version|supported frostfs-api versions|
|
|frostfs-api-go version|supported frostfs-api versions|
|
||||||
|:------------------:|:--------------------------:|
|
|:------------------:|:--------------------------:|
|
||||||
|v2.14.x|[v2.14.0](https://github.com/TrueCloudLab/frostfs-api/releases/tag/v2.14.0)|
|
|v2.14.x|[v2.14.0](https://git.frostfs.info/TrueCloudLab/frostfs-api/releases/tag/v2.14.0)|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
package accounting
|
|
||||||
|
|
||||||
import (
|
|
||||||
refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc"
|
|
||||||
session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session/grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SetOwnerId sets identifier of the account owner.
|
|
||||||
func (m *BalanceRequest_Body) SetOwnerId(v *refs.OwnerID) {
|
|
||||||
m.OwnerId = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the request.
|
|
||||||
func (m *BalanceRequest) SetBody(v *BalanceRequest_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the request.
|
|
||||||
func (m *BalanceRequest) SetMetaHeader(v *session.RequestMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the request.
|
|
||||||
func (m *BalanceRequest) SetVerifyHeader(v *session.RequestVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBalance sets balance value of the response.
|
|
||||||
func (m *BalanceResponse_Body) SetBalance(v *Decimal) {
|
|
||||||
m.Balance = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the response.
|
|
||||||
func (m *BalanceResponse) SetBody(v *BalanceResponse_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the response.
|
|
||||||
func (m *BalanceResponse) SetMetaHeader(v *session.ResponseMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the response.
|
|
||||||
func (m *BalanceResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
BIN
accounting/grpc/service.pb.go
generated
BIN
accounting/grpc/service.pb.go
generated
Binary file not shown.
BIN
accounting/grpc/service_frostfs.pb.go
generated
Normal file
BIN
accounting/grpc/service_frostfs.pb.go
generated
Normal file
Binary file not shown.
45
accounting/grpc/service_frostfs_fuzz.go
Normal file
45
accounting/grpc/service_frostfs_fuzz.go
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package accounting
|
||||||
|
|
||||||
|
func DoFuzzProtoBalanceRequest(data []byte) int {
|
||||||
|
msg := new(BalanceRequest)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONBalanceRequest(data []byte) int {
|
||||||
|
msg := new(BalanceRequest)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoBalanceResponse(data []byte) int {
|
||||||
|
msg := new(BalanceResponse)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONBalanceResponse(data []byte) int {
|
||||||
|
msg := new(BalanceResponse)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
31
accounting/grpc/service_frostfs_test.go
Normal file
31
accounting/grpc/service_frostfs_test.go
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package accounting
|
||||||
|
|
||||||
|
import (
|
||||||
|
testing "testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FuzzProtoBalanceRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoBalanceRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONBalanceRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONBalanceRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoBalanceResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoBalanceResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONBalanceResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONBalanceResponse(data)
|
||||||
|
})
|
||||||
|
}
|
BIN
accounting/grpc/service_grpc.pb.go
generated
BIN
accounting/grpc/service_grpc.pb.go
generated
Binary file not shown.
|
@ -1,11 +0,0 @@
|
||||||
package accounting
|
|
||||||
|
|
||||||
// SetValue sets value of the decimal number.
|
|
||||||
func (m *Decimal) SetValue(v int64) {
|
|
||||||
m.Value = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetPrecision sets precision of the decimal number.
|
|
||||||
func (m *Decimal) SetPrecision(v uint32) {
|
|
||||||
m.Precision = v
|
|
||||||
}
|
|
BIN
accounting/grpc/types.pb.go
generated
BIN
accounting/grpc/types.pb.go
generated
Binary file not shown.
BIN
accounting/grpc/types_frostfs.pb.go
generated
Normal file
BIN
accounting/grpc/types_frostfs.pb.go
generated
Normal file
Binary file not shown.
26
accounting/grpc/types_frostfs_fuzz.go
Normal file
26
accounting/grpc/types_frostfs_fuzz.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package accounting
|
||||||
|
|
||||||
|
func DoFuzzProtoDecimal(data []byte) int {
|
||||||
|
msg := new(Decimal)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONDecimal(data []byte) int {
|
||||||
|
msg := new(Decimal)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
21
accounting/grpc/types_frostfs_test.go
Normal file
21
accounting/grpc/types_frostfs_test.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package accounting
|
||||||
|
|
||||||
|
import (
|
||||||
|
testing "testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FuzzProtoDecimal(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoDecimal(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONDecimal(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONDecimal(data)
|
||||||
|
})
|
||||||
|
}
|
|
@ -32,7 +32,7 @@ func BenchmarkTable_ToGRPCMessage(b *testing.B) {
|
||||||
|
|
||||||
b.Run("to grpc message", func(b *testing.B) {
|
b.Run("to grpc message", func(b *testing.B) {
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
raw := tb.ToGRPCMessage()
|
raw := tb.ToGRPCMessage()
|
||||||
if len(tb.GetRecords()) != len(raw.(*aclGrpc.EACLTable).Records) {
|
if len(tb.GetRecords()) != len(raw.(*aclGrpc.EACLTable).Records) {
|
||||||
b.FailNow()
|
b.FailNow()
|
||||||
|
@ -41,7 +41,7 @@ func BenchmarkTable_ToGRPCMessage(b *testing.B) {
|
||||||
})
|
})
|
||||||
b.Run("from grpc message", func(b *testing.B) {
|
b.Run("from grpc message", func(b *testing.B) {
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
for i := 0; i < b.N; i++ {
|
for range b.N {
|
||||||
tb := new(acl.Table)
|
tb := new(acl.Table)
|
||||||
if tb.FromGRPCMessage(raw) != nil {
|
if tb.FromGRPCMessage(raw) != nil {
|
||||||
b.FailNow()
|
b.FailNow()
|
||||||
|
|
118
acl/convert.go
118
acl/convert.go
|
@ -2,6 +2,8 @@ package acl
|
||||||
|
|
||||||
import (
|
import (
|
||||||
acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl/grpc"
|
acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl/grpc"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape"
|
||||||
|
apeGRPC "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape/grpc"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
refsGRPC "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc"
|
refsGRPC "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/grpc"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/grpc"
|
||||||
|
@ -164,7 +166,7 @@ func (f *HeaderFilter) ToGRPCMessage() grpc.Message {
|
||||||
|
|
||||||
m.SetKey(f.key)
|
m.SetKey(f.key)
|
||||||
m.SetValue(f.value)
|
m.SetValue(f.value)
|
||||||
m.SetHeader(HeaderTypeToGRPCField(f.hdrType))
|
m.SetHeaderType(HeaderTypeToGRPCField(f.hdrType))
|
||||||
m.SetMatchType(MatchTypeToGRPCField(f.matchType))
|
m.SetMatchType(MatchTypeToGRPCField(f.matchType))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,28 +187,26 @@ func (f *HeaderFilter) FromGRPCMessage(m grpc.Message) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func HeaderFiltersToGRPC(fs []HeaderFilter) (res []*acl.EACLRecord_Filter) {
|
func HeaderFiltersToGRPC(fs []HeaderFilter) (res []acl.EACLRecord_Filter) {
|
||||||
if fs != nil {
|
if fs != nil {
|
||||||
res = make([]*acl.EACLRecord_Filter, 0, len(fs))
|
res = make([]acl.EACLRecord_Filter, 0, len(fs))
|
||||||
|
|
||||||
for i := range fs {
|
for i := range fs {
|
||||||
res = append(res, fs[i].ToGRPCMessage().(*acl.EACLRecord_Filter))
|
res = append(res, *fs[i].ToGRPCMessage().(*acl.EACLRecord_Filter))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func HeaderFiltersFromGRPC(fs []*acl.EACLRecord_Filter) (res []HeaderFilter, err error) {
|
func HeaderFiltersFromGRPC(fs []acl.EACLRecord_Filter) (res []HeaderFilter, err error) {
|
||||||
if fs != nil {
|
if fs != nil {
|
||||||
res = make([]HeaderFilter, len(fs))
|
res = make([]HeaderFilter, len(fs))
|
||||||
|
|
||||||
for i := range fs {
|
for i := range fs {
|
||||||
if fs[i] != nil {
|
err = res[i].FromGRPCMessage(&fs[i])
|
||||||
err = res[i].FromGRPCMessage(fs[i])
|
if err != nil {
|
||||||
if err != nil {
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -239,28 +239,26 @@ func (t *Target) FromGRPCMessage(m grpc.Message) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func TargetsToGRPC(ts []Target) (res []*acl.EACLRecord_Target) {
|
func TargetsToGRPC(ts []Target) (res []acl.EACLRecord_Target) {
|
||||||
if ts != nil {
|
if ts != nil {
|
||||||
res = make([]*acl.EACLRecord_Target, 0, len(ts))
|
res = make([]acl.EACLRecord_Target, 0, len(ts))
|
||||||
|
|
||||||
for i := range ts {
|
for i := range ts {
|
||||||
res = append(res, ts[i].ToGRPCMessage().(*acl.EACLRecord_Target))
|
res = append(res, *ts[i].ToGRPCMessage().(*acl.EACLRecord_Target))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func TargetsFromGRPC(fs []*acl.EACLRecord_Target) (res []Target, err error) {
|
func TargetsFromGRPC(fs []acl.EACLRecord_Target) (res []Target, err error) {
|
||||||
if fs != nil {
|
if fs != nil {
|
||||||
res = make([]Target, len(fs))
|
res = make([]Target, len(fs))
|
||||||
|
|
||||||
for i := range fs {
|
for i := range fs {
|
||||||
if fs[i] != nil {
|
err = res[i].FromGRPCMessage(&fs[i])
|
||||||
err = res[i].FromGRPCMessage(fs[i])
|
if err != nil {
|
||||||
if err != nil {
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -307,28 +305,26 @@ func (r *Record) FromGRPCMessage(m grpc.Message) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func RecordsToGRPC(ts []Record) (res []*acl.EACLRecord) {
|
func RecordsToGRPC(ts []Record) (res []acl.EACLRecord) {
|
||||||
if ts != nil {
|
if ts != nil {
|
||||||
res = make([]*acl.EACLRecord, 0, len(ts))
|
res = make([]acl.EACLRecord, 0, len(ts))
|
||||||
|
|
||||||
for i := range ts {
|
for i := range ts {
|
||||||
res = append(res, ts[i].ToGRPCMessage().(*acl.EACLRecord))
|
res = append(res, *ts[i].ToGRPCMessage().(*acl.EACLRecord))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func RecordsFromGRPC(fs []*acl.EACLRecord) (res []Record, err error) {
|
func RecordsFromGRPC(fs []acl.EACLRecord) (res []Record, err error) {
|
||||||
if fs != nil {
|
if fs != nil {
|
||||||
res = make([]Record, len(fs))
|
res = make([]Record, len(fs))
|
||||||
|
|
||||||
for i := range fs {
|
for i := range fs {
|
||||||
if fs[i] != nil {
|
err = res[i].FromGRPCMessage(&fs[i])
|
||||||
err = res[i].FromGRPCMessage(fs[i])
|
if err != nil {
|
||||||
if err != nil {
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -418,6 +414,54 @@ func (l *TokenLifetime) FromGRPCMessage(m grpc.Message) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *APEOverride) ToGRPCMessage() grpc.Message {
|
||||||
|
var m *acl.BearerToken_Body_APEOverride
|
||||||
|
|
||||||
|
if c != nil {
|
||||||
|
m = new(acl.BearerToken_Body_APEOverride)
|
||||||
|
|
||||||
|
m.SetTarget(c.target.ToGRPCMessage().(*apeGRPC.ChainTarget))
|
||||||
|
|
||||||
|
if len(c.chains) > 0 {
|
||||||
|
apeChains := make([]apeGRPC.Chain, len(c.chains))
|
||||||
|
for i := range c.chains {
|
||||||
|
apeChains[i] = *c.chains[i].ToGRPCMessage().(*apeGRPC.Chain)
|
||||||
|
}
|
||||||
|
m.SetChains(apeChains)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *APEOverride) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
v, ok := m.(*acl.BearerToken_Body_APEOverride)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, v)
|
||||||
|
}
|
||||||
|
|
||||||
|
if targetGRPC := v.GetTarget(); targetGRPC != nil {
|
||||||
|
if c.target == nil {
|
||||||
|
c.target = new(ape.ChainTarget)
|
||||||
|
}
|
||||||
|
if err := c.target.FromGRPCMessage(v.GetTarget()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if apeChains := v.GetChains(); len(apeChains) > 0 {
|
||||||
|
c.chains = make([]*ape.Chain, len(apeChains))
|
||||||
|
for i := range apeChains {
|
||||||
|
c.chains[i] = new(ape.Chain)
|
||||||
|
if err := c.chains[i].FromGRPCMessage(&apeChains[i]); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (bt *BearerTokenBody) ToGRPCMessage() grpc.Message {
|
func (bt *BearerTokenBody) ToGRPCMessage() grpc.Message {
|
||||||
var m *acl.BearerToken_Body
|
var m *acl.BearerToken_Body
|
||||||
|
|
||||||
|
@ -427,6 +471,8 @@ func (bt *BearerTokenBody) ToGRPCMessage() grpc.Message {
|
||||||
m.SetOwnerId(bt.ownerID.ToGRPCMessage().(*refsGRPC.OwnerID))
|
m.SetOwnerId(bt.ownerID.ToGRPCMessage().(*refsGRPC.OwnerID))
|
||||||
m.SetLifetime(bt.lifetime.ToGRPCMessage().(*acl.BearerToken_Body_TokenLifetime))
|
m.SetLifetime(bt.lifetime.ToGRPCMessage().(*acl.BearerToken_Body_TokenLifetime))
|
||||||
m.SetEaclTable(bt.eacl.ToGRPCMessage().(*acl.EACLTable))
|
m.SetEaclTable(bt.eacl.ToGRPCMessage().(*acl.EACLTable))
|
||||||
|
m.SetAllowImpersonate(bt.impersonate)
|
||||||
|
m.SetApeOverride(bt.apeOverride.ToGRPCMessage().(*acl.BearerToken_Body_APEOverride))
|
||||||
}
|
}
|
||||||
|
|
||||||
return m
|
return m
|
||||||
|
@ -476,9 +522,23 @@ func (bt *BearerTokenBody) FromGRPCMessage(m grpc.Message) error {
|
||||||
bt.eacl = new(Table)
|
bt.eacl = new(Table)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = bt.eacl.FromGRPCMessage(eacl)
|
if err = bt.eacl.FromGRPCMessage(eacl); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if apeOverrideGRPC := v.GetApeOverride(); apeOverrideGRPC != nil {
|
||||||
|
if bt.apeOverride == nil {
|
||||||
|
bt.apeOverride = new(APEOverride)
|
||||||
|
}
|
||||||
|
err = bt.apeOverride.FromGRPCMessage(apeOverrideGRPC)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bt.impersonate = v.GetAllowImpersonate()
|
||||||
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,175 +0,0 @@
|
||||||
package acl
|
|
||||||
|
|
||||||
import (
|
|
||||||
refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SetVersion sets version of EACL rules in table.
|
|
||||||
func (m *EACLTable) SetVersion(v *refs.Version) {
|
|
||||||
m.Version = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContainerId sets container identifier of the eACL table.
|
|
||||||
func (m *EACLTable) SetContainerId(v *refs.ContainerID) {
|
|
||||||
m.ContainerId = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetRecords sets record list of the eACL table.
|
|
||||||
func (m *EACLTable) SetRecords(v []*EACLRecord) {
|
|
||||||
m.Records = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetOperation sets operation of the eACL record.
|
|
||||||
func (m *EACLRecord) SetOperation(v Operation) {
|
|
||||||
m.Operation = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetAction sets action of the eACL record.
|
|
||||||
func (m *EACLRecord) SetAction(v Action) {
|
|
||||||
m.Action = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetFilters sets filter list of the eACL record.
|
|
||||||
func (m *EACLRecord) SetFilters(v []*EACLRecord_Filter) {
|
|
||||||
m.Filters = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetTargets sets target list of the eACL record.
|
|
||||||
func (m *EACLRecord) SetTargets(v []*EACLRecord_Target) {
|
|
||||||
m.Targets = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetHeader sets header type of the eACL filter.
|
|
||||||
func (m *EACLRecord_Filter) SetHeader(v HeaderType) {
|
|
||||||
m.HeaderType = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMatchType sets match type of the eACL filter.
|
|
||||||
func (m *EACLRecord_Filter) SetMatchType(v MatchType) {
|
|
||||||
m.MatchType = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetKey sets key of the eACL filter.
|
|
||||||
func (m *EACLRecord_Filter) SetKey(v string) {
|
|
||||||
m.Key = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetValue sets value of the eACL filter.
|
|
||||||
func (m *EACLRecord_Filter) SetValue(v string) {
|
|
||||||
m.Value = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetRole sets target group of the eACL target.
|
|
||||||
func (m *EACLRecord_Target) SetRole(v Role) {
|
|
||||||
m.Role = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetKeys of the eACL target.
|
|
||||||
func (m *EACLRecord_Target) SetKeys(v [][]byte) {
|
|
||||||
m.Keys = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetEaclTable sets eACL table of the bearer token.
|
|
||||||
func (m *BearerToken_Body) SetEaclTable(v *EACLTable) {
|
|
||||||
m.EaclTable = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetOwnerId sets identifier of the bearer token owner.
|
|
||||||
func (m *BearerToken_Body) SetOwnerId(v *refs.OwnerID) {
|
|
||||||
m.OwnerId = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetLifetime sets lifetime of the bearer token.
|
|
||||||
func (m *BearerToken_Body) SetLifetime(v *BearerToken_Body_TokenLifetime) {
|
|
||||||
m.Lifetime = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets bearer token body.
|
|
||||||
func (m *BearerToken) SetBody(v *BearerToken_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetSignature sets bearer token signature.
|
|
||||||
func (m *BearerToken) SetSignature(v *refs.Signature) {
|
|
||||||
m.Signature = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetExp sets epoch number of the token expiration.
|
|
||||||
func (m *BearerToken_Body_TokenLifetime) SetExp(v uint64) {
|
|
||||||
m.Exp = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetNbf sets starting epoch number of the token.
|
|
||||||
func (m *BearerToken_Body_TokenLifetime) SetNbf(v uint64) {
|
|
||||||
m.Nbf = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetIat sets the number of the epoch in which the token was issued.
|
|
||||||
func (m *BearerToken_Body_TokenLifetime) SetIat(v uint64) {
|
|
||||||
m.Iat = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// FromString parses Action from a string representation,
|
|
||||||
// It is a reverse action to String().
|
|
||||||
//
|
|
||||||
// Returns true if s was parsed successfully.
|
|
||||||
func (x *Action) FromString(s string) bool {
|
|
||||||
i, ok := Action_value[s]
|
|
||||||
if ok {
|
|
||||||
*x = Action(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
// FromString parses Role from a string representation,
|
|
||||||
// It is a reverse action to String().
|
|
||||||
//
|
|
||||||
// Returns true if s was parsed successfully.
|
|
||||||
func (x *Role) FromString(s string) bool {
|
|
||||||
i, ok := Role_value[s]
|
|
||||||
if ok {
|
|
||||||
*x = Role(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
// FromString parses Operation from a string representation,
|
|
||||||
// It is a reverse action to String().
|
|
||||||
//
|
|
||||||
// Returns true if s was parsed successfully.
|
|
||||||
func (x *Operation) FromString(s string) bool {
|
|
||||||
i, ok := Operation_value[s]
|
|
||||||
if ok {
|
|
||||||
*x = Operation(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
// FromString parses MatchType from a string representation,
|
|
||||||
// It is a reverse action to String().
|
|
||||||
//
|
|
||||||
// Returns true if s was parsed successfully.
|
|
||||||
func (x *MatchType) FromString(s string) bool {
|
|
||||||
i, ok := MatchType_value[s]
|
|
||||||
if ok {
|
|
||||||
*x = MatchType(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ok
|
|
||||||
}
|
|
||||||
|
|
||||||
// FromString parses HeaderType from a string representation,
|
|
||||||
// It is a reverse action to String().
|
|
||||||
//
|
|
||||||
// Returns true if s was parsed successfully.
|
|
||||||
func (x *HeaderType) FromString(s string) bool {
|
|
||||||
i, ok := HeaderType_value[s]
|
|
||||||
if ok {
|
|
||||||
*x = HeaderType(i)
|
|
||||||
}
|
|
||||||
|
|
||||||
return ok
|
|
||||||
}
|
|
BIN
acl/grpc/types.pb.go
generated
BIN
acl/grpc/types.pb.go
generated
Binary file not shown.
BIN
acl/grpc/types_frostfs.pb.go
generated
Normal file
BIN
acl/grpc/types_frostfs.pb.go
generated
Normal file
Binary file not shown.
64
acl/grpc/types_frostfs_fuzz.go
Normal file
64
acl/grpc/types_frostfs_fuzz.go
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package acl
|
||||||
|
|
||||||
|
func DoFuzzProtoEACLRecord(data []byte) int {
|
||||||
|
msg := new(EACLRecord)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONEACLRecord(data []byte) int {
|
||||||
|
msg := new(EACLRecord)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoEACLTable(data []byte) int {
|
||||||
|
msg := new(EACLTable)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONEACLTable(data []byte) int {
|
||||||
|
msg := new(EACLTable)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoBearerToken(data []byte) int {
|
||||||
|
msg := new(BearerToken)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONBearerToken(data []byte) int {
|
||||||
|
msg := new(BearerToken)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
41
acl/grpc/types_frostfs_test.go
Normal file
41
acl/grpc/types_frostfs_test.go
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package acl
|
||||||
|
|
||||||
|
import (
|
||||||
|
testing "testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FuzzProtoEACLRecord(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoEACLRecord(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONEACLRecord(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONEACLRecord(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoEACLTable(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoEACLTable(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONEACLTable(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONEACLTable(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoBearerToken(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoBearerToken(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONBearerToken(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONBearerToken(data)
|
||||||
|
})
|
||||||
|
}
|
|
@ -21,6 +21,14 @@ func (t *Target) UnmarshalJSON(data []byte) error {
|
||||||
return message.UnmarshalJSON(t, data, new(acl.EACLRecord_Target))
|
return message.UnmarshalJSON(t, data, new(acl.EACLRecord_Target))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *APEOverride) MarshalJSON() ([]byte, error) {
|
||||||
|
return message.MarshalJSON(a)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *APEOverride) UnmarshalJSON(data []byte) error {
|
||||||
|
return message.UnmarshalJSON(a, data, new(acl.BearerToken_Body_APEOverride))
|
||||||
|
}
|
||||||
|
|
||||||
func (r *Record) MarshalJSON() ([]byte, error) {
|
func (r *Record) MarshalJSON() ([]byte, error) {
|
||||||
return message.MarshalJSON(r)
|
return message.MarshalJSON(r)
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,9 +28,14 @@ const (
|
||||||
lifetimeNotValidBeforeField = 2
|
lifetimeNotValidBeforeField = 2
|
||||||
lifetimeIssuedAtField = 3
|
lifetimeIssuedAtField = 3
|
||||||
|
|
||||||
bearerTokenBodyACLField = 1
|
tokenAPEChainsTargetField = 1
|
||||||
bearerTokenBodyOwnerField = 2
|
tokenAPEChainsChainsField = 2
|
||||||
bearerTokenBodyLifetimeField = 3
|
|
||||||
|
bearerTokenBodyACLField = 1
|
||||||
|
bearerTokenBodyOwnerField = 2
|
||||||
|
bearerTokenBodyLifetimeField = 3
|
||||||
|
bearerTokenBodyImpersonate = 4
|
||||||
|
bearerTokenTokenAPEChainsField = 5
|
||||||
|
|
||||||
bearerTokenBodyField = 1
|
bearerTokenBodyField = 1
|
||||||
bearerTokenSignatureField = 2
|
bearerTokenSignatureField = 2
|
||||||
|
@ -238,6 +243,42 @@ func (l *TokenLifetime) Unmarshal(data []byte) error {
|
||||||
return message.Unmarshal(l, data, new(acl.BearerToken_Body_TokenLifetime))
|
return message.Unmarshal(l, data, new(acl.BearerToken_Body_TokenLifetime))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *APEOverride) StableMarshal(buf []byte) []byte {
|
||||||
|
if c == nil {
|
||||||
|
return []byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf == nil {
|
||||||
|
buf = make([]byte, c.StableSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
var offset int
|
||||||
|
|
||||||
|
offset += protoutil.NestedStructureMarshal(tokenAPEChainsTargetField, buf[offset:], c.target)
|
||||||
|
for i := range c.chains {
|
||||||
|
offset += protoutil.NestedStructureMarshal(tokenAPEChainsChainsField, buf[offset:], c.chains[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *APEOverride) StableSize() (size int) {
|
||||||
|
if c == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
size += protoutil.NestedStructureSize(tokenAPEChainsTargetField, c.target)
|
||||||
|
for i := range c.chains {
|
||||||
|
size += protoutil.NestedStructureSize(tokenAPEChainsChainsField, c.chains[i])
|
||||||
|
}
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *APEOverride) Unmarshal(data []byte) error {
|
||||||
|
return message.Unmarshal(c, data, new(acl.BearerToken_Body_APEOverride))
|
||||||
|
}
|
||||||
|
|
||||||
func (bt *BearerTokenBody) StableMarshal(buf []byte) []byte {
|
func (bt *BearerTokenBody) StableMarshal(buf []byte) []byte {
|
||||||
if bt == nil {
|
if bt == nil {
|
||||||
return []byte{}
|
return []byte{}
|
||||||
|
@ -251,7 +292,9 @@ func (bt *BearerTokenBody) StableMarshal(buf []byte) []byte {
|
||||||
|
|
||||||
offset += protoutil.NestedStructureMarshal(bearerTokenBodyACLField, buf[offset:], bt.eacl)
|
offset += protoutil.NestedStructureMarshal(bearerTokenBodyACLField, buf[offset:], bt.eacl)
|
||||||
offset += protoutil.NestedStructureMarshal(bearerTokenBodyOwnerField, buf[offset:], bt.ownerID)
|
offset += protoutil.NestedStructureMarshal(bearerTokenBodyOwnerField, buf[offset:], bt.ownerID)
|
||||||
protoutil.NestedStructureMarshal(bearerTokenBodyLifetimeField, buf[offset:], bt.lifetime)
|
offset += protoutil.NestedStructureMarshal(bearerTokenBodyLifetimeField, buf[offset:], bt.lifetime)
|
||||||
|
offset += protoutil.BoolMarshal(bearerTokenBodyImpersonate, buf[offset:], bt.impersonate)
|
||||||
|
protoutil.NestedStructureMarshal(bearerTokenTokenAPEChainsField, buf[offset:], bt.apeOverride)
|
||||||
|
|
||||||
return buf
|
return buf
|
||||||
}
|
}
|
||||||
|
@ -264,6 +307,8 @@ func (bt *BearerTokenBody) StableSize() (size int) {
|
||||||
size += protoutil.NestedStructureSize(bearerTokenBodyACLField, bt.eacl)
|
size += protoutil.NestedStructureSize(bearerTokenBodyACLField, bt.eacl)
|
||||||
size += protoutil.NestedStructureSize(bearerTokenBodyOwnerField, bt.ownerID)
|
size += protoutil.NestedStructureSize(bearerTokenBodyOwnerField, bt.ownerID)
|
||||||
size += protoutil.NestedStructureSize(bearerTokenBodyLifetimeField, bt.lifetime)
|
size += protoutil.NestedStructureSize(bearerTokenBodyLifetimeField, bt.lifetime)
|
||||||
|
size += protoutil.BoolSize(bearerTokenBodyImpersonate, bt.impersonate)
|
||||||
|
size += protoutil.NestedStructureSize(bearerTokenTokenAPEChainsField, bt.apeOverride)
|
||||||
|
|
||||||
return size
|
return size
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ package acltest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
||||||
|
apetest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape/test"
|
||||||
accountingtest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/test"
|
accountingtest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -22,8 +23,20 @@ func GenerateBearerTokenBody(empty bool) *acl.BearerTokenBody {
|
||||||
|
|
||||||
if !empty {
|
if !empty {
|
||||||
m.SetOwnerID(accountingtest.GenerateOwnerID(false))
|
m.SetOwnerID(accountingtest.GenerateOwnerID(false))
|
||||||
m.SetEACL(GenerateTable(false))
|
|
||||||
m.SetLifetime(GenerateTokenLifetime(false))
|
m.SetLifetime(GenerateTokenLifetime(false))
|
||||||
|
m.SetAPEOverride(GenerateAPEOverride(empty))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateAPEOverride(empty bool) *acl.APEOverride {
|
||||||
|
var m *acl.APEOverride
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m = new(acl.APEOverride)
|
||||||
|
m.SetTarget(apetest.GenerateChainTarget(empty))
|
||||||
|
m.SetChains(apetest.GenerateRawChains(false, 3))
|
||||||
}
|
}
|
||||||
|
|
||||||
return m
|
return m
|
||||||
|
|
63
acl/types.go
63
acl/types.go
|
@ -1,6 +1,9 @@
|
||||||
package acl
|
package acl
|
||||||
|
|
||||||
import "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
import (
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
|
)
|
||||||
|
|
||||||
// HeaderFilter is a unified structure of FilterInfo
|
// HeaderFilter is a unified structure of FilterInfo
|
||||||
// message from proto definition.
|
// message from proto definition.
|
||||||
|
@ -46,12 +49,22 @@ type TokenLifetime struct {
|
||||||
exp, nbf, iat uint64
|
exp, nbf, iat uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type APEOverride struct {
|
||||||
|
target *ape.ChainTarget
|
||||||
|
|
||||||
|
chains []*ape.Chain
|
||||||
|
}
|
||||||
|
|
||||||
type BearerTokenBody struct {
|
type BearerTokenBody struct {
|
||||||
eacl *Table
|
eacl *Table
|
||||||
|
|
||||||
ownerID *refs.OwnerID
|
ownerID *refs.OwnerID
|
||||||
|
|
||||||
lifetime *TokenLifetime
|
lifetime *TokenLifetime
|
||||||
|
|
||||||
|
apeOverride *APEOverride
|
||||||
|
|
||||||
|
impersonate bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type BearerToken struct {
|
type BearerToken struct {
|
||||||
|
@ -316,6 +329,42 @@ func (bt *BearerTokenBody) SetEACL(v *Table) {
|
||||||
bt.eacl = v
|
bt.eacl = v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *APEOverride) GetTarget() *ape.ChainTarget {
|
||||||
|
if t == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return t.target
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *APEOverride) GetChains() []*ape.Chain {
|
||||||
|
if t == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return t.chains
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *APEOverride) SetTarget(v *ape.ChainTarget) {
|
||||||
|
t.target = v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *APEOverride) SetChains(v []*ape.Chain) {
|
||||||
|
t.chains = v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bt *BearerTokenBody) GetAPEOverride() *APEOverride {
|
||||||
|
if bt != nil {
|
||||||
|
return bt.apeOverride
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bt *BearerTokenBody) SetAPEOverride(v *APEOverride) {
|
||||||
|
bt.apeOverride = v
|
||||||
|
}
|
||||||
|
|
||||||
func (bt *BearerTokenBody) GetOwnerID() *refs.OwnerID {
|
func (bt *BearerTokenBody) GetOwnerID() *refs.OwnerID {
|
||||||
if bt != nil {
|
if bt != nil {
|
||||||
return bt.ownerID
|
return bt.ownerID
|
||||||
|
@ -340,6 +389,18 @@ func (bt *BearerTokenBody) SetLifetime(v *TokenLifetime) {
|
||||||
bt.lifetime = v
|
bt.lifetime = v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (bt *BearerTokenBody) GetImpersonate() bool {
|
||||||
|
if bt != nil {
|
||||||
|
return bt.impersonate
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (bt *BearerTokenBody) SetImpersonate(v bool) {
|
||||||
|
bt.impersonate = v
|
||||||
|
}
|
||||||
|
|
||||||
func (bt *BearerToken) GetBody() *BearerTokenBody {
|
func (bt *BearerToken) GetBody() *BearerTokenBody {
|
||||||
if bt != nil {
|
if bt != nil {
|
||||||
return bt.body
|
return bt.body
|
||||||
|
|
132
ape/convert.go
Normal file
132
ape/convert.go
Normal file
|
@ -0,0 +1,132 @@
|
||||||
|
package ape
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
ape "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape/grpc"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/grpc"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TargetTypeToGRPCField(typ TargetType) ape.TargetType {
|
||||||
|
switch typ {
|
||||||
|
case TargetTypeNamespace:
|
||||||
|
return ape.TargetType_NAMESPACE
|
||||||
|
case TargetTypeContainer:
|
||||||
|
return ape.TargetType_CONTAINER
|
||||||
|
case TargetTypeUser:
|
||||||
|
return ape.TargetType_USER
|
||||||
|
case TargetTypeGroup:
|
||||||
|
return ape.TargetType_GROUP
|
||||||
|
default:
|
||||||
|
return ape.TargetType_UNDEFINED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TargetTypeFromGRPCField(typ ape.TargetType) TargetType {
|
||||||
|
switch typ {
|
||||||
|
case ape.TargetType_NAMESPACE:
|
||||||
|
return TargetTypeNamespace
|
||||||
|
case ape.TargetType_CONTAINER:
|
||||||
|
return TargetTypeContainer
|
||||||
|
case ape.TargetType_USER:
|
||||||
|
return TargetTypeUser
|
||||||
|
case ape.TargetType_GROUP:
|
||||||
|
return TargetTypeGroup
|
||||||
|
default:
|
||||||
|
return TargetTypeUndefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TargetTypeToGRPC(typ TargetType) ape.TargetType {
|
||||||
|
return ape.TargetType(typ)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TargetTypeFromGRPC(typ ape.TargetType) TargetType {
|
||||||
|
return TargetType(typ)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v2 *ChainTarget) ToGRPCMessage() grpc.Message {
|
||||||
|
var mgrpc *ape.ChainTarget
|
||||||
|
|
||||||
|
if v2 != nil {
|
||||||
|
mgrpc = new(ape.ChainTarget)
|
||||||
|
|
||||||
|
mgrpc.SetType(TargetTypeToGRPC(v2.GetTargetType()))
|
||||||
|
mgrpc.SetName(v2.GetName())
|
||||||
|
}
|
||||||
|
|
||||||
|
return mgrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v2 *ChainTarget) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
mgrpc, ok := m.(*ape.ChainTarget)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, mgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
v2.SetTargetType(TargetTypeFromGRPC(mgrpc.GetType()))
|
||||||
|
v2.SetName(mgrpc.GetName())
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v2 *ChainRaw) ToGRPCMessage() grpc.Message {
|
||||||
|
var mgrpc *ape.Chain_Raw
|
||||||
|
|
||||||
|
if v2 != nil {
|
||||||
|
mgrpc = new(ape.Chain_Raw)
|
||||||
|
|
||||||
|
mgrpc.SetRaw(v2.GetRaw())
|
||||||
|
}
|
||||||
|
|
||||||
|
return mgrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v2 *ChainRaw) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
mgrpc, ok := m.(*ape.Chain_Raw)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, mgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
v2.SetRaw(mgrpc.GetRaw())
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v2 *Chain) ToGRPCMessage() grpc.Message {
|
||||||
|
var mgrpc *ape.Chain
|
||||||
|
|
||||||
|
if v2 != nil {
|
||||||
|
mgrpc = new(ape.Chain)
|
||||||
|
|
||||||
|
switch chainKind := v2.GetKind().(type) {
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("unsupported chain kind: %T", chainKind))
|
||||||
|
case *ChainRaw:
|
||||||
|
mgrpc.SetKind(chainKind.ToGRPCMessage().(*ape.Chain_Raw))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mgrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (v2 *Chain) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
mgrpc, ok := m.(*ape.Chain)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, mgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch chainKind := mgrpc.GetKind().(type) {
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unsupported chain kind: %T", chainKind)
|
||||||
|
case *ape.Chain_Raw:
|
||||||
|
chainRaw := new(ChainRaw)
|
||||||
|
if err := chainRaw.FromGRPCMessage(chainKind); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
v2.SetKind(chainRaw)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
BIN
ape/grpc/types_frostfs.pb.go
generated
Normal file
BIN
ape/grpc/types_frostfs.pb.go
generated
Normal file
Binary file not shown.
45
ape/grpc/types_frostfs_fuzz.go
Normal file
45
ape/grpc/types_frostfs_fuzz.go
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package ape
|
||||||
|
|
||||||
|
func DoFuzzProtoChainTarget(data []byte) int {
|
||||||
|
msg := new(ChainTarget)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONChainTarget(data []byte) int {
|
||||||
|
msg := new(ChainTarget)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoChain(data []byte) int {
|
||||||
|
msg := new(Chain)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONChain(data []byte) int {
|
||||||
|
msg := new(Chain)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
31
ape/grpc/types_frostfs_test.go
Normal file
31
ape/grpc/types_frostfs_test.go
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package ape
|
||||||
|
|
||||||
|
import (
|
||||||
|
testing "testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FuzzProtoChainTarget(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoChainTarget(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONChainTarget(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONChainTarget(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoChain(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoChain(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONChain(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONChain(data)
|
||||||
|
})
|
||||||
|
}
|
14
ape/json.go
Normal file
14
ape/json.go
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
package ape
|
||||||
|
|
||||||
|
import (
|
||||||
|
ape "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape/grpc"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (t *ChainTarget) MarshalJSON() ([]byte, error) {
|
||||||
|
return message.MarshalJSON(t)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *ChainTarget) UnmarshalJSON(data []byte) error {
|
||||||
|
return message.UnmarshalJSON(t, data, new(ape.ChainTarget))
|
||||||
|
}
|
92
ape/marshal.go
Normal file
92
ape/marshal.go
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
package ape
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
ape "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape/grpc"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/proto"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
chainTargetTargetTypeField = 1
|
||||||
|
chainTargetNameField = 2
|
||||||
|
|
||||||
|
chainRawField = 1
|
||||||
|
)
|
||||||
|
|
||||||
|
func (t *ChainTarget) StableSize() (size int) {
|
||||||
|
if t == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
size += proto.EnumSize(chainTargetTargetTypeField, int32(t.targeType))
|
||||||
|
size += proto.StringSize(chainTargetNameField, t.name)
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *ChainTarget) StableMarshal(buf []byte) []byte {
|
||||||
|
if t == nil {
|
||||||
|
return []byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf == nil {
|
||||||
|
buf = make([]byte, t.StableSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
var offset int
|
||||||
|
|
||||||
|
offset += proto.EnumMarshal(chainTargetTargetTypeField, buf[offset:], int32(t.targeType))
|
||||||
|
proto.StringMarshal(chainTargetNameField, buf[offset:], t.name)
|
||||||
|
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *ChainTarget) Unmarshal(data []byte) error {
|
||||||
|
return message.Unmarshal(t, data, new(ape.ChainTarget))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Chain) StableSize() (size int) {
|
||||||
|
if c == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
switch v := c.GetKind().(type) {
|
||||||
|
case *ChainRaw:
|
||||||
|
if v != nil {
|
||||||
|
size += proto.BytesSize(chainRawField, v.GetRaw())
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("unsupported chain kind: %T", v))
|
||||||
|
}
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Chain) StableMarshal(buf []byte) []byte {
|
||||||
|
if c == nil {
|
||||||
|
return []byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf == nil {
|
||||||
|
buf = make([]byte, c.StableSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
var offset int
|
||||||
|
|
||||||
|
switch v := c.GetKind().(type) {
|
||||||
|
case *ChainRaw:
|
||||||
|
if v != nil {
|
||||||
|
proto.BytesMarshal(chainRawField, buf[offset:], v.GetRaw())
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("unsupported chain kind: %T", v))
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Chain) Unmarshal(data []byte) error {
|
||||||
|
return message.Unmarshal(c, data, new(ape.Chain))
|
||||||
|
}
|
|
@ -1,15 +1,15 @@
|
||||||
package subnet_test
|
package ape_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
apetest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape/test"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message"
|
||||||
messagetest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message/test"
|
messagetest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message/test"
|
||||||
subnettest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/subnet/test"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestMessageConvert(t *testing.T) {
|
func TestMessageConvert(t *testing.T) {
|
||||||
messagetest.TestRPCMessage(t,
|
messagetest.TestRPCMessage(t,
|
||||||
func(empty bool) message.Message { return subnettest.GenerateSubnetInfo(empty) },
|
func(empty bool) message.Message { return apetest.GenerateChainTarget(empty) },
|
||||||
)
|
)
|
||||||
}
|
}
|
18
ape/string.go
Normal file
18
ape/string.go
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package ape
|
||||||
|
|
||||||
|
import (
|
||||||
|
apegrpc "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (tt TargetType) String() string {
|
||||||
|
return TargetTypeToGRPCField(tt).String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (tt *TargetType) FromString(s string) bool {
|
||||||
|
i, ok := apegrpc.TargetType_value[s]
|
||||||
|
if ok {
|
||||||
|
*tt = TargetType(i)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok
|
||||||
|
}
|
71
ape/test/generate.go
Normal file
71
ape/test/generate.go
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
package test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GenerateRawChains(empty bool, n int) []*ape.Chain {
|
||||||
|
if empty {
|
||||||
|
return []*ape.Chain{}
|
||||||
|
}
|
||||||
|
|
||||||
|
res := make([]*ape.Chain, n)
|
||||||
|
for i := range res {
|
||||||
|
res[i] = GenerateRawChain(empty)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateRawChain(empty bool) *ape.Chain {
|
||||||
|
chRaw := new(ape.ChainRaw)
|
||||||
|
|
||||||
|
if empty {
|
||||||
|
chRaw.SetRaw([]byte("{}"))
|
||||||
|
} else {
|
||||||
|
chRaw.SetRaw([]byte(`{
|
||||||
|
"ID": "",
|
||||||
|
"Rules": [
|
||||||
|
{
|
||||||
|
"Status": "Allow",
|
||||||
|
"Actions": {
|
||||||
|
"Inverted": false,
|
||||||
|
"Names": [
|
||||||
|
"GetObject"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Resources": {
|
||||||
|
"Inverted": false,
|
||||||
|
"Names": [
|
||||||
|
"native:object/*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Any": false,
|
||||||
|
"Condition": [
|
||||||
|
{
|
||||||
|
"Op": "StringEquals",
|
||||||
|
"Object": "Resource",
|
||||||
|
"Key": "Department",
|
||||||
|
"Value": "HR"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"MatchType": "DenyPriority"
|
||||||
|
}`))
|
||||||
|
}
|
||||||
|
|
||||||
|
ch := new(ape.Chain)
|
||||||
|
ch.SetKind(chRaw)
|
||||||
|
return ch
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateChainTarget(empty bool) *ape.ChainTarget {
|
||||||
|
m := new(ape.ChainTarget)
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m.SetTargetType(ape.TargetTypeContainer)
|
||||||
|
m.SetName("BzQw5HH3feoxFDD5tCT87Y1726qzgLfxEE7wgtoRzB3R")
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
79
ape/types.go
Normal file
79
ape/types.go
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
package ape
|
||||||
|
|
||||||
|
type TargetType uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
TargetTypeUndefined TargetType = iota
|
||||||
|
TargetTypeNamespace
|
||||||
|
TargetTypeContainer
|
||||||
|
TargetTypeUser
|
||||||
|
TargetTypeGroup
|
||||||
|
)
|
||||||
|
|
||||||
|
type ChainTarget struct {
|
||||||
|
targeType TargetType
|
||||||
|
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ct *ChainTarget) SetTargetType(targeType TargetType) {
|
||||||
|
ct.targeType = targeType
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ct *ChainTarget) SetName(name string) {
|
||||||
|
ct.name = name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ct *ChainTarget) GetTargetType() TargetType {
|
||||||
|
if ct != nil {
|
||||||
|
return ct.targeType
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ct *ChainTarget) GetName() string {
|
||||||
|
if ct != nil {
|
||||||
|
return ct.name
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type chainKind interface {
|
||||||
|
isChainKind()
|
||||||
|
}
|
||||||
|
|
||||||
|
type Chain struct {
|
||||||
|
kind chainKind
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Chain) SetKind(kind chainKind) {
|
||||||
|
c.kind = kind
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Chain) GetKind() chainKind {
|
||||||
|
if c == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.kind
|
||||||
|
}
|
||||||
|
|
||||||
|
type ChainRaw struct {
|
||||||
|
Raw []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*ChainRaw) isChainKind() {}
|
||||||
|
|
||||||
|
func (c *ChainRaw) SetRaw(raw []byte) {
|
||||||
|
c.Raw = raw
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *ChainRaw) GetRaw() []byte {
|
||||||
|
if c == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Raw
|
||||||
|
}
|
358
apemanager/convert.go
Normal file
358
apemanager/convert.go
Normal file
|
@ -0,0 +1,358 @@
|
||||||
|
package apemanager
|
||||||
|
|
||||||
|
import (
|
||||||
|
ape "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape"
|
||||||
|
apeGRPC "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape/grpc"
|
||||||
|
apemanager "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/apemanager/grpc"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/grpc"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (reqBody *AddChainRequestBody) ToGRPCMessage() grpc.Message {
|
||||||
|
var reqBodygrpc *apemanager.AddChainRequest_Body
|
||||||
|
|
||||||
|
if reqBody != nil {
|
||||||
|
reqBodygrpc = new(apemanager.AddChainRequest_Body)
|
||||||
|
|
||||||
|
reqBodygrpc.SetTarget(reqBody.GetTarget().ToGRPCMessage().(*apeGRPC.ChainTarget))
|
||||||
|
reqBodygrpc.SetChain(reqBody.GetChain().ToGRPCMessage().(*apeGRPC.Chain))
|
||||||
|
}
|
||||||
|
|
||||||
|
return reqBodygrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (reqBody *AddChainRequestBody) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
reqBodygrpc, ok := m.(*apemanager.AddChainRequest_Body)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, reqBodygrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if targetgrpc := reqBodygrpc.GetTarget(); targetgrpc != nil {
|
||||||
|
reqBody.target = new(ape.ChainTarget)
|
||||||
|
if err := reqBody.target.FromGRPCMessage(targetgrpc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if chaingrpc := reqBodygrpc.GetChain(); chaingrpc != nil {
|
||||||
|
reqBody.chain = new(ape.Chain)
|
||||||
|
if err := reqBody.GetChain().FromGRPCMessage(chaingrpc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (req *AddChainRequest) ToGRPCMessage() grpc.Message {
|
||||||
|
var reqgrpc *apemanager.AddChainRequest
|
||||||
|
|
||||||
|
if req != nil {
|
||||||
|
reqgrpc = new(apemanager.AddChainRequest)
|
||||||
|
|
||||||
|
reqgrpc.SetBody(req.GetBody().ToGRPCMessage().(*apemanager.AddChainRequest_Body))
|
||||||
|
req.RequestHeaders.ToMessage(reqgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
return reqgrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (req *AddChainRequest) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
reqgrpc, ok := m.(*apemanager.AddChainRequest)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, reqgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if reqBodygrpc := reqgrpc.GetBody(); reqBodygrpc != nil {
|
||||||
|
req.body = new(AddChainRequestBody)
|
||||||
|
if err := req.body.FromGRPCMessage(reqBodygrpc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return req.RequestHeaders.FromMessage(reqgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (respBody *AddChainResponseBody) ToGRPCMessage() grpc.Message {
|
||||||
|
var respBodygrpc *apemanager.AddChainResponse_Body
|
||||||
|
|
||||||
|
if respBody != nil {
|
||||||
|
respBodygrpc = new(apemanager.AddChainResponse_Body)
|
||||||
|
|
||||||
|
respBodygrpc.SetChainId(respBody.GetChainID())
|
||||||
|
}
|
||||||
|
|
||||||
|
return respBodygrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (respBody *AddChainResponseBody) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
respBodygrpc, ok := m.(*apemanager.AddChainResponse_Body)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, respBodygrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
respBody.SetChainID(respBodygrpc.GetChainId())
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (resp *AddChainResponse) ToGRPCMessage() grpc.Message {
|
||||||
|
var respgrpc *apemanager.AddChainResponse
|
||||||
|
|
||||||
|
if resp != nil {
|
||||||
|
respgrpc = new(apemanager.AddChainResponse)
|
||||||
|
|
||||||
|
respgrpc.SetBody(resp.body.ToGRPCMessage().(*apemanager.AddChainResponse_Body))
|
||||||
|
resp.ResponseHeaders.ToMessage(respgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
return respgrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (resp *AddChainResponse) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
respgrpc, ok := m.(*apemanager.AddChainResponse)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, respgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if respBodygrpc := respgrpc.GetBody(); respBodygrpc != nil {
|
||||||
|
resp.body = new(AddChainResponseBody)
|
||||||
|
if err := resp.body.FromGRPCMessage(respBodygrpc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp.ResponseHeaders.FromMessage(respgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (reqBody *RemoveChainRequestBody) ToGRPCMessage() grpc.Message {
|
||||||
|
var reqBodygrpc *apemanager.RemoveChainRequest_Body
|
||||||
|
|
||||||
|
if reqBody != nil {
|
||||||
|
reqBodygrpc = new(apemanager.RemoveChainRequest_Body)
|
||||||
|
|
||||||
|
reqBodygrpc.SetTarget(reqBody.target.ToGRPCMessage().(*apeGRPC.ChainTarget))
|
||||||
|
reqBodygrpc.SetChainId(reqBody.GetChainID())
|
||||||
|
}
|
||||||
|
|
||||||
|
return reqBodygrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (reqBody *RemoveChainRequestBody) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
reqBodygrpc, ok := m.(*apemanager.RemoveChainRequest_Body)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, reqBodygrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if targetgrpc := reqBodygrpc.GetTarget(); targetgrpc != nil {
|
||||||
|
reqBody.target = new(ape.ChainTarget)
|
||||||
|
if err := reqBody.target.FromGRPCMessage(targetgrpc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reqBody.SetChainID(reqBodygrpc.GetChainId())
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (req *RemoveChainRequest) ToGRPCMessage() grpc.Message {
|
||||||
|
var reqgrpc *apemanager.RemoveChainRequest
|
||||||
|
|
||||||
|
if req != nil {
|
||||||
|
reqgrpc = new(apemanager.RemoveChainRequest)
|
||||||
|
|
||||||
|
reqgrpc.SetBody(req.body.ToGRPCMessage().(*apemanager.RemoveChainRequest_Body))
|
||||||
|
req.RequestHeaders.ToMessage(reqgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
return reqgrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (req *RemoveChainRequest) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
reqgrpc, ok := m.(*apemanager.RemoveChainRequest)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, reqgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if reqBodygrpc := reqgrpc.GetBody(); reqBodygrpc != nil {
|
||||||
|
req.body = new(RemoveChainRequestBody)
|
||||||
|
if err := req.body.FromGRPCMessage(reqBodygrpc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return req.RequestHeaders.FromMessage(reqgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (respBody *RemoveChainResponseBody) ToGRPCMessage() grpc.Message {
|
||||||
|
var respBodygrpc *apemanager.RemoveChainResponse_Body
|
||||||
|
|
||||||
|
if respBody != nil {
|
||||||
|
respBodygrpc = new(apemanager.RemoveChainResponse_Body)
|
||||||
|
}
|
||||||
|
|
||||||
|
return respBodygrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (respBody *RemoveChainResponseBody) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
respBodygrpc, ok := m.(*apemanager.RemoveChainResponse_Body)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, respBodygrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (resp *RemoveChainResponse) ToGRPCMessage() grpc.Message {
|
||||||
|
var respgrpc *apemanager.RemoveChainResponse
|
||||||
|
|
||||||
|
if resp != nil {
|
||||||
|
respgrpc = new(apemanager.RemoveChainResponse)
|
||||||
|
|
||||||
|
respgrpc.SetBody(resp.body.ToGRPCMessage().(*apemanager.RemoveChainResponse_Body))
|
||||||
|
resp.ResponseHeaders.ToMessage(respgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
return respgrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (resp *RemoveChainResponse) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
respgrpc, ok := m.(*apemanager.RemoveChainResponse)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, respgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if respBodygrpc := respgrpc.GetBody(); respBodygrpc != nil {
|
||||||
|
resp.body = new(RemoveChainResponseBody)
|
||||||
|
if err := resp.body.FromGRPCMessage(respBodygrpc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp.ResponseHeaders.FromMessage(respgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (reqBody *ListChainsRequestBody) ToGRPCMessage() grpc.Message {
|
||||||
|
var reqBodygrpc *apemanager.ListChainsRequest_Body
|
||||||
|
|
||||||
|
if reqBody != nil {
|
||||||
|
reqBodygrpc = new(apemanager.ListChainsRequest_Body)
|
||||||
|
|
||||||
|
reqBodygrpc.SetTarget(reqBody.target.ToGRPCMessage().(*apeGRPC.ChainTarget))
|
||||||
|
}
|
||||||
|
|
||||||
|
return reqBodygrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (reqBody *ListChainsRequestBody) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
reqBodygrpc, ok := m.(*apemanager.ListChainsRequest_Body)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, reqBodygrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if targetgrpc := reqBodygrpc.GetTarget(); targetgrpc != nil {
|
||||||
|
reqBody.target = new(ape.ChainTarget)
|
||||||
|
if err := reqBody.target.FromGRPCMessage(targetgrpc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (req *ListChainsRequest) ToGRPCMessage() grpc.Message {
|
||||||
|
var reqgrpc *apemanager.ListChainsRequest
|
||||||
|
|
||||||
|
if req != nil {
|
||||||
|
reqgrpc = new(apemanager.ListChainsRequest)
|
||||||
|
|
||||||
|
reqgrpc.SetBody(req.body.ToGRPCMessage().(*apemanager.ListChainsRequest_Body))
|
||||||
|
req.RequestHeaders.ToMessage(reqgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
return reqgrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (req *ListChainsRequest) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
reqgrpc, ok := m.(*apemanager.ListChainsRequest)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, reqgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if reqBodygrpc := reqgrpc.GetBody(); reqBodygrpc != nil {
|
||||||
|
req.body = new(ListChainsRequestBody)
|
||||||
|
if err := req.body.FromGRPCMessage(reqBodygrpc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return req.RequestHeaders.FromMessage(reqgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (respBody *ListChainsResponseBody) ToGRPCMessage() grpc.Message {
|
||||||
|
var respBodygrpc *apemanager.ListChainsResponse_Body
|
||||||
|
|
||||||
|
if respBody != nil {
|
||||||
|
respBodygrpc = new(apemanager.ListChainsResponse_Body)
|
||||||
|
|
||||||
|
chainsgrpc := make([]apeGRPC.Chain, 0, len(respBody.GetChains()))
|
||||||
|
for _, chain := range respBody.GetChains() {
|
||||||
|
chainsgrpc = append(chainsgrpc, *chain.ToGRPCMessage().(*apeGRPC.Chain))
|
||||||
|
}
|
||||||
|
|
||||||
|
respBodygrpc.SetChains(chainsgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
return respBodygrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (respBody *ListChainsResponseBody) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
respBodygrpc, ok := m.(*apemanager.ListChainsResponse_Body)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, respBodygrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
chains := make([]*ape.Chain, 0, len(respBodygrpc.GetChains()))
|
||||||
|
|
||||||
|
for _, chaingrpc := range respBodygrpc.GetChains() {
|
||||||
|
chain := new(ape.Chain)
|
||||||
|
if err := chain.FromGRPCMessage(&chaingrpc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
chains = append(chains, chain)
|
||||||
|
}
|
||||||
|
|
||||||
|
respBody.SetChains(chains)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (resp *ListChainsResponse) ToGRPCMessage() grpc.Message {
|
||||||
|
var respgrpc *apemanager.ListChainsResponse
|
||||||
|
|
||||||
|
if resp != nil {
|
||||||
|
respgrpc = new(apemanager.ListChainsResponse)
|
||||||
|
|
||||||
|
respgrpc.SetBody(resp.body.ToGRPCMessage().(*apemanager.ListChainsResponse_Body))
|
||||||
|
resp.ResponseHeaders.ToMessage(respgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
return respgrpc
|
||||||
|
}
|
||||||
|
|
||||||
|
func (resp *ListChainsResponse) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
respgrpc, ok := m.(*apemanager.ListChainsResponse)
|
||||||
|
if !ok {
|
||||||
|
return message.NewUnexpectedMessageType(m, respgrpc)
|
||||||
|
}
|
||||||
|
|
||||||
|
if respBodygrpc := respgrpc.GetBody(); respBodygrpc != nil {
|
||||||
|
resp.body = new(ListChainsResponseBody)
|
||||||
|
if err := resp.body.FromGRPCMessage(respBodygrpc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp.ResponseHeaders.FromMessage(respgrpc)
|
||||||
|
}
|
BIN
apemanager/grpc/service_frostfs.pb.go
generated
Normal file
BIN
apemanager/grpc/service_frostfs.pb.go
generated
Normal file
Binary file not shown.
121
apemanager/grpc/service_frostfs_fuzz.go
Normal file
121
apemanager/grpc/service_frostfs_fuzz.go
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package apemanager
|
||||||
|
|
||||||
|
func DoFuzzProtoAddChainRequest(data []byte) int {
|
||||||
|
msg := new(AddChainRequest)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONAddChainRequest(data []byte) int {
|
||||||
|
msg := new(AddChainRequest)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoAddChainResponse(data []byte) int {
|
||||||
|
msg := new(AddChainResponse)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONAddChainResponse(data []byte) int {
|
||||||
|
msg := new(AddChainResponse)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoRemoveChainRequest(data []byte) int {
|
||||||
|
msg := new(RemoveChainRequest)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONRemoveChainRequest(data []byte) int {
|
||||||
|
msg := new(RemoveChainRequest)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoRemoveChainResponse(data []byte) int {
|
||||||
|
msg := new(RemoveChainResponse)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONRemoveChainResponse(data []byte) int {
|
||||||
|
msg := new(RemoveChainResponse)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoListChainsRequest(data []byte) int {
|
||||||
|
msg := new(ListChainsRequest)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONListChainsRequest(data []byte) int {
|
||||||
|
msg := new(ListChainsRequest)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoListChainsResponse(data []byte) int {
|
||||||
|
msg := new(ListChainsResponse)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONListChainsResponse(data []byte) int {
|
||||||
|
msg := new(ListChainsResponse)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
71
apemanager/grpc/service_frostfs_test.go
Normal file
71
apemanager/grpc/service_frostfs_test.go
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package apemanager
|
||||||
|
|
||||||
|
import (
|
||||||
|
testing "testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FuzzProtoAddChainRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoAddChainRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONAddChainRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONAddChainRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoAddChainResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoAddChainResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONAddChainResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONAddChainResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoRemoveChainRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoRemoveChainRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONRemoveChainRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONRemoveChainRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoRemoveChainResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoRemoveChainResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONRemoveChainResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONRemoveChainResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoListChainsRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoListChainsRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONListChainsRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONListChainsRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoListChainsResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoListChainsResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONListChainsResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONListChainsResponse(data)
|
||||||
|
})
|
||||||
|
}
|
BIN
apemanager/grpc/service_grpc.pb.go
generated
Normal file
BIN
apemanager/grpc/service_grpc.pb.go
generated
Normal file
Binary file not shown.
205
apemanager/marshal.go
Normal file
205
apemanager/marshal.go
Normal file
|
@ -0,0 +1,205 @@
|
||||||
|
package apemanager
|
||||||
|
|
||||||
|
import (
|
||||||
|
apemanager "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/apemanager/grpc"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/proto"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
addChainReqBodyTargetField = 1
|
||||||
|
addChainReqBodyChainField = 2
|
||||||
|
|
||||||
|
addChainRespBodyChainIDField = 1
|
||||||
|
|
||||||
|
removeChainReqBodyTargetField = 1
|
||||||
|
removeChainReqBodyChainField = 2
|
||||||
|
|
||||||
|
/*
|
||||||
|
Fields for RemoveResponseBody are missed since RemoveResponseBody is empty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
listChainsReqBodyTargetField = 1
|
||||||
|
|
||||||
|
listChainsRespBodyChainsField = 1
|
||||||
|
)
|
||||||
|
|
||||||
|
func (rb *AddChainRequestBody) StableSize() (size int) {
|
||||||
|
if rb == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
size += proto.NestedStructureSize(addChainReqBodyTargetField, rb.target)
|
||||||
|
size += proto.NestedStructureSize(addChainReqBodyChainField, rb.chain)
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *AddChainRequestBody) StableMarshal(buf []byte) []byte {
|
||||||
|
if rb == nil {
|
||||||
|
return []byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf == nil {
|
||||||
|
buf = make([]byte, rb.StableSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
var offset int
|
||||||
|
|
||||||
|
offset += proto.NestedStructureMarshal(addChainReqBodyTargetField, buf[offset:], rb.target)
|
||||||
|
proto.NestedStructureMarshal(addChainReqBodyChainField, buf[offset:], rb.chain)
|
||||||
|
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *AddChainRequestBody) Unmarshal(data []byte) error {
|
||||||
|
return message.Unmarshal(rb, data, new(apemanager.AddChainRequest_Body))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *AddChainResponseBody) StableSize() (size int) {
|
||||||
|
if rb == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
size += proto.BytesSize(addChainRespBodyChainIDField, rb.chainID)
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *AddChainResponseBody) StableMarshal(buf []byte) []byte {
|
||||||
|
if rb == nil {
|
||||||
|
return []byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf == nil {
|
||||||
|
buf = make([]byte, rb.StableSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
var offset int
|
||||||
|
|
||||||
|
proto.BytesMarshal(addChainRespBodyChainIDField, buf[offset:], rb.chainID)
|
||||||
|
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *AddChainResponseBody) Unmarshal(data []byte) error {
|
||||||
|
return message.Unmarshal(rb, data, new(apemanager.AddChainResponse_Body))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RemoveChainRequestBody) StableSize() (size int) {
|
||||||
|
if rb == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
size += proto.NestedStructureSize(addChainReqBodyTargetField, rb.target)
|
||||||
|
size += proto.BytesSize(addChainReqBodyChainField, rb.chainID)
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RemoveChainRequestBody) StableMarshal(buf []byte) []byte {
|
||||||
|
if rb == nil {
|
||||||
|
return []byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf == nil {
|
||||||
|
buf = make([]byte, rb.StableSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
var offset int
|
||||||
|
|
||||||
|
offset += proto.NestedStructureMarshal(removeChainReqBodyTargetField, buf[offset:], rb.target)
|
||||||
|
proto.BytesMarshal(removeChainReqBodyChainField, buf[offset:], rb.chainID)
|
||||||
|
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RemoveChainRequestBody) Unmarshal(data []byte) error {
|
||||||
|
return message.Unmarshal(rb, data, new(apemanager.RemoveChainRequest_Body))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RemoveChainResponseBody) StableSize() (size int) {
|
||||||
|
if rb == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RemoveChainResponseBody) StableMarshal(buf []byte) []byte {
|
||||||
|
if rb == nil {
|
||||||
|
return []byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf == nil {
|
||||||
|
buf = make([]byte, rb.StableSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RemoveChainResponseBody) Unmarshal(data []byte) error {
|
||||||
|
return message.Unmarshal(rb, data, new(apemanager.RemoveChainResponse_Body))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *ListChainsRequestBody) StableSize() (size int) {
|
||||||
|
if rb == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
size += proto.NestedStructureSize(listChainsReqBodyTargetField, rb.target)
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *ListChainsRequestBody) StableMarshal(buf []byte) []byte {
|
||||||
|
if rb == nil {
|
||||||
|
return []byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf == nil {
|
||||||
|
buf = make([]byte, rb.StableSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
var offset int
|
||||||
|
proto.NestedStructureMarshal(addChainReqBodyTargetField, buf[offset:], rb.target)
|
||||||
|
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *ListChainsRequestBody) Unmarshal(data []byte) error {
|
||||||
|
return message.Unmarshal(rb, data, new(apemanager.ListChainsRequest_Body))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *ListChainsResponseBody) StableSize() (size int) {
|
||||||
|
if rb == nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, chain := range rb.GetChains() {
|
||||||
|
size += proto.NestedStructureSize(listChainsRespBodyChainsField, chain)
|
||||||
|
}
|
||||||
|
|
||||||
|
return size
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *ListChainsResponseBody) StableMarshal(buf []byte) []byte {
|
||||||
|
if rb == nil {
|
||||||
|
return []byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
if buf == nil {
|
||||||
|
buf = make([]byte, rb.StableSize())
|
||||||
|
}
|
||||||
|
|
||||||
|
var offset int
|
||||||
|
for _, chain := range rb.GetChains() {
|
||||||
|
offset += proto.NestedStructureMarshal(listChainsRespBodyChainsField, buf[offset:], chain)
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *ListChainsResponseBody) Unmarshal(data []byte) error {
|
||||||
|
return message.Unmarshal(rb, data, new(apemanager.ListChainsResponse_Body))
|
||||||
|
}
|
26
apemanager/message_test.go
Normal file
26
apemanager/message_test.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
package apemanager_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
apemanagertest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/apemanager/test"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message"
|
||||||
|
messagetest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message/test"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestMessageConvert(t *testing.T) {
|
||||||
|
messagetest.TestRPCMessage(t,
|
||||||
|
func(empty bool) message.Message { return apemanagertest.GenerateAddChainRequestBody(empty) },
|
||||||
|
func(empty bool) message.Message { return apemanagertest.GenerateAddChainRequest(empty) },
|
||||||
|
func(empty bool) message.Message { return apemanagertest.GenerateAddChainResponseBody(empty) },
|
||||||
|
func(empty bool) message.Message { return apemanagertest.GenerateAddChainResponse(empty) },
|
||||||
|
func(empty bool) message.Message { return apemanagertest.GenerateRemoveChainRequestBody(empty) },
|
||||||
|
func(empty bool) message.Message { return apemanagertest.GenerateRemoveChainRequest(empty) },
|
||||||
|
func(empty bool) message.Message { return apemanagertest.GenerateRemoveChainResponseBody(empty) },
|
||||||
|
func(empty bool) message.Message { return apemanagertest.GenerateRemoveChainResponse(empty) },
|
||||||
|
func(empty bool) message.Message { return apemanagertest.GenerateListChainsRequestBody(empty) },
|
||||||
|
func(empty bool) message.Message { return apemanagertest.GenerateListChainsRequest(empty) },
|
||||||
|
func(empty bool) message.Message { return apemanagertest.GenerateListChainsResponseBody(empty) },
|
||||||
|
func(empty bool) message.Message { return apemanagertest.GenerateListChainsResponse(empty) },
|
||||||
|
)
|
||||||
|
}
|
76
apemanager/status.go
Normal file
76
apemanager/status.go
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
package apemanager
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status"
|
||||||
|
statusgrpc "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// LocalizeFailStatus checks if passed global status.Code is related to ape manager failure and:
|
||||||
|
//
|
||||||
|
// then localizes the code and returns true,
|
||||||
|
// else leaves the code unchanged and returns false.
|
||||||
|
//
|
||||||
|
// Arg must be non-nil.
|
||||||
|
func LocalizeFailStatus(c *status.Code) bool {
|
||||||
|
return status.LocalizeIfInSection(c, uint32(statusgrpc.Section_SECTION_APE_MANAGER))
|
||||||
|
}
|
||||||
|
|
||||||
|
// GlobalizeFail globalizes local code of ape manager failure.
|
||||||
|
//
|
||||||
|
// Arg must be non-nil.
|
||||||
|
func GlobalizeFail(c *status.Code) {
|
||||||
|
c.GlobalizeSection(uint32(statusgrpc.Section_SECTION_APE_MANAGER))
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
// StatusAPEManagerAccessDenied is a local status.Code value for
|
||||||
|
// ACCESS_DENIED ape manager failure.
|
||||||
|
StatusAPEManagerAccessDenied status.Code = iota
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// detailAccessDeniedDesc is a StatusAccessDenied detail ID for
|
||||||
|
// human-readable description.
|
||||||
|
detailAccessDeniedDesc = iota
|
||||||
|
)
|
||||||
|
|
||||||
|
// WriteAccessDeniedDesc writes human-readable description of StatusAccessDenied
|
||||||
|
// into status.Status as a detail. The status must not be nil.
|
||||||
|
//
|
||||||
|
// Existing details are expected to be ID-unique, otherwise undefined behavior.
|
||||||
|
func WriteAccessDeniedDesc(st *status.Status, desc string) {
|
||||||
|
var found bool
|
||||||
|
|
||||||
|
st.IterateDetails(func(d *status.Detail) bool {
|
||||||
|
if d.ID() == detailAccessDeniedDesc {
|
||||||
|
found = true
|
||||||
|
d.SetValue([]byte(desc))
|
||||||
|
}
|
||||||
|
|
||||||
|
return found
|
||||||
|
})
|
||||||
|
|
||||||
|
if !found {
|
||||||
|
var d status.Detail
|
||||||
|
|
||||||
|
d.SetID(detailAccessDeniedDesc)
|
||||||
|
d.SetValue([]byte(desc))
|
||||||
|
|
||||||
|
st.AppendDetails(d)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadAccessDeniedDesc looks up for status detail with human-readable description
|
||||||
|
// of StatusAccessDenied. Returns empty string if detail is missing.
|
||||||
|
func ReadAccessDeniedDesc(st status.Status) (desc string) {
|
||||||
|
st.IterateDetails(func(d *status.Detail) bool {
|
||||||
|
if d.ID() == detailAccessDeniedDesc {
|
||||||
|
desc = string(d.Value())
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
30
apemanager/status_test.go
Normal file
30
apemanager/status_test.go
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
package apemanager_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/apemanager"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status"
|
||||||
|
statustest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/status/test"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStatusCodes(t *testing.T) {
|
||||||
|
statustest.TestCodes(t, apemanager.LocalizeFailStatus, apemanager.GlobalizeFail,
|
||||||
|
apemanager.StatusAPEManagerAccessDenied, 5120,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAccessDeniedDesc(t *testing.T) {
|
||||||
|
var st status.Status
|
||||||
|
|
||||||
|
require.Empty(t, apemanager.ReadAccessDeniedDesc(st))
|
||||||
|
|
||||||
|
const desc = "some description"
|
||||||
|
|
||||||
|
apemanager.WriteAccessDeniedDesc(&st, desc)
|
||||||
|
require.Equal(t, desc, apemanager.ReadAccessDeniedDesc(st))
|
||||||
|
|
||||||
|
apemanager.WriteAccessDeniedDesc(&st, desc+"1")
|
||||||
|
require.Equal(t, desc+"1", apemanager.ReadAccessDeniedDesc(st))
|
||||||
|
}
|
143
apemanager/test/generate.go
Normal file
143
apemanager/test/generate.go
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
package apemanagertest
|
||||||
|
|
||||||
|
import (
|
||||||
|
apetest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape/test"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/apemanager"
|
||||||
|
sessiontest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session/test"
|
||||||
|
)
|
||||||
|
|
||||||
|
func generateChainID(empty bool) []byte {
|
||||||
|
if empty {
|
||||||
|
return []byte{}
|
||||||
|
}
|
||||||
|
|
||||||
|
return []byte("616c6c6f774f626a476574436e72")
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateAddChainRequestBody(empty bool) *apemanager.AddChainRequestBody {
|
||||||
|
m := new(apemanager.AddChainRequestBody)
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m.SetTarget(apetest.GenerateChainTarget(empty))
|
||||||
|
m.SetChain(apetest.GenerateRawChain(empty))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateAddChainRequest(empty bool) *apemanager.AddChainRequest {
|
||||||
|
m := new(apemanager.AddChainRequest)
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m.SetBody(GenerateAddChainRequestBody(empty))
|
||||||
|
m.SetMetaHeader(sessiontest.GenerateRequestMetaHeader(empty))
|
||||||
|
m.SetVerificationHeader(sessiontest.GenerateRequestVerificationHeader(empty))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateAddChainResponseBody(empty bool) *apemanager.AddChainResponseBody {
|
||||||
|
m := new(apemanager.AddChainResponseBody)
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m.SetChainID(generateChainID(empty))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateAddChainResponse(empty bool) *apemanager.AddChainResponse {
|
||||||
|
m := new(apemanager.AddChainResponse)
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m.SetBody(GenerateAddChainResponseBody(empty))
|
||||||
|
m.SetMetaHeader(sessiontest.GenerateResponseMetaHeader(empty))
|
||||||
|
m.SetVerificationHeader(sessiontest.GenerateResponseVerificationHeader(empty))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateRemoveChainRequestBody(empty bool) *apemanager.RemoveChainRequestBody {
|
||||||
|
m := new(apemanager.RemoveChainRequestBody)
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m.SetChainID(generateChainID(empty))
|
||||||
|
m.SetTarget(apetest.GenerateChainTarget(empty))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateRemoveChainRequest(empty bool) *apemanager.RemoveChainRequest {
|
||||||
|
m := new(apemanager.RemoveChainRequest)
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m.SetBody(GenerateRemoveChainRequestBody(empty))
|
||||||
|
m.SetMetaHeader(sessiontest.GenerateRequestMetaHeader(empty))
|
||||||
|
m.SetVerificationHeader(sessiontest.GenerateRequestVerificationHeader(empty))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateRemoveChainResponseBody(_ bool) *apemanager.RemoveChainResponseBody {
|
||||||
|
return new(apemanager.RemoveChainResponseBody)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateRemoveChainResponse(empty bool) *apemanager.RemoveChainResponse {
|
||||||
|
m := new(apemanager.RemoveChainResponse)
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m.SetBody(GenerateRemoveChainResponseBody(empty))
|
||||||
|
m.SetMetaHeader(sessiontest.GenerateResponseMetaHeader(empty))
|
||||||
|
m.SetVerificationHeader(sessiontest.GenerateResponseVerificationHeader(empty))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateListChainsRequestBody(empty bool) *apemanager.ListChainsRequestBody {
|
||||||
|
m := new(apemanager.ListChainsRequestBody)
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m.SetTarget(apetest.GenerateChainTarget(empty))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateListChainsRequest(empty bool) *apemanager.ListChainsRequest {
|
||||||
|
m := new(apemanager.ListChainsRequest)
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m.SetBody(GenerateListChainsRequestBody(empty))
|
||||||
|
m.SetMetaHeader(sessiontest.GenerateRequestMetaHeader(empty))
|
||||||
|
m.SetVerificationHeader(sessiontest.GenerateRequestVerificationHeader(empty))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateListChainsResponseBody(empty bool) *apemanager.ListChainsResponseBody {
|
||||||
|
m := new(apemanager.ListChainsResponseBody)
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m.SetChains(apetest.GenerateRawChains(empty, 10))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateListChainsResponse(empty bool) *apemanager.ListChainsResponse {
|
||||||
|
m := new(apemanager.ListChainsResponse)
|
||||||
|
|
||||||
|
if !empty {
|
||||||
|
m.SetBody(GenerateListChainsResponseBody(empty))
|
||||||
|
m.SetMetaHeader(sessiontest.GenerateResponseMetaHeader(empty))
|
||||||
|
m.SetVerificationHeader(sessiontest.GenerateResponseVerificationHeader(empty))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
226
apemanager/types.go
Normal file
226
apemanager/types.go
Normal file
|
@ -0,0 +1,226 @@
|
||||||
|
package apemanager
|
||||||
|
|
||||||
|
import (
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/ape"
|
||||||
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AddChainRequest struct {
|
||||||
|
body *AddChainRequestBody
|
||||||
|
|
||||||
|
session.RequestHeaders
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *AddChainRequest) SetBody(body *AddChainRequestBody) {
|
||||||
|
r.body = body
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *AddChainRequest) GetBody() *AddChainRequestBody {
|
||||||
|
if r == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.body
|
||||||
|
}
|
||||||
|
|
||||||
|
type AddChainRequestBody struct {
|
||||||
|
target *ape.ChainTarget
|
||||||
|
|
||||||
|
chain *ape.Chain
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *AddChainRequestBody) SetTarget(target *ape.ChainTarget) {
|
||||||
|
rb.target = target
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *AddChainRequestBody) GetTarget() *ape.ChainTarget {
|
||||||
|
if rb == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return rb.target
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *AddChainRequestBody) SetChain(chain *ape.Chain) {
|
||||||
|
rb.chain = chain
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *AddChainRequestBody) GetChain() *ape.Chain {
|
||||||
|
if rb == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return rb.chain
|
||||||
|
}
|
||||||
|
|
||||||
|
type AddChainResponse struct {
|
||||||
|
body *AddChainResponseBody
|
||||||
|
|
||||||
|
session.ResponseHeaders
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *AddChainResponse) SetBody(body *AddChainResponseBody) {
|
||||||
|
r.body = body
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *AddChainResponse) GetBody() *AddChainResponseBody {
|
||||||
|
if r == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.body
|
||||||
|
}
|
||||||
|
|
||||||
|
type AddChainResponseBody struct {
|
||||||
|
chainID []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *AddChainResponseBody) SetChainID(chainID []byte) {
|
||||||
|
rb.chainID = chainID
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *AddChainResponseBody) GetChainID() []byte {
|
||||||
|
if rb == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return rb.chainID
|
||||||
|
}
|
||||||
|
|
||||||
|
type RemoveChainRequest struct {
|
||||||
|
body *RemoveChainRequestBody
|
||||||
|
|
||||||
|
session.RequestHeaders
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RemoveChainRequest) SetBody(body *RemoveChainRequestBody) {
|
||||||
|
r.body = body
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RemoveChainRequest) GetBody() *RemoveChainRequestBody {
|
||||||
|
if r == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.body
|
||||||
|
}
|
||||||
|
|
||||||
|
type RemoveChainRequestBody struct {
|
||||||
|
target *ape.ChainTarget
|
||||||
|
|
||||||
|
chainID []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RemoveChainRequestBody) SetTarget(target *ape.ChainTarget) {
|
||||||
|
rb.target = target
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RemoveChainRequestBody) GetTarget() *ape.ChainTarget {
|
||||||
|
if rb == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return rb.target
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RemoveChainRequestBody) SetChainID(chainID []byte) {
|
||||||
|
rb.chainID = chainID
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *RemoveChainRequestBody) GetChainID() []byte {
|
||||||
|
if rb == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return rb.chainID
|
||||||
|
}
|
||||||
|
|
||||||
|
type RemoveChainResponse struct {
|
||||||
|
body *RemoveChainResponseBody
|
||||||
|
|
||||||
|
session.ResponseHeaders
|
||||||
|
}
|
||||||
|
|
||||||
|
type RemoveChainResponseBody struct{}
|
||||||
|
|
||||||
|
func (r *RemoveChainResponse) SetBody(body *RemoveChainResponseBody) {
|
||||||
|
r.body = body
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *RemoveChainResponse) GetBody() *RemoveChainResponseBody {
|
||||||
|
if r == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.body
|
||||||
|
}
|
||||||
|
|
||||||
|
type ListChainsRequest struct {
|
||||||
|
body *ListChainsRequestBody
|
||||||
|
|
||||||
|
session.RequestHeaders
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *ListChainsRequest) SetBody(body *ListChainsRequestBody) {
|
||||||
|
r.body = body
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *ListChainsRequest) GetBody() *ListChainsRequestBody {
|
||||||
|
if r == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.body
|
||||||
|
}
|
||||||
|
|
||||||
|
type ListChainsRequestBody struct {
|
||||||
|
target *ape.ChainTarget
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *ListChainsRequestBody) SetTarget(target *ape.ChainTarget) {
|
||||||
|
rb.target = target
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rb *ListChainsRequestBody) GetTarget() *ape.ChainTarget {
|
||||||
|
if rb == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return rb.target
|
||||||
|
}
|
||||||
|
|
||||||
|
type ListChainsResponse struct {
|
||||||
|
body *ListChainsResponseBody
|
||||||
|
|
||||||
|
session.ResponseHeaders
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *ListChainsResponse) SetBody(body *ListChainsResponseBody) {
|
||||||
|
r.body = body
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *ListChainsResponse) GetBody() *ListChainsResponseBody {
|
||||||
|
if r == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.body
|
||||||
|
}
|
||||||
|
|
||||||
|
type ListChainsResponseBody struct {
|
||||||
|
chains []*ape.Chain
|
||||||
|
|
||||||
|
session.RequestHeaders
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *ListChainsResponseBody) SetChains(chains []*ape.Chain) {
|
||||||
|
r.chains = chains
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *ListChainsResponseBody) GetChains() []*ape.Chain {
|
||||||
|
if r == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.chains
|
||||||
|
}
|
|
@ -1,94 +0,0 @@
|
||||||
package audit
|
|
||||||
|
|
||||||
import (
|
|
||||||
audit "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/audit/grpc"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
|
||||||
refsGRPC "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/grpc"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (a *DataAuditResult) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *audit.DataAuditResult
|
|
||||||
|
|
||||||
if a != nil {
|
|
||||||
m = new(audit.DataAuditResult)
|
|
||||||
|
|
||||||
m.SetAuditEpoch(a.auditEpoch)
|
|
||||||
m.SetPublicKey(a.pubKey)
|
|
||||||
m.SetContainerId(a.cid.ToGRPCMessage().(*refsGRPC.ContainerID))
|
|
||||||
m.SetComplete(a.complete)
|
|
||||||
m.SetVersion(a.version.ToGRPCMessage().(*refsGRPC.Version))
|
|
||||||
m.SetPassNodes(a.passNodes)
|
|
||||||
m.SetFailNodes(a.failNodes)
|
|
||||||
m.SetRetries(a.retries)
|
|
||||||
m.SetRequests(a.requests)
|
|
||||||
m.SetHit(a.hit)
|
|
||||||
m.SetMiss(a.miss)
|
|
||||||
m.SetFail(a.fail)
|
|
||||||
m.SetPassSg(refs.ObjectIDListToGRPCMessage(a.passSG))
|
|
||||||
m.SetFailSg(refs.ObjectIDListToGRPCMessage(a.failSG))
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *DataAuditResult) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*audit.DataAuditResult)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
cid := v.GetContainerId()
|
|
||||||
if cid == nil {
|
|
||||||
a.cid = nil
|
|
||||||
} else {
|
|
||||||
if a.cid == nil {
|
|
||||||
a.cid = new(refs.ContainerID)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = a.cid.FromGRPCMessage(cid)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
version := v.GetVersion()
|
|
||||||
if version == nil {
|
|
||||||
a.version = nil
|
|
||||||
} else {
|
|
||||||
if a.version == nil {
|
|
||||||
a.version = new(refs.Version)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = a.version.FromGRPCMessage(version)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
a.passSG, err = refs.ObjectIDListFromGRPCMessage(v.GetPassSg())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
a.failSG, err = refs.ObjectIDListFromGRPCMessage(v.GetFailSg())
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
a.auditEpoch = v.GetAuditEpoch()
|
|
||||||
a.pubKey = v.GetPublicKey()
|
|
||||||
a.complete = v.GetComplete()
|
|
||||||
a.passNodes = v.GetPassNodes()
|
|
||||||
a.failNodes = v.GetFailNodes()
|
|
||||||
a.retries = v.GetRetries()
|
|
||||||
a.requests = v.GetRequests()
|
|
||||||
a.hit = v.GetHit()
|
|
||||||
a.miss = v.GetMiss()
|
|
||||||
a.fail = v.GetFail()
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
|
@ -1,75 +0,0 @@
|
||||||
package audit
|
|
||||||
|
|
||||||
import (
|
|
||||||
refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SetVersion is a Version field setter.
|
|
||||||
func (x *DataAuditResult) SetVersion(v *refs.Version) {
|
|
||||||
x.Version = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetAuditEpoch is an AuditEpoch field setter.
|
|
||||||
func (x *DataAuditResult) SetAuditEpoch(v uint64) {
|
|
||||||
x.AuditEpoch = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContainerId is a ContainerId field setter.
|
|
||||||
func (x *DataAuditResult) SetContainerId(v *refs.ContainerID) {
|
|
||||||
x.ContainerId = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetPublicKey is a PublicKey field setter.
|
|
||||||
func (x *DataAuditResult) SetPublicKey(v []byte) {
|
|
||||||
x.PublicKey = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetComplete is a Complete field setter.
|
|
||||||
func (x *DataAuditResult) SetComplete(v bool) {
|
|
||||||
x.Complete = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetRequests is a Requests field setter.
|
|
||||||
func (x *DataAuditResult) SetRequests(v uint32) {
|
|
||||||
x.Requests = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetRetries is a Retries field setter.
|
|
||||||
func (x *DataAuditResult) SetRetries(v uint32) {
|
|
||||||
x.Retries = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetPassSg is a PassSg field setter.
|
|
||||||
func (x *DataAuditResult) SetPassSg(v []*refs.ObjectID) {
|
|
||||||
x.PassSg = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetFailSg is a FailSg field setter.
|
|
||||||
func (x *DataAuditResult) SetFailSg(v []*refs.ObjectID) {
|
|
||||||
x.FailSg = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetHit is a Hit field setter.
|
|
||||||
func (x *DataAuditResult) SetHit(v uint32) {
|
|
||||||
x.Hit = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMiss is a Miss field setter.
|
|
||||||
func (x *DataAuditResult) SetMiss(v uint32) {
|
|
||||||
x.Miss = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetFail is a Fail field setter.
|
|
||||||
func (x *DataAuditResult) SetFail(v uint32) {
|
|
||||||
x.Fail = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetPassNodes is a PassNodes field setter.
|
|
||||||
func (x *DataAuditResult) SetPassNodes(v [][]byte) {
|
|
||||||
x.PassNodes = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetFailNodes is a FailNodes field setter.
|
|
||||||
func (x *DataAuditResult) SetFailNodes(v [][]byte) {
|
|
||||||
x.FailNodes = v
|
|
||||||
}
|
|
BIN
audit/grpc/types.pb.go
generated
BIN
audit/grpc/types.pb.go
generated
Binary file not shown.
|
@ -1,14 +0,0 @@
|
||||||
package audit
|
|
||||||
|
|
||||||
import (
|
|
||||||
audit "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/audit/grpc"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (a *DataAuditResult) MarshalJSON() ([]byte, error) {
|
|
||||||
return message.MarshalJSON(a)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *DataAuditResult) UnmarshalJSON(data []byte) error {
|
|
||||||
return message.UnmarshalJSON(a, data, new(audit.DataAuditResult))
|
|
||||||
}
|
|
|
@ -1,88 +0,0 @@
|
||||||
package audit
|
|
||||||
|
|
||||||
import (
|
|
||||||
audit "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/audit/grpc"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/util/proto"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
_ = iota
|
|
||||||
versionFNum
|
|
||||||
auditEpochFNum
|
|
||||||
cidFNum
|
|
||||||
pubKeyFNum
|
|
||||||
completeFNum
|
|
||||||
requestsFNum
|
|
||||||
retriesFNum
|
|
||||||
passSGFNum
|
|
||||||
failSGFNum
|
|
||||||
hitFNum
|
|
||||||
missFNum
|
|
||||||
failFNum
|
|
||||||
passNodesFNum
|
|
||||||
failNodesFNum
|
|
||||||
)
|
|
||||||
|
|
||||||
// StableMarshal marshals unified DataAuditResult structure into a protobuf
|
|
||||||
// binary format without field order shuffle.
|
|
||||||
func (a *DataAuditResult) StableMarshal(buf []byte) []byte {
|
|
||||||
if a == nil {
|
|
||||||
return []byte{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if buf == nil {
|
|
||||||
buf = make([]byte, a.StableSize())
|
|
||||||
}
|
|
||||||
|
|
||||||
var offset int
|
|
||||||
|
|
||||||
offset += proto.NestedStructureMarshal(versionFNum, buf[offset:], a.version)
|
|
||||||
offset += proto.Fixed64Marshal(auditEpochFNum, buf[offset:], a.auditEpoch)
|
|
||||||
offset += proto.NestedStructureMarshal(cidFNum, buf[offset:], a.cid)
|
|
||||||
offset += proto.BytesMarshal(pubKeyFNum, buf[offset:], a.pubKey)
|
|
||||||
offset += proto.BoolMarshal(completeFNum, buf[offset:], a.complete)
|
|
||||||
offset += proto.UInt32Marshal(requestsFNum, buf[offset:], a.requests)
|
|
||||||
offset += proto.UInt32Marshal(retriesFNum, buf[offset:], a.retries)
|
|
||||||
offset += refs.ObjectIDNestedListMarshal(passSGFNum, buf[offset:], a.passSG)
|
|
||||||
offset += refs.ObjectIDNestedListMarshal(failSGFNum, buf[offset:], a.failSG)
|
|
||||||
offset += proto.UInt32Marshal(hitFNum, buf[offset:], a.hit)
|
|
||||||
offset += proto.UInt32Marshal(missFNum, buf[offset:], a.miss)
|
|
||||||
offset += proto.UInt32Marshal(failFNum, buf[offset:], a.fail)
|
|
||||||
offset += proto.RepeatedBytesMarshal(passNodesFNum, buf[offset:], a.passNodes)
|
|
||||||
proto.RepeatedBytesMarshal(failNodesFNum, buf[offset:], a.failNodes)
|
|
||||||
|
|
||||||
return buf
|
|
||||||
}
|
|
||||||
|
|
||||||
// StableSize returns byte length of DataAuditResult structure
|
|
||||||
// marshaled by StableMarshal function.
|
|
||||||
func (a *DataAuditResult) StableSize() (size int) {
|
|
||||||
if a == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
size += proto.NestedStructureSize(versionFNum, a.version)
|
|
||||||
size += proto.Fixed64Size(auditEpochFNum, a.auditEpoch)
|
|
||||||
size += proto.NestedStructureSize(cidFNum, a.cid)
|
|
||||||
size += proto.BytesSize(pubKeyFNum, a.pubKey)
|
|
||||||
size += proto.BoolSize(completeFNum, a.complete)
|
|
||||||
size += proto.UInt32Size(requestsFNum, a.requests)
|
|
||||||
size += proto.UInt32Size(retriesFNum, a.retries)
|
|
||||||
size += refs.ObjectIDNestedListSize(passSGFNum, a.passSG)
|
|
||||||
size += refs.ObjectIDNestedListSize(failSGFNum, a.failSG)
|
|
||||||
size += proto.UInt32Size(hitFNum, a.hit)
|
|
||||||
size += proto.UInt32Size(missFNum, a.miss)
|
|
||||||
size += proto.UInt32Size(failFNum, a.fail)
|
|
||||||
size += proto.RepeatedBytesSize(passNodesFNum, a.passNodes)
|
|
||||||
size += proto.RepeatedBytesSize(failNodesFNum, a.failNodes)
|
|
||||||
|
|
||||||
return size
|
|
||||||
}
|
|
||||||
|
|
||||||
// Unmarshal unmarshals DataAuditResult structure from its protobuf
|
|
||||||
// binary representation.
|
|
||||||
func (a *DataAuditResult) Unmarshal(data []byte) error {
|
|
||||||
return message.Unmarshal(a, data, new(audit.DataAuditResult))
|
|
||||||
}
|
|
|
@ -1,15 +0,0 @@
|
||||||
package audit_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
audittest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/audit/test"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message"
|
|
||||||
messagetest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/rpc/message/test"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestMessageConvert(t *testing.T) {
|
|
||||||
messagetest.TestRPCMessage(t,
|
|
||||||
func(empty bool) message.Message { return audittest.GenerateDataAuditResult(empty) },
|
|
||||||
)
|
|
||||||
}
|
|
|
@ -1,29 +0,0 @@
|
||||||
package audittest
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/audit"
|
|
||||||
refstest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/test"
|
|
||||||
)
|
|
||||||
|
|
||||||
func GenerateDataAuditResult(empty bool) *audit.DataAuditResult {
|
|
||||||
m := new(audit.DataAuditResult)
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
m.SetPublicKey([]byte{1, 2, 3})
|
|
||||||
m.SetAuditEpoch(13)
|
|
||||||
m.SetHit(100)
|
|
||||||
m.SetMiss(200)
|
|
||||||
m.SetFail(300)
|
|
||||||
m.SetComplete(true)
|
|
||||||
m.SetPassNodes([][]byte{{1}, {2}})
|
|
||||||
m.SetFailNodes([][]byte{{3}, {4}})
|
|
||||||
m.SetRequests(666)
|
|
||||||
m.SetRetries(777)
|
|
||||||
m.SetVersion(refstest.GenerateVersion(false))
|
|
||||||
m.SetContainerID(refstest.GenerateContainerID(false))
|
|
||||||
m.SetPassSG(refstest.GenerateObjectIDs(false))
|
|
||||||
m.SetFailSG(refstest.GenerateObjectIDs(false))
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
243
audit/types.go
243
audit/types.go
|
@ -1,243 +0,0 @@
|
||||||
package audit
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
|
||||||
)
|
|
||||||
|
|
||||||
// DataAuditResult is a unified structure of
|
|
||||||
// DataAuditResult message from proto definition.
|
|
||||||
type DataAuditResult struct {
|
|
||||||
version *refs.Version
|
|
||||||
|
|
||||||
auditEpoch uint64
|
|
||||||
|
|
||||||
requests, retries uint32
|
|
||||||
|
|
||||||
hit, miss, fail uint32
|
|
||||||
|
|
||||||
cid *refs.ContainerID
|
|
||||||
|
|
||||||
pubKey []byte
|
|
||||||
|
|
||||||
passSG, failSG []refs.ObjectID
|
|
||||||
|
|
||||||
failNodes, passNodes [][]byte
|
|
||||||
|
|
||||||
complete bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetVersion returns version of Data Audit structure.
|
|
||||||
func (a *DataAuditResult) GetVersion() *refs.Version {
|
|
||||||
if a != nil {
|
|
||||||
return a.version
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVersion sets version of Data Audit structure.
|
|
||||||
func (a *DataAuditResult) SetVersion(v *refs.Version) {
|
|
||||||
a.version = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetAuditEpoch returns epoch number when the Data Audit was conducted.
|
|
||||||
func (a *DataAuditResult) GetAuditEpoch() uint64 {
|
|
||||||
if a != nil {
|
|
||||||
return a.auditEpoch
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetAuditEpoch sets epoch number when the Data Audit was conducted.
|
|
||||||
func (a *DataAuditResult) SetAuditEpoch(v uint64) {
|
|
||||||
a.auditEpoch = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetContainerID returns container under audit.
|
|
||||||
func (a *DataAuditResult) GetContainerID() *refs.ContainerID {
|
|
||||||
if a != nil {
|
|
||||||
return a.cid
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContainerID sets container under audit.
|
|
||||||
func (a *DataAuditResult) SetContainerID(v *refs.ContainerID) {
|
|
||||||
a.cid = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetPublicKey returns public key of the auditing InnerRing node in a binary format.
|
|
||||||
func (a *DataAuditResult) GetPublicKey() []byte {
|
|
||||||
if a != nil {
|
|
||||||
return a.pubKey
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetPublicKey sets public key of the auditing InnerRing node in a binary format.
|
|
||||||
func (a *DataAuditResult) SetPublicKey(v []byte) {
|
|
||||||
a.pubKey = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetPassSG returns list of Storage Groups that passed audit PoR stage.
|
|
||||||
func (a *DataAuditResult) GetPassSG() []refs.ObjectID {
|
|
||||||
if a != nil {
|
|
||||||
return a.passSG
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetPassSG sets list of Storage Groups that passed audit PoR stage.
|
|
||||||
func (a *DataAuditResult) SetPassSG(v []refs.ObjectID) {
|
|
||||||
a.passSG = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetFailSG returns list of Storage Groups that failed audit PoR stage.
|
|
||||||
func (a *DataAuditResult) GetFailSG() []refs.ObjectID {
|
|
||||||
if a != nil {
|
|
||||||
return a.failSG
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetFailSG sets list of Storage Groups that failed audit PoR stage.
|
|
||||||
func (a *DataAuditResult) SetFailSG(v []refs.ObjectID) {
|
|
||||||
a.failSG = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRequests returns number of requests made by PoR audit check to get
|
|
||||||
// all headers of the objects inside storage groups.
|
|
||||||
func (a *DataAuditResult) GetRequests() uint32 {
|
|
||||||
if a != nil {
|
|
||||||
return a.requests
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetRequests sets number of requests made by PoR audit check to get
|
|
||||||
// all headers of the objects inside storage groups.
|
|
||||||
func (a *DataAuditResult) SetRequests(v uint32) {
|
|
||||||
a.requests = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetRetries returns number of retries made by PoR audit check to get
|
|
||||||
// all headers of the objects inside storage groups.
|
|
||||||
func (a *DataAuditResult) GetRetries() uint32 {
|
|
||||||
if a != nil {
|
|
||||||
return a.retries
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetRetries sets number of retries made by PoR audit check to get
|
|
||||||
// all headers of the objects inside storage groups.
|
|
||||||
func (a *DataAuditResult) SetRetries(v uint32) {
|
|
||||||
a.retries = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetHit returns number of sampled objects under audit placed
|
|
||||||
// in an optimal way according to the containers placement policy
|
|
||||||
// when checking PoP.
|
|
||||||
func (a *DataAuditResult) GetHit() uint32 {
|
|
||||||
if a != nil {
|
|
||||||
return a.hit
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetHit sets number of sampled objects under audit placed
|
|
||||||
// in an optimal way according to the containers placement policy
|
|
||||||
// when checking PoP.
|
|
||||||
func (a *DataAuditResult) SetHit(v uint32) {
|
|
||||||
a.hit = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetMiss returns number of sampled objects under audit placed
|
|
||||||
// in suboptimal way according to the containers placement policy,
|
|
||||||
// but still at a satisfactory level when checking PoP.
|
|
||||||
func (a *DataAuditResult) GetMiss() uint32 {
|
|
||||||
if a != nil {
|
|
||||||
return a.miss
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMiss sets number of sampled objects under audit placed
|
|
||||||
// in suboptimal way according to the containers placement policy,
|
|
||||||
// but still at a satisfactory level when checking PoP.
|
|
||||||
func (a *DataAuditResult) SetMiss(v uint32) {
|
|
||||||
a.miss = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetFail returns number of sampled objects under audit stored
|
|
||||||
// in a way not confirming placement policy or not found at all
|
|
||||||
// when checking PoP.
|
|
||||||
func (a *DataAuditResult) GetFail() uint32 {
|
|
||||||
if a != nil {
|
|
||||||
return a.fail
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetFail sets number of sampled objects under audit stored
|
|
||||||
// in a way not confirming placement policy or not found at all
|
|
||||||
// when checking PoP.
|
|
||||||
func (a *DataAuditResult) SetFail(v uint32) {
|
|
||||||
a.fail = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetPassNodes returns list of storage node public keys that
|
|
||||||
// passed at least one PDP.
|
|
||||||
func (a *DataAuditResult) GetPassNodes() [][]byte {
|
|
||||||
if a != nil {
|
|
||||||
return a.passNodes
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetPassNodes sets list of storage node public keys that
|
|
||||||
// passed at least one PDP.
|
|
||||||
func (a *DataAuditResult) SetPassNodes(v [][]byte) {
|
|
||||||
a.passNodes = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetFailNodes returns list of storage node public keys that
|
|
||||||
// failed at least one PDP.
|
|
||||||
func (a *DataAuditResult) GetFailNodes() [][]byte {
|
|
||||||
if a != nil {
|
|
||||||
return a.failNodes
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetFailNodes sets list of storage node public keys that
|
|
||||||
// failed at least one PDP.
|
|
||||||
func (a *DataAuditResult) SetFailNodes(v [][]byte) {
|
|
||||||
a.failNodes = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetComplete returns boolean completion statement of audit result.
|
|
||||||
func (a *DataAuditResult) GetComplete() bool {
|
|
||||||
if a != nil {
|
|
||||||
return a.complete
|
|
||||||
}
|
|
||||||
|
|
||||||
return false // bool default
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetComplete sets boolean completion statement of audit result.
|
|
||||||
func (a *DataAuditResult) SetComplete(v bool) {
|
|
||||||
a.complete = v
|
|
||||||
}
|
|
|
@ -4,9 +4,6 @@ package container
|
||||||
const SysAttributePrefix = "__SYSTEM__"
|
const SysAttributePrefix = "__SYSTEM__"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// SysAttributeSubnet is a string ID of container's storage subnet.
|
|
||||||
SysAttributeSubnet = SysAttributePrefix + "SUBNET"
|
|
||||||
|
|
||||||
// SysAttributeName is a string of human-friendly container name registered as the domain in NNS contract.
|
// SysAttributeName is a string of human-friendly container name registered as the domain in NNS contract.
|
||||||
SysAttributeName = SysAttributePrefix + "NAME"
|
SysAttributeName = SysAttributePrefix + "NAME"
|
||||||
|
|
||||||
|
@ -18,24 +15,20 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// SysAttributePrefixNeoFS is a prefix of key to system attribute.
|
// SysAttributePrefixNeoFS is a prefix of key to system attribute.
|
||||||
// Deprecated: use SysAttributePrefix
|
// Deprecated: use SysAttributePrefix.
|
||||||
const SysAttributePrefixNeoFS = "__NEOFS__"
|
const SysAttributePrefixNeoFS = "__NEOFS__"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// SysAttributeSubnetNeoFS is a string ID of container's storage subnet.
|
|
||||||
// Deprecated: use SysAttributeSubnet
|
|
||||||
SysAttributeSubnetNeoFS = SysAttributePrefixNeoFS + "SUBNET"
|
|
||||||
|
|
||||||
// SysAttributeNameNeoFS is a string of human-friendly container name registered as the domain in NNS contract.
|
// SysAttributeNameNeoFS is a string of human-friendly container name registered as the domain in NNS contract.
|
||||||
// Deprecated: use SysAttributeName
|
// Deprecated: use SysAttributeName.
|
||||||
SysAttributeNameNeoFS = SysAttributePrefixNeoFS + "NAME"
|
SysAttributeNameNeoFS = SysAttributePrefixNeoFS + "NAME"
|
||||||
|
|
||||||
// SysAttributeZoneNeoFS is a string of zone for container name.
|
// SysAttributeZoneNeoFS is a string of zone for container name.
|
||||||
// Deprecated: use SysAttributeZone
|
// Deprecated: use SysAttributeZone.
|
||||||
SysAttributeZoneNeoFS = SysAttributePrefixNeoFS + "ZONE"
|
SysAttributeZoneNeoFS = SysAttributePrefixNeoFS + "ZONE"
|
||||||
|
|
||||||
// SysAttributeHomomorphicHashingNeoFS is a container's homomorphic hashing state.
|
// SysAttributeHomomorphicHashingNeoFS is a container's homomorphic hashing state.
|
||||||
// Deprecated: use SysAttributeHomomorphicHashing
|
// Deprecated: use SysAttributeHomomorphicHashing.
|
||||||
SysAttributeHomomorphicHashingNeoFS = SysAttributePrefixNeoFS + "DISABLE_HOMOMORPHIC_HASHING"
|
SysAttributeHomomorphicHashingNeoFS = SysAttributePrefixNeoFS + "DISABLE_HOMOMORPHIC_HASHING"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
|
||||||
aclGRPC "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl/grpc"
|
|
||||||
container "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container/grpc"
|
container "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container/grpc"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap"
|
||||||
netmapGRPC "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap/grpc"
|
netmapGRPC "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap/grpc"
|
||||||
|
@ -39,28 +37,26 @@ func (a *Attribute) FromGRPCMessage(m grpc.Message) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func AttributesToGRPC(xs []Attribute) (res []*container.Container_Attribute) {
|
func AttributesToGRPC(xs []Attribute) (res []container.Container_Attribute) {
|
||||||
if xs != nil {
|
if xs != nil {
|
||||||
res = make([]*container.Container_Attribute, 0, len(xs))
|
res = make([]container.Container_Attribute, 0, len(xs))
|
||||||
|
|
||||||
for i := range xs {
|
for i := range xs {
|
||||||
res = append(res, xs[i].ToGRPCMessage().(*container.Container_Attribute))
|
res = append(res, *xs[i].ToGRPCMessage().(*container.Container_Attribute))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func AttributesFromGRPC(xs []*container.Container_Attribute) (res []Attribute, err error) {
|
func AttributesFromGRPC(xs []container.Container_Attribute) (res []Attribute, err error) {
|
||||||
if xs != nil {
|
if xs != nil {
|
||||||
res = make([]Attribute, len(xs))
|
res = make([]Attribute, len(xs))
|
||||||
|
|
||||||
for i := range xs {
|
for i := range xs {
|
||||||
if xs[i] != nil {
|
err = res[i].FromGRPCMessage(&xs[i])
|
||||||
err = res[i].FromGRPCMessage(xs[i])
|
if err != nil {
|
||||||
if err != nil {
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -766,515 +762,3 @@ func (r *ListResponse) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
|
||||||
return r.ResponseHeaders.FromMessage(v)
|
return r.ResponseHeaders.FromMessage(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *SetExtendedACLRequestBody) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.SetExtendedACLRequest_Body
|
|
||||||
|
|
||||||
if r != nil {
|
|
||||||
m = new(container.SetExtendedACLRequest_Body)
|
|
||||||
|
|
||||||
m.SetEacl(r.eacl.ToGRPCMessage().(*aclGRPC.EACLTable))
|
|
||||||
m.SetSignature(toSignatureRFC6979(r.sig))
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLRequestBody) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.SetExtendedACLRequest_Body)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
eacl := v.GetEacl()
|
|
||||||
if eacl == nil {
|
|
||||||
r.eacl = nil
|
|
||||||
} else {
|
|
||||||
if r.eacl == nil {
|
|
||||||
r.eacl = new(acl.Table)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = r.eacl.FromGRPCMessage(eacl)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sig := v.GetSignature()
|
|
||||||
if sig == nil {
|
|
||||||
r.sig = nil
|
|
||||||
} else {
|
|
||||||
if r.sig == nil {
|
|
||||||
r.sig = new(refs.Signature)
|
|
||||||
}
|
|
||||||
|
|
||||||
r.sig.SetKey(sig.GetKey())
|
|
||||||
r.sig.SetSign(sig.GetSign())
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLRequest) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.SetExtendedACLRequest
|
|
||||||
|
|
||||||
if r != nil {
|
|
||||||
m = new(container.SetExtendedACLRequest)
|
|
||||||
|
|
||||||
m.SetBody(r.body.ToGRPCMessage().(*container.SetExtendedACLRequest_Body))
|
|
||||||
r.RequestHeaders.ToMessage(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLRequest) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.SetExtendedACLRequest)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
body := v.GetBody()
|
|
||||||
if body == nil {
|
|
||||||
r.body = nil
|
|
||||||
} else {
|
|
||||||
if r.body == nil {
|
|
||||||
r.body = new(SetExtendedACLRequestBody)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = r.body.FromGRPCMessage(body)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return r.RequestHeaders.FromMessage(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLResponseBody) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.SetExtendedACLResponse_Body
|
|
||||||
|
|
||||||
if r != nil {
|
|
||||||
m = new(container.SetExtendedACLResponse_Body)
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLResponseBody) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.SetExtendedACLResponse_Body)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLResponse) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.SetExtendedACLResponse
|
|
||||||
|
|
||||||
if r != nil {
|
|
||||||
m = new(container.SetExtendedACLResponse)
|
|
||||||
|
|
||||||
m.SetBody(r.body.ToGRPCMessage().(*container.SetExtendedACLResponse_Body))
|
|
||||||
r.ResponseHeaders.ToMessage(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLResponse) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.SetExtendedACLResponse)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
body := v.GetBody()
|
|
||||||
if body == nil {
|
|
||||||
r.body = nil
|
|
||||||
} else {
|
|
||||||
if r.body == nil {
|
|
||||||
r.body = new(SetExtendedACLResponseBody)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = r.body.FromGRPCMessage(body)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return r.ResponseHeaders.FromMessage(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLRequestBody) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.GetExtendedACLRequest_Body
|
|
||||||
|
|
||||||
if r != nil {
|
|
||||||
m = new(container.GetExtendedACLRequest_Body)
|
|
||||||
|
|
||||||
m.SetContainerId(r.cid.ToGRPCMessage().(*refsGRPC.ContainerID))
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLRequestBody) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.GetExtendedACLRequest_Body)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
cid := v.GetContainerId()
|
|
||||||
if cid == nil {
|
|
||||||
r.cid = nil
|
|
||||||
} else {
|
|
||||||
if r.cid == nil {
|
|
||||||
r.cid = new(refs.ContainerID)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = r.cid.FromGRPCMessage(cid)
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLRequest) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.GetExtendedACLRequest
|
|
||||||
|
|
||||||
if r != nil {
|
|
||||||
m = new(container.GetExtendedACLRequest)
|
|
||||||
|
|
||||||
m.SetBody(r.body.ToGRPCMessage().(*container.GetExtendedACLRequest_Body))
|
|
||||||
r.RequestHeaders.ToMessage(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLRequest) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.GetExtendedACLRequest)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
body := v.GetBody()
|
|
||||||
if body == nil {
|
|
||||||
r.body = nil
|
|
||||||
} else {
|
|
||||||
if r.body == nil {
|
|
||||||
r.body = new(GetExtendedACLRequestBody)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = r.body.FromGRPCMessage(body)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return r.RequestHeaders.FromMessage(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponseBody) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.GetExtendedACLResponse_Body
|
|
||||||
|
|
||||||
if r != nil {
|
|
||||||
m = new(container.GetExtendedACLResponse_Body)
|
|
||||||
|
|
||||||
m.SetEacl(r.eacl.ToGRPCMessage().(*aclGRPC.EACLTable))
|
|
||||||
m.SetSignature(toSignatureRFC6979(r.sig))
|
|
||||||
m.SetSessionToken(r.token.ToGRPCMessage().(*sessionGRPC.SessionToken))
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponseBody) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.GetExtendedACLResponse_Body)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
eacl := v.GetEacl()
|
|
||||||
if eacl == nil {
|
|
||||||
r.eacl = nil
|
|
||||||
} else {
|
|
||||||
if r.eacl == nil {
|
|
||||||
r.eacl = new(acl.Table)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = r.eacl.FromGRPCMessage(eacl)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sig := v.GetSignature()
|
|
||||||
if sig == nil {
|
|
||||||
r.sig = nil
|
|
||||||
} else {
|
|
||||||
if r.sig == nil {
|
|
||||||
r.sig = new(refs.Signature)
|
|
||||||
}
|
|
||||||
|
|
||||||
r.sig.SetKey(sig.GetKey())
|
|
||||||
r.sig.SetSign(sig.GetSign())
|
|
||||||
}
|
|
||||||
|
|
||||||
token := v.GetSessionToken()
|
|
||||||
if token == nil {
|
|
||||||
r.token = nil
|
|
||||||
} else {
|
|
||||||
if r.token == nil {
|
|
||||||
r.token = new(session.Token)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = r.token.FromGRPCMessage(token)
|
|
||||||
}
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponse) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.GetExtendedACLResponse
|
|
||||||
|
|
||||||
if r != nil {
|
|
||||||
m = new(container.GetExtendedACLResponse)
|
|
||||||
|
|
||||||
m.SetBody(r.body.ToGRPCMessage().(*container.GetExtendedACLResponse_Body))
|
|
||||||
r.ResponseHeaders.ToMessage(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponse) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.GetExtendedACLResponse)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
body := v.GetBody()
|
|
||||||
if body == nil {
|
|
||||||
r.body = nil
|
|
||||||
} else {
|
|
||||||
if r.body == nil {
|
|
||||||
r.body = new(GetExtendedACLResponseBody)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = r.body.FromGRPCMessage(body)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return r.ResponseHeaders.FromMessage(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *UsedSpaceAnnouncement) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.AnnounceUsedSpaceRequest_Body_Announcement
|
|
||||||
|
|
||||||
if a != nil {
|
|
||||||
m = new(container.AnnounceUsedSpaceRequest_Body_Announcement)
|
|
||||||
|
|
||||||
m.SetContainerId(a.cid.ToGRPCMessage().(*refsGRPC.ContainerID))
|
|
||||||
m.SetEpoch(a.epoch)
|
|
||||||
m.SetUsedSpace(a.usedSpace)
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *UsedSpaceAnnouncement) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.AnnounceUsedSpaceRequest_Body_Announcement)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
cid := v.GetContainerId()
|
|
||||||
if cid == nil {
|
|
||||||
a.cid = nil
|
|
||||||
} else {
|
|
||||||
if a.cid == nil {
|
|
||||||
a.cid = new(refs.ContainerID)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = a.cid.FromGRPCMessage(cid)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
a.epoch = v.GetEpoch()
|
|
||||||
a.usedSpace = v.GetUsedSpace()
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func UsedSpaceAnnouncementsToGRPCMessage(
|
|
||||||
ids []UsedSpaceAnnouncement,
|
|
||||||
) (res []*container.AnnounceUsedSpaceRequest_Body_Announcement) {
|
|
||||||
if ids != nil {
|
|
||||||
res = make([]*container.AnnounceUsedSpaceRequest_Body_Announcement, 0, len(ids))
|
|
||||||
|
|
||||||
for i := range ids {
|
|
||||||
res = append(res, ids[i].ToGRPCMessage().(*container.AnnounceUsedSpaceRequest_Body_Announcement))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func UsedSpaceAnnouncementssFromGRPCMessage(
|
|
||||||
asV2 []*container.AnnounceUsedSpaceRequest_Body_Announcement,
|
|
||||||
) (res []UsedSpaceAnnouncement, err error) {
|
|
||||||
if asV2 != nil {
|
|
||||||
res = make([]UsedSpaceAnnouncement, len(asV2))
|
|
||||||
|
|
||||||
for i := range asV2 {
|
|
||||||
if asV2[i] != nil {
|
|
||||||
err = res[i].FromGRPCMessage(asV2[i])
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceRequestBody) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.AnnounceUsedSpaceRequest_Body
|
|
||||||
|
|
||||||
if r != nil {
|
|
||||||
m = new(container.AnnounceUsedSpaceRequest_Body)
|
|
||||||
|
|
||||||
m.SetAnnouncements(UsedSpaceAnnouncementsToGRPCMessage(r.announcements))
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceRequestBody) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.AnnounceUsedSpaceRequest_Body)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
r.announcements, err = UsedSpaceAnnouncementssFromGRPCMessage(v.GetAnnouncements())
|
|
||||||
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceRequest) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.AnnounceUsedSpaceRequest
|
|
||||||
|
|
||||||
if r != nil {
|
|
||||||
m = new(container.AnnounceUsedSpaceRequest)
|
|
||||||
|
|
||||||
m.SetBody(r.body.ToGRPCMessage().(*container.AnnounceUsedSpaceRequest_Body))
|
|
||||||
r.RequestHeaders.ToMessage(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceRequest) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.AnnounceUsedSpaceRequest)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
body := v.GetBody()
|
|
||||||
if body == nil {
|
|
||||||
r.body = nil
|
|
||||||
} else {
|
|
||||||
if r.body == nil {
|
|
||||||
r.body = new(AnnounceUsedSpaceRequestBody)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = r.body.FromGRPCMessage(body)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return r.RequestHeaders.FromMessage(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceResponseBody) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.AnnounceUsedSpaceResponse_Body
|
|
||||||
|
|
||||||
if r != nil {
|
|
||||||
m = new(container.AnnounceUsedSpaceResponse_Body)
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceResponseBody) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.AnnounceUsedSpaceResponse_Body)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceResponse) ToGRPCMessage() grpc.Message {
|
|
||||||
var m *container.AnnounceUsedSpaceResponse
|
|
||||||
|
|
||||||
if r != nil {
|
|
||||||
m = new(container.AnnounceUsedSpaceResponse)
|
|
||||||
|
|
||||||
m.SetBody(r.body.ToGRPCMessage().(*container.AnnounceUsedSpaceResponse_Body))
|
|
||||||
r.ResponseHeaders.ToMessage(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceResponse) FromGRPCMessage(m grpc.Message) error {
|
|
||||||
v, ok := m.(*container.AnnounceUsedSpaceResponse)
|
|
||||||
if !ok {
|
|
||||||
return message.NewUnexpectedMessageType(m, v)
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
|
|
||||||
body := v.GetBody()
|
|
||||||
if body == nil {
|
|
||||||
r.body = nil
|
|
||||||
} else {
|
|
||||||
if r.body == nil {
|
|
||||||
r.body = new(AnnounceUsedSpaceResponseBody)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = r.body.FromGRPCMessage(body)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return r.ResponseHeaders.FromMessage(v)
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,324 +0,0 @@
|
||||||
package container
|
|
||||||
|
|
||||||
import (
|
|
||||||
acl "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl/grpc"
|
|
||||||
refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc"
|
|
||||||
session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session/grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SetContainer sets container of the request.
|
|
||||||
func (m *PutRequest_Body) SetContainer(v *Container) {
|
|
||||||
m.Container = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetSignature sets signature of the container structure.
|
|
||||||
func (m *PutRequest_Body) SetSignature(v *refs.SignatureRFC6979) {
|
|
||||||
m.Signature = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the request.
|
|
||||||
func (m *PutRequest) SetBody(v *PutRequest_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the request.
|
|
||||||
func (m *PutRequest) SetMetaHeader(v *session.RequestMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the request.
|
|
||||||
func (m *PutRequest) SetVerifyHeader(v *session.RequestVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContainerId sets identifier of the container.
|
|
||||||
func (m *PutResponse_Body) SetContainerId(v *refs.ContainerID) {
|
|
||||||
m.ContainerId = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the response.
|
|
||||||
func (m *PutResponse) SetBody(v *PutResponse_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the response.
|
|
||||||
func (m *PutResponse) SetMetaHeader(v *session.ResponseMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the response.
|
|
||||||
func (m *PutResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContainerId sets identifier of the container.
|
|
||||||
func (m *DeleteRequest_Body) SetContainerId(v *refs.ContainerID) {
|
|
||||||
m.ContainerId = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetSignature sets signature of the container identifier.
|
|
||||||
func (m *DeleteRequest_Body) SetSignature(v *refs.SignatureRFC6979) {
|
|
||||||
m.Signature = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the request.
|
|
||||||
func (m *DeleteRequest) SetBody(v *DeleteRequest_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the request.
|
|
||||||
func (m *DeleteRequest) SetMetaHeader(v *session.RequestMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the request.
|
|
||||||
func (m *DeleteRequest) SetVerifyHeader(v *session.RequestVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the response.
|
|
||||||
func (m *DeleteResponse) SetBody(v *DeleteResponse_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the response.
|
|
||||||
func (m *DeleteResponse) SetMetaHeader(v *session.ResponseMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the response.
|
|
||||||
func (m *DeleteResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContainerId sets identifier of the container.
|
|
||||||
func (m *GetRequest_Body) SetContainerId(v *refs.ContainerID) {
|
|
||||||
m.ContainerId = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the request.
|
|
||||||
func (m *GetRequest) SetBody(v *GetRequest_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the request.
|
|
||||||
func (m *GetRequest) SetMetaHeader(v *session.RequestMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the request.
|
|
||||||
func (m *GetRequest) SetVerifyHeader(v *session.RequestVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContainer sets the container structure.
|
|
||||||
func (m *GetResponse_Body) SetContainer(v *Container) {
|
|
||||||
m.Container = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetSessionToken sets token of the session within which requested
|
|
||||||
// container was created.
|
|
||||||
func (m *GetResponse_Body) SetSessionToken(v *session.SessionToken) {
|
|
||||||
m.SessionToken = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetSignature sets signature of the container structure.
|
|
||||||
func (m *GetResponse_Body) SetSignature(v *refs.SignatureRFC6979) {
|
|
||||||
m.Signature = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the response.
|
|
||||||
func (m *GetResponse) SetBody(v *GetResponse_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the response.
|
|
||||||
func (m *GetResponse) SetMetaHeader(v *session.ResponseMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the response.
|
|
||||||
func (m *GetResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetOwnerId sets identifier of the container owner.
|
|
||||||
func (m *ListRequest_Body) SetOwnerId(v *refs.OwnerID) {
|
|
||||||
m.OwnerId = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the request.
|
|
||||||
func (m *ListRequest) SetBody(v *ListRequest_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the request.
|
|
||||||
func (m *ListRequest) SetMetaHeader(v *session.RequestMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the request.
|
|
||||||
func (m *ListRequest) SetVerifyHeader(v *session.RequestVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContainerIds sets list of the container identifiers.
|
|
||||||
func (m *ListResponse_Body) SetContainerIds(v []*refs.ContainerID) {
|
|
||||||
m.ContainerIds = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the response.
|
|
||||||
func (m *ListResponse) SetBody(v *ListResponse_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the response.
|
|
||||||
func (m *ListResponse) SetMetaHeader(v *session.ResponseMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the response.
|
|
||||||
func (m *ListResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetEacl sets eACL table structure.
|
|
||||||
func (m *SetExtendedACLRequest_Body) SetEacl(v *acl.EACLTable) {
|
|
||||||
m.Eacl = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetSignature sets signature of the eACL table structure.
|
|
||||||
func (m *SetExtendedACLRequest_Body) SetSignature(v *refs.SignatureRFC6979) {
|
|
||||||
m.Signature = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the request.
|
|
||||||
func (m *SetExtendedACLRequest) SetBody(v *SetExtendedACLRequest_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the request.
|
|
||||||
func (m *SetExtendedACLRequest) SetMetaHeader(v *session.RequestMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the request.
|
|
||||||
func (m *SetExtendedACLRequest) SetVerifyHeader(v *session.RequestVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the response.
|
|
||||||
func (m *SetExtendedACLResponse) SetBody(v *SetExtendedACLResponse_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the response.
|
|
||||||
func (m *SetExtendedACLResponse) SetMetaHeader(v *session.ResponseMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the response.
|
|
||||||
func (m *SetExtendedACLResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContainerId sets identifier of the container.
|
|
||||||
func (m *GetExtendedACLRequest_Body) SetContainerId(v *refs.ContainerID) {
|
|
||||||
m.ContainerId = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the request.
|
|
||||||
func (m *GetExtendedACLRequest) SetBody(v *GetExtendedACLRequest_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the request.
|
|
||||||
func (m *GetExtendedACLRequest) SetMetaHeader(v *session.RequestMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the request.
|
|
||||||
func (m *GetExtendedACLRequest) SetVerifyHeader(v *session.RequestVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetEacl sets eACL table structure.
|
|
||||||
func (m *GetExtendedACLResponse_Body) SetEacl(v *acl.EACLTable) {
|
|
||||||
m.Eacl = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetSignature sets signature of the eACL table structure.
|
|
||||||
func (m *GetExtendedACLResponse_Body) SetSignature(v *refs.SignatureRFC6979) {
|
|
||||||
m.Signature = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetSessionToken sets token of the session within which requested
|
|
||||||
// eACl table was set.
|
|
||||||
func (m *GetExtendedACLResponse_Body) SetSessionToken(v *session.SessionToken) {
|
|
||||||
m.SessionToken = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the response.
|
|
||||||
func (m *GetExtendedACLResponse) SetBody(v *GetExtendedACLResponse_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the response.
|
|
||||||
func (m *GetExtendedACLResponse) SetMetaHeader(v *session.ResponseMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the response.
|
|
||||||
func (m *GetExtendedACLResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetEpoch sets epoch of the size estimation.
|
|
||||||
func (m *AnnounceUsedSpaceRequest_Body_Announcement) SetEpoch(v uint64) {
|
|
||||||
m.Epoch = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetContainerId sets identifier of the container.
|
|
||||||
func (m *AnnounceUsedSpaceRequest_Body_Announcement) SetContainerId(v *refs.ContainerID) {
|
|
||||||
m.ContainerId = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetUsedSpace sets used space value of the container.
|
|
||||||
func (m *AnnounceUsedSpaceRequest_Body_Announcement) SetUsedSpace(v uint64) {
|
|
||||||
m.UsedSpace = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetAnnouncements sets list of announcement for shared containers between nodes.
|
|
||||||
func (m *AnnounceUsedSpaceRequest_Body) SetAnnouncements(v []*AnnounceUsedSpaceRequest_Body_Announcement) {
|
|
||||||
m.Announcements = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the request.
|
|
||||||
func (m *AnnounceUsedSpaceRequest) SetBody(v *AnnounceUsedSpaceRequest_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the request.
|
|
||||||
func (m *AnnounceUsedSpaceRequest) SetMetaHeader(v *session.RequestMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the request.
|
|
||||||
func (m *AnnounceUsedSpaceRequest) SetVerifyHeader(v *session.RequestVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the response.
|
|
||||||
func (m *AnnounceUsedSpaceResponse) SetBody(v *AnnounceUsedSpaceResponse_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the response.
|
|
||||||
func (m *AnnounceUsedSpaceResponse) SetMetaHeader(v *session.ResponseMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the response.
|
|
||||||
func (m *AnnounceUsedSpaceResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
BIN
container/grpc/service.pb.go
generated
BIN
container/grpc/service.pb.go
generated
Binary file not shown.
BIN
container/grpc/service_frostfs.pb.go
generated
Normal file
BIN
container/grpc/service_frostfs.pb.go
generated
Normal file
Binary file not shown.
159
container/grpc/service_frostfs_fuzz.go
Normal file
159
container/grpc/service_frostfs_fuzz.go
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
func DoFuzzProtoPutRequest(data []byte) int {
|
||||||
|
msg := new(PutRequest)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONPutRequest(data []byte) int {
|
||||||
|
msg := new(PutRequest)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoPutResponse(data []byte) int {
|
||||||
|
msg := new(PutResponse)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONPutResponse(data []byte) int {
|
||||||
|
msg := new(PutResponse)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoDeleteRequest(data []byte) int {
|
||||||
|
msg := new(DeleteRequest)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONDeleteRequest(data []byte) int {
|
||||||
|
msg := new(DeleteRequest)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoDeleteResponse(data []byte) int {
|
||||||
|
msg := new(DeleteResponse)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONDeleteResponse(data []byte) int {
|
||||||
|
msg := new(DeleteResponse)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoGetRequest(data []byte) int {
|
||||||
|
msg := new(GetRequest)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONGetRequest(data []byte) int {
|
||||||
|
msg := new(GetRequest)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoGetResponse(data []byte) int {
|
||||||
|
msg := new(GetResponse)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONGetResponse(data []byte) int {
|
||||||
|
msg := new(GetResponse)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoListRequest(data []byte) int {
|
||||||
|
msg := new(ListRequest)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONListRequest(data []byte) int {
|
||||||
|
msg := new(ListRequest)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoListResponse(data []byte) int {
|
||||||
|
msg := new(ListResponse)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONListResponse(data []byte) int {
|
||||||
|
msg := new(ListResponse)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
91
container/grpc/service_frostfs_test.go
Normal file
91
container/grpc/service_frostfs_test.go
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
import (
|
||||||
|
testing "testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FuzzProtoPutRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoPutRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONPutRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONPutRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoPutResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoPutResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONPutResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONPutResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoDeleteRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoDeleteRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONDeleteRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONDeleteRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoDeleteResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoDeleteResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONDeleteResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONDeleteResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoGetRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoGetRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONGetRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONGetRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoGetResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoGetResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONGetResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONGetResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoListRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoListRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONListRequest(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONListRequest(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzProtoListResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoListResponse(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONListResponse(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONListResponse(data)
|
||||||
|
})
|
||||||
|
}
|
BIN
container/grpc/service_grpc.pb.go
generated
BIN
container/grpc/service_grpc.pb.go
generated
Binary file not shown.
|
@ -1,46 +0,0 @@
|
||||||
package container
|
|
||||||
|
|
||||||
import (
|
|
||||||
netmap "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap/grpc"
|
|
||||||
refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SetKey sets key to the container attribute.
|
|
||||||
func (m *Container_Attribute) SetKey(v string) {
|
|
||||||
m.Key = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetValue sets value of the container attribute.
|
|
||||||
func (m *Container_Attribute) SetValue(v string) {
|
|
||||||
m.Value = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetOwnerId sets identifier of the container owner,
|
|
||||||
func (m *Container) SetOwnerId(v *refs.OwnerID) {
|
|
||||||
m.OwnerId = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetNonce sets nonce of the container structure.
|
|
||||||
func (m *Container) SetNonce(v []byte) {
|
|
||||||
m.Nonce = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBasicAcl sets basic ACL of the container.
|
|
||||||
func (m *Container) SetBasicAcl(v uint32) {
|
|
||||||
m.BasicAcl = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetAttributes sets list of the container attributes.
|
|
||||||
func (m *Container) SetAttributes(v []*Container_Attribute) {
|
|
||||||
m.Attributes = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetPlacementPolicy sets placement policy of the container.
|
|
||||||
func (m *Container) SetPlacementPolicy(v *netmap.PlacementPolicy) {
|
|
||||||
m.PlacementPolicy = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVersion sets version of the container.
|
|
||||||
func (m *Container) SetVersion(v *refs.Version) {
|
|
||||||
m.Version = v
|
|
||||||
}
|
|
BIN
container/grpc/types.pb.go
generated
BIN
container/grpc/types.pb.go
generated
Binary file not shown.
BIN
container/grpc/types_frostfs.pb.go
generated
Normal file
BIN
container/grpc/types_frostfs.pb.go
generated
Normal file
Binary file not shown.
26
container/grpc/types_frostfs_fuzz.go
Normal file
26
container/grpc/types_frostfs_fuzz.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
func DoFuzzProtoContainer(data []byte) int {
|
||||||
|
msg := new(Container)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONContainer(data []byte) int {
|
||||||
|
msg := new(Container)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
21
container/grpc/types_frostfs_test.go
Normal file
21
container/grpc/types_frostfs_test.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package container
|
||||||
|
|
||||||
|
import (
|
||||||
|
testing "testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FuzzProtoContainer(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoContainer(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONContainer(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONContainer(data)
|
||||||
|
})
|
||||||
|
}
|
|
@ -34,21 +34,6 @@ const (
|
||||||
listReqBodyOwnerField = 1
|
listReqBodyOwnerField = 1
|
||||||
|
|
||||||
listRespBodyIDsField = 1
|
listRespBodyIDsField = 1
|
||||||
|
|
||||||
setEACLReqBodyTableField = 1
|
|
||||||
setEACLReqBodySignatureField = 2
|
|
||||||
|
|
||||||
getEACLReqBodyIDField = 1
|
|
||||||
|
|
||||||
getEACLRespBodyTableField = 1
|
|
||||||
getEACLRespBodySignatureField = 2
|
|
||||||
getEACLRespBodyTokenField = 3
|
|
||||||
|
|
||||||
usedSpaceAnnounceEpochField = 1
|
|
||||||
usedSpaceAnnounceCIDField = 2
|
|
||||||
usedSpaceAnnounceUsedSpaceField = 3
|
|
||||||
|
|
||||||
usedSpaceReqBodyAnnouncementsField = 1
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func (a *Attribute) StableMarshal(buf []byte) []byte {
|
func (a *Attribute) StableMarshal(buf []byte) []byte {
|
||||||
|
@ -223,7 +208,7 @@ func (r *DeleteRequestBody) Unmarshal(data []byte) error {
|
||||||
return message.Unmarshal(r, data, new(container.DeleteRequest_Body))
|
return message.Unmarshal(r, data, new(container.DeleteRequest_Body))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *DeleteResponseBody) StableMarshal(buf []byte) []byte {
|
func (r *DeleteResponseBody) StableMarshal(_ []byte) []byte {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,189 +343,3 @@ func (r *ListResponseBody) StableSize() (size int) {
|
||||||
func (r *ListResponseBody) Unmarshal(data []byte) error {
|
func (r *ListResponseBody) Unmarshal(data []byte) error {
|
||||||
return message.Unmarshal(r, data, new(container.ListResponse_Body))
|
return message.Unmarshal(r, data, new(container.ListResponse_Body))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *SetExtendedACLRequestBody) StableMarshal(buf []byte) []byte {
|
|
||||||
if r == nil {
|
|
||||||
return []byte{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if buf == nil {
|
|
||||||
buf = make([]byte, r.StableSize())
|
|
||||||
}
|
|
||||||
|
|
||||||
var offset int
|
|
||||||
|
|
||||||
offset += protoutil.NestedStructureMarshal(setEACLReqBodyTableField, buf[offset:], r.eacl)
|
|
||||||
protoutil.NestedStructureMarshal(setEACLReqBodySignatureField, buf[offset:], r.sig)
|
|
||||||
|
|
||||||
return buf
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLRequestBody) StableSize() (size int) {
|
|
||||||
if r == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
size += protoutil.NestedStructureSize(setEACLReqBodyTableField, r.eacl)
|
|
||||||
size += protoutil.NestedStructureSize(setEACLReqBodySignatureField, r.sig)
|
|
||||||
|
|
||||||
return size
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLRequestBody) Unmarshal(data []byte) error {
|
|
||||||
return message.Unmarshal(r, data, new(container.SetExtendedACLRequest_Body))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLResponseBody) StableMarshal(buf []byte) []byte {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLResponseBody) StableSize() (size int) {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLResponseBody) Unmarshal([]byte) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLRequestBody) StableMarshal(buf []byte) []byte {
|
|
||||||
if r == nil {
|
|
||||||
return []byte{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if buf == nil {
|
|
||||||
buf = make([]byte, r.StableSize())
|
|
||||||
}
|
|
||||||
|
|
||||||
protoutil.NestedStructureMarshal(getEACLReqBodyIDField, buf, r.cid)
|
|
||||||
|
|
||||||
return buf
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLRequestBody) StableSize() (size int) {
|
|
||||||
if r == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
size += protoutil.NestedStructureSize(getEACLReqBodyIDField, r.cid)
|
|
||||||
|
|
||||||
return size
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLRequestBody) Unmarshal(data []byte) error {
|
|
||||||
return message.Unmarshal(r, data, new(container.GetExtendedACLRequest_Body))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponseBody) StableMarshal(buf []byte) []byte {
|
|
||||||
if r == nil {
|
|
||||||
return []byte{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if buf == nil {
|
|
||||||
buf = make([]byte, r.StableSize())
|
|
||||||
}
|
|
||||||
|
|
||||||
var offset int
|
|
||||||
|
|
||||||
offset += protoutil.NestedStructureMarshal(getEACLRespBodyTableField, buf[offset:], r.eacl)
|
|
||||||
offset += protoutil.NestedStructureMarshal(getEACLRespBodySignatureField, buf[offset:], r.sig)
|
|
||||||
protoutil.NestedStructureMarshal(getEACLRespBodyTokenField, buf[offset:], r.token)
|
|
||||||
|
|
||||||
return buf
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponseBody) StableSize() (size int) {
|
|
||||||
if r == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
size += protoutil.NestedStructureSize(getEACLRespBodyTableField, r.eacl)
|
|
||||||
size += protoutil.NestedStructureSize(getEACLRespBodySignatureField, r.sig)
|
|
||||||
size += protoutil.NestedStructureSize(getEACLRespBodyTokenField, r.token)
|
|
||||||
|
|
||||||
return size
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponseBody) Unmarshal(data []byte) error {
|
|
||||||
return message.Unmarshal(r, data, new(container.GetExtendedACLResponse_Body))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *UsedSpaceAnnouncement) StableMarshal(buf []byte) []byte {
|
|
||||||
if a == nil {
|
|
||||||
return []byte{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if buf == nil {
|
|
||||||
buf = make([]byte, a.StableSize())
|
|
||||||
}
|
|
||||||
|
|
||||||
var offset int
|
|
||||||
|
|
||||||
offset += protoutil.UInt64Marshal(usedSpaceAnnounceEpochField, buf[offset:], a.epoch)
|
|
||||||
offset += protoutil.NestedStructureMarshal(usedSpaceAnnounceCIDField, buf[offset:], a.cid)
|
|
||||||
protoutil.UInt64Marshal(usedSpaceAnnounceUsedSpaceField, buf[offset:], a.usedSpace)
|
|
||||||
|
|
||||||
return buf
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *UsedSpaceAnnouncement) StableSize() (size int) {
|
|
||||||
if a == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
size += protoutil.UInt64Size(usedSpaceAnnounceEpochField, a.epoch)
|
|
||||||
size += protoutil.NestedStructureSize(usedSpaceAnnounceCIDField, a.cid)
|
|
||||||
size += protoutil.UInt64Size(usedSpaceAnnounceUsedSpaceField, a.usedSpace)
|
|
||||||
|
|
||||||
return size
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *UsedSpaceAnnouncement) Unmarshal(data []byte) error {
|
|
||||||
return message.Unmarshal(a, data, new(container.AnnounceUsedSpaceRequest_Body_Announcement))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceRequestBody) StableMarshal(buf []byte) []byte {
|
|
||||||
if r == nil {
|
|
||||||
return []byte{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if buf == nil {
|
|
||||||
buf = make([]byte, r.StableSize())
|
|
||||||
}
|
|
||||||
|
|
||||||
var offset int
|
|
||||||
|
|
||||||
for i := range r.announcements {
|
|
||||||
offset += protoutil.NestedStructureMarshal(usedSpaceReqBodyAnnouncementsField, buf[offset:], &r.announcements[i])
|
|
||||||
}
|
|
||||||
|
|
||||||
return buf
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceRequestBody) StableSize() (size int) {
|
|
||||||
if r == nil {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
for i := range r.announcements {
|
|
||||||
size += protoutil.NestedStructureSize(usedSpaceReqBodyAnnouncementsField, &r.announcements[i])
|
|
||||||
}
|
|
||||||
|
|
||||||
return size
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceRequestBody) Unmarshal(data []byte) error {
|
|
||||||
return message.Unmarshal(r, data, new(container.AnnounceUsedSpaceRequest_Body))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceResponseBody) StableMarshal(buf []byte) []byte {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceResponseBody) StableSize() (size int) {
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceResponseBody) Unmarshal([]byte) error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
|
@ -28,20 +28,9 @@ func TestMessageConvert(t *testing.T) {
|
||||||
func(empty bool) message.Message { return containertest.GenerateListRequest(empty) },
|
func(empty bool) message.Message { return containertest.GenerateListRequest(empty) },
|
||||||
func(empty bool) message.Message { return containertest.GenerateListResponseBody(empty) },
|
func(empty bool) message.Message { return containertest.GenerateListResponseBody(empty) },
|
||||||
func(empty bool) message.Message { return containertest.GenerateListResponse(empty) },
|
func(empty bool) message.Message { return containertest.GenerateListResponse(empty) },
|
||||||
func(empty bool) message.Message { return containertest.GenerateSetExtendedACLRequestBody(empty) },
|
|
||||||
func(empty bool) message.Message { return containertest.GenerateSetExtendedACLRequest(empty) },
|
|
||||||
func(empty bool) message.Message { return containertest.GenerateGetRequestBody(empty) },
|
func(empty bool) message.Message { return containertest.GenerateGetRequestBody(empty) },
|
||||||
func(empty bool) message.Message { return containertest.GenerateGetRequest(empty) },
|
func(empty bool) message.Message { return containertest.GenerateGetRequest(empty) },
|
||||||
func(empty bool) message.Message { return containertest.GenerateGetResponseBody(empty) },
|
func(empty bool) message.Message { return containertest.GenerateGetResponseBody(empty) },
|
||||||
func(empty bool) message.Message { return containertest.GenerateGetResponse(empty) },
|
func(empty bool) message.Message { return containertest.GenerateGetResponse(empty) },
|
||||||
func(empty bool) message.Message { return containertest.GenerateGetExtendedACLRequestBody(empty) },
|
|
||||||
func(empty bool) message.Message { return containertest.GenerateGetExtendedACLRequest(empty) },
|
|
||||||
func(empty bool) message.Message { return containertest.GenerateGetExtendedACLResponseBody(empty) },
|
|
||||||
func(empty bool) message.Message { return containertest.GenerateGetExtendedACLResponse(empty) },
|
|
||||||
func(empty bool) message.Message { return containertest.GenerateUsedSpaceAnnouncement(empty) },
|
|
||||||
func(empty bool) message.Message { return containertest.GenerateAnnounceUsedSpaceRequestBody(empty) },
|
|
||||||
func(empty bool) message.Message { return containertest.GenerateAnnounceUsedSpaceRequest(empty) },
|
|
||||||
func(empty bool) message.Message { return containertest.GenerateAnnounceUsedSpaceResponseBody(empty) },
|
|
||||||
func(empty bool) message.Message { return containertest.GenerateAnnounceUsedSpaceResponse(empty) },
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
package containertest
|
package containertest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
acltest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl/test"
|
"crypto/rand"
|
||||||
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container"
|
||||||
netmaptest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap/test"
|
netmaptest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap/test"
|
||||||
refstest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/test"
|
refstest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/test"
|
||||||
|
@ -36,8 +37,11 @@ func GenerateContainer(empty bool) *container.Container {
|
||||||
m := new(container.Container)
|
m := new(container.Container)
|
||||||
|
|
||||||
if !empty {
|
if !empty {
|
||||||
|
nonce := make([]byte, 16)
|
||||||
|
_, _ = rand.Read(nonce)
|
||||||
|
|
||||||
m.SetBasicACL(12)
|
m.SetBasicACL(12)
|
||||||
m.SetNonce([]byte{1, 2, 3})
|
m.SetNonce(nonce)
|
||||||
m.SetOwnerID(refstest.GenerateOwnerID(false))
|
m.SetOwnerID(refstest.GenerateOwnerID(false))
|
||||||
m.SetAttributes(GenerateAttributes(false))
|
m.SetAttributes(GenerateAttributes(false))
|
||||||
m.SetPlacementPolicy(netmaptest.GeneratePlacementPolicy(false))
|
m.SetPlacementPolicy(netmaptest.GeneratePlacementPolicy(false))
|
||||||
|
@ -170,7 +174,7 @@ func GenerateDeleteRequest(empty bool) *container.DeleteRequest {
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
func GenerateDeleteResponseBody(empty bool) *container.DeleteResponseBody {
|
func GenerateDeleteResponseBody(_ bool) *container.DeleteResponseBody {
|
||||||
m := new(container.DeleteResponseBody)
|
m := new(container.DeleteResponseBody)
|
||||||
|
|
||||||
return m
|
return m
|
||||||
|
@ -234,163 +238,3 @@ func GenerateListResponse(empty bool) *container.ListResponse {
|
||||||
|
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
func GenerateSetExtendedACLRequestBody(empty bool) *container.SetExtendedACLRequestBody {
|
|
||||||
m := new(container.SetExtendedACLRequestBody)
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
m.SetEACL(acltest.GenerateTable(false))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.SetSignature(refstest.GenerateSignature(empty))
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateSetExtendedACLRequest(empty bool) *container.SetExtendedACLRequest {
|
|
||||||
m := new(container.SetExtendedACLRequest)
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
m.SetBody(GenerateSetExtendedACLRequestBody(false))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.SetMetaHeader(sessiontest.GenerateRequestMetaHeader(empty))
|
|
||||||
m.SetVerificationHeader(sessiontest.GenerateRequestVerificationHeader(empty))
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateSetExtendedACLResponseBody(empty bool) *container.SetExtendedACLResponseBody {
|
|
||||||
m := new(container.SetExtendedACLResponseBody)
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateSetExtendedACLResponse(empty bool) *container.SetExtendedACLResponse {
|
|
||||||
m := new(container.SetExtendedACLResponse)
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
m.SetBody(GenerateSetExtendedACLResponseBody(false))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.SetMetaHeader(sessiontest.GenerateResponseMetaHeader(empty))
|
|
||||||
m.SetVerificationHeader(sessiontest.GenerateResponseVerificationHeader(empty))
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateGetExtendedACLRequestBody(empty bool) *container.GetExtendedACLRequestBody {
|
|
||||||
m := new(container.GetExtendedACLRequestBody)
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
m.SetContainerID(refstest.GenerateContainerID(false))
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateGetExtendedACLRequest(empty bool) *container.GetExtendedACLRequest {
|
|
||||||
m := new(container.GetExtendedACLRequest)
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
m.SetBody(GenerateGetExtendedACLRequestBody(false))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.SetMetaHeader(sessiontest.GenerateRequestMetaHeader(empty))
|
|
||||||
m.SetVerificationHeader(sessiontest.GenerateRequestVerificationHeader(empty))
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateGetExtendedACLResponseBody(empty bool) *container.GetExtendedACLResponseBody {
|
|
||||||
m := new(container.GetExtendedACLResponseBody)
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
m.SetEACL(acltest.GenerateTable(false))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.SetSignature(refstest.GenerateSignature(empty))
|
|
||||||
m.SetSessionToken(sessiontest.GenerateSessionToken(empty))
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateGetExtendedACLResponse(empty bool) *container.GetExtendedACLResponse {
|
|
||||||
m := new(container.GetExtendedACLResponse)
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
m.SetBody(GenerateGetExtendedACLResponseBody(false))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.SetMetaHeader(sessiontest.GenerateResponseMetaHeader(empty))
|
|
||||||
m.SetVerificationHeader(sessiontest.GenerateResponseVerificationHeader(empty))
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateUsedSpaceAnnouncement(empty bool) *container.UsedSpaceAnnouncement {
|
|
||||||
m := new(container.UsedSpaceAnnouncement)
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
m.SetContainerID(refstest.GenerateContainerID(false))
|
|
||||||
m.SetEpoch(1)
|
|
||||||
m.SetUsedSpace(2)
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateUsedSpaceAnnouncements(empty bool) []container.UsedSpaceAnnouncement {
|
|
||||||
var res []container.UsedSpaceAnnouncement
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
res = append(res,
|
|
||||||
*GenerateUsedSpaceAnnouncement(false),
|
|
||||||
*GenerateUsedSpaceAnnouncement(false),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateAnnounceUsedSpaceRequestBody(empty bool) *container.AnnounceUsedSpaceRequestBody {
|
|
||||||
m := new(container.AnnounceUsedSpaceRequestBody)
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
m.SetAnnouncements(GenerateUsedSpaceAnnouncements(false))
|
|
||||||
}
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateAnnounceUsedSpaceRequest(empty bool) *container.AnnounceUsedSpaceRequest {
|
|
||||||
m := new(container.AnnounceUsedSpaceRequest)
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
m.SetBody(GenerateAnnounceUsedSpaceRequestBody(false))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.SetMetaHeader(sessiontest.GenerateRequestMetaHeader(empty))
|
|
||||||
m.SetVerificationHeader(sessiontest.GenerateRequestVerificationHeader(empty))
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateAnnounceUsedSpaceResponseBody(empty bool) *container.AnnounceUsedSpaceResponseBody {
|
|
||||||
m := new(container.AnnounceUsedSpaceResponseBody)
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateAnnounceUsedSpaceResponse(empty bool) *container.AnnounceUsedSpaceResponse {
|
|
||||||
m := new(container.AnnounceUsedSpaceResponse)
|
|
||||||
|
|
||||||
if !empty {
|
|
||||||
m.SetBody(GenerateAnnounceUsedSpaceResponseBody(false))
|
|
||||||
}
|
|
||||||
|
|
||||||
m.SetMetaHeader(sessiontest.GenerateResponseMetaHeader(empty))
|
|
||||||
m.SetVerificationHeader(sessiontest.GenerateResponseVerificationHeader(empty))
|
|
||||||
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package container
|
package container
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/acl"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session"
|
||||||
|
@ -110,76 +109,6 @@ type ListResponse struct {
|
||||||
session.ResponseHeaders
|
session.ResponseHeaders
|
||||||
}
|
}
|
||||||
|
|
||||||
type SetExtendedACLRequestBody struct {
|
|
||||||
eacl *acl.Table
|
|
||||||
|
|
||||||
sig *refs.Signature
|
|
||||||
}
|
|
||||||
|
|
||||||
type SetExtendedACLRequest struct {
|
|
||||||
body *SetExtendedACLRequestBody
|
|
||||||
|
|
||||||
session.RequestHeaders
|
|
||||||
}
|
|
||||||
|
|
||||||
type SetExtendedACLResponseBody struct{}
|
|
||||||
|
|
||||||
type SetExtendedACLResponse struct {
|
|
||||||
body *SetExtendedACLResponseBody
|
|
||||||
|
|
||||||
session.ResponseHeaders
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetExtendedACLRequestBody struct {
|
|
||||||
cid *refs.ContainerID
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetExtendedACLRequest struct {
|
|
||||||
body *GetExtendedACLRequestBody
|
|
||||||
|
|
||||||
session.RequestHeaders
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetExtendedACLResponseBody struct {
|
|
||||||
eacl *acl.Table
|
|
||||||
|
|
||||||
sig *refs.Signature
|
|
||||||
|
|
||||||
token *session.Token
|
|
||||||
}
|
|
||||||
|
|
||||||
type GetExtendedACLResponse struct {
|
|
||||||
body *GetExtendedACLResponseBody
|
|
||||||
|
|
||||||
session.ResponseHeaders
|
|
||||||
}
|
|
||||||
|
|
||||||
type UsedSpaceAnnouncement struct {
|
|
||||||
epoch uint64
|
|
||||||
|
|
||||||
cid *refs.ContainerID
|
|
||||||
|
|
||||||
usedSpace uint64
|
|
||||||
}
|
|
||||||
|
|
||||||
type AnnounceUsedSpaceRequestBody struct {
|
|
||||||
announcements []UsedSpaceAnnouncement
|
|
||||||
}
|
|
||||||
|
|
||||||
type AnnounceUsedSpaceRequest struct {
|
|
||||||
body *AnnounceUsedSpaceRequestBody
|
|
||||||
|
|
||||||
session.RequestHeaders
|
|
||||||
}
|
|
||||||
|
|
||||||
type AnnounceUsedSpaceResponseBody struct{}
|
|
||||||
|
|
||||||
type AnnounceUsedSpaceResponse struct {
|
|
||||||
body *AnnounceUsedSpaceResponseBody
|
|
||||||
|
|
||||||
session.ResponseHeaders
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *Attribute) GetKey() string {
|
func (a *Attribute) GetKey() string {
|
||||||
if a != nil {
|
if a != nil {
|
||||||
return a.key
|
return a.key
|
||||||
|
@ -515,203 +444,3 @@ func (r *ListResponse) GetBody() *ListResponseBody {
|
||||||
func (r *ListResponse) SetBody(v *ListResponseBody) {
|
func (r *ListResponse) SetBody(v *ListResponseBody) {
|
||||||
r.body = v
|
r.body = v
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *SetExtendedACLRequestBody) GetEACL() *acl.Table {
|
|
||||||
if r != nil {
|
|
||||||
return r.eacl
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLRequestBody) SetEACL(v *acl.Table) {
|
|
||||||
r.eacl = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLRequestBody) GetSignature() *refs.Signature {
|
|
||||||
if r != nil {
|
|
||||||
return r.sig
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLRequestBody) SetSignature(v *refs.Signature) {
|
|
||||||
// TODO: (neofs-api-go#381) avoid this hack (e.g. create refs.SignatureRFC6979 type)
|
|
||||||
v.SetScheme(0)
|
|
||||||
r.sig = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLRequest) GetBody() *SetExtendedACLRequestBody {
|
|
||||||
if r != nil {
|
|
||||||
return r.body
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLRequest) SetBody(v *SetExtendedACLRequestBody) {
|
|
||||||
r.body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLResponse) GetBody() *SetExtendedACLResponseBody {
|
|
||||||
if r != nil {
|
|
||||||
return r.body
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *SetExtendedACLResponse) SetBody(v *SetExtendedACLResponseBody) {
|
|
||||||
r.body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLRequestBody) GetContainerID() *refs.ContainerID {
|
|
||||||
if r != nil {
|
|
||||||
return r.cid
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLRequestBody) SetContainerID(v *refs.ContainerID) {
|
|
||||||
r.cid = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLRequest) GetBody() *GetExtendedACLRequestBody {
|
|
||||||
if r != nil {
|
|
||||||
return r.body
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLRequest) SetBody(v *GetExtendedACLRequestBody) {
|
|
||||||
r.body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponseBody) GetEACL() *acl.Table {
|
|
||||||
if r != nil {
|
|
||||||
return r.eacl
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponseBody) SetEACL(v *acl.Table) {
|
|
||||||
r.eacl = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponseBody) GetSignature() *refs.Signature {
|
|
||||||
if r != nil {
|
|
||||||
return r.sig
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponseBody) SetSignature(v *refs.Signature) {
|
|
||||||
// TODO: (neofs-api-go#381) avoid this hack (e.g. create refs.SignatureRFC6979 type)
|
|
||||||
v.SetScheme(0)
|
|
||||||
r.sig = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetSessionToken returns token of the session within which requested
|
|
||||||
// eACL table was set.
|
|
||||||
func (r *GetExtendedACLResponseBody) GetSessionToken() *session.Token {
|
|
||||||
if r != nil {
|
|
||||||
return r.token
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetSessionToken sets token of the session within which requested
|
|
||||||
// eACL table was set.
|
|
||||||
func (r *GetExtendedACLResponseBody) SetSessionToken(v *session.Token) {
|
|
||||||
r.token = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponse) GetBody() *GetExtendedACLResponseBody {
|
|
||||||
if r != nil {
|
|
||||||
return r.body
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *GetExtendedACLResponse) SetBody(v *GetExtendedACLResponseBody) {
|
|
||||||
r.body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *UsedSpaceAnnouncement) GetEpoch() uint64 {
|
|
||||||
if a != nil {
|
|
||||||
return a.epoch
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *UsedSpaceAnnouncement) SetEpoch(v uint64) {
|
|
||||||
a.epoch = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *UsedSpaceAnnouncement) GetUsedSpace() uint64 {
|
|
||||||
if a != nil {
|
|
||||||
return a.usedSpace
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *UsedSpaceAnnouncement) SetUsedSpace(v uint64) {
|
|
||||||
a.usedSpace = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *UsedSpaceAnnouncement) GetContainerID() *refs.ContainerID {
|
|
||||||
if a != nil {
|
|
||||||
return a.cid
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *UsedSpaceAnnouncement) SetContainerID(v *refs.ContainerID) {
|
|
||||||
a.cid = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceRequestBody) GetAnnouncements() []UsedSpaceAnnouncement {
|
|
||||||
if r != nil {
|
|
||||||
return r.announcements
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceRequestBody) SetAnnouncements(v []UsedSpaceAnnouncement) {
|
|
||||||
r.announcements = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceRequest) GetBody() *AnnounceUsedSpaceRequestBody {
|
|
||||||
if r != nil {
|
|
||||||
return r.body
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceRequest) SetBody(v *AnnounceUsedSpaceRequestBody) {
|
|
||||||
r.body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceResponse) GetBody() *AnnounceUsedSpaceResponseBody {
|
|
||||||
if r != nil {
|
|
||||||
return r.body
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *AnnounceUsedSpaceResponse) SetBody(v *AnnounceUsedSpaceResponseBody) {
|
|
||||||
r.body = v
|
|
||||||
}
|
|
||||||
|
|
|
@ -35,11 +35,11 @@ Tag a release (must be signed) and push it:
|
||||||
$ git tag -s vX.Y.Z[-rc.N] && git push origin vX.Y.Z[-rc.N]
|
$ git tag -s vX.Y.Z[-rc.N] && git push origin vX.Y.Z[-rc.N]
|
||||||
```
|
```
|
||||||
|
|
||||||
## Make a Github release
|
## Make a proper release
|
||||||
|
|
||||||
Using Github's web interface create a new release based on just created tag
|
Using git.frostfs.info web interface create a new release based on just created tag
|
||||||
with the same changes from changelog and publish it.
|
with the same changes from changelog and publish it.
|
||||||
|
|
||||||
## Close github milestone
|
## Close milestone
|
||||||
|
|
||||||
Close corresponding vX.Y.Z github milestone.
|
Close corresponding vX.Y.Z milestone.
|
||||||
|
|
29
go.mod
29
go.mod
|
@ -1,25 +1,28 @@
|
||||||
module git.frostfs.info/TrueCloudLab/frostfs-api-go/v2
|
module git.frostfs.info/TrueCloudLab/frostfs-api-go/v2
|
||||||
|
|
||||||
go 1.18
|
go 1.22
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-crypto v0.6.0
|
git.frostfs.info/TrueCloudLab/frostfs-crypto v0.6.0
|
||||||
github.com/stretchr/testify v1.7.0
|
github.com/VictoriaMetrics/easyproto v0.1.4
|
||||||
golang.org/x/sync v0.1.0
|
github.com/mailru/easyjson v0.7.7
|
||||||
google.golang.org/grpc v1.48.0
|
github.com/stretchr/testify v1.8.3
|
||||||
google.golang.org/protobuf v1.28.0
|
golang.org/x/sync v0.7.0
|
||||||
|
google.golang.org/grpc v1.66.2
|
||||||
|
google.golang.org/protobuf v1.34.1
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0 // indirect
|
git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.0 // indirect
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/josharian/intern v1.0.0 // indirect
|
||||||
github.com/google/go-cmp v0.5.8 // indirect
|
github.com/kr/pretty v0.1.0 // indirect
|
||||||
github.com/mr-tron/base58 v1.2.0 // indirect
|
github.com/mr-tron/base58 v1.2.0 // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974 // indirect
|
golang.org/x/net v0.26.0 // indirect
|
||||||
golang.org/x/sys v0.1.0 // indirect
|
golang.org/x/sys v0.21.0 // indirect
|
||||||
golang.org/x/text v0.3.3 // indirect
|
golang.org/x/text v0.16.0 // indirect
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 // indirect
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|
164
go.sum
164
go.sum
|
@ -1,142 +1,48 @@
|
||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-crypto v0.6.0 h1:FxqFDhQYYgpe41qsIHVOcdzSVCB8JNSfPG7Uk4r2oSk=
|
git.frostfs.info/TrueCloudLab/frostfs-crypto v0.6.0 h1:FxqFDhQYYgpe41qsIHVOcdzSVCB8JNSfPG7Uk4r2oSk=
|
||||||
git.frostfs.info/TrueCloudLab/frostfs-crypto v0.6.0/go.mod h1:RUIKZATQLJ+TaYQa60X2fTDwfuhMfm8Ar60bQ5fr+vU=
|
git.frostfs.info/TrueCloudLab/frostfs-crypto v0.6.0/go.mod h1:RUIKZATQLJ+TaYQa60X2fTDwfuhMfm8Ar60bQ5fr+vU=
|
||||||
git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0 h1:M2KR3iBj7WpY3hP10IevfIB9MURr4O9mwVfJ+SjT3HA=
|
git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0 h1:M2KR3iBj7WpY3hP10IevfIB9MURr4O9mwVfJ+SjT3HA=
|
||||||
git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0/go.mod h1:okpbKfVYf/BpejtfFTfhZqFP+sZ8rsHrP8Rr/jYPNRc=
|
git.frostfs.info/TrueCloudLab/rfc6979 v0.4.0/go.mod h1:okpbKfVYf/BpejtfFTfhZqFP+sZ8rsHrP8Rr/jYPNRc=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/VictoriaMetrics/easyproto v0.1.4 h1:r8cNvo8o6sR4QShBXQd1bKw/VVLSQma/V2KhTBPf+Sc=
|
||||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
|
github.com/VictoriaMetrics/easyproto v0.1.4/go.mod h1:QlGlzaJnDfFd8Lk6Ci/fuLxfTo3/GThPs2KH23mv710=
|
||||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
|
|
||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
|
||||||
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
|
||||||
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
|
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
|
||||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
|
||||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
|
||||||
github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
|
|
||||||
github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
|
|
||||||
github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
|
|
||||||
github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
|
||||||
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
|
|
||||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
|
||||||
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
|
|
||||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
|
||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
|
||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
|
||||||
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
|
|
||||||
github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
|
||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
|
||||||
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
|
github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o=
|
||||||
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
|
||||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
|
||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
|
github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
|
||||||
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo=
|
||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI=
|
google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
|
||||||
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
|
||||||
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
|
||||||
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
|
|
||||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
|
||||||
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
|
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
|
||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
|
||||||
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
|
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
|
||||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
|
||||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
|
||||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
|
||||||
google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
|
|
||||||
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
|
|
||||||
google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w=
|
|
||||||
google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
|
||||||
google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
|
|
||||||
google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
|
|
||||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
|
||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
|
||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
|
||||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
|
||||||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
|
||||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
||||||
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|
|
@ -1,15 +0,0 @@
|
||||||
package random
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math/rand"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
rand.Seed(time.Now().UnixNano())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Uint32 returns random uint32 value [0, max).
|
|
||||||
func Uint32(max uint32) uint32 {
|
|
||||||
return rand.Uint32() % max
|
|
||||||
}
|
|
|
@ -1,8 +0,0 @@
|
||||||
package lock
|
|
||||||
|
|
||||||
import refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc"
|
|
||||||
|
|
||||||
// SetMembers sets `members` field.
|
|
||||||
func (x *Lock) SetMembers(ids []*refs.ObjectID) {
|
|
||||||
x.Members = ids
|
|
||||||
}
|
|
BIN
lock/grpc/types.pb.go
generated
BIN
lock/grpc/types.pb.go
generated
Binary file not shown.
BIN
lock/grpc/types_frostfs.pb.go
generated
Normal file
BIN
lock/grpc/types_frostfs.pb.go
generated
Normal file
Binary file not shown.
26
lock/grpc/types_frostfs_fuzz.go
Normal file
26
lock/grpc/types_frostfs_fuzz.go
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package lock
|
||||||
|
|
||||||
|
func DoFuzzProtoLock(data []byte) int {
|
||||||
|
msg := new(Lock)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONLock(data []byte) int {
|
||||||
|
msg := new(Lock)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
21
lock/grpc/types_frostfs_test.go
Normal file
21
lock/grpc/types_frostfs_test.go
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package lock
|
||||||
|
|
||||||
|
import (
|
||||||
|
testing "testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func FuzzProtoLock(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzProtoLock(data)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func FuzzJSONLock(f *testing.F) {
|
||||||
|
f.Fuzz(func(t *testing.T, data []byte) {
|
||||||
|
DoFuzzJSONLock(data)
|
||||||
|
})
|
||||||
|
}
|
|
@ -1,232 +0,0 @@
|
||||||
package netmap
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
|
||||||
)
|
|
||||||
|
|
||||||
// prefix of keys to subnet attributes.
|
|
||||||
const attrSubnetPrefix = "__SYSTEM__SUBNET_"
|
|
||||||
|
|
||||||
// prefix of keys to subnet attributes.
|
|
||||||
// Deprecated: use attrSubnetPrefix
|
|
||||||
const attrSubnetPrefixNeoFS = "__NEOFS__SUBNET_"
|
|
||||||
|
|
||||||
const (
|
|
||||||
// subnet attribute's value denoting subnet entry
|
|
||||||
attrSubnetValEntry = "True"
|
|
||||||
|
|
||||||
// subnet attribute's value denoting subnet exit
|
|
||||||
attrSubnetValExit = "False"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NodeSubnetInfo groups information about subnet which can be written to NodeInfo.
|
|
||||||
//
|
|
||||||
// Zero value represents entry to zero subnet.
|
|
||||||
type NodeSubnetInfo struct {
|
|
||||||
exit bool
|
|
||||||
|
|
||||||
id *refs.SubnetID
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enabled returns true iff subnet membership is enabled for the node.
|
|
||||||
func (x NodeSubnetInfo) Enabled() bool {
|
|
||||||
return !x.exit
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetEntryFlag sets the subnet entry flag.
|
|
||||||
func (x *NodeSubnetInfo) SetEntryFlag(enters bool) {
|
|
||||||
x.exit = !enters
|
|
||||||
}
|
|
||||||
|
|
||||||
// ID returns identifier of the subnet.
|
|
||||||
func (x NodeSubnetInfo) ID() *refs.SubnetID {
|
|
||||||
return x.id
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetID sets identifier of the subnet.
|
|
||||||
func (x *NodeSubnetInfo) SetID(id *refs.SubnetID) {
|
|
||||||
x.id = id
|
|
||||||
}
|
|
||||||
|
|
||||||
func subnetAttributeKey(id *refs.SubnetID) string {
|
|
||||||
txt, _ := id.MarshalText() // never returns an error
|
|
||||||
|
|
||||||
return attrSubnetPrefix + string(txt)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WriteSubnetInfo writes NodeSubnetInfo to NodeInfo via attributes. NodeInfo must not be nil.
|
|
||||||
//
|
|
||||||
// Existing subnet attributes are expected to be key-unique, otherwise undefined behavior.
|
|
||||||
//
|
|
||||||
// Does not add (removes existing) attribute if node:
|
|
||||||
// - disables non-zero subnet;
|
|
||||||
// - enables zero subnet.
|
|
||||||
//
|
|
||||||
// Attribute key is calculated from ID using format `__SYSTEM__SUBNET_%s`.
|
|
||||||
// Attribute Value is:
|
|
||||||
// - `True` if node enters the subnet;
|
|
||||||
// - `False`, otherwise.
|
|
||||||
func WriteSubnetInfo(node *NodeInfo, info NodeSubnetInfo) {
|
|
||||||
attrs := node.GetAttributes()
|
|
||||||
|
|
||||||
id := info.ID()
|
|
||||||
enters := info.Enabled()
|
|
||||||
|
|
||||||
// calculate attribute key
|
|
||||||
key := subnetAttributeKey(id)
|
|
||||||
|
|
||||||
if refs.IsZeroSubnet(id) == enters {
|
|
||||||
for i := range attrs {
|
|
||||||
if attrs[i].GetKey() == key {
|
|
||||||
attrs = append(attrs[:i], attrs[i+1:]...)
|
|
||||||
break // attributes are expected to be key-unique
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var val string
|
|
||||||
|
|
||||||
if enters {
|
|
||||||
val = attrSubnetValEntry
|
|
||||||
} else {
|
|
||||||
val = attrSubnetValExit
|
|
||||||
}
|
|
||||||
|
|
||||||
presented := false
|
|
||||||
|
|
||||||
for i := range attrs {
|
|
||||||
if attrs[i].GetKey() == key {
|
|
||||||
attrs[i].SetValue(val)
|
|
||||||
presented = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !presented {
|
|
||||||
index := len(attrs)
|
|
||||||
attrs = append(attrs, Attribute{})
|
|
||||||
attrs[index].SetKey(key)
|
|
||||||
attrs[index].SetValue(val)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
node.SetAttributes(attrs)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ErrRemoveSubnet is returned when a node needs to leave the subnet.
|
|
||||||
var ErrRemoveSubnet = errors.New("remove subnet")
|
|
||||||
|
|
||||||
var errNoSubnets = errors.New("no subnets")
|
|
||||||
|
|
||||||
// IterateSubnets iterates over all subnets the node belongs to and passes the IDs to f.
|
|
||||||
// Handler must not be nil.
|
|
||||||
//
|
|
||||||
// Subnet attributes are expected to be key-unique, otherwise undefined behavior.
|
|
||||||
//
|
|
||||||
// If f returns ErrRemoveSubnet, then removes subnet entry. Note that this leads to an instant mutation of NodeInfo.
|
|
||||||
// Breaks on any other non-nil error and returns it.
|
|
||||||
//
|
|
||||||
// Returns an error if any subnet attribute has wrong format.
|
|
||||||
// Returns an error if the node is not included in any subnet by the end of the loop.
|
|
||||||
func IterateSubnets(node *NodeInfo, f func(refs.SubnetID) error) error {
|
|
||||||
attrs := node.GetAttributes()
|
|
||||||
|
|
||||||
var (
|
|
||||||
err error
|
|
||||||
id refs.SubnetID
|
|
||||||
entries uint
|
|
||||||
|
|
||||||
zeroEntry = true
|
|
||||||
)
|
|
||||||
|
|
||||||
for i := 0; i < len(attrs); i++ { // range must not be used because of attrs mutation in body
|
|
||||||
key := attrs[i].GetKey()
|
|
||||||
|
|
||||||
// cut subnet ID string
|
|
||||||
idTxt := strings.TrimPrefix(key, attrSubnetPrefix)
|
|
||||||
if len(idTxt) == len(key) {
|
|
||||||
idTxt = strings.TrimPrefix(key, attrSubnetPrefixNeoFS)
|
|
||||||
if len(idTxt) == len(key) {
|
|
||||||
// not a subnet attribute
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// check value
|
|
||||||
val := attrs[i].GetValue()
|
|
||||||
if val != attrSubnetValExit && val != attrSubnetValEntry {
|
|
||||||
return fmt.Errorf("invalid attribute value: %s", val)
|
|
||||||
}
|
|
||||||
|
|
||||||
// decode subnet ID
|
|
||||||
if err = id.UnmarshalText([]byte(idTxt)); err != nil {
|
|
||||||
return fmt.Errorf("invalid ID text: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// update status of zero subnet
|
|
||||||
isZero := refs.IsZeroSubnet(&id)
|
|
||||||
|
|
||||||
if isZero {
|
|
||||||
zeroEntry = val == attrSubnetValEntry
|
|
||||||
}
|
|
||||||
|
|
||||||
// continue to process only the subnets to which the node belongs
|
|
||||||
if val == attrSubnetValExit {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
// pass ID to the handler
|
|
||||||
err = f(id)
|
|
||||||
|
|
||||||
isRemoveErr := errors.Is(err, ErrRemoveSubnet)
|
|
||||||
|
|
||||||
if err != nil && !isRemoveErr {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if isRemoveErr {
|
|
||||||
if isZero {
|
|
||||||
// we can't remove attribute of zero subnet because it means entry
|
|
||||||
attrs[i].SetValue(attrSubnetValExit)
|
|
||||||
} else {
|
|
||||||
// we can set False or remove attribute, latter is more memory/network efficient.
|
|
||||||
attrs = append(attrs[:i], attrs[i+1:]...)
|
|
||||||
i--
|
|
||||||
}
|
|
||||||
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
entries++
|
|
||||||
}
|
|
||||||
|
|
||||||
if zeroEntry {
|
|
||||||
// missing attribute of zero subnet equivalent to entry
|
|
||||||
refs.MakeZeroSubnet(&id)
|
|
||||||
|
|
||||||
err = f(id)
|
|
||||||
if err != nil {
|
|
||||||
if !errors.Is(err, ErrRemoveSubnet) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// zero subnet should be clearly removed with False value
|
|
||||||
index := len(attrs)
|
|
||||||
attrs = append(attrs, Attribute{})
|
|
||||||
attrs[index].SetKey(subnetAttributeKey(&id))
|
|
||||||
attrs[index].SetValue(attrSubnetValExit)
|
|
||||||
} else {
|
|
||||||
entries++
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if entries <= 0 {
|
|
||||||
return errNoSubnets
|
|
||||||
}
|
|
||||||
|
|
||||||
node.SetAttributes(attrs)
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
|
@ -1,361 +0,0 @@
|
||||||
package netmap_test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strconv"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap"
|
|
||||||
netmaptest "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/netmap/test"
|
|
||||||
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
|
||||||
"github.com/stretchr/testify/require"
|
|
||||||
)
|
|
||||||
|
|
||||||
func subnetAttrKey(val string) string {
|
|
||||||
return "__SYSTEM__SUBNET_" + val
|
|
||||||
}
|
|
||||||
|
|
||||||
func assertSubnetAttrKey(t *testing.T, attr *netmap.Attribute, num uint32) {
|
|
||||||
require.Equal(t, subnetAttrKey(strconv.FormatUint(uint64(num), 10)), attr.GetKey())
|
|
||||||
}
|
|
||||||
|
|
||||||
func BenchmarkNodeAttributes(b *testing.B) {
|
|
||||||
const size = 50
|
|
||||||
|
|
||||||
id := new(refs.SubnetID)
|
|
||||||
id.SetValue(12)
|
|
||||||
|
|
||||||
attrs := make([]netmap.Attribute, size)
|
|
||||||
for i := range attrs {
|
|
||||||
if i == size/2 {
|
|
||||||
attrs[i] = *netmaptest.GenerateAttribute(false)
|
|
||||||
} else {
|
|
||||||
data, err := id.MarshalText()
|
|
||||||
require.NoError(b, err)
|
|
||||||
|
|
||||||
attrs[i].SetKey(subnetAttrKey(string(data)))
|
|
||||||
attrs[i].SetValue("True")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var info netmap.NodeSubnetInfo
|
|
||||||
info.SetID(id)
|
|
||||||
info.SetEntryFlag(false)
|
|
||||||
|
|
||||||
node := new(netmap.NodeInfo)
|
|
||||||
|
|
||||||
// When using a single slice `StartTimer` overhead is comparable to the
|
|
||||||
// function execution time, so we reduce this cost by updating slices in groups.
|
|
||||||
const cacheSize = 1000
|
|
||||||
a := make([][]netmap.Attribute, cacheSize)
|
|
||||||
for i := range a {
|
|
||||||
a[i] = make([]netmap.Attribute, size)
|
|
||||||
}
|
|
||||||
|
|
||||||
b.ResetTimer()
|
|
||||||
b.ReportAllocs()
|
|
||||||
for i := 0; i < b.N; i++ {
|
|
||||||
if i%cacheSize == 0 {
|
|
||||||
b.StopTimer()
|
|
||||||
for j := range a {
|
|
||||||
copy(a[j], attrs)
|
|
||||||
}
|
|
||||||
b.StartTimer()
|
|
||||||
}
|
|
||||||
node.SetAttributes(a[i%cacheSize])
|
|
||||||
netmap.WriteSubnetInfo(node, info)
|
|
||||||
if len(node.GetAttributes())+1 != len(attrs) {
|
|
||||||
b.FailNow()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestWriteSubnetInfo(t *testing.T) {
|
|
||||||
t.Run("entry", func(t *testing.T) {
|
|
||||||
t.Run("zero subnet", func(t *testing.T) {
|
|
||||||
var (
|
|
||||||
node netmap.NodeInfo
|
|
||||||
info netmap.NodeSubnetInfo
|
|
||||||
)
|
|
||||||
|
|
||||||
netmap.WriteSubnetInfo(&node, info)
|
|
||||||
|
|
||||||
// entry to zero subnet does not require an attribute
|
|
||||||
attrs := node.GetAttributes()
|
|
||||||
require.Empty(t, attrs)
|
|
||||||
|
|
||||||
// exit the subnet
|
|
||||||
info.SetEntryFlag(false)
|
|
||||||
|
|
||||||
netmap.WriteSubnetInfo(&node, info)
|
|
||||||
|
|
||||||
// exit from zero subnet should be clearly reflected in attributes
|
|
||||||
attrs = node.GetAttributes()
|
|
||||||
require.Len(t, attrs, 1)
|
|
||||||
|
|
||||||
attr := &attrs[0]
|
|
||||||
assertSubnetAttrKey(t, attr, 0)
|
|
||||||
require.Equal(t, "False", attr.GetValue())
|
|
||||||
|
|
||||||
// again enter to zero subnet
|
|
||||||
info.SetEntryFlag(true)
|
|
||||||
|
|
||||||
netmap.WriteSubnetInfo(&node, info)
|
|
||||||
|
|
||||||
// attribute should be removed
|
|
||||||
attrs = node.GetAttributes()
|
|
||||||
require.Empty(t, attrs)
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("non-zero subnet", func(t *testing.T) {
|
|
||||||
var (
|
|
||||||
node netmap.NodeInfo
|
|
||||||
info netmap.NodeSubnetInfo
|
|
||||||
id refs.SubnetID
|
|
||||||
)
|
|
||||||
|
|
||||||
// create non-zero subnet ID
|
|
||||||
const num = 15
|
|
||||||
|
|
||||||
id.SetValue(num)
|
|
||||||
|
|
||||||
// enter to the subnet
|
|
||||||
info.SetID(&id)
|
|
||||||
info.SetEntryFlag(true)
|
|
||||||
|
|
||||||
netmap.WriteSubnetInfo(&node, info)
|
|
||||||
|
|
||||||
// check attribute format
|
|
||||||
attrs := node.GetAttributes()
|
|
||||||
require.Len(t, attrs, 1)
|
|
||||||
|
|
||||||
attr := &attrs[0]
|
|
||||||
assertSubnetAttrKey(t, attr, num)
|
|
||||||
require.Equal(t, "True", attr.GetValue())
|
|
||||||
|
|
||||||
// again exit the subnet
|
|
||||||
info.SetEntryFlag(false)
|
|
||||||
|
|
||||||
netmap.WriteSubnetInfo(&node, info)
|
|
||||||
|
|
||||||
// attribute should be removed
|
|
||||||
attrs = node.GetAttributes()
|
|
||||||
require.Empty(t, attrs)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSubnets(t *testing.T) {
|
|
||||||
t.Run("empty", func(t *testing.T) {
|
|
||||||
var node netmap.NodeInfo
|
|
||||||
|
|
||||||
called := 0
|
|
||||||
|
|
||||||
err := netmap.IterateSubnets(&node, func(id refs.SubnetID) error {
|
|
||||||
called++
|
|
||||||
|
|
||||||
require.True(t, refs.IsZeroSubnet(&id))
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.EqualValues(t, 1, called)
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("with correct attribute", func(t *testing.T) {
|
|
||||||
var (
|
|
||||||
node netmap.NodeInfo
|
|
||||||
|
|
||||||
attrEntry, attrExit netmap.Attribute
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
numEntry = 13
|
|
||||||
numExit = 14
|
|
||||||
)
|
|
||||||
|
|
||||||
attrEntry.SetKey(subnetAttrKey(strconv.FormatUint(numEntry, 10)))
|
|
||||||
attrEntry.SetValue("True")
|
|
||||||
|
|
||||||
attrExit.SetKey(subnetAttrKey(strconv.FormatUint(numExit, 10)))
|
|
||||||
attrExit.SetValue("False")
|
|
||||||
|
|
||||||
attrs := []netmap.Attribute{attrEntry, attrEntry}
|
|
||||||
|
|
||||||
node.SetAttributes(attrs)
|
|
||||||
|
|
||||||
mCalledNums := make(map[uint32]struct{})
|
|
||||||
|
|
||||||
err := netmap.IterateSubnets(&node, func(id refs.SubnetID) error {
|
|
||||||
mCalledNums[id.GetValue()] = struct{}{}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.Len(t, mCalledNums, 2)
|
|
||||||
|
|
||||||
_, ok := mCalledNums[numEntry]
|
|
||||||
require.True(t, ok)
|
|
||||||
|
|
||||||
_, ok = mCalledNums[numExit]
|
|
||||||
require.False(t, ok)
|
|
||||||
|
|
||||||
_, ok = mCalledNums[0]
|
|
||||||
require.True(t, ok)
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("with incorrect attribute", func(t *testing.T) {
|
|
||||||
assertErr := func(attr netmap.Attribute) {
|
|
||||||
var node netmap.NodeInfo
|
|
||||||
|
|
||||||
node.SetAttributes([]netmap.Attribute{attr})
|
|
||||||
|
|
||||||
require.Error(t, netmap.IterateSubnets(&node, func(refs.SubnetID) error {
|
|
||||||
return nil
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
t.Run("incorrect key", func(t *testing.T) {
|
|
||||||
var attr netmap.Attribute
|
|
||||||
|
|
||||||
attr.SetKey(subnetAttrKey("one-two-three"))
|
|
||||||
|
|
||||||
assertErr(attr)
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("incorrect value", func(t *testing.T) {
|
|
||||||
var attr netmap.Attribute
|
|
||||||
|
|
||||||
attr.SetKey(subnetAttrKey("1"))
|
|
||||||
|
|
||||||
for _, invalidVal := range []string{
|
|
||||||
"",
|
|
||||||
"Troo",
|
|
||||||
"Fols",
|
|
||||||
} {
|
|
||||||
attr.SetValue(invalidVal)
|
|
||||||
assertErr(attr)
|
|
||||||
}
|
|
||||||
|
|
||||||
assertErr(attr)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("remove entry", func(t *testing.T) {
|
|
||||||
t.Run("zero", func(t *testing.T) {
|
|
||||||
var node netmap.NodeInfo
|
|
||||||
|
|
||||||
// enter to some non-zero subnet so that zero is not the only one
|
|
||||||
var attr netmap.Attribute
|
|
||||||
|
|
||||||
attr.SetKey(subnetAttrKey("321"))
|
|
||||||
attr.SetValue("True")
|
|
||||||
|
|
||||||
attrs := []netmap.Attribute{attr}
|
|
||||||
node.SetAttributes(attrs)
|
|
||||||
|
|
||||||
err := netmap.IterateSubnets(&node, func(id refs.SubnetID) error {
|
|
||||||
if refs.IsZeroSubnet(&id) {
|
|
||||||
return netmap.ErrRemoveSubnet
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
attrs = node.GetAttributes()
|
|
||||||
require.Len(t, attrs, 2)
|
|
||||||
|
|
||||||
found := false
|
|
||||||
|
|
||||||
for i := range attrs {
|
|
||||||
if attrs[i].GetKey() == subnetAttrKey("0") {
|
|
||||||
require.Equal(t, "False", attrs[i].GetValue())
|
|
||||||
found = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
require.True(t, found)
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("non-zero", func(t *testing.T) {
|
|
||||||
var (
|
|
||||||
node netmap.NodeInfo
|
|
||||||
attr netmap.Attribute
|
|
||||||
)
|
|
||||||
|
|
||||||
attr.SetKey(subnetAttrKey("99"))
|
|
||||||
attr.SetValue("True")
|
|
||||||
|
|
||||||
attrs := []netmap.Attribute{attr}
|
|
||||||
node.SetAttributes(attrs)
|
|
||||||
|
|
||||||
err := netmap.IterateSubnets(&node, func(id refs.SubnetID) error {
|
|
||||||
if !refs.IsZeroSubnet(&id) {
|
|
||||||
return netmap.ErrRemoveSubnet
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
require.NoError(t, err)
|
|
||||||
|
|
||||||
attrs = node.GetAttributes()
|
|
||||||
require.Empty(t, attrs)
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("all", func(t *testing.T) {
|
|
||||||
var (
|
|
||||||
node netmap.NodeInfo
|
|
||||||
attrs []netmap.Attribute
|
|
||||||
)
|
|
||||||
|
|
||||||
// enter to some non-zero subnet so that zero is not the only one
|
|
||||||
for i := 1; i <= 5; i++ {
|
|
||||||
var attr netmap.Attribute
|
|
||||||
|
|
||||||
attr.SetKey(subnetAttrKey(strconv.Itoa(i)))
|
|
||||||
attr.SetValue("True")
|
|
||||||
|
|
||||||
attrs = append(attrs, attr)
|
|
||||||
}
|
|
||||||
|
|
||||||
node.SetAttributes(attrs)
|
|
||||||
|
|
||||||
err := netmap.IterateSubnets(&node, func(id refs.SubnetID) error {
|
|
||||||
return netmap.ErrRemoveSubnet
|
|
||||||
})
|
|
||||||
|
|
||||||
require.Error(t, err)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("zero subnet removal via attribute", func(t *testing.T) {
|
|
||||||
var (
|
|
||||||
node netmap.NodeInfo
|
|
||||||
|
|
||||||
attrZero, attrOther netmap.Attribute
|
|
||||||
)
|
|
||||||
|
|
||||||
attrZero.SetKey(subnetAttrKey("0"))
|
|
||||||
attrZero.SetValue("False")
|
|
||||||
|
|
||||||
attrOther.SetKey(subnetAttrKey("1"))
|
|
||||||
attrOther.SetValue("True")
|
|
||||||
|
|
||||||
node.SetAttributes([]netmap.Attribute{attrZero, attrOther})
|
|
||||||
|
|
||||||
calledCount := 0
|
|
||||||
|
|
||||||
err := netmap.IterateSubnets(&node, func(id refs.SubnetID) error {
|
|
||||||
require.False(t, refs.IsZeroSubnet(&id))
|
|
||||||
calledCount++
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.EqualValues(t, 1, calledCount)
|
|
||||||
})
|
|
||||||
}
|
|
|
@ -45,28 +45,26 @@ func (f *Filter) FromGRPCMessage(m grpc.Message) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func FiltersToGRPC(fs []Filter) (res []*netmap.Filter) {
|
func FiltersToGRPC(fs []Filter) (res []netmap.Filter) {
|
||||||
if fs != nil {
|
if fs != nil {
|
||||||
res = make([]*netmap.Filter, 0, len(fs))
|
res = make([]netmap.Filter, 0, len(fs))
|
||||||
|
|
||||||
for i := range fs {
|
for i := range fs {
|
||||||
res = append(res, fs[i].ToGRPCMessage().(*netmap.Filter))
|
res = append(res, *fs[i].ToGRPCMessage().(*netmap.Filter))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func FiltersFromGRPC(fs []*netmap.Filter) (res []Filter, err error) {
|
func FiltersFromGRPC(fs []netmap.Filter) (res []Filter, err error) {
|
||||||
if fs != nil {
|
if fs != nil {
|
||||||
res = make([]Filter, len(fs))
|
res = make([]Filter, len(fs))
|
||||||
|
|
||||||
for i := range fs {
|
for i := range fs {
|
||||||
if fs[i] != nil {
|
err = res[i].FromGRPCMessage(&fs[i])
|
||||||
err = res[i].FromGRPCMessage(fs[i])
|
if err != nil {
|
||||||
if err != nil {
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,28 +103,26 @@ func (s *Selector) FromGRPCMessage(m grpc.Message) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func SelectorsToGRPC(ss []Selector) (res []*netmap.Selector) {
|
func SelectorsToGRPC(ss []Selector) (res []netmap.Selector) {
|
||||||
if ss != nil {
|
if ss != nil {
|
||||||
res = make([]*netmap.Selector, 0, len(ss))
|
res = make([]netmap.Selector, 0, len(ss))
|
||||||
|
|
||||||
for i := range ss {
|
for i := range ss {
|
||||||
res = append(res, ss[i].ToGRPCMessage().(*netmap.Selector))
|
res = append(res, *ss[i].ToGRPCMessage().(*netmap.Selector))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func SelectorsFromGRPC(ss []*netmap.Selector) (res []Selector, err error) {
|
func SelectorsFromGRPC(ss []netmap.Selector) (res []Selector, err error) {
|
||||||
if ss != nil {
|
if ss != nil {
|
||||||
res = make([]Selector, len(ss))
|
res = make([]Selector, len(ss))
|
||||||
|
|
||||||
for i := range ss {
|
for i := range ss {
|
||||||
if ss[i] != nil {
|
err = res[i].FromGRPCMessage(&ss[i])
|
||||||
err = res[i].FromGRPCMessage(ss[i])
|
if err != nil {
|
||||||
if err != nil {
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -142,6 +138,8 @@ func (r *Replica) ToGRPCMessage() grpc.Message {
|
||||||
|
|
||||||
m.SetSelector(r.selector)
|
m.SetSelector(r.selector)
|
||||||
m.SetCount(r.count)
|
m.SetCount(r.count)
|
||||||
|
m.EcDataCount = r.ecDataCount
|
||||||
|
m.EcParityCount = r.ecParityCount
|
||||||
}
|
}
|
||||||
|
|
||||||
return m
|
return m
|
||||||
|
@ -155,32 +153,32 @@ func (r *Replica) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
|
||||||
r.selector = v.GetSelector()
|
r.selector = v.GetSelector()
|
||||||
r.count = v.GetCount()
|
r.count = v.GetCount()
|
||||||
|
r.ecDataCount = v.GetEcDataCount()
|
||||||
|
r.ecParityCount = v.GetEcParityCount()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReplicasToGRPC(rs []Replica) (res []*netmap.Replica) {
|
func ReplicasToGRPC(rs []Replica) (res []netmap.Replica) {
|
||||||
if rs != nil {
|
if rs != nil {
|
||||||
res = make([]*netmap.Replica, 0, len(rs))
|
res = make([]netmap.Replica, 0, len(rs))
|
||||||
|
|
||||||
for i := range rs {
|
for i := range rs {
|
||||||
res = append(res, rs[i].ToGRPCMessage().(*netmap.Replica))
|
res = append(res, *rs[i].ToGRPCMessage().(*netmap.Replica))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func ReplicasFromGRPC(rs []*netmap.Replica) (res []Replica, err error) {
|
func ReplicasFromGRPC(rs []netmap.Replica) (res []Replica, err error) {
|
||||||
if rs != nil {
|
if rs != nil {
|
||||||
res = make([]Replica, len(rs))
|
res = make([]Replica, len(rs))
|
||||||
|
|
||||||
for i := range rs {
|
for i := range rs {
|
||||||
if rs[i] != nil {
|
err = res[i].FromGRPCMessage(&rs[i])
|
||||||
err = res[i].FromGRPCMessage(rs[i])
|
if err != nil {
|
||||||
if err != nil {
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -198,7 +196,7 @@ func (p *PlacementPolicy) ToGRPCMessage() grpc.Message {
|
||||||
m.SetSelectors(SelectorsToGRPC(p.selectors))
|
m.SetSelectors(SelectorsToGRPC(p.selectors))
|
||||||
m.SetReplicas(ReplicasToGRPC(p.replicas))
|
m.SetReplicas(ReplicasToGRPC(p.replicas))
|
||||||
m.SetContainerBackupFactor(p.backupFactor)
|
m.SetContainerBackupFactor(p.backupFactor)
|
||||||
m.SetSubnetID(p.subnetID.ToGRPCMessage().(*refsGRPC.SubnetID))
|
m.SetUnique(p.unique)
|
||||||
}
|
}
|
||||||
|
|
||||||
return m
|
return m
|
||||||
|
@ -227,22 +225,10 @@ func (p *PlacementPolicy) FromGRPCMessage(m grpc.Message) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
subnetID := v.GetSubnetId()
|
|
||||||
if subnetID == nil {
|
|
||||||
p.subnetID = nil
|
|
||||||
} else {
|
|
||||||
if p.subnetID == nil {
|
|
||||||
p.subnetID = new(refs.SubnetID)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = p.subnetID.FromGRPCMessage(subnetID)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
p.backupFactor = v.GetContainerBackupFactor()
|
p.backupFactor = v.GetContainerBackupFactor()
|
||||||
|
|
||||||
|
p.unique = v.GetUnique()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -297,28 +283,26 @@ func (a *Attribute) FromGRPCMessage(m grpc.Message) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func AttributesToGRPC(as []Attribute) (res []*netmap.NodeInfo_Attribute) {
|
func AttributesToGRPC(as []Attribute) (res []netmap.NodeInfo_Attribute) {
|
||||||
if as != nil {
|
if as != nil {
|
||||||
res = make([]*netmap.NodeInfo_Attribute, 0, len(as))
|
res = make([]netmap.NodeInfo_Attribute, 0, len(as))
|
||||||
|
|
||||||
for i := range as {
|
for i := range as {
|
||||||
res = append(res, as[i].ToGRPCMessage().(*netmap.NodeInfo_Attribute))
|
res = append(res, *as[i].ToGRPCMessage().(*netmap.NodeInfo_Attribute))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func AttributesFromGRPC(as []*netmap.NodeInfo_Attribute) (res []Attribute, err error) {
|
func AttributesFromGRPC(as []netmap.NodeInfo_Attribute) (res []Attribute, err error) {
|
||||||
if as != nil {
|
if as != nil {
|
||||||
res = make([]Attribute, len(as))
|
res = make([]Attribute, len(as))
|
||||||
|
|
||||||
for i := range as {
|
for i := range as {
|
||||||
if as[i] != nil {
|
err = res[i].FromGRPCMessage(&as[i])
|
||||||
err = res[i].FromGRPCMessage(as[i])
|
if err != nil {
|
||||||
if err != nil {
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -536,13 +520,13 @@ func (x *NetworkConfig) ToGRPCMessage() grpc.Message {
|
||||||
if x != nil {
|
if x != nil {
|
||||||
m = new(netmap.NetworkConfig)
|
m = new(netmap.NetworkConfig)
|
||||||
|
|
||||||
var ps []*netmap.NetworkConfig_Parameter
|
var ps []netmap.NetworkConfig_Parameter
|
||||||
|
|
||||||
if ln := len(x.ps); ln > 0 {
|
if ln := len(x.ps); ln > 0 {
|
||||||
ps = make([]*netmap.NetworkConfig_Parameter, 0, ln)
|
ps = make([]netmap.NetworkConfig_Parameter, 0, ln)
|
||||||
|
|
||||||
for i := 0; i < ln; i++ {
|
for i := range ln {
|
||||||
ps = append(ps, x.ps[i].ToGRPCMessage().(*netmap.NetworkConfig_Parameter))
|
ps = append(ps, *x.ps[i].ToGRPCMessage().(*netmap.NetworkConfig_Parameter))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -568,11 +552,9 @@ func (x *NetworkConfig) FromGRPCMessage(m grpc.Message) error {
|
||||||
|
|
||||||
ps = make([]NetworkParameter, ln)
|
ps = make([]NetworkParameter, ln)
|
||||||
|
|
||||||
for i := 0; i < ln; i++ {
|
for i := range ln {
|
||||||
if psV2[i] != nil {
|
if err := ps[i].FromGRPCMessage(&psV2[i]); err != nil {
|
||||||
if err := ps[i].FromGRPCMessage(psV2[i]); err != nil {
|
return err
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -764,10 +746,10 @@ func (x *NetMap) ToGRPCMessage() grpc.Message {
|
||||||
m.SetEpoch(x.epoch)
|
m.SetEpoch(x.epoch)
|
||||||
|
|
||||||
if x.nodes != nil {
|
if x.nodes != nil {
|
||||||
nodes := make([]*netmap.NodeInfo, len(x.nodes))
|
nodes := make([]netmap.NodeInfo, len(x.nodes))
|
||||||
|
|
||||||
for i := range x.nodes {
|
for i := range x.nodes {
|
||||||
nodes[i] = x.nodes[i].ToGRPCMessage().(*netmap.NodeInfo)
|
nodes[i] = *x.nodes[i].ToGRPCMessage().(*netmap.NodeInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
m.SetNodes(nodes)
|
m.SetNodes(nodes)
|
||||||
|
@ -792,7 +774,7 @@ func (x *NetMap) FromGRPCMessage(m grpc.Message) error {
|
||||||
x.nodes = make([]NodeInfo, len(nodes))
|
x.nodes = make([]NodeInfo, len(nodes))
|
||||||
|
|
||||||
for i := range nodes {
|
for i := range nodes {
|
||||||
err = x.nodes[i].FromGRPCMessage(nodes[i])
|
err = x.nodes[i].FromGRPCMessage(&nodes[i])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,116 +0,0 @@
|
||||||
package netmap
|
|
||||||
|
|
||||||
import (
|
|
||||||
refs "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs/grpc"
|
|
||||||
session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session/grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
// SetBody sets body of the request.
|
|
||||||
func (m *LocalNodeInfoRequest) SetBody(v *LocalNodeInfoRequest_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the request.
|
|
||||||
func (m *LocalNodeInfoRequest) SetMetaHeader(v *session.RequestMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the request.
|
|
||||||
func (m *LocalNodeInfoRequest) SetVerifyHeader(v *session.RequestVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVersion sets version of response body.
|
|
||||||
func (m *LocalNodeInfoResponse_Body) SetVersion(v *refs.Version) {
|
|
||||||
m.Version = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetNodeInfo sets node info of response body.
|
|
||||||
func (m *LocalNodeInfoResponse_Body) SetNodeInfo(v *NodeInfo) {
|
|
||||||
m.NodeInfo = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the response.
|
|
||||||
func (m *LocalNodeInfoResponse) SetBody(v *LocalNodeInfoResponse_Body) {
|
|
||||||
m.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the response.
|
|
||||||
func (m *LocalNodeInfoResponse) SetMetaHeader(v *session.ResponseMetaHeader) {
|
|
||||||
m.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the response.
|
|
||||||
func (m *LocalNodeInfoResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) {
|
|
||||||
m.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the request.
|
|
||||||
func (x *NetworkInfoRequest) SetBody(v *NetworkInfoRequest_Body) {
|
|
||||||
x.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the request.
|
|
||||||
func (x *NetworkInfoRequest) SetMetaHeader(v *session.RequestMetaHeader) {
|
|
||||||
x.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the request.
|
|
||||||
func (x *NetworkInfoRequest) SetVerifyHeader(v *session.RequestVerificationHeader) {
|
|
||||||
x.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetNetworkInfo sets information about the network.
|
|
||||||
func (x *NetworkInfoResponse_Body) SetNetworkInfo(v *NetworkInfo) {
|
|
||||||
x.NetworkInfo = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the response.
|
|
||||||
func (x *NetworkInfoResponse) SetBody(v *NetworkInfoResponse_Body) {
|
|
||||||
x.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the response.
|
|
||||||
func (x *NetworkInfoResponse) SetMetaHeader(v *session.ResponseMetaHeader) {
|
|
||||||
x.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the response.
|
|
||||||
func (x *NetworkInfoResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) {
|
|
||||||
x.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the request.
|
|
||||||
func (x *NetmapSnapshotRequest) SetBody(v *NetmapSnapshotRequest_Body) {
|
|
||||||
x.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the request.
|
|
||||||
func (x *NetmapSnapshotRequest) SetMetaHeader(v *session.RequestMetaHeader) {
|
|
||||||
x.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the request.
|
|
||||||
func (x *NetmapSnapshotRequest) SetVerifyHeader(v *session.RequestVerificationHeader) {
|
|
||||||
x.VerifyHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetNetmap sets current Netmap.
|
|
||||||
func (x *NetmapSnapshotResponse_Body) SetNetmap(v *Netmap) {
|
|
||||||
x.Netmap = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetBody sets body of the response.
|
|
||||||
func (x *NetmapSnapshotResponse) SetBody(v *NetmapSnapshotResponse_Body) {
|
|
||||||
x.Body = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetMetaHeader sets meta header of the response.
|
|
||||||
func (x *NetmapSnapshotResponse) SetMetaHeader(v *session.ResponseMetaHeader) {
|
|
||||||
x.MetaHeader = v
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetVerifyHeader sets verification header of the response.
|
|
||||||
func (x *NetmapSnapshotResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) {
|
|
||||||
x.VerifyHeader = v
|
|
||||||
}
|
|
BIN
netmap/grpc/service.pb.go
generated
BIN
netmap/grpc/service.pb.go
generated
Binary file not shown.
BIN
netmap/grpc/service_frostfs.pb.go
generated
Normal file
BIN
netmap/grpc/service_frostfs.pb.go
generated
Normal file
Binary file not shown.
121
netmap/grpc/service_frostfs_fuzz.go
Normal file
121
netmap/grpc/service_frostfs_fuzz.go
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
//go:build gofuzz
|
||||||
|
// +build gofuzz
|
||||||
|
|
||||||
|
// Code generated by protoc-gen-go-frostfs. DO NOT EDIT.
|
||||||
|
|
||||||
|
package netmap
|
||||||
|
|
||||||
|
func DoFuzzProtoLocalNodeInfoRequest(data []byte) int {
|
||||||
|
msg := new(LocalNodeInfoRequest)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONLocalNodeInfoRequest(data []byte) int {
|
||||||
|
msg := new(LocalNodeInfoRequest)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoLocalNodeInfoResponse(data []byte) int {
|
||||||
|
msg := new(LocalNodeInfoResponse)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONLocalNodeInfoResponse(data []byte) int {
|
||||||
|
msg := new(LocalNodeInfoResponse)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoNetworkInfoRequest(data []byte) int {
|
||||||
|
msg := new(NetworkInfoRequest)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONNetworkInfoRequest(data []byte) int {
|
||||||
|
msg := new(NetworkInfoRequest)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoNetworkInfoResponse(data []byte) int {
|
||||||
|
msg := new(NetworkInfoResponse)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONNetworkInfoResponse(data []byte) int {
|
||||||
|
msg := new(NetworkInfoResponse)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoNetmapSnapshotRequest(data []byte) int {
|
||||||
|
msg := new(NetmapSnapshotRequest)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONNetmapSnapshotRequest(data []byte) int {
|
||||||
|
msg := new(NetmapSnapshotRequest)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzProtoNetmapSnapshotResponse(data []byte) int {
|
||||||
|
msg := new(NetmapSnapshotResponse)
|
||||||
|
if err := msg.UnmarshalProtobuf(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_ = msg.MarshalProtobuf(nil)
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
func DoFuzzJSONNetmapSnapshotResponse(data []byte) int {
|
||||||
|
msg := new(NetmapSnapshotResponse)
|
||||||
|
if err := msg.UnmarshalJSON(data); err != nil {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
_, err := msg.MarshalJSON()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
return 1
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue