[#11] Support reading env variables from file
Signed-off-by: Denis Kirillov <d.kirillov@yadro.com>
This commit is contained in:
parent
c5a250618c
commit
ed58333aba
10 changed files with 82 additions and 0 deletions
|
@ -2,6 +2,7 @@ package xk6_frostfs
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "git.frostfs.info/TrueCloudLab/xk6-frostfs/internal/datagen"
|
_ "git.frostfs.info/TrueCloudLab/xk6-frostfs/internal/datagen"
|
||||||
|
_ "git.frostfs.info/TrueCloudLab/xk6-frostfs/internal/env"
|
||||||
_ "git.frostfs.info/TrueCloudLab/xk6-frostfs/internal/logging"
|
_ "git.frostfs.info/TrueCloudLab/xk6-frostfs/internal/logging"
|
||||||
_ "git.frostfs.info/TrueCloudLab/xk6-frostfs/internal/native"
|
_ "git.frostfs.info/TrueCloudLab/xk6-frostfs/internal/native"
|
||||||
_ "git.frostfs.info/TrueCloudLab/xk6-frostfs/internal/registry"
|
_ "git.frostfs.info/TrueCloudLab/xk6-frostfs/internal/registry"
|
||||||
|
|
1
go.mod
1
go.mod
|
@ -10,6 +10,7 @@ require (
|
||||||
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/dop251/goja v0.0.0-20220405120441-9037c2b61cbf
|
||||||
github.com/google/uuid v1.3.0
|
github.com/google/uuid v1.3.0
|
||||||
|
github.com/joho/godotenv v1.5.1
|
||||||
github.com/nspcc-dev/neo-go v0.100.1
|
github.com/nspcc-dev/neo-go v0.100.1
|
||||||
github.com/sirupsen/logrus v1.8.1
|
github.com/sirupsen/logrus v1.8.1
|
||||||
github.com/stretchr/testify v1.8.1
|
github.com/stretchr/testify v1.8.1
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -281,6 +281,8 @@ github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuT
|
||||||
github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI=
|
github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI=
|
||||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
|
||||||
|
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
|
||||||
|
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
|
||||||
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
|
||||||
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
|
||||||
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
|
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
|
||||||
|
|
50
internal/env/parser.go
vendored
Normal file
50
internal/env/parser.go
vendored
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
package env
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/joho/godotenv"
|
||||||
|
"go.k6.io/k6/js/modules"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RootModule is the global module object type. It is instantiated once per test
|
||||||
|
// run and will be used to create k6/x/frostfs/registry module instances for each VU.
|
||||||
|
type RootModule struct{}
|
||||||
|
|
||||||
|
// Parser represents an instance of the module for every VU.
|
||||||
|
type Parser struct {
|
||||||
|
vu modules.VU
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the interfaces are implemented correctly.
|
||||||
|
var (
|
||||||
|
_ modules.Instance = &Parser{}
|
||||||
|
_ modules.Module = &RootModule{}
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
modules.Register("k6/x/frostfs/env", new(RootModule))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewModuleInstance implements the modules.Module interface and returns
|
||||||
|
// a new instance for each VU.
|
||||||
|
func (r *RootModule) NewModuleInstance(vu modules.VU) modules.Instance {
|
||||||
|
mi := &Parser{vu: vu}
|
||||||
|
return mi
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exports implements the modules.Instance interface and returns the exports
|
||||||
|
// of the JS module.
|
||||||
|
func (p *Parser) Exports() modules.Exports {
|
||||||
|
return modules.Exports{Default: p}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Parser) Parse(fileName string) (map[string]string, error) {
|
||||||
|
f, err := os.Open(fileName)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
return godotenv.Parse(f)
|
||||||
|
}
|
|
@ -5,6 +5,9 @@ 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';
|
||||||
import { textSummary } from './libs/k6-summary-0.0.2.js';
|
import { textSummary } from './libs/k6-summary-0.0.2.js';
|
||||||
|
import { parseEnv } from './libs/env-parser.js';
|
||||||
|
|
||||||
|
parseEnv();
|
||||||
|
|
||||||
const obj_list = new SharedArray('obj_list', function () {
|
const obj_list = new SharedArray('obj_list', function () {
|
||||||
return JSON.parse(open(__ENV.PREGEN_JSON)).objects;
|
return JSON.parse(open(__ENV.PREGEN_JSON)).objects;
|
||||||
|
|
|
@ -5,6 +5,9 @@ import http from 'k6/http';
|
||||||
import { SharedArray } from 'k6/data';
|
import { SharedArray } from 'k6/data';
|
||||||
import { sleep } from 'k6';
|
import { sleep } from 'k6';
|
||||||
import { textSummary } from './libs/k6-summary-0.0.2.js';
|
import { textSummary } from './libs/k6-summary-0.0.2.js';
|
||||||
|
import { parseEnv } from './libs/env-parser.js';
|
||||||
|
|
||||||
|
parseEnv();
|
||||||
|
|
||||||
const obj_list = new SharedArray('obj_list', function () {
|
const obj_list = new SharedArray('obj_list', function () {
|
||||||
return JSON.parse(open(__ENV.PREGEN_JSON)).objects;
|
return JSON.parse(open(__ENV.PREGEN_JSON)).objects;
|
||||||
|
|
10
scenarios/libs/env-parser.js
Normal file
10
scenarios/libs/env-parser.js
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
import env from 'k6/x/frostfs/env';
|
||||||
|
|
||||||
|
export function parseEnv() {
|
||||||
|
if (__ENV.ENV_FILE) {
|
||||||
|
const parsedVars = env.parse(__ENV.ENV_FILE)
|
||||||
|
for (const prop in parsedVars) {
|
||||||
|
__ENV[prop] = __ENV[prop] || parsedVars[prop];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,12 @@
|
||||||
|
|
||||||
# How to execute scenarios
|
# How to execute scenarios
|
||||||
|
|
||||||
|
**Note:** you can provide file with all environment variables (system env variables overrides env from file) using
|
||||||
|
`-e ENV_FILE=.env` (relative path to that file must start from working directory):
|
||||||
|
```shell
|
||||||
|
$ ./k6 run -e ENV_FILE=.env some-scenario.js
|
||||||
|
```
|
||||||
|
|
||||||
## Common options for gRPC, HTTP, S3 scenarios:
|
## Common options for gRPC, HTTP, S3 scenarios:
|
||||||
|
|
||||||
Scenarios `grpc.js`, `http.js` and `s3.js` support the following options:
|
Scenarios `grpc.js`, `http.js` and `s3.js` support the following options:
|
||||||
|
|
|
@ -5,6 +5,9 @@ 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';
|
||||||
import { textSummary } from './libs/k6-summary-0.0.2.js';
|
import { textSummary } from './libs/k6-summary-0.0.2.js';
|
||||||
|
import { parseEnv } from './libs/env-parser.js';
|
||||||
|
|
||||||
|
parseEnv();
|
||||||
|
|
||||||
const obj_list = new SharedArray('obj_list', function () {
|
const obj_list = new SharedArray('obj_list', function () {
|
||||||
return JSON.parse(open(__ENV.PREGEN_JSON)).objects;
|
return JSON.parse(open(__ENV.PREGEN_JSON)).objects;
|
||||||
|
|
|
@ -4,6 +4,9 @@ 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';
|
||||||
import { textSummary } from './libs/k6-summary-0.0.2.js';
|
import { textSummary } from './libs/k6-summary-0.0.2.js';
|
||||||
|
import { parseEnv } from './libs/env-parser.js';
|
||||||
|
|
||||||
|
parseEnv();
|
||||||
|
|
||||||
const obj_registry = registry.open(__ENV.REGISTRY_FILE);
|
const obj_registry = registry.open(__ENV.REGISTRY_FILE);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue