forked from TrueCloudLab/xk6-frostfs
parent
88b2129b54
commit
171327cdda
21 changed files with 81 additions and 84 deletions
|
@ -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/nspcc-dev/xk6-neofs/issues) and
|
- Check the open [issues](https://github.com/TrueCloudLab/xk6-frostfs/issues) and
|
||||||
[pull requests](https://github.com/nspcc-dev/xk6-neofs/pulls) for existing
|
[pull requests](https://github.com/TrueCloudLab/xk6-frostfs/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.
|
||||||
|
@ -23,23 +23,23 @@ everyone. Please follow the guidelines:
|
||||||
|
|
||||||
## Development Workflow
|
## Development Workflow
|
||||||
|
|
||||||
Start by forking the `xk6-neofs` repository, make changes in a branch and then
|
Start by forking the `xk6-frostfs` repository, make changes in a branch and then
|
||||||
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 GitHub Repository
|
||||||
Fork [xk6-neofs upstream](https://github.com/nspcc-dev/xk6-neofs/fork) source
|
Fork [xk6-frostfs upstream](https://github.com/TrueCloudLab/xk6-frostfs/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/nspcc-dev/xk6-neofs
|
$ git clone https://github.com/TrueCloudLab/xk6-frostfs
|
||||||
```
|
```
|
||||||
|
|
||||||
### Set up git remote as ``upstream``
|
### Set up git remote as ``upstream``
|
||||||
```sh
|
```sh
|
||||||
$ cd xk6-neofs
|
$ cd xk6-frostfs
|
||||||
$ git remote add upstream https://github.com/nspcc-dev/xk6-neofs
|
$ git remote add upstream https://github.com/TrueCloudLab/xk6-frostfs
|
||||||
$ git fetch upstream
|
$ git fetch upstream
|
||||||
$ git merge upstream/master
|
$ git merge upstream/master
|
||||||
...
|
...
|
||||||
|
@ -106,7 +106,7 @@ contributors".
|
||||||
To sign your work, just add a line like this at the end of your commit message:
|
To sign your work, just add a line like this at the end of your commit message:
|
||||||
|
|
||||||
```
|
```
|
||||||
Signed-off-by: Samii Sakisaka <samii@nspcc.ru>
|
Signed-off-by: Samii Sakisaka <samii@eve-no-jikan.co.jp>
|
||||||
```
|
```
|
||||||
|
|
||||||
This can easily be done with the `--signoff` option to `git commit`.
|
This can easily be done with the `--signoff` option to `git commit`.
|
||||||
|
|
31
README.md
31
README.md
|
@ -1,14 +1,11 @@
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="./.github/logo.svg" width="500px" alt="NeoFS">
|
<a href="https://go.k6.io/k6">k6</a> extension to test and benchmark FrostFS related protocols.
|
||||||
</p>
|
|
||||||
<p align="center">
|
|
||||||
<a href="https://go.k6.io/k6">k6</a> extension to test and benchmark <a href="https://fs.neo.org">NeoFS</a> related protocols.
|
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
|
[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
|
||||||
|
|
||||||
# xk6-neofs
|
# xk6-frostfs
|
||||||
|
|
||||||
# Build
|
# Build
|
||||||
|
|
||||||
|
@ -24,13 +21,13 @@ go install go.k6.io/xk6/cmd/xk6@latest
|
||||||
|
|
||||||
2. Clone this repository
|
2. Clone this repository
|
||||||
```shell
|
```shell
|
||||||
git clone github.com/nspcc-dev/xk6-neofs
|
git clone github.com/TrueCloudLab/xk6-frostfs
|
||||||
cd xk6-neofs
|
cd xk6-frostfs
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Build the binary:
|
3. Build the binary:
|
||||||
```shell
|
```shell
|
||||||
xk6 build --with github.com/nspcc-dev/xk6-neofs=.
|
xk6 build --with github.com/TrueCloudLab/xk6-frostfs=.
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Run k6:
|
4. Run k6:
|
||||||
|
@ -43,12 +40,12 @@ xk6 build --with github.com/nspcc-dev/xk6-neofs=.
|
||||||
## Native
|
## Native
|
||||||
|
|
||||||
Create native client with `connect` method. Arguments:
|
Create native client with `connect` method. Arguments:
|
||||||
- neofs storage node endpoint
|
- frostfs storage node endpoint
|
||||||
- hex encoded private key (empty value produces random key)
|
- hex encoded private key (empty value produces random key)
|
||||||
|
|
||||||
```js
|
```js
|
||||||
import native from 'k6/x/neofs/native';
|
import native from 'k6/x/frostfs/native';
|
||||||
const neofs_cli = native.connect("s01.neofs.devenv:8080", "")
|
const frostfs_cli = native.connect("s01.frostfs.devenv:8080", "")
|
||||||
```
|
```
|
||||||
|
|
||||||
### Methods
|
### Methods
|
||||||
|
@ -62,8 +59,8 @@ const neofs_cli = native.connect("s01.neofs.devenv:8080", "")
|
||||||
boolean flag, `object_id` string, and `error` string.
|
boolean flag, `object_id` string, and `error` string.
|
||||||
- `get(container_id, object_id)`. Returns dictionary with `success` boolean
|
- `get(container_id, object_id)`. Returns dictionary with `success` boolean
|
||||||
flag, and `error` string.
|
flag, and `error` string.
|
||||||
- `onsite(container_id, payload)`. Returns NeoFS object instance with prepared
|
- `onsite(container_id, payload)`. Returns FrostFS object instance with prepared
|
||||||
headers. Invoke `put(headers)` method on this object to upload it into NeoFS.
|
headers. Invoke `put(headers)` method on this object to upload it into FrostFS.
|
||||||
It returns dictionary with `success` boolean flag, `object_id` string and
|
It returns dictionary with `success` boolean flag, `object_id` string and
|
||||||
`error` string.
|
`error` string.
|
||||||
|
|
||||||
|
@ -75,14 +72,14 @@ Create s3 client with `connect` method. Arguments:
|
||||||
Credentials are taken from default AWS configuration files and ENVs.
|
Credentials are taken from default AWS configuration files and ENVs.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
import s3 from 'k6/x/neofs/s3';
|
import s3 from 'k6/x/frostfs/s3';
|
||||||
const s3_cli = s3.connect("http://s3.neofs.devenv:8080")
|
const s3_cli = s3.connect("http://s3.frostfs.devenv:8080")
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also provide additional options:
|
You can also provide additional options:
|
||||||
```js
|
```js
|
||||||
import s3 from 'k6/x/neofs/s3';
|
import s3 from 'k6/x/frostfs/s3';
|
||||||
const s3_cli = s3.connect("http://s3.neofs.devenv:8080", {'no_verify_ssl': 'true', 'timeout': '60s'})
|
const s3_cli = s3.connect("http://s3.frostfs.devenv:8080", {'no_verify_ssl': 'true', 'timeout': '60s'})
|
||||||
```
|
```
|
||||||
|
|
||||||
* `no_verify_ss` - Bool. If `true` - skip verifying the s3 certificate chain and host name (useful if s3 uses self-signed certificates)
|
* `no_verify_ss` - Bool. If `true` - skip verifying the s3 certificate chain and host name (useful if s3 uses self-signed certificates)
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
import {uuidv4} from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
|
import {uuidv4} from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
|
||||||
import {fail} from "k6";
|
import {fail} from "k6";
|
||||||
import native from 'k6/x/neofs/native';
|
import native from 'k6/x/frostfs/native';
|
||||||
|
|
||||||
const payload = open('../go.sum', 'b');
|
const payload = open('../go.sum', 'b');
|
||||||
const neofs_cli = native.connect("s01.neofs.devenv:8080", "1dd37fba80fec4e6a6f13fd708d8dcb3b29def768017052f6c930fa1c5d90bbb")
|
const frostfs_cli = native.connect("s01.frostfs.devenv:8080", "1dd37fba80fec4e6a6f13fd708d8dcb3b29def768017052f6c930fa1c5d90bbb")
|
||||||
|
|
||||||
export const options = {
|
export const options = {
|
||||||
stages: [
|
stages: [
|
||||||
|
@ -19,7 +19,7 @@ export function setup() {
|
||||||
name_global_scope: 'false'
|
name_global_scope: 'false'
|
||||||
}
|
}
|
||||||
|
|
||||||
const res = neofs_cli.putContainer(params)
|
const res = frostfs_cli.putContainer(params)
|
||||||
if (!res.success) {
|
if (!res.success) {
|
||||||
fail(res.error)
|
fail(res.error)
|
||||||
}
|
}
|
||||||
|
@ -31,9 +31,9 @@ export default function (data) {
|
||||||
let headers = {
|
let headers = {
|
||||||
'unique_header': uuidv4()
|
'unique_header': uuidv4()
|
||||||
}
|
}
|
||||||
let resp = neofs_cli.put(data.container_id, headers, payload)
|
let resp = frostfs_cli.put(data.container_id, headers, payload)
|
||||||
if (resp.success) {
|
if (resp.success) {
|
||||||
neofs_cli.get(data.container_id, resp.object_id)
|
frostfs_cli.get(data.container_id, resp.object_id)
|
||||||
} else {
|
} else {
|
||||||
console.log(resp.error)
|
console.log(resp.error)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import { uuidv4 } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
|
import { uuidv4 } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
|
||||||
import native from 'k6/x/neofs/native';
|
import native from 'k6/x/frostfs/native';
|
||||||
|
|
||||||
const payload = open('../go.sum', 'b');
|
const payload = open('../go.sum', 'b');
|
||||||
const container = "AjSxSNNXbJUDPqqKYm1VbFVDGCakbpUNH8aGjPmGAH3B"
|
const container = "AjSxSNNXbJUDPqqKYm1VbFVDGCakbpUNH8aGjPmGAH3B"
|
||||||
const neofs_cli = native.connect("s01.neofs.devenv:8080", "")
|
const frostfs_cli = native.connect("s01.frostfs.devenv:8080", "")
|
||||||
const neofs_obj = neofs_cli.onsite(container, payload)
|
const frostfs_obj = frostfs_cli.onsite(container, payload)
|
||||||
|
|
||||||
export const options = {
|
export const options = {
|
||||||
stages: [
|
stages: [
|
||||||
|
@ -16,9 +16,9 @@ export default function () {
|
||||||
let headers = {
|
let headers = {
|
||||||
'unique_header': uuidv4()
|
'unique_header': uuidv4()
|
||||||
}
|
}
|
||||||
let resp = neofs_obj.put(headers)
|
let resp = frostfs_obj.put(headers)
|
||||||
if (resp.success) {
|
if (resp.success) {
|
||||||
neofs_cli.get(container, resp.object_id)
|
frostfs_cli.get(container, resp.object_id)
|
||||||
} else {
|
} else {
|
||||||
console.log(resp.error)
|
console.log(resp.error)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import {uuidv4} from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
|
import {uuidv4} from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
|
||||||
import {fail} from 'k6'
|
import {fail} from 'k6'
|
||||||
import s3 from 'k6/x/neofs/s3';
|
import s3 from 'k6/x/frostfs/s3';
|
||||||
|
|
||||||
const payload = open('../go.sum', 'b');
|
const payload = open('../go.sum', 'b');
|
||||||
const bucket = "cats"
|
const bucket = "cats"
|
||||||
const s3_cli = s3.connect("https://s3.neofs.devenv:8080", {'no_verify_ssl': 'true'})
|
const s3_cli = s3.connect("https://s3.frostfs.devenv:8080", {'no_verify_ssl': 'true'})
|
||||||
|
|
||||||
export const options = {
|
export const options = {
|
||||||
stages: [
|
stages: [
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package xk6_neofs
|
package xk6_frostfs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "github.com/TrueCloudLab/xk6-frostfs/internal/datagen"
|
_ "github.com/TrueCloudLab/xk6-frostfs/internal/datagen"
|
||||||
|
@ -13,9 +13,9 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
modules.Register("k6/x/neofs", &NeoFS{Version: version})
|
modules.Register("k6/x/frostfs", &FrostFS{Version: version})
|
||||||
}
|
}
|
||||||
|
|
||||||
type NeoFS struct {
|
type FrostFS struct {
|
||||||
Version string
|
Version string
|
||||||
}
|
}
|
|
@ -5,7 +5,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// RootModule is the global module object type. It is instantiated once per test
|
// RootModule is the global module object type. It is instantiated once per test
|
||||||
// run and will be used to create k6/x/neofs/registry module instances for each VU.
|
// run and will be used to create k6/x/frostfs/registry module instances for each VU.
|
||||||
type RootModule struct{}
|
type RootModule struct{}
|
||||||
|
|
||||||
// Datagen represents an instance of the module for every VU.
|
// Datagen represents an instance of the module for every VU.
|
||||||
|
@ -20,7 +20,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
modules.Register("k6/x/neofs/datagen", new(RootModule))
|
modules.Register("k6/x/frostfs/datagen", new(RootModule))
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewModuleInstance implements the modules.Module interface and returns
|
// NewModuleInstance implements the modules.Module interface and returns
|
||||||
|
|
|
@ -352,7 +352,7 @@ func (c *Client) Onsite(containerID string, payload goja.ArrayBuffer) PreparedOb
|
||||||
// not sure if load test needs object transformation
|
// not sure if load test needs object transformation
|
||||||
// with parent-child relation; if needs, then replace
|
// with parent-child relation; if needs, then replace
|
||||||
// this code with the usage of object transformer from
|
// this code with the usage of object transformer from
|
||||||
// neofs-loader or distribution.
|
// frostfs-loader or distribution.
|
||||||
msg := fmt.Sprintf("payload size %d is bigger than network limit %d", ln, maxObjectSize)
|
msg := fmt.Sprintf("payload size %d is bigger than network limit %d", ln, maxObjectSize)
|
||||||
panic(msg)
|
panic(msg)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/TrueCloudLab/frostfs-sdk-go/client"
|
"github.com/TrueCloudLab/frostfs-sdk-go/client"
|
||||||
neofsecdsa "github.com/TrueCloudLab/frostfs-sdk-go/crypto/ecdsa"
|
frostfsecdsa "github.com/TrueCloudLab/frostfs-sdk-go/crypto/ecdsa"
|
||||||
"github.com/TrueCloudLab/frostfs-sdk-go/session"
|
"github.com/TrueCloudLab/frostfs-sdk-go/session"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
"github.com/nspcc-dev/neo-go/pkg/crypto/keys"
|
||||||
|
@ -15,7 +15,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// RootModule is the global module object type. It is instantiated once per test
|
// RootModule is the global module object type. It is instantiated once per test
|
||||||
// run and will be used to create k6/x/neofs/native module instances for each VU.
|
// run and will be used to create k6/x/frostfs/native module instances for each VU.
|
||||||
type RootModule struct{}
|
type RootModule struct{}
|
||||||
|
|
||||||
// Native represents an instance of the module for every VU.
|
// Native represents an instance of the module for every VU.
|
||||||
|
@ -35,7 +35,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
modules.Register("k6/x/neofs/native", new(RootModule))
|
modules.Register("k6/x/frostfs/native", new(RootModule))
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewModuleInstance implements the modules.Module interface and returns
|
// NewModuleInstance implements the modules.Module interface and returns
|
||||||
|
@ -97,7 +97,7 @@ func (n *Native) Connect(endpoint, hexPrivateKey string, dialTimeout, streamTime
|
||||||
return nil, fmt.Errorf("session token: %w", err)
|
return nil, fmt.Errorf("session token: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var key neofsecdsa.PublicKey
|
var key frostfsecdsa.PublicKey
|
||||||
err = key.Decode(sessionResp.PublicKey())
|
err = key.Decode(sessionResp.PublicKey())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("invalid public session key: %w", err)
|
return nil, fmt.Errorf("invalid public session key: %w", err)
|
||||||
|
@ -111,21 +111,21 @@ func (n *Native) Connect(endpoint, hexPrivateKey string, dialTimeout, streamTime
|
||||||
|
|
||||||
// register metrics
|
// register metrics
|
||||||
registry := metrics.NewRegistry()
|
registry := metrics.NewRegistry()
|
||||||
objPutTotal, _ = registry.NewMetric("neofs_obj_put_total", metrics.Counter)
|
objPutTotal, _ = registry.NewMetric("frostfs_obj_put_total", metrics.Counter)
|
||||||
objPutFails, _ = registry.NewMetric("neofs_obj_put_fails", metrics.Counter)
|
objPutFails, _ = registry.NewMetric("frostfs_obj_put_fails", metrics.Counter)
|
||||||
objPutDuration, _ = registry.NewMetric("neofs_obj_put_duration", metrics.Trend, metrics.Time)
|
objPutDuration, _ = registry.NewMetric("frostfs_obj_put_duration", metrics.Trend, metrics.Time)
|
||||||
|
|
||||||
objGetTotal, _ = registry.NewMetric("neofs_obj_get_total", metrics.Counter)
|
objGetTotal, _ = registry.NewMetric("frostfs_obj_get_total", metrics.Counter)
|
||||||
objGetFails, _ = registry.NewMetric("neofs_obj_get_fails", metrics.Counter)
|
objGetFails, _ = registry.NewMetric("frostfs_obj_get_fails", metrics.Counter)
|
||||||
objGetDuration, _ = registry.NewMetric("neofs_obj_get_duration", metrics.Trend, metrics.Time)
|
objGetDuration, _ = registry.NewMetric("frostfs_obj_get_duration", metrics.Trend, metrics.Time)
|
||||||
|
|
||||||
objDeleteTotal, _ = registry.NewMetric("neofs_obj_delete_total", metrics.Counter)
|
objDeleteTotal, _ = registry.NewMetric("frostfs_obj_delete_total", metrics.Counter)
|
||||||
objDeleteFails, _ = registry.NewMetric("neofs_obj_delete_fails", metrics.Counter)
|
objDeleteFails, _ = registry.NewMetric("frostfs_obj_delete_fails", metrics.Counter)
|
||||||
objDeleteDuration, _ = registry.NewMetric("neofs_obj_delete_duration", metrics.Trend, metrics.Time)
|
objDeleteDuration, _ = registry.NewMetric("frostfs_obj_delete_duration", metrics.Trend, metrics.Time)
|
||||||
|
|
||||||
cnrPutTotal, _ = registry.NewMetric("neofs_cnr_put_total", metrics.Counter)
|
cnrPutTotal, _ = registry.NewMetric("frostfs_cnr_put_total", metrics.Counter)
|
||||||
cnrPutFails, _ = registry.NewMetric("neofs_cnr_put_fails", metrics.Counter)
|
cnrPutFails, _ = registry.NewMetric("frostfs_cnr_put_fails", metrics.Counter)
|
||||||
cnrPutDuration, _ = registry.NewMetric("neofs_cnr_put_duration", metrics.Trend, metrics.Time)
|
cnrPutDuration, _ = registry.NewMetric("frostfs_cnr_put_duration", metrics.Trend, metrics.Time)
|
||||||
|
|
||||||
return &Client{
|
return &Client{
|
||||||
vu: n.vu,
|
vu: n.vu,
|
||||||
|
|
|
@ -24,7 +24,7 @@ const (
|
||||||
|
|
||||||
const bucketName = "_object"
|
const bucketName = "_object"
|
||||||
|
|
||||||
// ObjectInfo represents information about neoFS object that has been created
|
// ObjectInfo represents information about FrostFS object that has been created
|
||||||
// via gRPC/HTTP/S3 API.
|
// via gRPC/HTTP/S3 API.
|
||||||
type ObjectInfo struct {
|
type ObjectInfo struct {
|
||||||
Id uint64 // Identifier in bolt DB
|
Id uint64 // Identifier in bolt DB
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// RootModule is the global module object type. It is instantiated once per test
|
// RootModule is the global module object type. It is instantiated once per test
|
||||||
// run and will be used to create k6/x/neofs/registry module instances for each VU.
|
// run and will be used to create k6/x/frostfs/registry module instances for each VU.
|
||||||
type RootModule struct {
|
type RootModule struct {
|
||||||
// Stores object registry by path of database file. We should have only single instance
|
// Stores object registry by path of database file. We should have only single instance
|
||||||
// of registry per each file
|
// of registry per each file
|
||||||
|
@ -38,7 +38,7 @@ func init() {
|
||||||
registries: make(map[string]*ObjRegistry),
|
registries: make(map[string]*ObjRegistry),
|
||||||
selectors: make(map[string]*ObjSelector),
|
selectors: make(map[string]*ObjSelector),
|
||||||
}
|
}
|
||||||
modules.Register("k6/x/neofs/registry", rootModule)
|
modules.Register("k6/x/frostfs/registry", rootModule)
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewModuleInstance implements the modules.Module interface and returns
|
// NewModuleInstance implements the modules.Module interface and returns
|
||||||
|
|
|
@ -15,7 +15,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// RootModule is the global module object type. It is instantiated once per test
|
// RootModule is the global module object type. It is instantiated once per test
|
||||||
// run and will be used to create k6/x/neofs/s3 module instances for each VU.
|
// run and will be used to create k6/x/frostfs/s3 module instances for each VU.
|
||||||
type RootModule struct{}
|
type RootModule struct{}
|
||||||
|
|
||||||
// S3 represents an instance of the module for every VU.
|
// S3 represents an instance of the module for every VU.
|
||||||
|
@ -35,7 +35,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
modules.Register("k6/x/neofs/s3", new(RootModule))
|
modules.Register("k6/x/frostfs/s3", new(RootModule))
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewModuleInstance implements the modules.Module interface and returns
|
// NewModuleInstance implements the modules.Module interface and returns
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import datagen from 'k6/x/neofs/datagen';
|
import datagen from 'k6/x/frostfs/datagen';
|
||||||
import native from 'k6/x/neofs/native';
|
import native from 'k6/x/frostfs/native';
|
||||||
import registry from 'k6/x/neofs/registry';
|
import registry from 'k6/x/frostfs/registry';
|
||||||
import { SharedArray } from 'k6/data';
|
import { SharedArray } from 'k6/data';
|
||||||
import { sleep } from 'k6';
|
import { sleep } from 'k6';
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import datagen from 'k6/x/neofs/datagen';
|
import datagen from 'k6/x/frostfs/datagen';
|
||||||
import registry from 'k6/x/neofs/registry';
|
import registry from 'k6/x/frostfs/registry';
|
||||||
import http from 'k6/http';
|
import http from 'k6/http';
|
||||||
import { SharedArray } from 'k6/data';
|
import { SharedArray } from 'k6/data';
|
||||||
import { sleep } from 'k6';
|
import { sleep } from 'k6';
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
import argparse
|
import argparse
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from helpers.neofs_cli import get_object
|
from helpers.frostfs_cli import get_object
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument('--endpoint', help='Node address')
|
parser.add_argument('--endpoint', help='Node address')
|
||||||
|
|
|
@ -8,7 +8,7 @@ from collections import Counter
|
||||||
from concurrent.futures import ProcessPoolExecutor
|
from concurrent.futures import ProcessPoolExecutor
|
||||||
|
|
||||||
from helpers.cmd import ProgressBar
|
from helpers.cmd import ProgressBar
|
||||||
from helpers.neofs_cli import search_object_by_id
|
from helpers.frostfs_cli import search_object_by_id
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument('--endpoints', help='Node address')
|
parser.add_argument('--endpoints', help='Node address')
|
||||||
|
|
|
@ -4,7 +4,7 @@ from helpers.cmd import execute_cmd
|
||||||
|
|
||||||
|
|
||||||
def create_container(endpoint, policy, wallet_file, wallet_config):
|
def create_container(endpoint, policy, wallet_file, wallet_config):
|
||||||
cmd_line = f"neofs-cli --rpc-endpoint {endpoint} container create --wallet {wallet_file} --config {wallet_config} " \
|
cmd_line = f"frostfs-cli --rpc-endpoint {endpoint} container create --wallet {wallet_file} --config {wallet_config} " \
|
||||||
f" --policy '{policy}' --basic-acl public-read-write --await"
|
f" --policy '{policy}' --basic-acl public-read-write --await"
|
||||||
|
|
||||||
output, success = execute_cmd(cmd_line)
|
output, success = execute_cmd(cmd_line)
|
||||||
|
@ -29,7 +29,7 @@ def create_container(endpoint, policy, wallet_file, wallet_config):
|
||||||
|
|
||||||
def upload_object(container, payload_filepath, endpoint, wallet_file, wallet_config):
|
def upload_object(container, payload_filepath, endpoint, wallet_file, wallet_config):
|
||||||
object_name = ""
|
object_name = ""
|
||||||
cmd_line = f"neofs-cli --rpc-endpoint {endpoint} object put --file {payload_filepath} --wallet {wallet_file} --config {wallet_config} " \
|
cmd_line = f"frostfs-cli --rpc-endpoint {endpoint} object put --file {payload_filepath} --wallet {wallet_file} --config {wallet_config} " \
|
||||||
f"--cid {container} --no-progress"
|
f"--cid {container} --no-progress"
|
||||||
output, success = execute_cmd(cmd_line)
|
output, success = execute_cmd(cmd_line)
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ def upload_object(container, payload_filepath, endpoint, wallet_file, wallet_con
|
||||||
|
|
||||||
|
|
||||||
def get_object(cid, oid, endpoint, out_filepath, wallet_file, wallet_config):
|
def get_object(cid, oid, endpoint, out_filepath, wallet_file, wallet_config):
|
||||||
cmd_line = f"neofs-cli object get -r {endpoint} --cid {cid} --oid {oid} --wallet {wallet_file} --config {wallet_config} " \
|
cmd_line = f"frostfs-cli object get -r {endpoint} --cid {cid} --oid {oid} --wallet {wallet_file} --config {wallet_config} " \
|
||||||
f"--file {out_filepath}"
|
f"--file {out_filepath}"
|
||||||
|
|
||||||
output, success = execute_cmd(cmd_line)
|
output, success = execute_cmd(cmd_line)
|
||||||
|
@ -64,7 +64,7 @@ def get_object(cid, oid, endpoint, out_filepath, wallet_file, wallet_config):
|
||||||
|
|
||||||
|
|
||||||
def search_object_by_id(cid, oid, endpoint, wallet_file, wallet_config, ttl=2):
|
def search_object_by_id(cid, oid, endpoint, wallet_file, wallet_config, ttl=2):
|
||||||
cmd_line = f"neofs-cli object search --ttl {ttl} -r {endpoint} --cid {cid} --oid {oid} --wallet {wallet_file} --config {wallet_config} "
|
cmd_line = f"frostfs-cli object search --ttl {ttl} -r {endpoint} --cid {cid} --oid {oid} --wallet {wallet_file} --config {wallet_config} "
|
||||||
|
|
||||||
output, success = execute_cmd(cmd_line)
|
output, success = execute_cmd(cmd_line)
|
||||||
|
|
|
@ -8,7 +8,7 @@ from argparse import Namespace
|
||||||
from concurrent.futures import ProcessPoolExecutor
|
from concurrent.futures import ProcessPoolExecutor
|
||||||
|
|
||||||
from helpers.cmd import random_payload
|
from helpers.cmd import random_payload
|
||||||
from helpers.neofs_cli import create_container, upload_object
|
from helpers.frostfs_cli import create_container, upload_object
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument('--size', help='Upload objects size in kb')
|
parser.add_argument('--size', help='Upload objects size in kb')
|
||||||
|
|
|
@ -35,7 +35,7 @@ $ ./k6 run -e DURATION=60 -e WRITE_OBJ_SIZE=8192 -e READERS=20 -e WRITERS=20 -e
|
||||||
```
|
```
|
||||||
|
|
||||||
Options (in addition to the common options):
|
Options (in addition to the common options):
|
||||||
* `GRPC_ENDPOINTS` - GRPC endpoints of neoFS in format `host:port`. To specify multiple endpoints separate them by comma.
|
* `GRPC_ENDPOINTS` - GRPC endpoints of FrostFS storage in format `host:port`. To specify multiple endpoints separate them by comma.
|
||||||
* `DELETERS` - number of VUs performing delete operations (using deleters requires that options `DELETE_AGE` and `REGISTRY_FILE` are specified as well).
|
* `DELETERS` - number of VUs performing delete operations (using deleters requires that options `DELETE_AGE` and `REGISTRY_FILE` are specified as well).
|
||||||
* `DELETE_AGE` - age of object in seconds before which it can not be deleted. This parameter can be used to control how many objects we have in the system under load.
|
* `DELETE_AGE` - age of object in seconds before which it can not be deleted. This parameter can be used to control how many objects we have in the system under load.
|
||||||
* `SLEEP_DELETE` - time interval (in seconds) between deleting VU iterations.
|
* `SLEEP_DELETE` - time interval (in seconds) between deleting VU iterations.
|
||||||
|
@ -63,7 +63,7 @@ Options (in addition to the common options):
|
||||||
1. Create s3 credentials:
|
1. Create s3 credentials:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
$ neofs-s3-authmate issue-secret --wallet wallet.json --peer host1:8080 --gate-public-key 03d33a2cc7b8daaa5a3df3fccf065f7cf1fc6a3279efc161fcec512dcc0c1b2277 --gate-public-key 03ff0ad212e10683234442530bfd71d0bb18c3fbd6459aba768eacf158b0c359a2 --gate-public-key 033ae03ff30ed3b6665af69955562cfc0eae18d50e798ab31f054ee22e32fee993 --gate-public-key 02127c7498de0765d2461577c9d4f13f916eefd1884896183e6de0d9a85d17f2fb --bearer-rules rules.json --container-placement-policy "REP 1 IN X CBF 1 SELECT 1 FROM * AS X" --container-policy ./scenarios/files/policy.json
|
$ frostfs-s3-authmate issue-secret --wallet wallet.json --peer host1:8080 --gate-public-key 03d33a2cc7b8daaa5a3df3fccf065f7cf1fc6a3279efc161fcec512dcc0c1b2277 --gate-public-key 03ff0ad212e10683234442530bfd71d0bb18c3fbd6459aba768eacf158b0c359a2 --gate-public-key 033ae03ff30ed3b6665af69955562cfc0eae18d50e798ab31f054ee22e32fee993 --gate-public-key 02127c7498de0765d2461577c9d4f13f916eefd1884896183e6de0d9a85d17f2fb --bearer-rules rules.json --container-placement-policy "REP 1 IN X CBF 1 SELECT 1 FROM * AS X" --container-policy ./scenarios/files/policy.json
|
||||||
|
|
||||||
Enter password for wallet.json >
|
Enter password for wallet.json >
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import datagen from 'k6/x/neofs/datagen';
|
import datagen from 'k6/x/frostfs/datagen';
|
||||||
import registry from 'k6/x/neofs/registry';
|
import registry from 'k6/x/frostfs/registry';
|
||||||
import s3 from 'k6/x/neofs/s3';
|
import s3 from 'k6/x/frostfs/s3';
|
||||||
import { SharedArray } from 'k6/data';
|
import { SharedArray } from 'k6/data';
|
||||||
import { sleep } from 'k6';
|
import { sleep } from 'k6';
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import native from 'k6/x/neofs/native';
|
import native from 'k6/x/frostfs/native';
|
||||||
import registry from 'k6/x/neofs/registry';
|
import registry from 'k6/x/frostfs/registry';
|
||||||
import s3 from 'k6/x/neofs/s3';
|
import s3 from 'k6/x/frostfs/s3';
|
||||||
import { sleep } from 'k6';
|
import { sleep } from 'k6';
|
||||||
import { Counter } from 'k6/metrics';
|
import { Counter } from 'k6/metrics';
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue