From bf1b365091f796736e431c2d3f3bca4fee57159e Mon Sep 17 00:00:00 2001 From: Marcus H Date: Mon, 17 May 2021 14:30:34 -0600 Subject: [PATCH 01/14] stubbing out and adding logic for router load tests --- .../src/load/helpers/routerLoadTest.ts | 128 ++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 modules/test-runner/src/load/helpers/routerLoadTest.ts diff --git a/modules/test-runner/src/load/helpers/routerLoadTest.ts b/modules/test-runner/src/load/helpers/routerLoadTest.ts new file mode 100644 index 000000000..04c72dcc1 --- /dev/null +++ b/modules/test-runner/src/load/helpers/routerLoadTest.ts @@ -0,0 +1,128 @@ +import { Wallet, utils, constants } from "ethers"; +import {env, fundIfBelow, getRandomIndex} from "../../utils"; +import { EngineEvents, INodeService, TransferNames } from "@connext/vector-types"; +import {RestServerNodeService} from "@connext/vector-utils"; +import pino from "pino"; +import {carolEvts} from "./setupServer"; +import { + advanceBlocktime, + chainId1, + chainId2, + defundChannel, + deposit, + disputeChannel, + exitAssets, + provider1, + requestCollateral, + setup, + transfer, + wallet1, + wallet2, + withdraw, +} from "../../utils/channel"; +const logger = pino({ level: env.logLevel }); + +const testName:string = 'Router Load Test' +const rogerURL:string = "localhost?" +const carolURL:string = "localhost" + + +let routers:RestServerNodeService[] = []; +let nodes:RestServerNodeService[] = []; + +async function setupRoger() { + const routerIndex = getRandomIndex(); + //verify below + // const routerIndex = 0; + const events = undefined; + const min = utils.parseEther("0.1"); + + + const roger = await RestServerNodeService.connect( + rogerURL, + logger.child({testName, name:"roger"}), + events, + routerIndex + ) + //fund roger + // Default collateral is 0.1 ETH + await fundIfBelow(roger.signerAddress, constants.AddressZero, min.mul(15), wallet1); + if (wallet2) { + await fundIfBelow(roger.signerAddress, constants.AddressZero, min.mul(15), wallet2); + } + + return roger +} +async function setupNode() { + const routerIndex = getRandomIndex(); + //verify below + // const routerIndex = 0; + const events = undefined; + const min = utils.parseEther("0.1"); + + + const roger = await RestServerNodeService.connect( + rogerURL, + logger.child({testName, name:"carol"}), + carolEvts, + routerIndex + ) + //fund roger + // Default collateral is 0.1 ETH + await fundIfBelow(roger.signerAddress, constants.AddressZero, min.mul(15), wallet1); + if (wallet2) { + await fundIfBelow(roger.signerAddress, constants.AddressZero, min.mul(15), wallet2); + } + + return roger +} +async function createRouters(num_routers:number){ + for(let i = 0; i <= num_routers; i++){ + const roger = await setupRoger() + routers.push(roger); + } + return routers; +} +//non router nodes +async function createNode(num_nodes:number){ + for(let i = 0; i <= num_nodes; i++){ + const carol = await setupNode() + nodes.push(carol); + } + return nodes; +} +//get two roters to setup together +const getRandomEntity = async function(entityArr:RestServerNodeService[], num_entities:number){ + const randEntities = entityArr.map(x => ({ x, r: Math.random() })) + .sort((a, b) => a.r - b.r) + .map(a => a.x) + .slice(0, num_entities); + return randEntities; +} +const setupChannelsBetweenNodesAndRouter = async function(nodes:RestServerNodeService[], router:RestServerNodeService) { + const assetId = constants.AddressZero; + const depositAmt = utils.parseEther("1"); + + for (let i = 0; i < nodes.length; i++) { + const setup_res = await setup(nodes[i], router[0], chainId1) + await deposit(nodes[i], router[0], setup_res.channelAddress, assetId, depositAmt) + } +} +async function start(){ + + const transferAmt = utils.parseEther("0.1"); + + const num_routers = 5; + const num_nodes = 10; + + await createRouters(num_routers); + + await createNode(num_nodes); + + const randomRouter:RestServerNodeService = await getRandomEntity(routers,1)[0]; + const randomNodes:RestServerNodeService[] = await getRandomEntity(nodes, 3); + + const res = await setupChannelsBetweenNodesAndRouter(randomNodes, randomRouter) + + //setup channel between all carols and the random node +} \ No newline at end of file From 0006b80f568723f3ea6e2516783161a8b6090ac0 Mon Sep 17 00:00:00 2001 From: Marcus H Date: Tue, 18 May 2021 11:23:23 -0600 Subject: [PATCH 02/14] created dockerNodeMgmt.ts to create the necessary docker bash processes --- .../src/load/helpers/dockerNodeMgmt.ts | 18 ++++++++++++++++++ .../src/load/helpers/routerLoadTest.ts | 19 ++++++++----------- 2 files changed, 26 insertions(+), 11 deletions(-) create mode 100644 modules/test-runner/src/load/helpers/dockerNodeMgmt.ts diff --git a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts new file mode 100644 index 000000000..0cacdf7d2 --- /dev/null +++ b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts @@ -0,0 +1,18 @@ +import {spawn} from 'child_process' + +// export const echo = spawn('echo',['something']); + +const docker_fn = (args)=>{return spawn('docker', args)} + + +export const swarm_init = docker_fn(['swarm', 'init', '2>', '/dev/null']) + +swarm_init.stdout.on('data', (data)=>{ + console.log("ee: " + data) +}) +swarm_init.stderr.on('data', (data)=>{ + console.log("stderr: " + data) +}) +swarm_init.stdout.on('close', (code)=>{ + console.log("process finished, code: " + code) +}) \ No newline at end of file diff --git a/modules/test-runner/src/load/helpers/routerLoadTest.ts b/modules/test-runner/src/load/helpers/routerLoadTest.ts index 04c72dcc1..c02c11e52 100644 --- a/modules/test-runner/src/load/helpers/routerLoadTest.ts +++ b/modules/test-runner/src/load/helpers/routerLoadTest.ts @@ -5,26 +5,21 @@ import {RestServerNodeService} from "@connext/vector-utils"; import pino from "pino"; import {carolEvts} from "./setupServer"; import { - advanceBlocktime, chainId1, - chainId2, - defundChannel, deposit, - disputeChannel, - exitAssets, - provider1, - requestCollateral, setup, - transfer, wallet1, wallet2, - withdraw, } from "../../utils/channel"; + +import * as docker_api from './dockerNodeMgmt' const logger = pino({ level: env.logLevel }); +//??is there a difference between doug and carol ? + const testName:string = 'Router Load Test' const rogerURL:string = "localhost?" -const carolURL:string = "localhost" +const carolURL:string = "localhost??" let routers:RestServerNodeService[] = []; @@ -125,4 +120,6 @@ async function start(){ const res = await setupChannelsBetweenNodesAndRouter(randomNodes, randomRouter) //setup channel between all carols and the random node -} \ No newline at end of file +} + +console.log(docker_api.swarm_init) From e2faca331389e6caaf41c4a8e405c3d55eb4170b Mon Sep 17 00:00:00 2001 From: Marcus H Date: Tue, 18 May 2021 12:31:14 -0600 Subject: [PATCH 03/14] needed child_process.exec because it spawns an actual shell --- .../src/load/helpers/dockerNodeMgmt.ts | 33 +++++++++++-------- .../src/load/helpers/routerLoadTest.ts | 5 ++- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts index 0cacdf7d2..587cca848 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts @@ -1,18 +1,25 @@ -import {spawn} from 'child_process' +import {spawn, exec} from 'child_process' // export const echo = spawn('echo',['something']); -const docker_fn = (args)=>{return spawn('docker', args)} +// const docker_fn = (args)=>{return exec('docker', args)} +const swarm_init_str = 'docker swarm init 2> /dev/null || true' +const d_net_create_str = 'docker network create --attachable --driver overlay "$project" 2> /dev/null || true' +export const swarm_init = ()=> exec( + swarm_init_str, + ((e,r)=>(console.log(e,r)))) -export const swarm_init = docker_fn(['swarm', 'init', '2>', '/dev/null']) - -swarm_init.stdout.on('data', (data)=>{ - console.log("ee: " + data) -}) -swarm_init.stderr.on('data', (data)=>{ - console.log("stderr: " + data) -}) -swarm_init.stdout.on('close', (code)=>{ - console.log("process finished, code: " + code) -}) \ No newline at end of file +export const d_net_create = ()=> exec( + d_net_create_str, + ((e,r)=>console.log(e,r)) +) +// swarm_init.stdout.on('data', (data)=>{ +// console.log("ee: " + data) +// }) +// swarm_init.stderr.on('data', (data)=>{ +// console.log("stderr: " + data) +// }) +// swarm_init.stdout.on('close', (code)=>{ +// console.log("process finished, code: " + code) +// }) \ No newline at end of file diff --git a/modules/test-runner/src/load/helpers/routerLoadTest.ts b/modules/test-runner/src/load/helpers/routerLoadTest.ts index c02c11e52..e79e706d0 100644 --- a/modules/test-runner/src/load/helpers/routerLoadTest.ts +++ b/modules/test-runner/src/load/helpers/routerLoadTest.ts @@ -13,6 +13,7 @@ import { } from "../../utils/channel"; import * as docker_api from './dockerNodeMgmt' +import {d_net_create, swarm_init} from "./dockerNodeMgmt"; const logger = pino({ level: env.logLevel }); //??is there a difference between doug and carol ? @@ -121,5 +122,7 @@ async function start(){ //setup channel between all carols and the random node } +d_net_create() +swarm_init() + -console.log(docker_api.swarm_init) From 0d2c4fe38c1c2dcd5cdb27122dd0974fbd275d90 Mon Sep 17 00:00:00 2001 From: Marcus H Date: Thu, 20 May 2021 14:30:59 -0600 Subject: [PATCH 04/14] passing indepenednt env vars to different spawns of router --- .../src/load/helpers/dockerNodeMgmt.ts | 214 +++++++++++++++++- .../src/load/helpers/routerLoadTest.ts | 10 +- ops/start-router.sh | 11 +- 3 files changed, 216 insertions(+), 19 deletions(-) diff --git a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts index 587cca848..a6bc77b5c 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts @@ -6,6 +6,8 @@ import {spawn, exec} from 'child_process' const swarm_init_str = 'docker swarm init 2> /dev/null || true' const d_net_create_str = 'docker network create --attachable --driver overlay "$project" 2> /dev/null || true' +const start_router = 'bash ops/start-router.sh' + export const swarm_init = ()=> exec( swarm_init_str, ((e,r)=>(console.log(e,r)))) @@ -14,12 +16,206 @@ export const d_net_create = ()=> exec( d_net_create_str, ((e,r)=>console.log(e,r)) ) -// swarm_init.stdout.on('data', (data)=>{ -// console.log("ee: " + data) -// }) -// swarm_init.stderr.on('data', (data)=>{ -// console.log("stderr: " + data) -// }) -// swarm_init.stdout.on('close', (code)=>{ -// console.log("process finished, code: " + code) -// }) \ No newline at end of file + + +export const d_start_router = ()=> exec( + start_router, + ((e,r)=>console.log(e,r)) +) + + +export const spawn_router_start = spawn('bash',["ops/start-router.sh"], {shell:true}) + +const node_config_json = +{ + "adminToken": "cxt1234", + "chainAddresses": { + "1337": { + "channelFactoryAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10", + "testTokenAddress": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", + "transferRegistryAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40" + }, + "1338": { + "channelFactoryAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10", + "testTokenAddress": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", + "transferRegistryAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40" + } + }, + "chainProviders": { + "1337": "http://evm_1337:8545", + "1338": "http://evm_1338:8545" + }, + "logLevel": "info", + "messagingUrl": "", + "production": false +} + +const router_config = { + "allowedSwaps": [ + { + "fromChainId": 1337, + "toChainId": 1338, + "fromAssetId": "0x0000000000000000000000000000000000000000", + "toAssetId": "0x0000000000000000000000000000000000000000", + "priceType": "hardcoded", + "hardcodedRate": "1" + }, + { + "fromChainId": 1337, + "toChainId": 1338, + "fromAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", + "toAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", + "priceType": "hardcoded", + "hardcodedRate": "1" + } + ], + "messagingUrl": "", + "production": false, + "rebalanceProfiles": [ + { + "chainId": 1337, + "assetId": "0x0000000000000000000000000000000000000000", + "reclaimThreshold": "200000000000000000", + "target": "100000000000000000", + "collateralizeThreshold": "50000000000000000" + }, + { + "chainId": 1338, + "assetId": "0x0000000000000000000000000000000000000000", + "reclaimThreshold": "200000000000000000", + "target": "100000000000000000", + "collateralizeThreshold": "50000000000000000" + }, + { + "chainId": 1337, + "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", + "reclaimThreshold": "2000000000000000000", + "target": "1000000000000000000", + "collateralizeThreshold": "500000000000000000" + }, + { + "chainId": 1338, + "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", + "reclaimThreshold": "2000000000000000000", + "target": "1000000000000000000", + "collateralizeThreshold": "500000000000000000" + } + ] +} +const project = 'vector' +const production = 'false' +const eth_mnemonic = 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' +const eth_mnemonic_file = ""; + +const stack_secrets = '' +const VECTOR_CONFIG = node_config_json; +const VECTOR_PROD = false; +const node_internal_port = "8000" +const VECTOR_NODE_URL = 'http://node:' + node_internal_port; +const VECTOR_DATABASE_URL = "" +const VECTOR_PG_DATABASE = "vector" +const VECTOR_PG_HOST = "database-node" +const VECTOR_PG_PASSWORD = "" +//or 'vector for password +const VECTOR_PG_PASSWORD_FILE = '/run/secrets/$db_secret' +const VECTOR_PG_PORT = '5432' +const VECTOR_PG_USERNAME = 'vector' + + +const docker_compose_configuration = +`version: '3.4' + +networks: + ${project}: + external: true + +${stack_secrets} + +volumes: + certs: + database_node: + database_router: + prometheus: + grafana: + +services: + + node: + $common + $node_image + environment: + VECTOR_CONFIG: ${node_config_json} + VECTOR_PROD: ${production} + VECTOR_MNEMONIC: '${eth_mnemonic}' + VECTOR_MNEMONIC_FILE: '${eth_mnemonic_file} + VECTOR_DATABASE_URL: ${VECTOR_DATABASE_URL} + VECTOR_PG_DATABASE: + VECTOR_PG_HOST: 'database-node' + VECTOR_PG_PASSWORD: '$pg_password' + VECTOR_PG_PASSWORD_FILE: '$pg_password_file' + VECTOR_PG_PORT: '5432' + VECTOR_PG_USERNAME: '$pg_user' + + router: + $common + $router_image + environment: + VECTOR_CONFIG: ${node_config_json} + VECTOR_PROD: ${production} + VECTOR_NODE_URL: 'http://node:$node_internal_port' + VECTOR_DATABASE_URL: '$database_url' + VECTOR_PG_DATABASE: '$pg_db' + VECTOR_PG_HOST: 'database-router' + VECTOR_PG_PASSWORD: '$pg_password' + VECTOR_PG_PASSWORD_FILE: '$pg_password_file' + VECTOR_PG_PORT: '5432' + VECTOR_PG_USERNAME: '$pg_user' + VECTOR_MNEMONIC: '${eth_mnemonic}' + VECTOR_MNEMONIC_FILE: '${eth_mnemonic_file}' + + database-node: + $common + $database_image_node + environment: + AWS_ACCESS_KEY_ID: '$aws_access_id' + AWS_SECRET_ACCESS_KEY: '$aws_access_key' + POSTGRES_DB: '$pg_db' + POSTGRES_PASSWORD: '$pg_password' + POSTGRES_PASSWORD_FILE: '$pg_password_file' + POSTGRES_USER: '$project' + VECTOR_ADMIN_TOKEN: '$admin_token' + VECTOR_PROD: '$production' + + database-router: + $common + $database_image_router + environment: + AWS_ACCESS_KEY_ID: '$aws_access_id' + AWS_SECRET_ACCESS_KEY: '$aws_access_key' + POSTGRES_DB: '$pg_db' + POSTGRES_PASSWORD: '$pg_password' + POSTGRES_PASSWORD_FILE: '$pg_password_file' + POSTGRES_USER: '$project' + VECTOR_ADMIN_TOKEN: '$admin_token' + VECTOR_PROD: '$production' + + $observability_services + +EOF` + +export const spawn_n_routers = (num_routers) => { + spawn('bash',["ops/start-router.sh"], {shell:true}) + + for (let i = 0; i < num_routers; i++) { + spawn_router_start.stdout.on('data', (data) => { + console.log("Data from router node " + data) + }) + spawn_router_start.stderr.on('data', (data) => { + console.log("stderr: " + data) + }) + spawn_router_start.stdout.on('close', (code) => { + if (code) + console.log("process finished, exit code " + code) + }) + } +} \ No newline at end of file diff --git a/modules/test-runner/src/load/helpers/routerLoadTest.ts b/modules/test-runner/src/load/helpers/routerLoadTest.ts index e79e706d0..9a7d5d3b1 100644 --- a/modules/test-runner/src/load/helpers/routerLoadTest.ts +++ b/modules/test-runner/src/load/helpers/routerLoadTest.ts @@ -13,7 +13,7 @@ import { } from "../../utils/channel"; import * as docker_api from './dockerNodeMgmt' -import {d_net_create, swarm_init} from "./dockerNodeMgmt"; +import {d_net_create, swarm_init, d_start_router, spawn_n_routers} from "./dockerNodeMgmt"; const logger = pino({ level: env.logLevel }); //??is there a difference between doug and carol ? @@ -122,7 +122,7 @@ async function start(){ //setup channel between all carols and the random node } -d_net_create() -swarm_init() - - +// d_net_create() +// swarm_init() +// d_start_router() +spawn_n_routers(3) \ No newline at end of file diff --git a/ops/start-router.sh b/ops/start-router.sh index f5c8fa1dd..f5eae6ceb 100644 --- a/ops/start-router.sh +++ b/ops/start-router.sh @@ -8,9 +8,9 @@ project=$(grep -m 1 '"name":' "$root/package.json" | cut -d '"' -f 4) docker swarm init 2> /dev/null || true docker network create --attachable --driver overlay "$project" 2> /dev/null || true -if grep -qs "$stack" <<<"$(docker stack ls --format '{{.Name}}')" -then echo "A $stack stack is already running" && exit 0; -fi +#if grep -qs "$stack" <<<"$(docker stack ls --format '{{.Name}}')" +#then echo "A $stack stack is already running" && exit 0; +#fi #################### # Load config @@ -212,8 +212,9 @@ fi ######################################## ## Router config -router_internal_port="8000" -router_public_port="9000" +router_internal_port="9002" +# change so it dosen't conflict with portainer (revert) +router_public_port="9002" public_url="http://127.0.0.1:$router_public_port/ping" if [[ $production == "true" ]] then From 58d665ee0c92830b5642cf3dcc44e26bf944d9e6 Mon Sep 17 00:00:00 2001 From: Marcus H Date: Sun, 23 May 2021 16:11:57 -0600 Subject: [PATCH 05/14] got a single router stack to run via node, need to disect configs to do that for multiple --- .../src/load/helpers/dockerNodeConfig.ts | 177 +++++++++++++++++ .../src/load/helpers/dockerNodeMgmt.ts | 184 +----------------- .../src/load/helpers/routerLoadTest.ts | 1 + 3 files changed, 181 insertions(+), 181 deletions(-) create mode 100644 modules/test-runner/src/load/helpers/dockerNodeConfig.ts diff --git a/modules/test-runner/src/load/helpers/dockerNodeConfig.ts b/modules/test-runner/src/load/helpers/dockerNodeConfig.ts new file mode 100644 index 000000000..67dc86a2c --- /dev/null +++ b/modules/test-runner/src/load/helpers/dockerNodeConfig.ts @@ -0,0 +1,177 @@ + +export const node_config_json = + { + "adminToken": "cxt1234", + "chainAddresses": { + "1337": { + "channelFactoryAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10", + "testTokenAddress": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", + "transferRegistryAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40" + }, + "1338": { + "channelFactoryAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10", + "testTokenAddress": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", + "transferRegistryAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40" + } + }, + "chainProviders": { + "1337": "http://evm_1337:8545", + "1338": "http://evm_1338:8545" + }, + "logLevel": "info", + "messagingUrl": "", + "production": false +} + +export const router_config = { + "allowedSwaps": [ + { + "fromChainId": 1337, + "toChainId": 1338, + "fromAssetId": "0x0000000000000000000000000000000000000000", + "toAssetId": "0x0000000000000000000000000000000000000000", + "priceType": "hardcoded", + "hardcodedRate": "1" + }, + { + "fromChainId": 1337, + "toChainId": 1338, + "fromAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", + "toAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", + "priceType": "hardcoded", + "hardcodedRate": "1" + } + ], + "messagingUrl": "", + "production": false, + "rebalanceProfiles": [ + { + "chainId": 1337, + "assetId": "0x0000000000000000000000000000000000000000", + "reclaimThreshold": "200000000000000000", + "target": "100000000000000000", + "collateralizeThreshold": "50000000000000000" + }, + { + "chainId": 1338, + "assetId": "0x0000000000000000000000000000000000000000", + "reclaimThreshold": "200000000000000000", + "target": "100000000000000000", + "collateralizeThreshold": "50000000000000000" + }, + { + "chainId": 1337, + "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", + "reclaimThreshold": "2000000000000000000", + "target": "1000000000000000000", + "collateralizeThreshold": "500000000000000000" + }, + { + "chainId": 1338, + "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", + "reclaimThreshold": "2000000000000000000", + "target": "1000000000000000000", + "collateralizeThreshold": "500000000000000000" + } + ] +} +const project = 'vector' +const production = 'false' +const eth_mnemonic = 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' +const eth_mnemonic_file = ""; + +const stack_secrets = '' +const VECTOR_CONFIG = node_config_json; +const VECTOR_PROD = false; +const node_internal_port = "8000" +const VECTOR_NODE_URL = 'http://node:' + node_internal_port; +const VECTOR_DATABASE_URL = "" +const VECTOR_PG_DATABASE = "vector" +const VECTOR_PG_HOST = "database-node" +const VECTOR_PG_PASSWORD = "" +//or 'vector for password +const VECTOR_PG_PASSWORD_FILE = '/run/secrets/$db_secret' +const VECTOR_PG_PORT = '5432' +const VECTOR_PG_USERNAME = 'vector' + + +export const docker_compose_configuration = + `version: '3.4' + +networks: + ${project}: + external: true + +${stack_secrets} + +volumes: + certs: + database_node: + database_router: + prometheus: + grafana: + +services: + + node: + $common + $node_image + environment: + VECTOR_CONFIG: ${node_config_json} + VECTOR_PROD: ${production} + VECTOR_MNEMONIC: '${eth_mnemonic}' + VECTOR_MNEMONIC_FILE: '${eth_mnemonic_file} + VECTOR_DATABASE_URL: ${VECTOR_DATABASE_URL} + VECTOR_PG_DATABASE: + VECTOR_PG_HOST: 'database-node' + VECTOR_PG_PASSWORD: '$pg_password' + VECTOR_PG_PASSWORD_FILE: '$pg_password_file' + VECTOR_PG_PORT: '5432' + VECTOR_PG_USERNAME: '$pg_user' + + router: + $common + $router_image + environment: + VECTOR_CONFIG: ${node_config_json} + VECTOR_PROD: ${production} + VECTOR_NODE_URL: 'http://node:$node_internal_port' + VECTOR_DATABASE_URL: '$database_url' + VECTOR_PG_DATABASE: '$pg_db' + VECTOR_PG_HOST: 'database-router' + VECTOR_PG_PASSWORD: '$pg_password' + VECTOR_PG_PASSWORD_FILE: '$pg_password_file' + VECTOR_PG_PORT: '5432' + VECTOR_PG_USERNAME: '$pg_user' + VECTOR_MNEMONIC: '${eth_mnemonic}' + VECTOR_MNEMONIC_FILE: '${eth_mnemonic_file}' + + database-node: + $common + $database_image_node + environment: + AWS_ACCESS_KEY_ID: '$aws_access_id' + AWS_SECRET_ACCESS_KEY: '$aws_access_key' + POSTGRES_DB: '$pg_db' + POSTGRES_PASSWORD: '$pg_password' + POSTGRES_PASSWORD_FILE: '$pg_password_file' + POSTGRES_USER: '$project' + VECTOR_ADMIN_TOKEN: '$admin_token' + VECTOR_PROD: '$production' + + database-router: + $common + $database_image_router + environment: + AWS_ACCESS_KEY_ID: '$aws_access_id' + AWS_SECRET_ACCESS_KEY: '$aws_access_key' + POSTGRES_DB: '$pg_db' + POSTGRES_PASSWORD: '$pg_password' + POSTGRES_PASSWORD_FILE: '$pg_password_file' + POSTGRES_USER: '$project' + VECTOR_ADMIN_TOKEN: '$admin_token' + VECTOR_PROD: '$production' + + $observability_services + +EOF` \ No newline at end of file diff --git a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts index a6bc77b5c..dec6a4b38 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts @@ -1,8 +1,5 @@ import {spawn, exec} from 'child_process' - -// export const echo = spawn('echo',['something']); - -// const docker_fn = (args)=>{return exec('docker', args)} +import {docker_compose_configuration} from "./dockerNodeConfig"; const swarm_init_str = 'docker swarm init 2> /dev/null || true' const d_net_create_str = 'docker network create --attachable --driver overlay "$project" 2> /dev/null || true' @@ -26,185 +23,10 @@ export const d_start_router = ()=> exec( export const spawn_router_start = spawn('bash',["ops/start-router.sh"], {shell:true}) -const node_config_json = -{ - "adminToken": "cxt1234", - "chainAddresses": { - "1337": { - "channelFactoryAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10", - "testTokenAddress": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", - "transferRegistryAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40" - }, - "1338": { - "channelFactoryAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10", - "testTokenAddress": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", - "transferRegistryAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40" - } - }, - "chainProviders": { - "1337": "http://evm_1337:8545", - "1338": "http://evm_1338:8545" - }, - "logLevel": "info", - "messagingUrl": "", - "production": false -} - -const router_config = { - "allowedSwaps": [ - { - "fromChainId": 1337, - "toChainId": 1338, - "fromAssetId": "0x0000000000000000000000000000000000000000", - "toAssetId": "0x0000000000000000000000000000000000000000", - "priceType": "hardcoded", - "hardcodedRate": "1" - }, - { - "fromChainId": 1337, - "toChainId": 1338, - "fromAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", - "toAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", - "priceType": "hardcoded", - "hardcodedRate": "1" - } - ], - "messagingUrl": "", - "production": false, - "rebalanceProfiles": [ - { - "chainId": 1337, - "assetId": "0x0000000000000000000000000000000000000000", - "reclaimThreshold": "200000000000000000", - "target": "100000000000000000", - "collateralizeThreshold": "50000000000000000" - }, - { - "chainId": 1338, - "assetId": "0x0000000000000000000000000000000000000000", - "reclaimThreshold": "200000000000000000", - "target": "100000000000000000", - "collateralizeThreshold": "50000000000000000" - }, - { - "chainId": 1337, - "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", - "reclaimThreshold": "2000000000000000000", - "target": "1000000000000000000", - "collateralizeThreshold": "500000000000000000" - }, - { - "chainId": 1338, - "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", - "reclaimThreshold": "2000000000000000000", - "target": "1000000000000000000", - "collateralizeThreshold": "500000000000000000" - } - ] -} -const project = 'vector' -const production = 'false' -const eth_mnemonic = 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' -const eth_mnemonic_file = ""; - -const stack_secrets = '' -const VECTOR_CONFIG = node_config_json; -const VECTOR_PROD = false; -const node_internal_port = "8000" -const VECTOR_NODE_URL = 'http://node:' + node_internal_port; -const VECTOR_DATABASE_URL = "" -const VECTOR_PG_DATABASE = "vector" -const VECTOR_PG_HOST = "database-node" -const VECTOR_PG_PASSWORD = "" -//or 'vector for password -const VECTOR_PG_PASSWORD_FILE = '/run/secrets/$db_secret' -const VECTOR_PG_PORT = '5432' -const VECTOR_PG_USERNAME = 'vector' - - -const docker_compose_configuration = -`version: '3.4' - -networks: - ${project}: - external: true - -${stack_secrets} - -volumes: - certs: - database_node: - database_router: - prometheus: - grafana: - -services: - - node: - $common - $node_image - environment: - VECTOR_CONFIG: ${node_config_json} - VECTOR_PROD: ${production} - VECTOR_MNEMONIC: '${eth_mnemonic}' - VECTOR_MNEMONIC_FILE: '${eth_mnemonic_file} - VECTOR_DATABASE_URL: ${VECTOR_DATABASE_URL} - VECTOR_PG_DATABASE: - VECTOR_PG_HOST: 'database-node' - VECTOR_PG_PASSWORD: '$pg_password' - VECTOR_PG_PASSWORD_FILE: '$pg_password_file' - VECTOR_PG_PORT: '5432' - VECTOR_PG_USERNAME: '$pg_user' - - router: - $common - $router_image - environment: - VECTOR_CONFIG: ${node_config_json} - VECTOR_PROD: ${production} - VECTOR_NODE_URL: 'http://node:$node_internal_port' - VECTOR_DATABASE_URL: '$database_url' - VECTOR_PG_DATABASE: '$pg_db' - VECTOR_PG_HOST: 'database-router' - VECTOR_PG_PASSWORD: '$pg_password' - VECTOR_PG_PASSWORD_FILE: '$pg_password_file' - VECTOR_PG_PORT: '5432' - VECTOR_PG_USERNAME: '$pg_user' - VECTOR_MNEMONIC: '${eth_mnemonic}' - VECTOR_MNEMONIC_FILE: '${eth_mnemonic_file}' - - database-node: - $common - $database_image_node - environment: - AWS_ACCESS_KEY_ID: '$aws_access_id' - AWS_SECRET_ACCESS_KEY: '$aws_access_key' - POSTGRES_DB: '$pg_db' - POSTGRES_PASSWORD: '$pg_password' - POSTGRES_PASSWORD_FILE: '$pg_password_file' - POSTGRES_USER: '$project' - VECTOR_ADMIN_TOKEN: '$admin_token' - VECTOR_PROD: '$production' - - database-router: - $common - $database_image_router - environment: - AWS_ACCESS_KEY_ID: '$aws_access_id' - AWS_SECRET_ACCESS_KEY: '$aws_access_key' - POSTGRES_DB: '$pg_db' - POSTGRES_PASSWORD: '$pg_password' - POSTGRES_PASSWORD_FILE: '$pg_password_file' - POSTGRES_USER: '$project' - VECTOR_ADMIN_TOKEN: '$admin_token' - VECTOR_PROD: '$production' - - $observability_services - -EOF` export const spawn_n_routers = (num_routers) => { - spawn('bash',["ops/start-router.sh"], {shell:true}) + // spawn('bash',["ops/start-router.sh"], {shell:true}) + spawn('docker',["stack", "deploy", "-c", docker_compose_configuration, "router"], {shell:true}) for (let i = 0; i < num_routers; i++) { spawn_router_start.stdout.on('data', (data) => { diff --git a/modules/test-runner/src/load/helpers/routerLoadTest.ts b/modules/test-runner/src/load/helpers/routerLoadTest.ts index 9a7d5d3b1..3c9df5cfb 100644 --- a/modules/test-runner/src/load/helpers/routerLoadTest.ts +++ b/modules/test-runner/src/load/helpers/routerLoadTest.ts @@ -122,6 +122,7 @@ async function start(){ //setup channel between all carols and the random node } + // d_net_create() // swarm_init() // d_start_router() From 3080dfe048465d432addbf027d9e4a4f6d820aff Mon Sep 17 00:00:00 2001 From: Marcus H Date: Sun, 23 May 2021 17:37:40 -0600 Subject: [PATCH 06/14] got a single router stack to run via node, need to disect configs to do that for multiple --- modules/test-runner/src/load/helpers/dockerNodeConfig.ts | 5 +++++ modules/test-runner/src/load/helpers/dockerNodeMgmt.ts | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/test-runner/src/load/helpers/dockerNodeConfig.ts b/modules/test-runner/src/load/helpers/dockerNodeConfig.ts index 67dc86a2c..91d50d2ec 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeConfig.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeConfig.ts @@ -1,4 +1,9 @@ +const router_server_config = { + internal_port:"9002", + public_port:"9002", + public_url:`http://127.0.0.1:9002/ping`, +} export const node_config_json = { "adminToken": "cxt1234", diff --git a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts index dec6a4b38..7c6f12f72 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts @@ -21,12 +21,13 @@ export const d_start_router = ()=> exec( ) -export const spawn_router_start = spawn('bash',["ops/start-router.sh"], {shell:true}) +// export const spawn_router_start = spawn('bash',["ops/start-router.sh"], {shell:true}) +export const spawn_router_start = spawn('docker',["stack", "deploy", "-c", docker_compose_configuration, "router"], {shell:true}) export const spawn_n_routers = (num_routers) => { // spawn('bash',["ops/start-router.sh"], {shell:true}) - spawn('docker',["stack", "deploy", "-c", docker_compose_configuration, "router"], {shell:true}) + // spawn('docker',["stack", "deploy", "-c", docker_compose_configuration, "router"], {shell:true}) for (let i = 0; i < num_routers; i++) { spawn_router_start.stdout.on('data', (data) => { From cebb0d8a3f8bf471c4d9eff485f339acbe3ea40c Mon Sep 17 00:00:00 2001 From: Marcus H Date: Mon, 24 May 2021 13:30:10 -0600 Subject: [PATCH 07/14] created process Handler class/abstractions --- .../src/load/helpers/dockerNodeConfig.ts | 212 +++++++++++++++++- .../src/load/helpers/dockerNodeMgmt.ts | 119 +++++++++- .../src/load/helpers/routerLoadTest.ts | 16 +- 3 files changed, 330 insertions(+), 17 deletions(-) diff --git a/modules/test-runner/src/load/helpers/dockerNodeConfig.ts b/modules/test-runner/src/load/helpers/dockerNodeConfig.ts index 91d50d2ec..70def77c0 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeConfig.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeConfig.ts @@ -99,10 +99,39 @@ const VECTOR_PG_PASSWORD_FILE = '/run/secrets/$db_secret' const VECTOR_PG_PORT = '5432' const VECTOR_PG_USERNAME = 'vector' +// router_image_name="${project}_builder:$version"; +// router_image="image: '$router_image_name' +// entrypoint: 'bash modules/router/ops/entry.sh' +// volumes: +// - '$root:/app' +// ports: +// - '$router_public_port:$router_internal_port'" +// echo "${stack}_router will be exposed on *:$router_public_port" +// fi +// bash "$root/ops/pull-images.sh" "$router_image_name" > /dev/null -export const docker_compose_configuration = - `version: '3.4' +const router_image_name = "vector_builder:0.2.2-beta.2" +const router_image = `${router_image_name} +entrypoint: 'bash modules/router/ops/entry.sh' + volumes: + - '$root:/app' + ports: + - ${router_server_config.public_port}:${router_server_config.internal_port} + +` +export const pull_router_image_opts = ["./ops/pull-images.sh", `${router_image_name}`, '> /dev/null'] + +const common = ` + networks: + - '$project' + logging: + driver: 'json-file' + options: + max-size: '10m' +` +export const docker_compose_configuration = +`version: '3.4' networks: ${project}: external: true @@ -127,7 +156,7 @@ services: VECTOR_MNEMONIC: '${eth_mnemonic}' VECTOR_MNEMONIC_FILE: '${eth_mnemonic_file} VECTOR_DATABASE_URL: ${VECTOR_DATABASE_URL} - VECTOR_PG_DATABASE: + VECTOR_PG_DATABASE: ${project} VECTOR_PG_HOST: 'database-node' VECTOR_PG_PASSWORD: '$pg_password' VECTOR_PG_PASSWORD_FILE: '$pg_password_file' @@ -135,19 +164,19 @@ services: VECTOR_PG_USERNAME: '$pg_user' router: - $common - $router_image + ${common} + ${router_image} environment: VECTOR_CONFIG: ${node_config_json} VECTOR_PROD: ${production} VECTOR_NODE_URL: 'http://node:$node_internal_port' - VECTOR_DATABASE_URL: '$database_url' - VECTOR_PG_DATABASE: '$pg_db' + VECTOR_DATABASE_URL: ${VECTOR_DATABASE_URL} + VECTOR_PG_DATABASE: ${project} VECTOR_PG_HOST: 'database-router' - VECTOR_PG_PASSWORD: '$pg_password' - VECTOR_PG_PASSWORD_FILE: '$pg_password_file' + VECTOR_PG_PASSWORD: "" + VECTOR_PG_PASSWORD_FILE: "" VECTOR_PG_PORT: '5432' - VECTOR_PG_USERNAME: '$pg_user' + VECTOR_PG_USERNAME: ${project} VECTOR_MNEMONIC: '${eth_mnemonic}' VECTOR_MNEMONIC_FILE: '${eth_mnemonic_file}' @@ -179,4 +208,165 @@ services: $observability_services -EOF` \ No newline at end of file +EOF` + + +export const test_docker_compose_configuration = `version: '3.4' + +networks: + vector: + external: true + + + +volumes: + certs: + database_node: + database_router: + prometheus: + grafana: + +services: + + node: + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'vector_builder:latest' + entrypoint: 'bash modules/server-node/ops/entry.sh' + volumes: + - '/home/z/Development/vector:/app' + ports: + - '8002:8000' + environment: + VECTOR_CONFIG: '{ "adminToken": "cxt1234", "chainAddresses": { "1337": { "channelFactoryAddress": "0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da", "testTokenAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40", "transferRegistryAddress": "0x8f0483125FCb9aaAEFA9209D8E9d7b9C8B9Fb90F", "hashlockTransferAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10" }, "1338": { "channelFactoryAddress": "0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da", "testTokenAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40", "transferRegistryAddress": "0x8f0483125FCb9aaAEFA9209D8E9d7b9C8B9Fb90F", "hashlockTransferAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10" } }, "chainProviders": { "1337": "http://evm_1337:8545", "1338": "http://evm_1338:8545" }, "logLevel": "info", "messagingUrl": "", "production": false, "allowedSwaps": [ { "fromChainId": 1337, "toChainId": 1338, "fromAssetId": "0x0000000000000000000000000000000000000000", "toAssetId": "0x0000000000000000000000000000000000000000", "priceType": "hardcoded", "hardcodedRate": "1" }, { "fromChainId": 1337, "toChainId": 1338, "fromAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "toAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "priceType": "hardcoded", "hardcodedRate": "1" } ], "rebalanceProfiles": [ { "chainId": 1337, "assetId": "0x0000000000000000000000000000000000000000", "reclaimThreshold": "200000000000000000", "target": "100000000000000000", "collateralizeThreshold": "50000000000000000" }, { "chainId": 1338, "assetId": "0x0000000000000000000000000000000000000000", "reclaimThreshold": "200000000000000000", "target": "100000000000000000", "collateralizeThreshold": "50000000000000000" }, { "chainId": 1337, "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "reclaimThreshold": "2000000000000000000", "target": "1000000000000000000", "collateralizeThreshold": "500000000000000000" }, { "chainId": 1338, "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "reclaimThreshold": "2000000000000000000", "target": "1000000000000000000", "collateralizeThreshold": "500000000000000000" } ]}' + VECTOR_PROD: 'false' + VECTOR_MNEMONIC: 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' + VECTOR_MNEMONIC_FILE: '' + VECTOR_DATABASE_URL: '' + VECTOR_PG_DATABASE: 'vector' + VECTOR_PG_HOST: 'database-node' + VECTOR_PG_PASSWORD: 'vector' + VECTOR_PG_PASSWORD_FILE: '' + VECTOR_PG_PORT: '5432' + VECTOR_PG_USERNAME: 'vector' + + router: + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'vector_builder:latest' + entrypoint: 'bash modules/router/ops/entry.sh' + volumes: + - '/home/z/Development/vector:/app' + ports: + - '9002:9002' + environment: + VECTOR_CONFIG: '{ "adminToken": "cxt1234", "chainAddresses": { "1337": { "channelFactoryAddress": "0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da", "testTokenAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40", "transferRegistryAddress": "0x8f0483125FCb9aaAEFA9209D8E9d7b9C8B9Fb90F", "hashlockTransferAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10" }, "1338": { "channelFactoryAddress": "0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da", "testTokenAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40", "transferRegistryAddress": "0x8f0483125FCb9aaAEFA9209D8E9d7b9C8B9Fb90F", "hashlockTransferAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10" } }, "chainProviders": { "1337": "http://evm_1337:8545", "1338": "http://evm_1338:8545" }, "logLevel": "info", "messagingUrl": "", "production": false, "allowedSwaps": [ { "fromChainId": 1337, "toChainId": 1338, "fromAssetId": "0x0000000000000000000000000000000000000000", "toAssetId": "0x0000000000000000000000000000000000000000", "priceType": "hardcoded", "hardcodedRate": "1" }, { "fromChainId": 1337, "toChainId": 1338, "fromAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "toAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "priceType": "hardcoded", "hardcodedRate": "1" } ], "rebalanceProfiles": [ { "chainId": 1337, "assetId": "0x0000000000000000000000000000000000000000", "reclaimThreshold": "200000000000000000", "target": "100000000000000000", "collateralizeThreshold": "50000000000000000" }, { "chainId": 1338, "assetId": "0x0000000000000000000000000000000000000000", "reclaimThreshold": "200000000000000000", "target": "100000000000000000", "collateralizeThreshold": "50000000000000000" }, { "chainId": 1337, "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "reclaimThreshold": "2000000000000000000", "target": "1000000000000000000", "collateralizeThreshold": "500000000000000000" }, { "chainId": 1338, "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "reclaimThreshold": "2000000000000000000", "target": "1000000000000000000", "collateralizeThreshold": "500000000000000000" } ]}' + VECTOR_PROD: 'false' + VECTOR_NODE_URL: 'http://node:8000' + VECTOR_DATABASE_URL: '' + VECTOR_PG_DATABASE: 'vector' + VECTOR_PG_HOST: 'database-router' + VECTOR_PG_PASSWORD: 'vector' + VECTOR_PG_PASSWORD_FILE: '' + VECTOR_PG_PORT: '5432' + VECTOR_PG_USERNAME: 'vector' + VECTOR_MNEMONIC: 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' + VECTOR_MNEMONIC_FILE: '' + + database-node: + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'vector_database:latest' + ports: + - '5434:5432' + environment: + AWS_ACCESS_KEY_ID: '' + AWS_SECRET_ACCESS_KEY: '' + POSTGRES_DB: 'vector' + POSTGRES_PASSWORD: 'vector' + POSTGRES_PASSWORD_FILE: '' + POSTGRES_USER: 'vector' + VECTOR_ADMIN_TOKEN: 'cxt1234' + VECTOR_PROD: 'false' + + database-router: + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'vector_database:latest' + ports: + - '5435:5432' + environment: + AWS_ACCESS_KEY_ID: '' + AWS_SECRET_ACCESS_KEY: '' + POSTGRES_DB: 'vector' + POSTGRES_PASSWORD: 'vector' + POSTGRES_PASSWORD_FILE: '' + POSTGRES_USER: 'vector' + VECTOR_ADMIN_TOKEN: 'cxt1234' + VECTOR_PROD: 'false' + + prometheus: + image: prom/prometheus:latest + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + ports: + - 9090:9090 + command: + - --config.file=/etc/prometheus/prometheus.yml + volumes: + - /home/z/Development/vector/ops/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro + - prometheus:/prometheus + + cadvisor: + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: gcr.io/google-containers/cadvisor:latest + ports: + - 8081:8080 + volumes: + - /:/rootfs:ro + - /var/run:/var/run:rw + - /sys:/sys:ro + - /var/lib/docker/:/var/lib/docker:ro + + grafana: + image: grafana/grafana:latest + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + networks: + - vector + ports: + - 3008:3000 + volumes: + - /home/z/Development/vector/ops/grafana/grafana:/etc/grafana + - /home/z/Development/vector/ops/grafana/dashboards:/etc/dashboards + - grafana:/var/lib/grafana +` \ No newline at end of file diff --git a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts index 7c6f12f72..517509b1e 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts @@ -1,5 +1,9 @@ import {spawn, exec} from 'child_process' -import {docker_compose_configuration} from "./dockerNodeConfig"; +import { + docker_compose_configuration, + pull_router_image_opts, + test_docker_compose_configuration, +} from "./dockerNodeConfig"; const swarm_init_str = 'docker swarm init 2> /dev/null || true' const d_net_create_str = 'docker network create --attachable --driver overlay "$project" 2> /dev/null || true' @@ -23,11 +27,17 @@ export const d_start_router = ()=> exec( // export const spawn_router_start = spawn('bash',["ops/start-router.sh"], {shell:true}) -export const spawn_router_start = spawn('docker',["stack", "deploy", "-c", docker_compose_configuration, "router"], {shell:true}) +export const echo_router_config = spawn(`bash`, ['-c',`echo "${test_docker_compose_configuration}" > router.config.test.yml`]) + +export const spawn_router_start = spawn('docker',["stack", "deploy", "-c", "router.config.test.yml", "router"], {shell:true}) + +// export const pull_router_image = spawn('bash', pull_router_image_opts); +// const spawn_router_start = spawn('bash', pull_router_image_opts); + export const spawn_n_routers = (num_routers) => { // spawn('bash',["ops/start-router.sh"], {shell:true}) - // spawn('docker',["stack", "deploy", "-c", docker_compose_configuration, "router"], {shell:true}) + spawn('docker',["stack", "deploy", "-c", "router.config.txt", "router"], {shell:true}) for (let i = 0; i < num_routers; i++) { spawn_router_start.stdout.on('data', (data) => { @@ -41,4 +51,105 @@ export const spawn_n_routers = (num_routers) => { console.log("process finished, exit code " + code) }) } -} \ No newline at end of file +} + +interface Command { + cmd:string, + args:string[] +} + +class ProcessHandler{ + success_str: string; + success:boolean|undefined = undefined; + + constructor(_success_str:string) { + this.success_str = _success_str; + } + + cmp_stdout(stdout:string){ + const res_str = String(stdout); + const res = res_str.includes(this.success_str); + if(!res){ + console.log("process handler not finding a result that makes sense") + return this.success=false; + } + console.log("Success") + return this.success=true; + } + + cb_stdout_data(data:string){ + this.cmp_stdout(data) + } + cb_stdout_close(data:string){ + console.log("process closed") + return 0; + } + +} + +class SpawnProcess { + returnCode:number|undefined = undefined; + command:Command; + handler:ProcessHandler; + process; + + constructor(_command:Command, _handler:ProcessHandler){ + this.command = _command; + this.handler = _handler; + + } + + register_events(){ + try { + this.process.stderr.on('data', (event_data) => { + console.log("got err data" + event_data) + }) + }catch(e){ + console.log("couldnt register to stderr") + } + + try { + this.process.stdout.on('data', (event_data) => { + console.log("got stdout data" + event_data) + this.handler.cb_stdout_data(event_data) + }) + this.process.stdout.on('close', (event_data) => { + console.log("got event close" + event_data) + this.returnCode = this.handler.cb_stdout_close(event_data) + }) + }catch(e){ + console.log("couldnt register to stdout") + } + } + + exec(){ + this.process = spawn(this.command.cmd, this.command.args, {shell:true}) + this.register_events() + } + + async getResult():Promise{ + const delay = (ms)=>{ + return new Promise((resolve)=> + setTimeout(function(){ + console.log("waiting for process to resolve"); + resolve(); + },ms)) + + } + while(this.handler.success === undefined){ + await delay(400); + + } + return this.handler.success; + } + +} + + +// export const echo_router_config = spawn(`bash`, ['-c',`echo "${test_docker_compose_configuration}" > router.config.test.yml`]) +const bashCommand: Command = {cmd:'ls',args:['-la']}; +const handler:ProcessHandler = new ProcessHandler("TODO"); + +export const test_process:SpawnProcess = new SpawnProcess(bashCommand, handler); + + diff --git a/modules/test-runner/src/load/helpers/routerLoadTest.ts b/modules/test-runner/src/load/helpers/routerLoadTest.ts index 3c9df5cfb..0ff403d09 100644 --- a/modules/test-runner/src/load/helpers/routerLoadTest.ts +++ b/modules/test-runner/src/load/helpers/routerLoadTest.ts @@ -13,7 +13,7 @@ import { } from "../../utils/channel"; import * as docker_api from './dockerNodeMgmt' -import {d_net_create, swarm_init, d_start_router, spawn_n_routers} from "./dockerNodeMgmt"; +import {d_net_create, swarm_init, d_start_router, spawn_n_routers, test_process} from "./dockerNodeMgmt"; const logger = pino({ level: env.logLevel }); //??is there a difference between doug and carol ? @@ -126,4 +126,16 @@ async function start(){ // d_net_create() // swarm_init() // d_start_router() -spawn_n_routers(3) \ No newline at end of file +// spawn_n_routers(1) + +const test = async()=>{ + const test_resCode = test_process.exec(); + + const test_res = await test_process.getResult(); + if(test_res){ + console.log("test_res" + test_res) + } + +} + +test() From 9366b3bf6df155b9f8ba351782ee5a38a0f37c3b Mon Sep 17 00:00:00 2001 From: Marcus H Date: Mon, 24 May 2021 14:36:13 -0600 Subject: [PATCH 08/14] why did bash -c [args] stop w? --- .../src/load/helpers/dockerNodeMgmt.ts | 8 ++++--- .../src/load/helpers/routerLoadTest.ts | 21 +++++++++++++------ 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts index 517509b1e..f2e7c44cf 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts @@ -68,6 +68,7 @@ class ProcessHandler{ cmp_stdout(stdout:string){ const res_str = String(stdout); + console.log(res_str); const res = res_str.includes(this.success_str); if(!res){ console.log("process handler not finding a result that makes sense") @@ -146,9 +147,10 @@ class SpawnProcess { } -// export const echo_router_config = spawn(`bash`, ['-c',`echo "${test_docker_compose_configuration}" > router.config.test.yml`]) -const bashCommand: Command = {cmd:'ls',args:['-la']}; -const handler:ProcessHandler = new ProcessHandler("TODO"); +export const echo_router_config_cmd = spawn(`bash`, ['-c',`echo "${test_docker_compose_configuration}" > router.config.test.yml`]) +const bashCommand: Command = {cmd:'bash',args:['-c',`echo "Howdy Ho" > abc12.txt`]}; + +const handler:ProcessHandler = new ProcessHandler(""); export const test_process:SpawnProcess = new SpawnProcess(bashCommand, handler); diff --git a/modules/test-runner/src/load/helpers/routerLoadTest.ts b/modules/test-runner/src/load/helpers/routerLoadTest.ts index 0ff403d09..0c11b2287 100644 --- a/modules/test-runner/src/load/helpers/routerLoadTest.ts +++ b/modules/test-runner/src/load/helpers/routerLoadTest.ts @@ -13,7 +13,14 @@ import { } from "../../utils/channel"; import * as docker_api from './dockerNodeMgmt' -import {d_net_create, swarm_init, d_start_router, spawn_n_routers, test_process} from "./dockerNodeMgmt"; +import { + d_net_create, + swarm_init, + d_start_router, + spawn_n_routers, + test_process, + echo_router_config_cmd, +} from "./dockerNodeMgmt"; const logger = pino({ level: env.logLevel }); //??is there a difference between doug and carol ? @@ -131,11 +138,13 @@ async function start(){ const test = async()=>{ const test_resCode = test_process.exec(); - const test_res = await test_process.getResult(); - if(test_res){ - console.log("test_res" + test_res) - } + // const test_res = await test_process.getResult(); + // if(test_res){ + // console.log("test_res" + test_res) + // } + console.log("test_res" + test_resCode) + } -test() +echo_router_config_cmd.stdout.on("data", (d)=>console.log(d)) \ No newline at end of file From a7cb75be87b65b8cc3ae3f8450df7d6aff99d64e Mon Sep 17 00:00:00 2001 From: Marcus H Date: Mon, 24 May 2021 14:38:06 -0600 Subject: [PATCH 09/14] why did bash -c [args] stop w? --- modules/test-runner/src/load/helpers/dockerNodeMgmt.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts index f2e7c44cf..cd1d30562 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts @@ -147,8 +147,8 @@ class SpawnProcess { } -export const echo_router_config_cmd = spawn(`bash`, ['-c',`echo "${test_docker_compose_configuration}" > router.config.test.yml`]) -const bashCommand: Command = {cmd:'bash',args:['-c',`echo "Howdy Ho" > abc12.txt`]}; +export const echo_router_config_cmd = spawn(`bash`, [`echo "${test_docker_compose_configuration}" > router.config.test.yml`]) +const bashCommand: Command = {cmd:'bash', args:['-c',`echo "Howdy Ho" > abc12.txt`]}; const handler:ProcessHandler = new ProcessHandler(""); From 1f07d7c4524d98c44b189875782079b25d6e924c Mon Sep 17 00:00:00 2001 From: Marcus H Date: Mon, 24 May 2021 16:26:11 -0600 Subject: [PATCH 10/14] fixing bash -c --- modules/test-runner/src/load/helpers/dockerNodeMgmt.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts index cd1d30562..08c761cc5 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts @@ -101,15 +101,11 @@ class SpawnProcess { } register_events(){ - try { + this.process.stderr.on('data', (event_data) => { console.log("got err data" + event_data) }) - }catch(e){ - console.log("couldnt register to stderr") - } - try { this.process.stdout.on('data', (event_data) => { console.log("got stdout data" + event_data) this.handler.cb_stdout_data(event_data) @@ -118,9 +114,6 @@ class SpawnProcess { console.log("got event close" + event_data) this.returnCode = this.handler.cb_stdout_close(event_data) }) - }catch(e){ - console.log("couldnt register to stdout") - } } exec(){ From adff9ba91973483a89c9d42a0b4da677790171f1 Mon Sep 17 00:00:00 2001 From: Marcus H Date: Mon, 24 May 2021 16:43:30 -0600 Subject: [PATCH 11/14] echoing config yml works, test() through handler abstractions does as well --- modules/test-runner/src/load/helpers/dockerNodeMgmt.ts | 5 ++--- modules/test-runner/src/load/helpers/routerLoadTest.ts | 5 +++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts index 08c761cc5..d48ae4041 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts @@ -37,7 +37,7 @@ export const spawn_router_start = spawn('docker',["stack", "deploy", "-c", "rout export const spawn_n_routers = (num_routers) => { // spawn('bash',["ops/start-router.sh"], {shell:true}) - spawn('docker',["stack", "deploy", "-c", "router.config.txt", "router"], {shell:true}) + spawn('docker',["stack", "deploy", "-c", "router.config.test.yml", "router"], {shell:true}) for (let i = 0; i < num_routers; i++) { spawn_router_start.stdout.on('data', (data) => { @@ -141,10 +141,9 @@ class SpawnProcess { export const echo_router_config_cmd = spawn(`bash`, [`echo "${test_docker_compose_configuration}" > router.config.test.yml`]) -const bashCommand: Command = {cmd:'bash', args:['-c',`echo "Howdy Ho" > abc12.txt`]}; +const bashCommand: Command = {cmd:'docker', args:["stack", "deploy", "-c", "router.config.test.yml", "router"]}; const handler:ProcessHandler = new ProcessHandler(""); - export const test_process:SpawnProcess = new SpawnProcess(bashCommand, handler); diff --git a/modules/test-runner/src/load/helpers/routerLoadTest.ts b/modules/test-runner/src/load/helpers/routerLoadTest.ts index 0c11b2287..672999f10 100644 --- a/modules/test-runner/src/load/helpers/routerLoadTest.ts +++ b/modules/test-runner/src/load/helpers/routerLoadTest.ts @@ -133,6 +133,8 @@ async function start(){ // d_net_create() // swarm_init() // d_start_router() + +// echo_router_config_cmd.stdout.on("data", (d)=>console.log(d)) // spawn_n_routers(1) const test = async()=>{ @@ -146,5 +148,4 @@ const test = async()=>{ } - -echo_router_config_cmd.stdout.on("data", (d)=>console.log(d)) \ No newline at end of file +test(); From cbad5cfa8c604638d34bd05cd3133da0d058eea8 Mon Sep 17 00:00:00 2001 From: Marcus H Date: Thu, 27 May 2021 15:33:20 -0600 Subject: [PATCH 12/14] static configuration for multiple routers --- .../src/load/helpers/dockerNodeConfig.ts | 237 +++++++------- .../src/load/helpers/dockerNodeMgmt.ts | 17 +- .../src/load/helpers/routerLoadTest.ts | 43 +-- simnet_compose.yml | 304 ++++++++++++++++++ 4 files changed, 446 insertions(+), 155 deletions(-) create mode 100644 simnet_compose.yml diff --git a/modules/test-runner/src/load/helpers/dockerNodeConfig.ts b/modules/test-runner/src/load/helpers/dockerNodeConfig.ts index 70def77c0..1edbf63bb 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeConfig.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeConfig.ts @@ -4,8 +4,67 @@ const router_server_config = { public_url:`http://127.0.0.1:9002/ping`, } -export const node_config_json = - { + +export const messaging_config = +`version: '3.4' + +secrets: + vector_jwt_public_key: + external: true + vector_jwt_private_key: + external: true + +networks: + vector: + external: true + +volumes: + certs: + +services: + + auth: + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '100m' + image: 'vector_builder:latest' + entrypoint: 'bash modules/auth/ops/entry.sh' + ports: + - '5040:5040' + volumes: + - '/home/z/Development/vector:/app' + environment: + VECTOR_JWT_SIGNER_PUBLIC_KEY_FILE: '/run/secrets/vector_jwt_public_key' + VECTOR_JWT_SIGNER_PRIVATE_KEY_FILE: '/run/secrets/vector_jwt_private_key' + VECTOR_NATS_URL: 'nats://nats:4222' + VECTOR_ADMIN_TOKEN: 'cxt1234' + VECTOR_PORT: '5040' + VECTOR_PROD: 'false' + secrets: + - 'vector_jwt_private_key' + - 'vector_jwt_public_key' + + nats: + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '100m' + image: 'vector_nats:latest' + environment: + JWT_SIGNER_PUBLIC_KEY_FILE: '/run/secrets/vector_jwt_public_key' + secrets: + - 'vector_jwt_public_key' + ports: + - '4222:4222' + - '4221:4221' +` +export const node_config_json:string = + `{ "adminToken": "cxt1234", "chainAddresses": { "1337": { @@ -25,10 +84,13 @@ export const node_config_json = }, "logLevel": "info", "messagingUrl": "", + "authUrl": "172.17.0.1:4222", + "natsUrl":"172.17.0.1:4221", "production": false } +` -export const router_config = { +export const router_config:string = `{ "allowedSwaps": [ { "fromChainId": 1337, @@ -80,136 +142,53 @@ export const router_config = { } ] } -const project = 'vector' -const production = 'false' +` const eth_mnemonic = 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' -const eth_mnemonic_file = ""; - -const stack_secrets = '' -const VECTOR_CONFIG = node_config_json; -const VECTOR_PROD = false; -const node_internal_port = "8000" -const VECTOR_NODE_URL = 'http://node:' + node_internal_port; -const VECTOR_DATABASE_URL = "" -const VECTOR_PG_DATABASE = "vector" -const VECTOR_PG_HOST = "database-node" -const VECTOR_PG_PASSWORD = "" -//or 'vector for password -const VECTOR_PG_PASSWORD_FILE = '/run/secrets/$db_secret' -const VECTOR_PG_PORT = '5432' -const VECTOR_PG_USERNAME = 'vector' - -// router_image_name="${project}_builder:$version"; -// router_image="image: '$router_image_name' -// entrypoint: 'bash modules/router/ops/entry.sh' -// volumes: -// - '$root:/app' -// ports: -// - '$router_public_port:$router_internal_port'" -// echo "${stack}_router will be exposed on *:$router_public_port" -// fi -// bash "$root/ops/pull-images.sh" "$router_image_name" > /dev/null - const router_image_name = "vector_builder:0.2.2-beta.2" -const router_image = `${router_image_name} -entrypoint: 'bash modules/router/ops/entry.sh' - volumes: - - '$root:/app' - ports: - - ${router_server_config.public_port}:${router_server_config.internal_port} - -` -export const pull_router_image_opts = ["./ops/pull-images.sh", `${router_image_name}`, '> /dev/null'] - -const common = ` - networks: - - '$project' - logging: - driver: 'json-file' - options: - max-size: '10m' -` -export const docker_compose_configuration = -`version: '3.4' -networks: - ${project}: - external: true - -${stack_secrets} -volumes: - certs: - database_node: - database_router: - prometheus: - grafana: - -services: - - node: - $common - $node_image - environment: - VECTOR_CONFIG: ${node_config_json} - VECTOR_PROD: ${production} - VECTOR_MNEMONIC: '${eth_mnemonic}' - VECTOR_MNEMONIC_FILE: '${eth_mnemonic_file} - VECTOR_DATABASE_URL: ${VECTOR_DATABASE_URL} - VECTOR_PG_DATABASE: ${project} - VECTOR_PG_HOST: 'database-node' - VECTOR_PG_PASSWORD: '$pg_password' - VECTOR_PG_PASSWORD_FILE: '$pg_password_file' - VECTOR_PG_PORT: '5432' - VECTOR_PG_USERNAME: '$pg_user' - - router: - ${common} - ${router_image} - environment: - VECTOR_CONFIG: ${node_config_json} - VECTOR_PROD: ${production} - VECTOR_NODE_URL: 'http://node:$node_internal_port' - VECTOR_DATABASE_URL: ${VECTOR_DATABASE_URL} - VECTOR_PG_DATABASE: ${project} - VECTOR_PG_HOST: 'database-router' - VECTOR_PG_PASSWORD: "" - VECTOR_PG_PASSWORD_FILE: "" - VECTOR_PG_PORT: '5432' - VECTOR_PG_USERNAME: ${project} - VECTOR_MNEMONIC: '${eth_mnemonic}' - VECTOR_MNEMONIC_FILE: '${eth_mnemonic_file}' - - database-node: - $common - $database_image_node - environment: - AWS_ACCESS_KEY_ID: '$aws_access_id' - AWS_SECRET_ACCESS_KEY: '$aws_access_key' - POSTGRES_DB: '$pg_db' - POSTGRES_PASSWORD: '$pg_password' - POSTGRES_PASSWORD_FILE: '$pg_password_file' - POSTGRES_USER: '$project' - VECTOR_ADMIN_TOKEN: '$admin_token' - VECTOR_PROD: '$production' +export const pull_router_image_opts = ["./ops/pull-images.sh", `${router_image_name}`, '> /dev/null'] - database-router: - $common - $database_image_router - environment: - AWS_ACCESS_KEY_ID: '$aws_access_id' - AWS_SECRET_ACCESS_KEY: '$aws_access_key' - POSTGRES_DB: '$pg_db' - POSTGRES_PASSWORD: '$pg_password' - POSTGRES_PASSWORD_FILE: '$pg_password_file' - POSTGRES_USER: '$project' - VECTOR_ADMIN_TOKEN: '$admin_token' - VECTOR_PROD: '$production' - $observability_services +// const msg_url = `{ adminToken: cxt1234, chainAddresses: { 1337: { channelFactoryAddress: 0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da, testTokenAddress: 0x9FBDa871d559710256a2502A2517b794B482Db40, transferRegistryAddress: 0x8f0483125FCb9aaAEFA9209D8E9d7b9C8B9Fb90F, hashlockTransferAddress: 0x345cA3e014Aaf5dcA488057592ee47305D9B3e10 }, 1338: { channelFactoryAddress: 0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da, testTokenAddress: 0x9FBDa871d559710256a2502A2517b794B482Db40, transferRegistryAddress: 0x8f0483125FCb9aaAEFA9209D8E9d7b9C8B9Fb90F, hashlockTransferAddress: 0x345cA3e014Aaf5dcA488057592ee47305D9B3e10 } }, chainProviders: { 1337: http://evm_1337:8545, 1338: http://evm_1338:8545 }, logLevel: info, messagingUrl:"", "authUrl": "172.17.0.1:4222","natsUrl":"172.17.0.1:4221", production: false, allowedSwaps: [ { fromChainId: 1337, toChainId: 1338, fromAssetId: 0x0000000000000000000000000000000000000000, toAssetId: 0x0000000000000000000000000000000000000000, priceType: hardcoded, hardcodedRate: 1 }, { fromChainId: 1337, toChainId: 1338, fromAssetId: 0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0, toAssetId: 0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0, priceType: hardcoded, hardcodedRate: 1 } ], rebalanceProfiles: [ { chainId: 1337, assetId: 0x0000000000000000000000000000000000000000, reclaimThreshold: 200000000000000000, target: 100000000000000000, collateralizeThreshold: 50000000000000000 }, { chainId: 1338, assetId: 0x0000000000000000000000000000000000000000, reclaimThreshold: 200000000000000000, target: 100000000000000000, collateralizeThreshold: 50000000000000000 }, { chainId: 1337, assetId: 0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0, reclaimThreshold: 2000000000000000000, target: 1000000000000000000, collateralizeThreshold: 500000000000000000 }, { chainId: 1338, assetId: 0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0, reclaimThreshold: 2000000000000000000, target: 1000000000000000000, collateralizeThreshold: 500000000000000000 } ]}` +const msg_url = `{ adminToken: cxt1234, chainAddresses: { 1337: { channelFactoryAddress: 0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da, testTokenAddress: 0x9FBDa871d559710256a2502A2517b794B482Db40, transferRegistryAddress: 0x8f0483125FCb9aaAEFA9209D8E9d7b9C8B9Fb90F, hashlockTransferAddress: 0x345cA3e014Aaf5dcA488057592ee47305D9B3e10 }, 1338: { channelFactoryAddress: 0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da, testTokenAddress: 0x9FBDa871d559710256a2502A2517b794B482Db40, transferRegistryAddress: 0x8f0483125FCb9aaAEFA9209D8E9d7b9C8B9Fb90F, hashlockTransferAddress: 0x345cA3e014Aaf5dcA488057592ee47305D9B3e10 } }, chainProviders: { 1337: http://evm_1337:8545, 1338: http://evm_1338:8545 }, logLevel: info, messagingUrl: , production: false, allowedSwaps: [ { fromChainId: 1337, toChainId: 1338, fromAssetId: 0x0000000000000000000000000000000000000000, toAssetId: 0x0000000000000000000000000000000000000000, priceType: hardcoded, hardcodedRate: 1 }, { fromChainId: 1337, toChainId: 1338, fromAssetId: 0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0, toAssetId: 0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0, priceType: hardcoded, hardcodedRate: 1 } ], rebalanceProfiles: [ { chainId: 1337, assetId: 0x0000000000000000000000000000000000000000, reclaimThreshold: 200000000000000000, target: 100000000000000000, collateralizeThreshold: 50000000000000000 }, { chainId: 1338, assetId: 0x0000000000000000000000000000000000000000, reclaimThreshold: 200000000000000000, target: 100000000000000000, collateralizeThreshold: 50000000000000000 }, { chainId: 1337, assetId: 0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0, reclaimThreshold: 2000000000000000000, target: 1000000000000000000, collateralizeThreshold: 500000000000000000 }, { chainId: 1338, assetId: 0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0, reclaimThreshold: 2000000000000000000, target: 1000000000000000000, collateralizeThreshold: 500000000000000000 } ]}` +const v_config = `{ + "adminToken": "cxt1234", + "chainAddresses": {}, + "chainProviders": { + "4": "https://rinkeby.infura.io" + }, + "logLevel": "info", + "messagingUrl": "", + "production": false, + "allowedSwaps": [ + { + "fromChainId": 4, + "toChainId": 4, + "fromAssetId": "0x0000000000000000000000000000000000000000", + "toAssetId": "0x0000000000000000000000000000000000000000", + "priceType": "hardcoded", + "hardcodedRate": "1" + } + ], + "rebalanceProfiles": [ + { + "chainId": 4, + "assetId": "0x0000000000000000000000000000000000000000", + "reclaimThreshold": "1", + "target": "0", + "collateralizeThreshold": "0" + } + ] +}` -EOF` +const getMnemonic = () => {return `'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat'`} +const getVectorConfig = ()=>{ + const n_config = node_config_json.replace(/\n/g, ''); + const r_config = router_config.replace(/\n/g, '') + return `${n_config},${r_config}` +} export const test_docker_compose_configuration = `version: '3.4' @@ -240,11 +219,11 @@ services: volumes: - '/home/z/Development/vector:/app' ports: - - '8002:8000' + environment: - VECTOR_CONFIG: '{ "adminToken": "cxt1234", "chainAddresses": { "1337": { "channelFactoryAddress": "0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da", "testTokenAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40", "transferRegistryAddress": "0x8f0483125FCb9aaAEFA9209D8E9d7b9C8B9Fb90F", "hashlockTransferAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10" }, "1338": { "channelFactoryAddress": "0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da", "testTokenAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40", "transferRegistryAddress": "0x8f0483125FCb9aaAEFA9209D8E9d7b9C8B9Fb90F", "hashlockTransferAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10" } }, "chainProviders": { "1337": "http://evm_1337:8545", "1338": "http://evm_1338:8545" }, "logLevel": "info", "messagingUrl": "", "production": false, "allowedSwaps": [ { "fromChainId": 1337, "toChainId": 1338, "fromAssetId": "0x0000000000000000000000000000000000000000", "toAssetId": "0x0000000000000000000000000000000000000000", "priceType": "hardcoded", "hardcodedRate": "1" }, { "fromChainId": 1337, "toChainId": 1338, "fromAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "toAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "priceType": "hardcoded", "hardcodedRate": "1" } ], "rebalanceProfiles": [ { "chainId": 1337, "assetId": "0x0000000000000000000000000000000000000000", "reclaimThreshold": "200000000000000000", "target": "100000000000000000", "collateralizeThreshold": "50000000000000000" }, { "chainId": 1338, "assetId": "0x0000000000000000000000000000000000000000", "reclaimThreshold": "200000000000000000", "target": "100000000000000000", "collateralizeThreshold": "50000000000000000" }, { "chainId": 1337, "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "reclaimThreshold": "2000000000000000000", "target": "1000000000000000000", "collateralizeThreshold": "500000000000000000" }, { "chainId": 1338, "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "reclaimThreshold": "2000000000000000000", "target": "1000000000000000000", "collateralizeThreshold": "500000000000000000" } ]}' + VECTOR_CONFIG:'${v_config}' VECTOR_PROD: 'false' - VECTOR_MNEMONIC: 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' + VECTOR_MNEMONIC: ${getMnemonic()} VECTOR_MNEMONIC_FILE: '' VECTOR_DATABASE_URL: '' VECTOR_PG_DATABASE: 'vector' @@ -266,7 +245,7 @@ services: volumes: - '/home/z/Development/vector:/app' ports: - - '9002:9002' + environment: VECTOR_CONFIG: '{ "adminToken": "cxt1234", "chainAddresses": { "1337": { "channelFactoryAddress": "0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da", "testTokenAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40", "transferRegistryAddress": "0x8f0483125FCb9aaAEFA9209D8E9d7b9C8B9Fb90F", "hashlockTransferAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10" }, "1338": { "channelFactoryAddress": "0xF12b5dd4EAD5F743C6BaA640B0216200e89B60Da", "testTokenAddress": "0x9FBDa871d559710256a2502A2517b794B482Db40", "transferRegistryAddress": "0x8f0483125FCb9aaAEFA9209D8E9d7b9C8B9Fb90F", "hashlockTransferAddress": "0x345cA3e014Aaf5dcA488057592ee47305D9B3e10" } }, "chainProviders": { "1337": "http://evm_1337:8545", "1338": "http://evm_1338:8545" }, "logLevel": "info", "messagingUrl": "", "production": false, "allowedSwaps": [ { "fromChainId": 1337, "toChainId": 1338, "fromAssetId": "0x0000000000000000000000000000000000000000", "toAssetId": "0x0000000000000000000000000000000000000000", "priceType": "hardcoded", "hardcodedRate": "1" }, { "fromChainId": 1337, "toChainId": 1338, "fromAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "toAssetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "priceType": "hardcoded", "hardcodedRate": "1" } ], "rebalanceProfiles": [ { "chainId": 1337, "assetId": "0x0000000000000000000000000000000000000000", "reclaimThreshold": "200000000000000000", "target": "100000000000000000", "collateralizeThreshold": "50000000000000000" }, { "chainId": 1338, "assetId": "0x0000000000000000000000000000000000000000", "reclaimThreshold": "200000000000000000", "target": "100000000000000000", "collateralizeThreshold": "50000000000000000" }, { "chainId": 1337, "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "reclaimThreshold": "2000000000000000000", "target": "1000000000000000000", "collateralizeThreshold": "500000000000000000" }, { "chainId": 1338, "assetId": "0x8CdaF0CD259887258Bc13a92C0a6dA92698644C0", "reclaimThreshold": "2000000000000000000", "target": "1000000000000000000", "collateralizeThreshold": "500000000000000000" } ]}' VECTOR_PROD: 'false' diff --git a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts index d48ae4041..294c990ff 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts @@ -1,6 +1,6 @@ import {spawn, exec} from 'child_process' import { - docker_compose_configuration, + messaging_config, pull_router_image_opts, test_docker_compose_configuration, } from "./dockerNodeConfig"; @@ -131,7 +131,7 @@ class SpawnProcess { } while(this.handler.success === undefined){ - await delay(400); + await delay(20); } return this.handler.success; @@ -140,10 +140,15 @@ class SpawnProcess { } -export const echo_router_config_cmd = spawn(`bash`, [`echo "${test_docker_compose_configuration}" > router.config.test.yml`]) +// export const echo_router_config_cmd = spawn(`bash`, ['-c', `echo "${test_docker_compose_configuration}" > router.config.test.yml`]) +// export const echo_messaging_config_cmd = spawn(`bash`, ['-c',`echo "${messaging_config}" > messaging.config.test.yml`]) -const bashCommand: Command = {cmd:'docker', args:["stack", "deploy", "-c", "router.config.test.yml", "router"]}; -const handler:ProcessHandler = new ProcessHandler(""); -export const test_process:SpawnProcess = new SpawnProcess(bashCommand, handler); +const messagingStart: Command = {cmd:'docker', args:["stack", "deploy", "-c", "messaging.config.test.yml", "messaging"]}; +const messaging_handler:ProcessHandler = new ProcessHandler(""); +export const start_messaging:SpawnProcess = new SpawnProcess(messagingStart, messaging_handler); + +const routerStart: Command = {cmd:'docker', args:["stack", "deploy", "-c", "simnet_compose.yml", "router"]}; +const test_handler:ProcessHandler = new ProcessHandler(""); +export const test_process:SpawnProcess = new SpawnProcess(routerStart, test_handler); diff --git a/modules/test-runner/src/load/helpers/routerLoadTest.ts b/modules/test-runner/src/load/helpers/routerLoadTest.ts index 672999f10..fd6415192 100644 --- a/modules/test-runner/src/load/helpers/routerLoadTest.ts +++ b/modules/test-runner/src/load/helpers/routerLoadTest.ts @@ -1,12 +1,12 @@ -import { Wallet, utils, constants } from "ethers"; +import { Wallet, utils, constants, providers } from "ethers"; import {env, fundIfBelow, getRandomIndex} from "../../utils"; import { EngineEvents, INodeService, TransferNames } from "@connext/vector-types"; import {RestServerNodeService} from "@connext/vector-utils"; import pino from "pino"; import {carolEvts} from "./setupServer"; import { - chainId1, - deposit, + chainId1, chainId2, + deposit, provider2, setup, wallet1, wallet2, @@ -18,15 +18,15 @@ import { swarm_init, d_start_router, spawn_n_routers, - test_process, - echo_router_config_cmd, + start_messaging, + test_process } from "./dockerNodeMgmt"; const logger = pino({ level: env.logLevel }); //??is there a difference between doug and carol ? const testName:string = 'Router Load Test' -const rogerURL:string = "localhost?" +const rogerURL:string = "http://localhost:8014" const carolURL:string = "localhost??" @@ -49,10 +49,13 @@ async function setupRoger() { ) //fund roger // Default collateral is 0.1 ETH - await fundIfBelow(roger.signerAddress, constants.AddressZero, min.mul(15), wallet1); - if (wallet2) { - await fundIfBelow(roger.signerAddress, constants.AddressZero, min.mul(15), wallet2); - } + const provider2 = new providers.JsonRpcProvider("https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9"); + const w = Wallet.fromMnemonic(env.sugarDaddy!).connect(provider2); + console.log(w) + // await fundIfBelow(roger.signerAddress, constants.AddressZero, min.mul(15), w); + // if (wallet2) { + // await fundIfBelow(roger.signerAddress, constants.AddressZero, min.mul(15), wallet2); + // } return roger } @@ -130,22 +133,22 @@ async function start(){ //setup channel between all carols and the random node } + + // d_net_create() // swarm_init() // d_start_router() - -// echo_router_config_cmd.stdout.on("data", (d)=>console.log(d)) // spawn_n_routers(1) const test = async()=>{ - const test_resCode = test_process.exec(); - - // const test_res = await test_process.getResult(); - // if(test_res){ - // console.log("test_res" + test_res) - // } - console.log("test_res" + test_resCode) + const messaging = start_messaging.exec(); + const router_a = test_process.exec(); +} +// test(); +const setupR = async()=> { + const roger = await setupRoger(); + console.log(roger) } -test(); +setupR() \ No newline at end of file diff --git a/simnet_compose.yml b/simnet_compose.yml new file mode 100644 index 000000000..3e75c5b42 --- /dev/null +++ b/simnet_compose.yml @@ -0,0 +1,304 @@ +version: '3.8' + +networks: + vector: + vector1: + +volumes: + database_node: + driver_opts: + type: tmpfs + device: tmpfs + database_router0: + driver_opts: + type: tmpfs + device: tmpfs + database_node1: + driver_opts: + type: tmpfs + device: tmpfs + database_router1: + driver_opts: + type: tmpfs + device: tmpfs + +services: + + node: + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'connextproject/vector_node:0.2.5-beta.16' + restart: always + ports: + - '8002:8000' + environment: + VECTOR_CONFIG: '{ + "adminToken": "cxt1234", + "chainAddresses": {}, + "chainProviders": { + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + }, + "logLevel": "info", + "messagingUrl": "https://messaging.connext.network", + "production": false, + "allowedSwaps": [ + { + "fromChainId": 4, + "toChainId": 4, + "fromAssetId": "0x0000000000000000000000000000000000000000", + "toAssetId": "0x0000000000000000000000000000000000000000", + "priceType": "hardcoded", + "hardcodedRate": "1" + } + ], + "rebalanceProfiles": [ + { + "chainId": 4, + "assetId": "0x0000000000000000000000000000000000000000", + "reclaimThreshold": "1", + "target": "0", + "collateralizeThreshold": "0" + } + ] +}' + VECTOR_PROD: 'true' + VECTOR_MNEMONIC: 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' + VECTOR_PG_DATABASE: 'vector' + VECTOR_PG_HOST: 'database-node' + VECTOR_PG_PASSWORD: 'vector' + VECTOR_PG_PORT: '5432' + VECTOR_PG_USERNAME: 'vector' + + + + router: + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'connextproject/vector_router:0.2.5-beta.16' + environment: + VECTOR_CONFIG: '{ + "adminToken": "cxt1234", + "chainAddresses": {}, + "chainProviders": { + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + }, + "logLevel": "info", + "messagingUrl": "https://messaging.connext.network", + "production": false, + "allowedSwaps": [ + { + "fromChainId": 4, + "toChainId": 4, + "fromAssetId": "0x0000000000000000000000000000000000000000", + "toAssetId": "0x0000000000000000000000000000000000000000", + "priceType": "hardcoded", + "hardcodedRate": "1" + } + ], + "rebalanceProfiles": [ + { + "chainId": 4, + "assetId": "0x0000000000000000000000000000000000000000", + "reclaimThreshold": "1", + "target": "0", + "collateralizeThreshold": "0" + } + ] +}' + VECTOR_PROD: 'true' + VECTOR_NODE_URL: 'http://node:8000' + VECTOR_PG_DATABASE: 'vector' + VECTOR_PG_HOST: 'database-router0' + VECTOR_PG_PASSWORD: 'vector' + VECTOR_PG_PORT: '5432' + VECTOR_PG_USERNAME: 'vector' + VECTOR_MNEMONIC: 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' + + database-node: + volumes: + - database_node:/var/lib/postgresql/data + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'vector_database:latest' + + environment: + AWS_ACCESS_KEY_ID: '' + AWS_SECRET_ACCESS_KEY: '' + POSTGRES_DB: 'vector' + POSTGRES_PASSWORD: 'vector' + POSTGRES_PASSWORD_FILE: '' + POSTGRES_USER: 'vector' + VECTOR_ADMIN_TOKEN: 'cxt1234' + VECTOR_PROD: 'true' + + database-router0: + volumes: + - database_router0:/var/lib/postgresql/data + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'vector_database:latest' + + environment: + AWS_ACCESS_KEY_ID: '' + AWS_SECRET_ACCESS_KEY: '' + POSTGRES_DB: 'vector' + POSTGRES_PASSWORD: 'vector' + POSTGRES_PASSWORD_FILE: '' + POSTGRES_USER: 'vector' + VECTOR_ADMIN_TOKEN: 'cxt1234' + VECTOR_PROD: 'true' + + node1: + networks: + - 'vector1' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'connextproject/vector_node:0.2.5-beta.16' + restart: always + ports: + - '8014:8000' + environment: + VECTOR_CONFIG: '{ + "adminToken": "cxt1234", + "chainAddresses": {}, + "chainProviders": { + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + }, + "logLevel": "info", + "messagingUrl": "https://messaging.connext.network", + "production": false, + "allowedSwaps": [ + { + "fromChainId": 4, + "toChainId": 4, + "fromAssetId": "0x0000000000000000000000000000000000000000", + "toAssetId": "0x0000000000000000000000000000000000000000", + "priceType": "hardcoded", + "hardcodedRate": "1" + } + ], + "rebalanceProfiles": [ + { + "chainId": 4, + "assetId": "0x0000000000000000000000000000000000000000", + "reclaimThreshold": "1", + "target": "0", + "collateralizeThreshold": "0" + } + ] +}' + VECTOR_PROD: 'true' + VECTOR_MNEMONIC: 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' + VECTOR_PG_DATABASE: 'vector' + VECTOR_PG_PASSWORD: 'vector' + VECTOR_PG_PORT: '5432' + VECTOR_PG_USERNAME: 'vector' + + + router1: + networks: + - 'vector1' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'connextproject/vector_router:0.2.5-beta.16' + environment: + VECTOR_CONFIG: '{ + "adminToken": "cxt1234", + "chainAddresses": {}, + "chainProviders": { + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + }, + "logLevel": "info", + "messagingUrl": "https://messaging.connext.network", + "production": false, + "allowedSwaps": [ + { + "fromChainId": 4, + "toChainId": 4, + "fromAssetId": "0x0000000000000000000000000000000000000000", + "toAssetId": "0x0000000000000000000000000000000000000000", + "priceType": "hardcoded", + "hardcodedRate": "1" + } + ], + "rebalanceProfiles": [ + { + "chainId": 4, + "assetId": "0x0000000000000000000000000000000000000000", + "reclaimThreshold": "1", + "target": "0", + "collateralizeThreshold": "0" + } + ] +}' + VECTOR_PROD: 'true' + VECTOR_NODE_URL: 'http://node1:8000' + VECTOR_PG_DATABASE: 'vector' + VECTOR_PG_HOST: 'database-router1' + VECTOR_PG_PASSWORD: 'vector' + VECTOR_PG_PORT: '5432' + VECTOR_PG_USERNAME: 'vector' + VECTOR_MNEMONIC: 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' + + database-node1: + volumes: + - database_node1:/var/lib/postgresql/data + networks: + - 'vector1' + logging: + driver: 'json-file' + options: + max-size: '10m' + + image: 'vector_database:latest' + + environment: + AWS_ACCESS_KEY_ID: '' + AWS_SECRET_ACCESS_KEY: '' + POSTGRES_DB: 'vector' + POSTGRES_PASSWORD: 'vector' + POSTGRES_PASSWORD_FILE: '' + POSTGRES_USER: 'vector' + VECTOR_ADMIN_TOKEN: 'cxt1234' + VECTOR_PROD: 'true' +# + database-router1: + volumes: + - database_router1:/var/lib/postgresql/data + networks: + - 'vector1' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'vector_database:latest' + + environment: + AWS_ACCESS_KEY_ID: '' + AWS_SECRET_ACCESS_KEY: '' + POSTGRES_DB: 'vector' + POSTGRES_PASSWORD: 'vector' + POSTGRES_PASSWORD_FILE: '' + POSTGRES_USER: 'vector' + VECTOR_ADMIN_TOKEN: 'cxt1234' + VECTOR_PROD: 'true' From 888b07bc712c9c171b645dbf7b4d102aab940c3d Mon Sep 17 00:00:00 2001 From: z Date: Fri, 28 May 2021 13:32:16 -0600 Subject: [PATCH 13/14] have rodger and carol setups working --- .../src/load/helpers/routerLoadTest.ts | 86 +++++++-- package-lock.json | 12 +- simnet_compose.yml | 166 ++++++++++++++++-- 3 files changed, 231 insertions(+), 33 deletions(-) diff --git a/modules/test-runner/src/load/helpers/routerLoadTest.ts b/modules/test-runner/src/load/helpers/routerLoadTest.ts index fd6415192..a56f36251 100644 --- a/modules/test-runner/src/load/helpers/routerLoadTest.ts +++ b/modules/test-runner/src/load/helpers/routerLoadTest.ts @@ -38,8 +38,6 @@ async function setupRoger() { //verify below // const routerIndex = 0; const events = undefined; - const min = utils.parseEther("0.1"); - const roger = await RestServerNodeService.connect( rogerURL, @@ -49,13 +47,8 @@ async function setupRoger() { ) //fund roger // Default collateral is 0.1 ETH - const provider2 = new providers.JsonRpcProvider("https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9"); - const w = Wallet.fromMnemonic(env.sugarDaddy!).connect(provider2); - console.log(w) - // await fundIfBelow(roger.signerAddress, constants.AddressZero, min.mul(15), w); - // if (wallet2) { - // await fundIfBelow(roger.signerAddress, constants.AddressZero, min.mul(15), wallet2); - // } + const provider2 = new providers.JsonRpcProvider("https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9"); + const w = Wallet.fromMnemonic('program biology gasp gentle describe boring suspect raven favorite uphold salon crater').connect(provider2); return roger } @@ -140,15 +133,78 @@ async function start(){ // d_start_router() // spawn_n_routers(1) -const test = async()=>{ +const start_stack = async()=>{ const messaging = start_messaging.exec(); const router_a = test_process.exec(); } -// test(); -const setupR = async()=> { - const roger = await setupRoger(); - console.log(roger) +const r0Address = '0x36e6dEdC5554b2e1fedFb1627Be4D703f0da2B6D' +const r1Address = '0xE3E44bd168C03393d9Ef2E8B304686023E2ca233'; +const daveAddress = '0xA383539Ae895Db1ABF4F6381eB082455366CF93c'; +const carolAddress = '0x6D9B09e55e6341B019eB5CB05067d51cb058D788'; + +const g_provider = new providers.JsonRpcProvider("https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9"); +const r_provider = new providers.JsonRpcProvider("https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9"); + +const getBalances = async function(provider){ + const addressesToCheck = [r0Address,r1Address,daveAddress,carolAddress]; + + let allAddressesHaveETH = true; + for(let i=0; iR0 Setup: ", cr0Post) + +} +// start_stack() + +main() \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e268a30ae..ad8fd546a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19829,11 +19829,21 @@ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, + "node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, "node-fetch": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=" }, + "node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" + }, "normalize-url": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", @@ -22010,7 +22020,7 @@ } }, "ethereumjs-abi": { - "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#1a27c59c15ab1e95ee8e5c4ed6ad814c49cc439e", + "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#ee3994657fa7a427238e6ba92a84d0b529bbcde0", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "requires": { "bn.js": "^4.11.8", diff --git a/simnet_compose.yml b/simnet_compose.yml index 3e75c5b42..86dcda29a 100644 --- a/simnet_compose.yml +++ b/simnet_compose.yml @@ -17,6 +17,14 @@ volumes: driver_opts: type: tmpfs device: tmpfs + database_carol: + driver_opts: + type: tmpfs + device: tmpfs + database_dave: + driver_opts: + type: tmpfs + device: tmpfs database_router1: driver_opts: type: tmpfs @@ -40,15 +48,16 @@ services: "adminToken": "cxt1234", "chainAddresses": {}, "chainProviders": { - "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", + "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" }, "logLevel": "info", "messagingUrl": "https://messaging.connext.network", - "production": false, + "production": true, "allowedSwaps": [ { "fromChainId": 4, - "toChainId": 4, + "toChainId": 5, "fromAssetId": "0x0000000000000000000000000000000000000000", "toAssetId": "0x0000000000000000000000000000000000000000", "priceType": "hardcoded", @@ -66,15 +75,14 @@ services: ] }' VECTOR_PROD: 'true' - VECTOR_MNEMONIC: 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' + VECTOR_MNEMONIC: 'glad focus asset predict monkey worth way talk unhappy hazard area squeeze' +# Address: '0x36e6dEdC5554b2e1fedFb1627Be4D703f0da2B6D' VECTOR_PG_DATABASE: 'vector' VECTOR_PG_HOST: 'database-node' VECTOR_PG_PASSWORD: 'vector' VECTOR_PG_PORT: '5432' VECTOR_PG_USERNAME: 'vector' - - router: networks: - 'vector' @@ -88,15 +96,16 @@ services: "adminToken": "cxt1234", "chainAddresses": {}, "chainProviders": { - "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", + "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" }, "logLevel": "info", "messagingUrl": "https://messaging.connext.network", - "production": false, + "production": true, "allowedSwaps": [ { "fromChainId": 4, - "toChainId": 4, + "toChainId": 5, "fromAssetId": "0x0000000000000000000000000000000000000000", "toAssetId": "0x0000000000000000000000000000000000000000", "priceType": "hardcoded", @@ -120,7 +129,7 @@ services: VECTOR_PG_PASSWORD: 'vector' VECTOR_PG_PORT: '5432' VECTOR_PG_USERNAME: 'vector' - VECTOR_MNEMONIC: 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' + VECTOR_MNEMONIC: 'glad focus asset predict monkey worth way talk unhappy hazard area squeeze' database-node: volumes: @@ -180,11 +189,13 @@ services: "adminToken": "cxt1234", "chainAddresses": {}, "chainProviders": { - "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", + "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + }, "logLevel": "info", "messagingUrl": "https://messaging.connext.network", - "production": false, + "production": true, "allowedSwaps": [ { "fromChainId": 4, @@ -206,7 +217,8 @@ services: ] }' VECTOR_PROD: 'true' - VECTOR_MNEMONIC: 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' + VECTOR_MNEMONIC: 'program biology gasp gentle describe boring suspect raven favorite uphold salon crater' +# Addresss : 0xE3E44bd168C03393d9Ef2E8B304686023E2ca233 VECTOR_PG_DATABASE: 'vector' VECTOR_PG_PASSWORD: 'vector' VECTOR_PG_PORT: '5432' @@ -226,15 +238,16 @@ services: "adminToken": "cxt1234", "chainAddresses": {}, "chainProviders": { - "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", + "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" }, "logLevel": "info", "messagingUrl": "https://messaging.connext.network", - "production": false, + "production": true, "allowedSwaps": [ { "fromChainId": 4, - "toChainId": 4, + "toChainId": 5, "fromAssetId": "0x0000000000000000000000000000000000000000", "toAssetId": "0x0000000000000000000000000000000000000000", "priceType": "hardcoded", @@ -248,6 +261,13 @@ services: "reclaimThreshold": "1", "target": "0", "collateralizeThreshold": "0" + }, + { + "chainId": 5, + "assetId": "0x0000000000000000000000000000000000000000", + "reclaimThreshold": "1", + "target": "0", + "collateralizeThreshold": "0" } ] }' @@ -258,7 +278,9 @@ services: VECTOR_PG_PASSWORD: 'vector' VECTOR_PG_PORT: '5432' VECTOR_PG_USERNAME: 'vector' - VECTOR_MNEMONIC: 'candy maple cake sugar pudding cream honey rich smooth crumble sweet treat' + VECTOR_MNEMONIC: 'program biology gasp gentle describe boring suspect raven favorite uphold salon crater' + # Addresss : 0xE3E44bd168C03393d9Ef2E8B304686023E2ca233 + database-node1: volumes: @@ -302,3 +324,113 @@ services: POSTGRES_USER: 'vector' VECTOR_ADMIN_TOKEN: 'cxt1234' VECTOR_PROD: 'true' + + + carol_node: + networks: + - 'vector1' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'connextproject/vector_node:0.2.5-beta.16' + restart: always + ports: + - '8004:8000' + environment: + VECTOR_CONFIG: '{ + "adminToken": "cxt1234", + "chainAddresses": {}, + "chainProviders": { + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", + "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + + }, + "logLevel": "info", + "messagingUrl": "https://messaging.connext.network", + "production": true +}' + VECTOR_PROD: 'true' + VECTOR_MNEMONIC: 'hood path despair ranch version fiber hope people wise angle avocado suit' +# Address: '0x6D9B09e55e6341B019eB5CB05067d51cb058D788' + VECTOR_PG_DATABASE: 'vector' + VECTOR_PG_HOST: 'database_carol' + VECTOR_PG_PASSWORD: 'vector' + VECTOR_PG_PORT: '5432' + VECTOR_PG_USERNAME: 'vector' + + database_carol: + volumes: + - database_carol:/var/lib/postgresql/data + networks: + - 'vector1' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'vector_database:latest' + + environment: + AWS_ACCESS_KEY_ID: '' + AWS_SECRET_ACCESS_KEY: '' + POSTGRES_DB: 'vector' + POSTGRES_PASSWORD: 'vector' + POSTGRES_PASSWORD_FILE: '' + POSTGRES_USER: 'vector' + VECTOR_ADMIN_TOKEN: 'cxt1234' + VECTOR_PROD: 'true' + + dave_node: + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'connextproject/vector_node:0.2.5-beta.16' + restart: always + ports: + - '8005:8000' + environment: + VECTOR_CONFIG: '{ + "adminToken": "cxt1234", + "chainAddresses": {}, + "chainProviders": { + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", + "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + + }, + "logLevel": "info", + "messagingUrl": "https://messaging.connext.network", + "production": true +}' + VECTOR_PROD: 'true' + VECTOR_MNEMONIC: 'apart tomorrow mango disorder amused dutch number fruit canvas hold august raise' +# Address: '0xA383539Ae895Db1ABF4F6381eB082455366CF93c' + + VECTOR_PG_DATABASE: 'vector' + VECTOR_PG_HOST: 'database_dave' + VECTOR_PG_PASSWORD: 'vector' + VECTOR_PG_PORT: '5432' + VECTOR_PG_USERNAME: 'vector' + + database_dave: + volumes: + - database_dave:/var/lib/postgresql/data + networks: + - 'vector' + logging: + driver: 'json-file' + options: + max-size: '10m' + image: 'vector_database:latest' + + environment: + AWS_ACCESS_KEY_ID: '' + AWS_SECRET_ACCESS_KEY: '' + POSTGRES_DB: 'vector' + POSTGRES_PASSWORD: 'vector' + POSTGRES_PASSWORD_FILE: '' + POSTGRES_USER: 'vector' + VECTOR_ADMIN_TOKEN: 'cxt1234' + VECTOR_PROD: 'true' From f760c3bf8f6ed7df7207f48a68f5ed49bfa34e3c Mon Sep 17 00:00:00 2001 From: z Date: Mon, 31 May 2021 18:12:57 -0600 Subject: [PATCH 14/14] Rahul pairing on transfers --- .../src/load/helpers/dockerNodeMgmt.ts | 10 +- .../src/load/helpers/routerLoadTest.ts | 208 ++++++++++++++++-- modules/test-runner/src/utils/channel.ts | 2 +- simnet_compose.yml | 22 +- 4 files changed, 201 insertions(+), 41 deletions(-) diff --git a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts index 294c990ff..58294ba65 100644 --- a/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts +++ b/modules/test-runner/src/load/helpers/dockerNodeMgmt.ts @@ -24,13 +24,14 @@ export const d_start_router = ()=> exec( ((e,r)=>console.log(e,r)) ) - +//Start with script // export const spawn_router_start = spawn('bash',["ops/start-router.sh"], {shell:true}) export const echo_router_config = spawn(`bash`, ['-c',`echo "${test_docker_compose_configuration}" > router.config.test.yml`]) export const spawn_router_start = spawn('docker',["stack", "deploy", "-c", "router.config.test.yml", "router"], {shell:true}) +//Pull images // export const pull_router_image = spawn('bash', pull_router_image_opts); // const spawn_router_start = spawn('bash', pull_router_image_opts); @@ -101,17 +102,16 @@ class SpawnProcess { } register_events(){ - this.process.stderr.on('data', (event_data) => { - console.log("got err data" + event_data) + console.log("STDERR: " + event_data) }) this.process.stdout.on('data', (event_data) => { - console.log("got stdout data" + event_data) + console.log("STDOUT: " + event_data) this.handler.cb_stdout_data(event_data) }) this.process.stdout.on('close', (event_data) => { - console.log("got event close" + event_data) + console.log("PROCESS CLOSE: " + event_data) this.returnCode = this.handler.cb_stdout_close(event_data) }) } diff --git a/modules/test-runner/src/load/helpers/routerLoadTest.ts b/modules/test-runner/src/load/helpers/routerLoadTest.ts index a56f36251..3ff7cd2dc 100644 --- a/modules/test-runner/src/load/helpers/routerLoadTest.ts +++ b/modules/test-runner/src/load/helpers/routerLoadTest.ts @@ -1,7 +1,19 @@ -import { Wallet, utils, constants, providers } from "ethers"; +import { utils, constants, providers, BigNumber} from "ethers"; +import { getAddress } from "@ethersproject/address"; +import {ChannelFactory} from '@connext/vector-contracts' +import {Contract} from "@ethersproject/contracts" +import { Wallet } from "@ethersproject/wallet"; + + import {env, fundIfBelow, getRandomIndex} from "../../utils"; -import { EngineEvents, INodeService, TransferNames } from "@connext/vector-types"; -import {RestServerNodeService} from "@connext/vector-utils"; +import { + DEFAULT_CHANNEL_TIMEOUT, + EngineEvents, + FullChannelState, + INodeService, + TransferNames +} from "@connext/vector-types"; +import {getBalanceForAssetId, getRandomBytes32, RestServerNodeService} from "@connext/vector-utils"; import pino from "pino"; import {carolEvts} from "./setupServer"; import { @@ -27,8 +39,6 @@ const logger = pino({ level: env.logLevel }); const testName:string = 'Router Load Test' const rogerURL:string = "http://localhost:8014" -const carolURL:string = "localhost??" - let routers:RestServerNodeService[] = []; let nodes:RestServerNodeService[] = []; @@ -126,8 +136,6 @@ async function start(){ //setup channel between all carols and the random node } - - // d_net_create() // swarm_init() // d_start_router() @@ -138,7 +146,6 @@ const start_stack = async()=>{ const router_a = test_process.exec(); } - const r0Address = '0x36e6dEdC5554b2e1fedFb1627Be4D703f0da2B6D' const r1Address = '0xE3E44bd168C03393d9Ef2E8B304686023E2ca233'; const daveAddress = '0xA383539Ae895Db1ABF4F6381eB082455366CF93c'; @@ -167,44 +174,199 @@ const daveNodeURL = '8005' const r0NodeUrl = '8002' const r1Nodeurl = '8014' +const timeout = (ms)=> { + return new Promise(resolve => setTimeout(resolve, ms)); +} + +export const dynamicDeposit = async ( + depositor: INodeService, + counterparty: INodeService, + channelAddress: string, + assetId: string, + amount: BigNumber, + provider: providers.Provider + +): Promise => { + const channelRes = await depositor.getStateChannel({ channelAddress }); + const channel = channelRes.getValue()! as FullChannelState; + + const chainId = await provider.getNetwork().then((p)=>{return p.chainId}) + + //get depositor balance of asset + const beforeDepositBalance = (channel:FullChannelState, assetId:string)=>{ + const assetIdx = channel.assetIds.findIndex((a) => getAddress(a) === getAddress(assetId)); + if (assetIdx === -1) { + return "0"; + } + //todo: should we be looking for 0 or 1? + // return channel.balances[assetIdx].amount[participant === "alice" ? 0 : 1]; + return channel.balances[assetIdx].amount[1]; + } + + const beforeDepositBal = beforeDepositBalance(channel,assetId); + + console.log("doing a deposit for ", depositor.signerAddress) + const tx = await depositor.sendDepositTx({ + amount: amount.toString(), + assetId, + chainId: chainId, + channelAddress, + publicIdentifier: depositor.publicIdentifier + }) + + const tx_receipt = await provider.waitForTransaction(tx.getValue().txHash) + console.log("TX RECEIPT :", tx_receipt); + const depositRes = await depositor.reconcileDeposit({ + assetId, + channelAddress: channel.channelAddress, + publicIdentifier: depositor.publicIdentifier, + }); + + console.log("Dep RES :", depositRes.getValue()!); + + const depositorChannel = ( + await depositor.getStateChannel({ + channelAddress: channel.channelAddress, + publicIdentifier: depositor.publicIdentifier, + }) + ).getValue()! as FullChannelState; + + const counterpartyChannel = ( + await counterparty.getStateChannel({ + channelAddress: channel.channelAddress, + publicIdentifier: counterparty.publicIdentifier, + }) + ).getValue()!; + + + return depositorChannel + +} const main = async function(){ - const participantsHaveETH = await getBalances(g_provider) + const participantsHaveETH = await getBalances(g_provider) if(!participantsHaveETH){return;} - const urlBase = "http://localhost:" - const index = 6969 - const daveService = await RestServerNodeService.connect( - urlBase + daveNodeURL, - logger.child({testName, name:"Dave"}), - undefined, - index) + const urlBase = "http://localhost:" + const net = await g_provider.getNetwork() + const chainId = net.chainId; const carolService = await RestServerNodeService.connect( urlBase + carolNodeURL, logger.child({testName, name:"Carol"}), undefined, - index) + 1) + const daveService = await RestServerNodeService.connect( + urlBase + daveNodeURL, + logger.child({testName, name:"Dave"}), + undefined, + 1) const r0Service = await RestServerNodeService.connect( urlBase + r0NodeUrl, logger.child({ testName, name: "Roger" }), undefined, - 0, - ); + 1) + + const carolSetup = await carolService.setup({ + counterpartyIdentifier: r0Service.publicIdentifier, + chainId, + timeout: DEFAULT_CHANNEL_TIMEOUT.toString() + }); + + const daveSetup = await daveService.setup({ + counterpartyIdentifier: r0Service.publicIdentifier, + chainId: 4, + timeout: DEFAULT_CHANNEL_TIMEOUT.toString() + }) + + const carolChannel = carolSetup.getValue(); + const daveChannel = daveSetup.getValue(); + + //get carol's channel with self? + const carolChan = await r0Service.getStateChannel({ + channelAddress: carolChannel.channelAddress, + publicIdentifier: carolService.publicIdentifier, + }); + + // r0Service.getStateChannelByParticipants() + const routerChan = await r0Service.getStateChannel({ + channelAddress: carolChannel.channelAddress, + publicIdentifier: r0Service.publicIdentifier + }) + + const daveChan = await r0Service.getStateChannel({ + channelAddress: daveChannel.channelAddress, + publicIdentifier: r0Service.publicIdentifier + }) + + //carol and router chan should deep euqal + const carolSetupRes = routerChan.getValue()! as FullChannelState; + const daveSetupRes = daveChan.getValue()! as FullChannelState; + + console.log("ROUTER CHAN ", carolSetupRes) + + const depositAmt = utils.parseEther(".1"); - // const net = await g_provider.getNetwork() - // const chainId = net.chainId; + const assetId = constants.AddressZero; + + const tx = await carolService.sendDepositTx({ + amount: depositAmt.toString(), + assetId, + chainId: chainId, + channelAddress: carolChannel.channelAddress, + publicIdentifier: carolService.publicIdentifier, + }) + + const tx_wait = g_provider.waitForTransaction(tx.getValue().txHash) + console.log("DEPOSIT TX ", tx_wait) + + const depositRes = await carolService.reconcileDeposit({ + assetId, + channelAddress: carolSetupRes.channelAddress, + publicIdentifier: carolService.publicIdentifier, + }) + + const deposit = await depositRes.getValue() + + console.log("DEPOSIT RECON RES ", deposit) + + const preImage = getRandomBytes32(); + const lockHash = utils.soliditySha256(["bytes32"], [preImage]); + + const transferRes = await carolService.conditionalTransfer({ + amount: depositAmt.toString(), + assetId: assetId, + channelAddress: carolSetupRes.channelAddress, + type: TransferNames.HashlockTransfer, + details: { + lockHash, + expiry: "0", + }, + recipient: daveService.publicIdentifier, + recipientChainId: 4 + }) + + console.log("Transfer Result Context", transferRes.getError()?.context.context) + + + //get tx event + // daveService.resolveTransfer(... lockHash) - const cr0Post = await setup(carolService, r0Service, 5) - console.log("C=>R0 Setup: ", cr0Post) } + +async function run_all(){ + await start_stack(); + await timeout(45000) + await main() +} +// start_stack() // start_stack() main() \ No newline at end of file diff --git a/modules/test-runner/src/utils/channel.ts b/modules/test-runner/src/utils/channel.ts index aaac5c479..1a8ad2c50 100644 --- a/modules/test-runner/src/utils/channel.ts +++ b/modules/test-runner/src/utils/channel.ts @@ -45,7 +45,7 @@ export const advanceBlocktime = async (seconds: number, provider = provider1): P } }; -export const setup = async ( +export const setup = async ( bobService: INodeService, aliceService: INodeService, chainId: number, diff --git a/simnet_compose.yml b/simnet_compose.yml index 86dcda29a..a1fcf74ab 100644 --- a/simnet_compose.yml +++ b/simnet_compose.yml @@ -48,8 +48,8 @@ services: "adminToken": "cxt1234", "chainAddresses": {}, "chainProviders": { - "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", - "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" }, "logLevel": "info", "messagingUrl": "https://messaging.connext.network", @@ -96,8 +96,8 @@ services: "adminToken": "cxt1234", "chainAddresses": {}, "chainProviders": { - "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", - "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" }, "logLevel": "info", "messagingUrl": "https://messaging.connext.network", @@ -189,8 +189,8 @@ services: "adminToken": "cxt1234", "chainAddresses": {}, "chainProviders": { - "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", - "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" + "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" }, "logLevel": "info", @@ -342,9 +342,8 @@ services: "adminToken": "cxt1234", "chainAddresses": {}, "chainProviders": { - "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", - "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" - + "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" }, "logLevel": "info", "messagingUrl": "https://messaging.connext.network", @@ -396,9 +395,8 @@ services: "adminToken": "cxt1234", "chainAddresses": {}, "chainProviders": { - "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", - "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" - + "5": "https://goerli.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9", + "4": "https://rinkeby.infura.io/v3/af2f28bdb95d40edb06226a46106f5f9" }, "logLevel": "info", "messagingUrl": "https://messaging.connext.network",