feat: traffic gen (#21)

* feat: generate random bytes and push to the binded nodes

* fix: npm reinstall

* fix: version dumps in package.json

* ci: bump version number of node

* feat: payment-tolerance

* refactor: gen 400 chunks with the trafficgen command

* feat: parametric traffic generation

* docs: amend beeShPorts description

* docs: readme

* fix: payment tolerance default value in bee.sh

* refactor: only beeApiUrl argument on script call

* docs: traffic gen readme adjustment

* refactor: instead of payment tolerance use payment threshold

* refactor: sleep ms raise and take out unnecessary axios call

* chore: await for upload, the script no longer overloads bee nodes with data (#27)

Co-authored-by: Vojtech Simetka <vojtech@simetka.cz>
This commit is contained in:
nugaon 2021-05-17 11:03:36 +02:00 committed by GitHub
parent 05dc7b511b
commit e61f2cb8a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 20418 additions and 3272 deletions

View File

@ -29,7 +29,7 @@ jobs:
steps:
- uses: actions/setup-node@v1
with:
node-version: 12
node-version: 15
registry-url: 'https://registry.npmjs.org'
- name: Checkout
uses: actions/checkout@v2

View File

@ -78,3 +78,29 @@ start the Bee cluster
```sh
./scripts/environment.sh start
```
## Utilities
It is possible to generate random traffic in your cluster:
```sh
$ npm run gen:traffic
```
The script is in an infinite loop, so if you want to stop the generation you have to terminate it manually in your terminal by pressing `Ctrl^C`.
If you don't specify any parameters it will produce 400 chunks/0.5 sec that the script tries to upload on the `http://localhost:1633` - that is the binded port of the queen node if you orchestrated the environment with the `envrionment.sh`.
The following way you can pass parameter
1. BEE_API_URL - Host that has reachable port to the Bee API. [Array<string>,Default:['http://localhost:1633']]
```sh
$ npm run gen:traffic -- <BEE_API_URL> <BEE_API_URL> <BEE_API_URL> (...)
```
e.g.
```sh
$ npm run gen:traffic -- http://localhost:1633 http://localhost:11633
```

23570
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -8,11 +8,14 @@
"supply": "truffle exec src/supply.js",
"build:env": "./scripts/build-environment.sh",
"publish:env": "./scripts/publish-environment.sh",
"run:env": "./scripts/environment.sh"
"run:env": "./scripts/environment.sh",
"gen:traffic": "node ./scripts/gen-traffic.js"
},
"dependencies": {
"@ethersphere/bee-js": "^0.8.1",
"@openzeppelin/contracts": "^3.1.0",
"truffle": "^5.3.1"
"axios": "^0.20.0",
"truffle": "^5.3.5"
},
"keywords": [
"swarm",

View File

@ -21,6 +21,7 @@ PARAMETERS:
--own-image If passed, the used Docker image names will be identical as the name of the workers.
--version=x.y.z used version of Bee client.
--detach It will not log the output of Queen node at the end of the process.
--payment-threshold The threshold in BZZ where you expect to get paid from your peers. (without decimals, default: 10000000000000)
USAGE
exit 1
}
@ -106,6 +107,7 @@ PORT_MAPS=2
SWAP=true
SWAP_FACTORY_ADDRESS="0x5b1869D9A4C187F2EAa108f3062412ecf0526b24"
INIT_ROOT_DATA_DIR="$MY_PATH/bee-data-dirs"
PAYMENT_THRESHOLD="10000000000000"
# Decide script action
case "$1" in
@ -145,6 +147,10 @@ do
PORT_MAPS="${1#*=}"
shift 1
;;
--payment-treshold=*)
PAYMENT_THRESHOLD="${1#*=}"
shift 1
;;
--own-image)
OWN_IMAGE=true
shift 1
@ -197,6 +203,7 @@ if [ -z "$QUEEN_CONTAINER_IN_DOCKER" ] || $EPHEMERAL ; then
--swap-enable=$SWAP \
--swap-endpoint="http://$SWARM_BLOCKCHAIN_NAME:9545" \
--swap-factory-address=$SWAP_FACTORY_ADDRESS \
--payment-threshold="$PAYMENT_THRESHOLD" \
--welcome-message="You have found the queen of the beehive..." \
--cors-allowed-origins="*"
else
@ -241,6 +248,7 @@ for i in $(seq 1 1 "$WORKERS"); do
--swap-enable=$SWAP \
--swap-endpoint="http://$SWARM_BLOCKCHAIN_NAME:9545" \
--swap-factory-address=$SWAP_FACTORY_ADDRESS \
--payment-threshold="$PAYMENT_THRESHOLD" \
--welcome-message="I'm just Bee worker ${i} in the beehive." \
--cors-allowed-origins="*"
else

