From a7a287f8237c2dcce1c3c65a52b4e1130a344461 Mon Sep 17 00:00:00 2001 From: Javier Viola Date: Fri, 27 Oct 2023 11:25:14 -0300 Subject: [PATCH] feat: allow to use a custom chain-spec generator for plain/raw mode (#1453) * feat: allow to use a custom chain-spec generator for plain/raw mode * lint/fmt * fmt * fix paras * fix logic for build raw --- .../orchestrator/src/configGenerator.ts | 6 +++--- .../packages/orchestrator/src/orchestrator.ts | 3 ++- javascript/packages/orchestrator/src/paras.ts | 7 ++++++- .../orchestrator/src/providers/k8s/chainSpec.ts | 12 +++++++----- .../src/providers/native/chainSpec.ts | 17 ++++++++--------- .../src/providers/podman/chainSpec.ts | 17 ++++++++--------- javascript/packages/utils/src/fs.ts | 4 +++- 7 files changed, 37 insertions(+), 29 deletions(-) diff --git a/javascript/packages/orchestrator/src/configGenerator.ts b/javascript/packages/orchestrator/src/configGenerator.ts index b5d6404ab..33a03b267 100644 --- a/javascript/packages/orchestrator/src/configGenerator.ts +++ b/javascript/packages/orchestrator/src/configGenerator.ts @@ -183,9 +183,9 @@ export async function generateNetworkSpec( .chain_spec_command ? config.relaychain.chain_spec_command : DEFAULT_CHAIN_SPEC_COMMAND.replace( - "{{chainName}}", - networkSpec.relaychain.chain, - ).replace("{{DEFAULT_COMMAND}}", networkSpec.relaychain.defaultCommand); + "{{DEFAULT_COMMAND}}", + networkSpec.relaychain.defaultCommand, + ); } const relayChainBootnodes: string[] = []; diff --git a/javascript/packages/orchestrator/src/orchestrator.ts b/javascript/packages/orchestrator/src/orchestrator.ts index ae395c0d1..3813fc891 100644 --- a/javascript/packages/orchestrator/src/orchestrator.ts +++ b/javascript/packages/orchestrator/src/orchestrator.ts @@ -293,7 +293,8 @@ export async function start( namespace, networkSpec.relaychain.defaultImage, chainName, - networkSpec.relaychain.defaultCommand, + networkSpec.relaychain.chainSpecCommand || + networkSpec.relaychain.defaultCommand, chainSpecFullPath, ); } else { diff --git a/javascript/packages/orchestrator/src/paras.ts b/javascript/packages/orchestrator/src/paras.ts index d5e02e452..a1de9a075 100644 --- a/javascript/packages/orchestrator/src/paras.ts +++ b/javascript/packages/orchestrator/src/paras.ts @@ -3,6 +3,7 @@ import fs from "fs"; import chainSpecFns, { isRawSpec } from "./chainSpec"; import { getUniqueName } from "./configGenerator"; import { + DEFAULT_CHAIN_SPEC_COMMAND, DEFAULT_COLLATOR_IMAGE, GENESIS_STATE_FILENAME, GENESIS_WASM_FILENAME, @@ -163,7 +164,11 @@ export async function generateParachainFiles( `${parachain.chain ? parachain.chain + "-" : ""}${ parachain.name }-${relayChainName}`, - parachain.collators[0].command!, + // TODO: does paras need to support external chain generation cmd? + DEFAULT_CHAIN_SPEC_COMMAND.replace( + "{{DEFAULT_COMMAND}}", + parachain.collators[0].command!, + ), chainSpecFullPath, ); } else { diff --git a/javascript/packages/orchestrator/src/providers/k8s/chainSpec.ts b/javascript/packages/orchestrator/src/providers/k8s/chainSpec.ts index f01be2751..36a98fdf3 100644 --- a/javascript/packages/orchestrator/src/providers/k8s/chainSpec.ts +++ b/javascript/packages/orchestrator/src/providers/k8s/chainSpec.ts @@ -1,7 +1,6 @@ import { promises as fsPromises, writeFileSync } from "fs"; import { DEFAULT_CHAIN_SPEC, - DEFAULT_CHAIN_SPEC_COMMAND, DEFAULT_CHAIN_SPEC_RAW, NODE_CONTAINER_WAIT_LOG, } from "../../constants"; @@ -31,7 +30,10 @@ export async function setupChainSpec( "/" + DEFAULT_CHAIN_SPEC.replace(/{{chainName}}/gi, chainName); - const fullCommand = `${chainSpecCommand} > ${plainChainSpecOutputFilePath}`; + const fullCommand = `${chainSpecCommand.replace( + /{{chainName}}/gi, + chainName, + )} > ${plainChainSpecOutputFilePath}`; const node = await createTempNodeDef( "temp", defaultImage, @@ -63,7 +65,7 @@ export async function getChainSpecRaw( namespace: string, image: string, chainName: string, - chainCommand: string, + chainSpecCommand: string, chainFullPath: string, ): Promise { const client = getClient() as KubeClient; @@ -77,10 +79,10 @@ export async function getChainSpecRaw( client.remoteDir + "/" + DEFAULT_CHAIN_SPEC_RAW.replace(/{{chainName}}/, chainName); - const chainSpecCommandRaw = DEFAULT_CHAIN_SPEC_COMMAND.replace( + const chainSpecCommandRaw = chainSpecCommand.replace( /{{chainName}}/gi, remoteChainSpecFullPath, - ).replace("{{DEFAULT_COMMAND}}", chainCommand); + ); const fullCommand = `${chainSpecCommandRaw} --raw > ${remoteChainSpecRawFullPath}`; const node = await createTempNodeDef("temp", image, chainName, fullCommand); diff --git a/javascript/packages/orchestrator/src/providers/native/chainSpec.ts b/javascript/packages/orchestrator/src/providers/native/chainSpec.ts index b7682e463..d9292d1a7 100644 --- a/javascript/packages/orchestrator/src/providers/native/chainSpec.ts +++ b/javascript/packages/orchestrator/src/providers/native/chainSpec.ts @@ -1,11 +1,7 @@ import { sleep } from "@zombienet/utils"; import { promises as fsPromises } from "fs"; import { readAndParseChainSpec } from "../../chainSpec"; -import { - DEFAULT_CHAIN_SPEC, - DEFAULT_CHAIN_SPEC_COMMAND, - DEFAULT_CHAIN_SPEC_RAW, -} from "../../constants"; +import { DEFAULT_CHAIN_SPEC, DEFAULT_CHAIN_SPEC_RAW } from "../../constants"; import { getClient } from "../client"; import { createTempNodeDef, genNodeDef } from "./dynResourceDefinition"; @@ -33,7 +29,10 @@ export async function setupChainSpec( "/" + DEFAULT_CHAIN_SPEC.replace(/{{chainName}}/gi, chainName); // set output of command - const fullCommand = `${chainSpecCommand} > ${plainChainSpecOutputFilePath}`; + const fullCommand = `${chainSpecCommand.replace( + /{{chainName}}/gi, + chainName, + )} > ${plainChainSpecOutputFilePath}`; const node = await createTempNodeDef( "temp", defaultImage, @@ -52,7 +51,7 @@ export async function getChainSpecRaw( namespace: string, image: string, chainName: string, - chainCommand: string, + chainSpecCommand: string, chainFullPath: string, ): Promise { const client = getClient(); @@ -65,10 +64,10 @@ export async function getChainSpecRaw( client.tmpDir + "/" + DEFAULT_CHAIN_SPEC_RAW.replace(/{{chainName}}/, chainName); - const chainSpecCommandRaw = DEFAULT_CHAIN_SPEC_COMMAND.replace( + const chainSpecCommandRaw = chainSpecCommand.replace( /{{chainName}}/gi, remoteChainSpecFullPath, - ).replace("{{DEFAULT_COMMAND}}", chainCommand); + ); const fullCommand = `${chainSpecCommandRaw} --raw > ${remoteChainSpecRawFullPath}`; const node = await createTempNodeDef("temp", image, chainName, fullCommand); diff --git a/javascript/packages/orchestrator/src/providers/podman/chainSpec.ts b/javascript/packages/orchestrator/src/providers/podman/chainSpec.ts index b6754e211..b4e2a688f 100644 --- a/javascript/packages/orchestrator/src/providers/podman/chainSpec.ts +++ b/javascript/packages/orchestrator/src/providers/podman/chainSpec.ts @@ -1,9 +1,5 @@ import { sleep } from "@zombienet/utils"; -import { - DEFAULT_CHAIN_SPEC, - DEFAULT_CHAIN_SPEC_COMMAND, - DEFAULT_CHAIN_SPEC_RAW, -} from "../../constants"; +import { DEFAULT_CHAIN_SPEC, DEFAULT_CHAIN_SPEC_RAW } from "../../constants"; import { getClient } from "../client"; import { createTempNodeDef, genNodeDef } from "./dynResourceDefinition"; const debug = require("debug")("zombie::podman::chain-spec"); @@ -31,7 +27,10 @@ export async function setupChainSpec( "/" + DEFAULT_CHAIN_SPEC.replace(/{{chainName}}/gi, chainName); // set output of command - const fullCommand = `${chainSpecCommand} > ${plainChainSpecOutputFilePath}`; + const fullCommand = `${chainSpecCommand.replace( + /{{chainName}}/gi, + chainName, + )} > ${plainChainSpecOutputFilePath}`; const node = await createTempNodeDef( "temp", defaultImage, @@ -55,7 +54,7 @@ export async function getChainSpecRaw( namespace: string, image: string, chainName: string, - chainCommand: string, + chainSpecCommand: string, chainFullPath: string, ): Promise { const plainPath = chainFullPath.replace(".json", "-plain.json"); @@ -69,10 +68,10 @@ export async function getChainSpecRaw( client.remoteDir + "/" + DEFAULT_CHAIN_SPEC_RAW.replace(/{{chainName}}/, chainName); - const chainSpecCommandRaw = DEFAULT_CHAIN_SPEC_COMMAND.replace( + const chainSpecCommandRaw = chainSpecCommand.replace( /{{chainName}}/gi, remoteChainSpecFullPath, - ).replace("{{DEFAULT_COMMAND}}", chainCommand); + ); const fullCommand = `${chainSpecCommandRaw} --raw > ${remoteChainSpecRawFullPath}`; const node = await createTempNodeDef("temp", image, chainName, fullCommand); diff --git a/javascript/packages/utils/src/fs.ts b/javascript/packages/utils/src/fs.ts index a3768b8a9..f8510e350 100644 --- a/javascript/packages/utils/src/fs.ts +++ b/javascript/packages/utils/src/fs.ts @@ -87,7 +87,9 @@ function getReplacementInText(content: string): string[] { // eslint-disable-next-line no-useless-escape const replacementRegex = /{{([A-Za-z-_\.]+)}}/gim; for (const match of content.matchAll(replacementRegex)) { - replacements.push(match[1]); + // chainName is allowed since we want to use it + // to replace it in runtime for custom chain spec generator cmd + if (match[1] !== "chainName") replacements.push(match[1]); } return replacements;