diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index dc0a7deb8..11802fdb3 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -262,7 +262,7 @@ zombienet-restart-pause-resume: - echo "${GH_DIR}" - export DEBUG=zombie* - export ZOMBIENET_INTEGRATION_TEST_IMAGE="docker.io/paritypr/polkadot-debug:master" - - export COL_IMAGE="docker.io/paritypr/colander:4519" + - export COL_IMAGE="docker.io/paritypr/colander:master" script: - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh @@ -287,7 +287,7 @@ zombienet-logs-assertion: - echo "${GH_DIR}" - export DEBUG=zombie* - export ZOMBIENET_INTEGRATION_TEST_IMAGE="docker.io/paritypr/polkadot-debug:master" - - export COL_IMAGE="docker.io/paritypr/colander:4519" + - export COL_IMAGE="docker.io/paritypr/colander:master" script: - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh @@ -312,7 +312,7 @@ zombienet-system-event-assertion: - echo "${GH_DIR}" - export DEBUG=zombie* - export ZOMBIENET_INTEGRATION_TEST_IMAGE="docker.io/paritypr/polkadot-debug:master" - - export COL_IMAGE="docker.io/paritypr/colander:4519" + - export COL_IMAGE="docker.io/paritypr/colander:master" script: - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh @@ -337,7 +337,7 @@ zombienet-custom-scripts-assertion: - echo "${GH_DIR}" - export DEBUG=zombie* - export ZOMBIENET_INTEGRATION_TEST_IMAGE="docker.io/paritypr/polkadot-debug:master" - - export COL_IMAGE="docker.io/paritypr/colander:4519" + - export COL_IMAGE="docker.io/paritypr/colander:master" script: - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh @@ -368,7 +368,7 @@ zombienet-histogram-assertion: - echo "${GH_DIR}" - export DEBUG=zombie* - export ZOMBIENET_INTEGRATION_TEST_IMAGE="docker.io/paritypr/polkadot-debug:master" - - export COL_IMAGE="docker.io/paritypr/colander:4519" + - export COL_IMAGE="docker.io/paritypr/colander:master" script: - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh @@ -399,7 +399,7 @@ zombienet-update-genesis-config: - echo "${GH_DIR}" - export DEBUG=zombie* - export ZOMBIENET_INTEGRATION_TEST_IMAGE="docker.io/paritypr/polkadot-debug:master" - - export COL_IMAGE="docker.io/paritypr/colander:4519" + - export COL_IMAGE="docker.io/paritypr/colander:master" script: - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh @@ -430,7 +430,7 @@ zombienet-scale-net-config: - echo "${GH_DIR}" - export DEBUG=zombie* - export ZOMBIENET_INTEGRATION_TEST_IMAGE="docker.io/paritypr/polkadot-debug:master" - - export COL_IMAGE="docker.io/paritypr/colander:4519" + - export COL_IMAGE="docker.io/paritypr/colander:master" script: - /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh diff --git a/src/cmdGenerator.ts b/src/cmdGenerator.ts index 36d091788..1327678be 100644 --- a/src/cmdGenerator.ts +++ b/src/cmdGenerator.ts @@ -124,49 +124,51 @@ export async function genCumulusCollatorCmd( } } - // Arguments for the relay chain node part of the collator binary. - fullCmd.push(...["--", "--chain", `${cfgPath}/${chain}.json`, "--execution wasm"]); - - if (argsFullNode) { - // Add any additional flags to the CLI - for (const [index, arg] of argsFullNode.entries()) { - if (collatorPorts[arg] >= 0) { - // port passed as argument, we need to ensure is not a default one because it will be - // use by the parachain part. - const selectedPort = parseInt(argsFullNode[index + 1], 10); - if ([P2P_PORT, RPC_HTTP_PORT, RPC_WS_PORT].includes(selectedPort)) { - console.log( - decorators.yellow( - `WARN: default port configured, changing to use a random free port` - ) - ); - const randomPort = await getRandomPort(); - collatorPorts[arg] = randomPort; - argsFullNode[index + 1] = randomPort.toString(); + if(fullCmd.findIndex(thisArg => thisArg.includes("relay-chain-rpc-url")) === -1 ) { + // Arguments for the relay chain node part of the collator binary. + fullCmd.push(...["--", "--chain", `${cfgPath}/${chain}.json`, "--execution wasm"]); + + if (argsFullNode) { + // Add any additional flags to the CLI + for (const [index, arg] of argsFullNode.entries()) { + if (collatorPorts[arg] >= 0) { + // port passed as argument, we need to ensure is not a default one because it will be + // use by the parachain part. + const selectedPort = parseInt(argsFullNode[index + 1], 10); + if ([P2P_PORT, RPC_HTTP_PORT, RPC_WS_PORT].includes(selectedPort)) { + console.log( + decorators.yellow( + `WARN: default port configured, changing to use a random free port` + ) + ); + const randomPort = await getRandomPort(); + collatorPorts[arg] = randomPort; + argsFullNode[index + 1] = randomPort.toString(); + } } } - } - // check ports - for (const portArg of Object.keys(collatorPorts)) { - if (collatorPorts[portArg] === 0) { - const randomPort = await getRandomPort(); - argsFullNode.push(portArg); - argsFullNode.push(randomPort.toString()); - debug(`Added ${portArg} with value ${randomPort}`); + // check ports + for (const portArg of Object.keys(collatorPorts)) { + if (collatorPorts[portArg] === 0) { + const randomPort = await getRandomPort(); + argsFullNode.push(portArg); + argsFullNode.push(randomPort.toString()); + debug(`Added ${portArg} with value ${randomPort}`); + } } - } - fullCmd = fullCmd.concat(argsFullNode); - debug(`Added ${argsFullNode} to collator`); - } else { - // ensure ports - for (const portArg of Object.keys(collatorPorts)) { - if (collatorPorts[portArg] === 0) { - const randomPort = await getRandomPort(); - fullCmd.push(portArg); - fullCmd.push(randomPort.toString()); - debug(`Added ${portArg} with value ${randomPort}`); + fullCmd = fullCmd.concat(argsFullNode); + debug(`Added ${argsFullNode} to collator`); + } else { + // ensure ports + for (const portArg of Object.keys(collatorPorts)) { + if (collatorPorts[portArg] === 0) { + const randomPort = await getRandomPort(); + fullCmd.push(portArg); + fullCmd.push(randomPort.toString()); + debug(`Added ${portArg} with value ${randomPort}`); + } } } } diff --git a/src/network.ts b/src/network.ts index aa36a433d..7b83cd4e2 100644 --- a/src/network.ts +++ b/src/network.ts @@ -356,4 +356,11 @@ export class Network { console.log(`\t\t Node prometheus link: ${node.prometheusUri}\n`); console.log("---\n"); } + + replaceWithNetworInfo(placeholder: string): string { + return placeholder.replace(/{{ZOMBIE:(.*?):(.*?)}}/ig, (_substring, nodeName, key: keyof NetworkNode) => { + const node = this.getNodeByName(nodeName); + return node[key]; + }); + } } diff --git a/src/networkNode.ts b/src/networkNode.ts index bfb9082ae..11d429c26 100644 --- a/src/networkNode.ts +++ b/src/networkNode.ts @@ -29,6 +29,7 @@ export class NetworkNode implements NetworkNodeInterface { name: string; wsUri: string; prometheusUri: string; + multiAddress: string; apiInstance?: ApiPromise; spec?: object | undefined; cachedMetrics?: Metrics; @@ -42,11 +43,13 @@ export class NetworkNode implements NetworkNodeInterface { name: string, wsUri: string, prometheusUri: string, - userDefinedTypes: any = null + multiAddress: string, + userDefinedTypes: any = null, ) { this.name = name; this.wsUri = wsUri; this.prometheusUri = prometheusUri; + this.multiAddress = multiAddress; if (userDefinedTypes) this.userDefinedTypes = userDefinedTypes; } diff --git a/src/orchestrator.ts b/src/orchestrator.ts index 1bd69ca45..ec86147aa 100644 --- a/src/orchestrator.ts +++ b/src/orchestrator.ts @@ -128,7 +128,7 @@ export async function start( initClient, setupChainSpec, getChainSpecRaw, - replaceMultiAddresReferences, + replaceNetworkRef, } = Providers.get(networkSpec.settings.provider); const client = initClient(credentials, namespace, tmpDir.path); @@ -378,8 +378,8 @@ export async function start( keystoreLocalDir = path.dirname(keystoreFiles[0]); } - // replace all multiaddress references in command - replaceMultiAddresReferences(podDef, multiAddressByNode) + // replace all network references in command + replaceNetworkRef(podDef, network); await client.spawnFromDef( podDef, @@ -416,6 +416,7 @@ export async function start( "{{PORT}}", PROMETHEUS_PORT.toString() ), + nodeMultiAddress, userDefinedTypes ); } else { @@ -439,6 +440,7 @@ export async function start( "{{PORT}}", nodePrometheusPort.toString() ), + nodeMultiAddress, userDefinedTypes ); } @@ -578,11 +580,13 @@ export async function start( const IP = (options?.inCI) ? await client.getNodeIP(INTROSPECTOR_POD_NAME) : LOCALHOST; const PORT = (options?.inCI) ? INTROSPECTOR_PORT : await client.startPortForwarding(INTROSPECTOR_PORT, INTROSPECTOR_POD_NAME); + // TODO: create a new kind `companion` const introspectorNetworkNode = new NetworkNode( INTROSPECTOR_POD_NAME, "", METRICS_URI_PATTERN.replace("{{IP}}", IP).replace( - "{{PORT}}",PORT.toString()) + "{{PORT}}",PORT.toString()), + "" ); network.addNode(introspectorNetworkNode, Scope.COMPANION); diff --git a/src/providers/k8s/dynResourceDefinition.ts b/src/providers/k8s/dynResourceDefinition.ts index 707f13574..b348dc2bf 100644 --- a/src/providers/k8s/dynResourceDefinition.ts +++ b/src/providers/k8s/dynResourceDefinition.ts @@ -12,6 +12,7 @@ import { import { getUniqueName } from "../../configGenerator"; import { MultiAddressByNode, Node } from "../../types"; import { getSha256 } from "../../utils/misc-utils"; +import { Network } from "../../network"; export async function genBootnodeDef( namespace: string, @@ -198,22 +199,15 @@ function jaegerAgentDef() { } } -export function replaceMultiAddresReferences(podDef: any, multiAddressByNode: MultiAddressByNode) { +export function replaceNetworkRef(podDef: any, network: Network) { // replace command if needed in containers for( const container of podDef.spec.containers) { if(Array.isArray(container.command)){ - const finalCommand = container.command.map((item: string) => { - return item.replace(/{{ZOMBIE:(.*?)?}}/ig, (_substring, nodeName) => { - return multiAddressByNode[nodeName]; - }); - }); + const finalCommand = container.command.map((item: string) => network.replaceWithNetworInfo(item)); container.command = finalCommand; } else { - container.command = container.command.replace(/{{ZOMBIE:(.*?)?}}/ig, (_substring: any, nodeName: string) => { - return multiAddressByNode[nodeName]; - }); + container.command = network.replaceWithNetworInfo(container.command); } - } } diff --git a/src/providers/k8s/index.ts b/src/providers/k8s/index.ts index 016401645..ab2dca1bb 100644 --- a/src/providers/k8s/index.ts +++ b/src/providers/k8s/index.ts @@ -1,5 +1,5 @@ import { KubeClient, initClient } from "./kubeClient"; -import { genBootnodeDef, genNodeDef, replaceMultiAddresReferences } from "./dynResourceDefinition"; +import { genBootnodeDef, genNodeDef, replaceNetworkRef } from "./dynResourceDefinition"; import { setupChainSpec, getChainSpecRaw } from "./chain-spec"; export const provider = { @@ -9,5 +9,5 @@ export const provider = { initClient, setupChainSpec, getChainSpecRaw, - replaceMultiAddresReferences, + replaceNetworkRef, }; diff --git a/src/providers/native/dynResourceDefinition.ts b/src/providers/native/dynResourceDefinition.ts index f6269dddb..0457e96a7 100644 --- a/src/providers/native/dynResourceDefinition.ts +++ b/src/providers/native/dynResourceDefinition.ts @@ -10,6 +10,7 @@ import { getUniqueName } from "../../configGenerator"; import { MultiAddressByNode, Node } from "../../types"; import { getRandomPort } from "../../utils/net-utils"; import { getClient } from "../client"; +import { Network } from "../../network"; const fs = require("fs").promises; @@ -131,20 +132,14 @@ async function getPorts(rpc?: number, ws?:number, prometheus?:number) { return ports; } -export function replaceMultiAddresReferences(podDef: any, multiAddressByNode: MultiAddressByNode) { +export function replaceNetworkRef(podDef: any, network: Network) { // replace command if needed if(Array.isArray(podDef.spec.command)) { - const finalCommand = podDef.spec.command.map((item: string) => { - return item.replace(/{{ZOMBIE:(.*?)?}}/ig, (_substring, nodeName) => { - return multiAddressByNode[nodeName]; - }); - }); + const finalCommand = podDef.spec.command.map((item: string) => network.replaceWithNetworInfo(item)); podDef.spec.command = finalCommand; } else { // string - podDef.spec.command = podDef.spec.command.replace(/{{ZOMBIE:(.*?)?}}/ig, (_substring: any, nodeName: string) => { - return multiAddressByNode[nodeName]; - }); + podDef.spec.command = network.replaceWithNetworInfo(podDef.spec.command); } } diff --git a/src/providers/native/index.ts b/src/providers/native/index.ts index bc811fa5b..57461b91c 100644 --- a/src/providers/native/index.ts +++ b/src/providers/native/index.ts @@ -1,5 +1,5 @@ import { NativeClient, initClient } from "./nativeClient"; -import { genBootnodeDef, genNodeDef, replaceMultiAddresReferences } from "./dynResourceDefinition"; +import { genBootnodeDef, genNodeDef, replaceNetworkRef } from "./dynResourceDefinition"; import { setupChainSpec, getChainSpecRaw } from "./chain-spec"; export const provider = { @@ -9,5 +9,5 @@ export const provider = { initClient, setupChainSpec, getChainSpecRaw, - replaceMultiAddresReferences + replaceNetworkRef }; diff --git a/src/providers/podman/dynResourceDefinition.ts b/src/providers/podman/dynResourceDefinition.ts index 1ae37a9a8..84905b581 100644 --- a/src/providers/podman/dynResourceDefinition.ts +++ b/src/providers/podman/dynResourceDefinition.ts @@ -14,6 +14,7 @@ import { MultiAddressByNode, Node } from "../../types"; import { getRandomPort } from "../../utils/net-utils"; import { getClient } from "../client"; import { resolve } from "path"; +import { Network } from "../../network"; const fs = require("fs").promises; @@ -447,22 +448,15 @@ async function make_main_container( return containerDef; } -export function replaceMultiAddresReferences(podDef: any, multiAddressByNode: MultiAddressByNode) { +export function replaceNetworkRef(podDef: any, network: Network) { // replace command if needed in containers for( const container of podDef.spec.containers) { if(Array.isArray(container.command)){ - const finalCommand = container.command.map((item: string) => { - return item.replace(/{{ZOMBIE:(.*?)?}}/ig, (_substring, nodeName) => { - return multiAddressByNode[nodeName]; - }); - }); + const finalCommand = container.command.map((item: string) => network.replaceWithNetworInfo(item)) container.command = finalCommand; } else { - container.command = container.command.replace(/{{ZOMBIE:(.*?)?}}/ig, (_substring: any, nodeName: string) => { - return multiAddressByNode[nodeName]; - }); + container.command = network.replaceWithNetworInfo(container.command); } - } } diff --git a/src/providers/podman/index.ts b/src/providers/podman/index.ts index 20a822171..7e2c29add 100644 --- a/src/providers/podman/index.ts +++ b/src/providers/podman/index.ts @@ -1,5 +1,5 @@ import { PodmanClient, initClient } from "./podmanClient"; -import { genBootnodeDef, genNodeDef, replaceMultiAddresReferences } from "./dynResourceDefinition"; +import { genBootnodeDef, genNodeDef, replaceNetworkRef } from "./dynResourceDefinition"; import { setupChainSpec, getChainSpecRaw } from "./chain-spec"; export const provider = { @@ -9,5 +9,5 @@ export const provider = { initClient, setupChainSpec, getChainSpecRaw, - replaceMultiAddresReferences, + replaceNetworkRef, }; diff --git a/src/utils/fs-utils.ts b/src/utils/fs-utils.ts index 08937a79c..7902f5101 100644 --- a/src/utils/fs-utils.ts +++ b/src/utils/fs-utils.ts @@ -54,8 +54,8 @@ export function readNetworkConfig(filepath: string): LaunchConfig { const configBasePath = path.dirname(filepath); const env = new Environment(new RelativeLoader([configBasePath])); - env.addFilter('zombie', function(nodeName){ - return `{{ZOMBIE:${nodeName}}}`; + env.addFilter('zombie', function(nodeName, key){ + return `{{ZOMBIE:${nodeName}:${key}}}`; }); const temmplateContent = fs.readFileSync(filepath).toString(); diff --git a/tests/0001-dispute-valid-block.toml b/tests/0001-dispute-valid-block.toml index f3533a39b..a3c07ee29 100644 --- a/tests/0001-dispute-valid-block.toml +++ b/tests/0001-dispute-valid-block.toml @@ -11,25 +11,25 @@ command = "polkadot" name = "alice" validator = true command = "polkadot" - extra_args = [ "--alice", "-lparachain=debug" ] + extra_args = [ "-lparachain=debug" ] [[relaychain.nodes]] name = "bob" validator = true command = "polkadot" - extra_args = [ "--bob", "-lparachain=debug" ] + extra_args = [ "-lparachain=debug" ] [[relaychain.nodes]] name = "charlie" validator = true command = "polkadot" - extra_args = [ "--charlie", "-lparachain=debug" ] + extra_args = [ "-lparachain=debug" ] [[relaychain.nodes]] - name = "david" + name = "dave" validator = true command = "malus dispute-ancestor" - extra_args = ["--dave", "-lparachain=debug"] + extra_args = ["-lparachain=debug"] image = "{{MALUS_IMAGE}}" diff --git a/tests/0004-parachains-upgrade-smoke-test.toml b/tests/0004-parachains-upgrade-smoke-test.toml index 7a8dda5ba..871e3bf01 100644 --- a/tests/0004-parachains-upgrade-smoke-test.toml +++ b/tests/0004-parachains-upgrade-smoke-test.toml @@ -9,7 +9,6 @@ command = "polkadot" [[relaychain.nodes]] name = "alice" - extra_args = [ "--alice" ] [[relaychain.nodes.env]] name = "RUST_LOG" diff --git a/tests/0006-logs.toml b/tests/0006-logs.toml index 0a1629fab..b727e4a52 100644 --- a/tests/0006-logs.toml +++ b/tests/0006-logs.toml @@ -9,11 +9,9 @@ command = "polkadot" [[relaychain.nodes]] name = "alice" - extra_args = [ "--alice" ] [[relaychain.nodes]] name = "bob" - extra_args = [ "--bob" ] [[parachains]] id = 100 diff --git a/tests/0007-events.toml b/tests/0007-events.toml index 2533bcbf2..c6b214a0e 100644 --- a/tests/0007-events.toml +++ b/tests/0007-events.toml @@ -9,11 +9,9 @@ chain = "rococo-local" [[relaychain.nodes]] name = "alice" - extra_args = [ "--alice" ] [[relaychain.nodes]] name = "bob" - extra_args = [ "--bob" ] [[parachains]] id = 100 diff --git a/tests/0008-custom-scripts.toml b/tests/0008-custom-scripts.toml index ad6b58a71..5cf018126 100644 --- a/tests/0008-custom-scripts.toml +++ b/tests/0008-custom-scripts.toml @@ -7,11 +7,9 @@ chain = "rococo-local" [[relaychain.nodes]] name = "alice" - extra_args = [ "--alice" ] [[relaychain.nodes]] name = "bob" - extra_args = [ "--bob" ] [[parachains]] id = 100 diff --git a/tests/0010-histogram-smoke-test.toml b/tests/0010-histogram-smoke-test.toml index bf18d2026..43f5eb45f 100644 --- a/tests/0010-histogram-smoke-test.toml +++ b/tests/0010-histogram-smoke-test.toml @@ -8,11 +8,9 @@ chain = "rococo-local" [[relaychain.nodes]] name = "alice" - extra_args = [ "--alice" ] [[relaychain.nodes]] name = "bob" - extra_args = [ "--bob" ] add_to_bootnodes = true [[parachains]] diff --git a/tests/0011-update-genesis-config.toml b/tests/0011-update-genesis-config.toml index 719c8fa84..77fd31527 100644 --- a/tests/0011-update-genesis-config.toml +++ b/tests/0011-update-genesis-config.toml @@ -12,11 +12,9 @@ chain = "rococo-local" [[relaychain.nodes]] name = "alice" - extra_args = [ "--alice" ] [[relaychain.nodes]] name = "bob" - extra_args = [ "--bob" ] add_to_bootnodes = true [[parachains]] diff --git a/tests/0012-parachains-smoke-test-cumulus.toml b/tests/0012-parachains-smoke-test-cumulus.toml index f1c4c5ebf..788af882e 100644 --- a/tests/0012-parachains-smoke-test-cumulus.toml +++ b/tests/0012-parachains-smoke-test-cumulus.toml @@ -13,11 +13,9 @@ chain = "rococo-local" [[relaychain.nodes]] name = "alice" - extra_args = [ "--alice" ] [[relaychain.nodes]] name = "bob" - extra_args = [ "--bob" ] [[parachains]]