View File

@ -10,6 +10,7 @@ PARAMETERS:
--ephemeral create ephemeral container for bee-client. Data won't be persisted.
--workers=number all Bee nodes in the test environment. Default is 4.
--detach It will not log the output of Queen node at the end of the process.
--payment-treshold excess debt above payment threshold in BZZ where you disconnect from your peer (without decimals, default: 2000000000)
USAGE
exit 1
}
@ -38,6 +39,7 @@ WORKERS=4
LOG=true
SWARM_BLOCKCHAIN_NAME="$BEE_ENV_PREFIX-blockchain"
SWARM_NETWORK="$BEE_ENV_PREFIX-network"
PAYMENT_THRESHOLD="2000000000"
# Decide script action
case "$1" in
@ -66,6 +68,10 @@ do
WORKERS=${1#*=}
shift 1
;;
--payment-treshold=*)
PAYMENT_THRESHOLD=${1#*=}
shift 1
;;
--detach)
LOG=false
shift 1
@ -100,7 +106,7 @@ fi
sleep 5
# Build up bee.sh parameters
BEE_SH_ARGUMENTS="--workers=$WORKERS --own-image"
BEE_SH_ARGUMENTS="--workers=$WORKERS --own-image --payment-treshold=$PAYMENT_THRESHOLD"
if $EPHEMERAL ; then
BEE_SH_ARGUMENTS="$BEE_SH_ARGUMENTS --ephemeral"
fi

69
scripts/gen-traffic.js Normal file
View File

@ -0,0 +1,69 @@
const axios = require('axios').default;
const Bee = require('@ethersphere/bee-js').Bee;
const SLEEP_BETWEEN_UPLOADS_MS = 1000
/**
* Lehmer random number generator with seed (minstd_rand in C++11)
* !!! Very fast but not well distributed pseudo-random function !!!
*
* @param seed Seed for the pseudo-random generator
*/
function lrng(seed) {
return () => ((2 ** 31 - 1) & (seed = Math.imul(48271, seed))) / 2 ** 31
}
/**
* Utility function for generating random Buffer
* !!! IT IS NOT CRYPTO SAFE !!!
* For that use `crypto.randomBytes()`
*
* @param length Number of bytes to generate
* @param seed Seed for the pseudo-random generator
*/
function randomByteArray(length, seed = 500) {
const rand = lrng(seed)
const buf = new Uint8Array(length)
for (let i = 0; i < length; ++i) {
buf[i] = (rand() * 0xff) << 0
}
return buf
}
async function trafficGen(host = 'http://localhost:1633', seed = 500, bytes = 1024 * 4 * 400) {
const randomBytes = randomByteArray(bytes, seed)
const bee = new Bee(host)
const ref = await bee.uploadData(randomBytes)
console.log(`Generated ${bytes} bytes traffic, the random data's root reference: ${ref}`)
}
/**
* Generate traffic on Bee node(s)
*
* @param beeApiUrls Bee API URLs where the random generated data will be sent to.
*/
async function genTrafficOnOpenPorts(beeApiUrls) {
const promises = beeApiUrls.map((url) => {
console.log(`Generate Swarm Chunk traffic on ${url}...`)
return trafficGen(url, new Date().getTime())
})
await Promise.all(promises)
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function genTrafficLoop(hosts) {
while(true) {
await genTrafficOnOpenPorts(hosts)
await sleep(SLEEP_BETWEEN_UPLOADS_MS)
}
}
const inputArray = process.argv.slice(2)
const hosts = inputArray.length > 0 ? inputArray : [ 'http://localhost:1633' ]
genTrafficLoop(hosts)

BIN
smth.txt Normal file

Binary file not shown.