forked from TrueCloudLab/xk6-frostfs
[#11] Add bucket creation
Signed-off-by: Denis Kirillov <denis@nspcc.ru>
This commit is contained in:
parent
32916a2b25
commit
5671b5c73f
5 changed files with 70 additions and 7 deletions
|
@ -76,6 +76,8 @@ const s3_cli = s3.connect("http://s3.neofs.devenv:8080")
|
||||||
```
|
```
|
||||||
|
|
||||||
### Methods
|
### Methods
|
||||||
|
- `createBucket(bucket, params)`. Returns dictionary with `success` boolean flag
|
||||||
|
and `error` string. The `params` is a dictionary (e.g. `{acl:'private',lock_enabled:'true',location_constraint:'ru'}`)
|
||||||
- `put(bucket, key, payload)`. Returns dictionary with `success` boolean flag
|
- `put(bucket, key, payload)`. Returns dictionary with `success` boolean flag
|
||||||
and `error` string.
|
and `error` string.
|
||||||
- `get(bucket, key)`. Returns dictionary with `success` boolean flag and `error`
|
- `get(bucket, key)`. Returns dictionary with `success` boolean flag and `error`
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
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 s3 from 'k6/x/neofs/s3';
|
import s3 from 'k6/x/neofs/s3';
|
||||||
|
|
||||||
const payload = open('../go.sum', 'b');
|
const payload = open('../go.sum', 'b');
|
||||||
|
@ -7,13 +8,26 @@ const s3_cli = s3.connect("http://s3.neofs.devenv:8080")
|
||||||
|
|
||||||
export const options = {
|
export const options = {
|
||||||
stages: [
|
stages: [
|
||||||
{ duration: '30s', target: 10 },
|
{duration: '30s', target: 10},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export function setup() {
|
||||||
|
const params = {
|
||||||
|
acl: 'private',
|
||||||
|
lock_enabled: 'true',
|
||||||
|
location_constraint: 'ru'
|
||||||
|
}
|
||||||
|
|
||||||
|
const res = s3_cli.createBucket(bucket, params)
|
||||||
|
if (!res.success) {
|
||||||
|
fail(res.error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export default function () {
|
export default function () {
|
||||||
const key = uuidv4();
|
const key = uuidv4();
|
||||||
if (s3_cli.put(bucket, key, payload).success) {
|
if (s3_cli.put(bucket, key, payload).success) {
|
||||||
s3_cli.get(bucket, key )
|
s3_cli.get(bucket, key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
4
go.mod
4
go.mod
|
@ -6,9 +6,11 @@ require (
|
||||||
github.com/aws/aws-sdk-go-v2 v1.16.3
|
github.com/aws/aws-sdk-go-v2 v1.16.3
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.15.5
|
github.com/aws/aws-sdk-go-v2/config v1.15.5
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.26.9
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.26.9
|
||||||
|
github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf
|
||||||
github.com/google/uuid v1.2.0
|
github.com/google/uuid v1.2.0
|
||||||
github.com/nspcc-dev/neo-go v0.98.2
|
github.com/nspcc-dev/neo-go v0.98.2
|
||||||
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.3.0.20220504192402-12ea1e8d740f
|
github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.3.0.20220504192402-12ea1e8d740f
|
||||||
|
github.com/nspcc-dev/tzhash v1.5.2
|
||||||
go.k6.io/k6 v0.38.2
|
go.k6.io/k6 v0.38.2
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -29,7 +31,6 @@ require (
|
||||||
github.com/aws/smithy-go v1.11.2 // indirect
|
github.com/aws/smithy-go v1.11.2 // indirect
|
||||||
github.com/btcsuite/btcd v0.22.0-beta // indirect
|
github.com/btcsuite/btcd v0.22.0-beta // indirect
|
||||||
github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 // indirect
|
github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91 // indirect
|
||||||
github.com/dop251/goja v0.0.0-20220405120441-9037c2b61cbf // indirect
|
|
||||||
github.com/fatih/color v1.13.0 // indirect
|
github.com/fatih/color v1.13.0 // indirect
|
||||||
github.com/go-sourcemap/sourcemap v2.1.4-0.20211119122758-180fcef48034+incompatible // indirect
|
github.com/go-sourcemap/sourcemap v2.1.4-0.20211119122758-180fcef48034+incompatible // indirect
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
|
@ -42,7 +43,6 @@ require (
|
||||||
github.com/nspcc-dev/neofs-api-go/v2 v2.12.1 // indirect
|
github.com/nspcc-dev/neofs-api-go/v2 v2.12.1 // indirect
|
||||||
github.com/nspcc-dev/neofs-crypto v0.3.0 // indirect
|
github.com/nspcc-dev/neofs-crypto v0.3.0 // indirect
|
||||||
github.com/nspcc-dev/rfc6979 v0.2.0 // indirect
|
github.com/nspcc-dev/rfc6979 v0.2.0 // indirect
|
||||||
github.com/nspcc-dev/tzhash v1.5.2 // indirect
|
|
||||||
github.com/nxadm/tail v1.4.8 // indirect
|
github.com/nxadm/tail v1.4.8 // indirect
|
||||||
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect
|
github.com/oxtoacart/bpool v0.0.0-20190530202638-03653db5a59c // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
|
|
@ -3,10 +3,12 @@ package s3
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go-v2/aws"
|
"github.com/aws/aws-sdk-go-v2/aws"
|
||||||
"github.com/aws/aws-sdk-go-v2/service/s3"
|
"github.com/aws/aws-sdk-go-v2/service/s3"
|
||||||
|
"github.com/aws/aws-sdk-go-v2/service/s3/types"
|
||||||
"github.com/dop251/goja"
|
"github.com/dop251/goja"
|
||||||
"github.com/nspcc-dev/xk6-neofs/internal/stats"
|
"github.com/nspcc-dev/xk6-neofs/internal/stats"
|
||||||
"go.k6.io/k6/js/modules"
|
"go.k6.io/k6/js/modules"
|
||||||
|
@ -28,6 +30,11 @@ type (
|
||||||
Success bool
|
Success bool
|
||||||
Error string
|
Error string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CreateBucketResponse struct {
|
||||||
|
Success bool
|
||||||
|
Error string
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *Client) Put(bucket, key string, payload goja.ArrayBuffer) PutResponse {
|
func (c *Client) Put(bucket, key string, payload goja.ArrayBuffer) PutResponse {
|
||||||
|
@ -80,3 +87,38 @@ func (c *Client) Get(bucket, key string) GetResponse {
|
||||||
stats.ReportDataReceived(c.vu, float64(sz))
|
stats.ReportDataReceived(c.vu, float64(sz))
|
||||||
return GetResponse{Success: true}
|
return GetResponse{Success: true}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Client) CreateBucket(bucket string, params map[string]string) CreateBucketResponse {
|
||||||
|
stats.Report(c.vu, createBucketTotal, 1)
|
||||||
|
|
||||||
|
var err error
|
||||||
|
var lockEnabled bool
|
||||||
|
if lockEnabledStr, ok := params["lock_enabled"]; ok {
|
||||||
|
if lockEnabled, err = strconv.ParseBool(lockEnabledStr); err != nil {
|
||||||
|
stats.Report(c.vu, createBucketFails, 1)
|
||||||
|
return CreateBucketResponse{Success: false, Error: "invalid lock_enabled params"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var bucketConfiguration *types.CreateBucketConfiguration
|
||||||
|
if locationConstraint, ok := params["location_constraint"]; ok {
|
||||||
|
bucketConfiguration = &types.CreateBucketConfiguration{
|
||||||
|
LocationConstraint: types.BucketLocationConstraint(locationConstraint),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
start := time.Now()
|
||||||
|
_, err = c.cli.CreateBucket(c.vu.Context(), &s3.CreateBucketInput{
|
||||||
|
Bucket: aws.String(bucket),
|
||||||
|
ACL: types.BucketCannedACL(params["acl"]),
|
||||||
|
CreateBucketConfiguration: bucketConfiguration,
|
||||||
|
ObjectLockEnabledForBucket: lockEnabled,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
stats.Report(c.vu, createBucketFails, 1)
|
||||||
|
return CreateBucketResponse{Success: false, Error: err.Error()}
|
||||||
|
}
|
||||||
|
|
||||||
|
stats.Report(c.vu, createBucketDuration, metrics.D(time.Since(start)))
|
||||||
|
return CreateBucketResponse{Success: true}
|
||||||
|
}
|
||||||
|
|
|
@ -24,8 +24,9 @@ var (
|
||||||
_ modules.Instance = &S3{}
|
_ modules.Instance = &S3{}
|
||||||
_ modules.Module = &RootModule{}
|
_ modules.Module = &RootModule{}
|
||||||
|
|
||||||
objPutTotal, objPutFails, objPutDuration *metrics.Metric
|
objPutTotal, objPutFails, objPutDuration *metrics.Metric
|
||||||
objGetTotal, objGetFails, objGetDuration *metrics.Metric
|
objGetTotal, objGetFails, objGetDuration *metrics.Metric
|
||||||
|
createBucketTotal, createBucketFails, createBucketDuration *metrics.Metric
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -75,6 +76,10 @@ func (s *S3) Connect(endpoint string) (*Client, error) {
|
||||||
objGetFails, _ = registry.NewMetric("aws_obj_get_fails", metrics.Counter)
|
objGetFails, _ = registry.NewMetric("aws_obj_get_fails", metrics.Counter)
|
||||||
objGetDuration, _ = registry.NewMetric("aws_obj_get_duration", metrics.Trend, metrics.Time)
|
objGetDuration, _ = registry.NewMetric("aws_obj_get_duration", metrics.Trend, metrics.Time)
|
||||||
|
|
||||||
|
createBucketTotal, _ = registry.NewMetric("aws_create_bucket_total", metrics.Counter)
|
||||||
|
createBucketFails, _ = registry.NewMetric("aws_create_bucket_fails", metrics.Counter)
|
||||||
|
createBucketDuration, _ = registry.NewMetric("aws_create_bucket_duration", metrics.Trend, metrics.Time)
|
||||||
|
|
||||||
return &Client{
|
return &Client{
|
||||||
vu: s.vu,
|
vu: s.vu,
|
||||||
cli: cli,
|
cli: cli,
|
||||||
|
|
Loading…
Reference in a new issue