From 7e2d9e54a7beca93285620df8ca12248fa376a4d Mon Sep 17 00:00:00 2001 From: Loris Moulin <45130584+l0r1s@users.noreply.github.com> Date: Tue, 9 May 2023 17:52:42 +0300 Subject: [PATCH 1/4] Bug/teardown podman (#1022) * chore: fixed undefined network before promise result * chore: fix teardown before spawning end on user action * bugfix: added interval to keep process running and avoid exit when using podman provider * chore: apply feedback for review * doc: added comment to explain why we prevent throw on previous ran commands --- javascript/packages/cli/src/actions/spawn.ts | 8 ++++++-- javascript/packages/cli/src/cli.ts | 7 ++++++- .../packages/orchestrator/src/orchestrator.ts | 4 ++++ .../src/providers/podman/podmanClient.ts | 19 +++++++++++++------ 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/javascript/packages/cli/src/actions/spawn.ts b/javascript/packages/cli/src/actions/spawn.ts index 29f0bdc42..19fa70eb8 100644 --- a/javascript/packages/cli/src/actions/spawn.ts +++ b/javascript/packages/cli/src/actions/spawn.ts @@ -30,7 +30,8 @@ export async function spawn( credsFile: string | undefined, cmdOpts: any, program: any, -): Promise { + setGlobalNetwork: (network: Network) => void, +): Promise { const opts = { ...program.parent.opts(), ...cmdOpts }; const dir = opts.dir || ""; const force = opts.force || false; @@ -93,8 +94,11 @@ export async function spawn( force, inCI, silent: false, + setGlobalNetwork, }; const network = await start(creds, config, options); network.showNetworkInfo(config.settings?.provider); - return network; + // keep the process running + // eslint-disable-next-line @typescript-eslint/no-empty-function + setInterval(() => {}, 1000); } diff --git a/javascript/packages/cli/src/cli.ts b/javascript/packages/cli/src/cli.ts index 415e883d8..90b16f0da 100644 --- a/javascript/packages/cli/src/cli.ts +++ b/javascript/packages/cli/src/cli.ts @@ -14,6 +14,10 @@ const program = new Command("zombienet"); let network: Network | undefined; let alreadyTryToStop = false; +const setGlobalNetwork = (globalNetwork: Network) => { + network = globalNetwork; +}; + async function handleTermination(userInterrupted = false) { process.env.terminating = "1"; if (network && !alreadyTryToStop) { @@ -21,6 +25,7 @@ async function handleTermination(userInterrupted = false) { if (userInterrupted) console.log("Ctrl+c detected..."); debug("removing namespace: " + network.namespace); await network.dumpLogs(); + console.log(decorators.blue("Tearing down network...")); await network.stop(); } } @@ -154,7 +159,7 @@ function asyncAction(cmd: Function) { (async () => { try { if (cmd.name == "spawn") { - network = await cmd(...args); + await cmd(...args, setGlobalNetwork); } else { await cmd(...args); } diff --git a/javascript/packages/orchestrator/src/orchestrator.ts b/javascript/packages/orchestrator/src/orchestrator.ts index 090999d38..faac888e3 100644 --- a/javascript/packages/orchestrator/src/orchestrator.ts +++ b/javascript/packages/orchestrator/src/orchestrator.ts @@ -69,6 +69,7 @@ export interface OrcOptionsInterface { dir?: string; force?: boolean; silent?: boolean; // Mute logging output + setGlobalNetwork?: (network: Network) => void; } export async function start( @@ -161,6 +162,9 @@ export async function start( if (networkSpec.settings.node_spawn_timeout) client.timeout = networkSpec.settings.node_spawn_timeout; network = new Network(client, namespace, tmpDir.path); + if (options?.setGlobalNetwork) { + options.setGlobalNetwork(network); + } const zombieTable = new CreateLogTable({ head: [ diff --git a/javascript/packages/orchestrator/src/providers/podman/podmanClient.ts b/javascript/packages/orchestrator/src/providers/podman/podmanClient.ts index 17d5725ad..d92539066 100644 --- a/javascript/packages/orchestrator/src/providers/podman/podmanClient.ts +++ b/javascript/packages/orchestrator/src/providers/podman/podmanClient.ts @@ -55,6 +55,7 @@ export class PodmanClient extends Client { localMagicFilepath: string; remoteDir: string; dataDir: string; + isTearingDown: boolean; constructor(configPath: string, namespace: string, tmpDir: string) { super(configPath, namespace, tmpDir, "podman", "podman"); @@ -66,6 +67,7 @@ export class PodmanClient extends Client { this.localMagicFilepath = `${tmpDir}/finished.txt`; this.remoteDir = DEFAULT_REMOTE_DIR; this.dataDir = DEFAULT_DATA_DIR; + this.isTearingDown = false; } async validateAccess(): Promise { @@ -177,6 +179,7 @@ export class PodmanClient extends Client { } async destroyNamespace(): Promise { + this.isTearingDown = true; // get pod names let args = [ "pod", @@ -189,11 +192,11 @@ export class PodmanClient extends Client { let result = await this.runCommand(args, { scoped: false }); // now remove the pods - args = ["pod", "rm", "-f", ...result.stdout.split("\n")]; + args = ["pod", "rm", "-f", "-i", ...result.stdout.split("\n")]; result = await this.runCommand(args, { scoped: false }); // now remove the pnetwork - args = ["network", "rm", this.namespace]; + args = ["network", "rm", "-f", this.namespace]; result = await this.runCommand(args, { scoped: false }); } @@ -297,10 +300,14 @@ export class PodmanClient extends Client { stdout, }; } catch (error) { - console.log( - `\n ${decorators.red("Error: ")} \t ${decorators.bright(error)}\n`, - ); - throw error; + // We prevent previous commands ran to throw error when we are tearing down the network. + if (!this.isTearingDown) { + console.log( + `\n ${decorators.red("Error: ")} \t ${decorators.bright(error)}\n`, + ); + throw error; + } + return { exitCode: 0, stdout: "" }; } } From c66281695fb83314dd9cd77af895b67966d642f4 Mon Sep 17 00:00:00 2001 From: Nikos Kontakis Date: Tue, 9 May 2023 19:29:11 +0300 Subject: [PATCH 2/4] Fix LOKI URL (#1023) --- javascript/packages/utils/src/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/packages/utils/src/constants.ts b/javascript/packages/utils/src/constants.ts index 3a677a1f2..bf180f37c 100644 --- a/javascript/packages/utils/src/constants.ts +++ b/javascript/packages/utils/src/constants.ts @@ -1,2 +1,2 @@ export const LOKI_URL_FOR_NODE = - "https://grafana.parity-mgmt.parity.io/explore?orgId=1&left=%5B%22{{from}}%22,%22{{to}}%22,%22loki.parity-zombienet%22,%7B%22expr%22:%22%7Bpod%3D~%5C%22{{namespace}}%2F{{podName}}%5C%22%7D%22,%22refId%22:%22A%22,%22range%22:true%7D%5D"; + "https://grafana.parity-mgmt.parity.io/explore?orgId=1&left=%7B%22datasource%22:%22PCF9DACBDF30E12B3%22,%22queries%22:%5B%7B%22refId%22:%22A%22,%22datasource%22:%7B%22type%22:%22loki%22,%22uid%22:%22PCF9DACBDF30E12B3%22%7D,%22editorMode%22:%22code%22,%22expr%22:%22%7Bpod%3D~%5C%22{{namespace}}%2F{{podName}}%5C%22%7D%22,%22queryType%22:%22range%22%7D%5D,%22range%22:%7B%22from%22:%22{{from}}%22,%22to%22:%22{{to}}%22%7D%7D"; From c4b25d517a397b585d94ff2b40e547576bb1c12a Mon Sep 17 00:00:00 2001 From: Javier Viola Date: Tue, 9 May 2023 14:39:45 -0300 Subject: [PATCH 3/4] bump version (#1024) --- javascript/packages/utils/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/javascript/packages/utils/package.json b/javascript/packages/utils/package.json index 76494f452..2298e0bb3 100644 --- a/javascript/packages/utils/package.json +++ b/javascript/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@zombienet/utils", - "version": "0.0.19", + "version": "0.0.20", "description": "Useful utilities for ZombieNet Framework", "main": "dist/index.js", "author": "Parity Technologies ", From 05a8c8a226eadeae01af2dcccab49dc42f028d43 Mon Sep 17 00:00:00 2001 From: Javier Viola Date: Tue, 9 May 2023 16:59:12 -0300 Subject: [PATCH 4/4] bump versions for release (#1025) --- javascript/packages/cli/package.json | 6 +++--- javascript/packages/orchestrator/package.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/javascript/packages/cli/package.json b/javascript/packages/cli/package.json index d628154ce..57fd006da 100644 --- a/javascript/packages/cli/package.json +++ b/javascript/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@zombienet/cli", - "version": "1.3.50", + "version": "1.3.51", "description": "ZombieNet aim to be a testing framework for substrate based blockchains, providing a simple cli tool that allow users to spawn and test ephemeral Substrate based networks", "main": "dist/index.js", "scripts": { @@ -53,8 +53,8 @@ }, "dependencies": { "@zombienet/dsl-parser-wrapper": "^0.1.7", - "@zombienet/orchestrator": "^0.0.39", - "@zombienet/utils": "^0.0.19", + "@zombienet/orchestrator": "^0.0.40", + "@zombienet/utils": "^0.0.20", "cli-progress": "^3.12.0", "commander": "^10.0.1", "debug": "^4.3.4", diff --git a/javascript/packages/orchestrator/package.json b/javascript/packages/orchestrator/package.json index 5cf16064e..a09b685b2 100644 --- a/javascript/packages/orchestrator/package.json +++ b/javascript/packages/orchestrator/package.json @@ -1,6 +1,6 @@ { "name": "@zombienet/orchestrator", - "version": "0.0.39", + "version": "0.0.40", "description": "ZombieNet aim to be a testing framework for substrate based blockchains, providing a simple cli tool that allow users to spawn and test ephemeral Substrate based networks", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -37,7 +37,7 @@ "@polkadot/api": "^10.6.1", "@polkadot/keyring": "^12.1.2", "@polkadot/util-crypto": "^12.1.2", - "@zombienet/utils": "^0.0.19", + "@zombienet/utils": "^0.0.20", "chai": "^4.3.7", "debug": "^4.3.4", "execa": "^5.1.1",