From 89f01b318f07bf6d6abf5f99798e3fd39ae4bd6d Mon Sep 17 00:00:00 2001 From: Ahmad Kaouk Date: Mon, 23 Mar 2026 11:38:31 +0100 Subject: [PATCH] fix: stabilize storagehub e2e startup --- test/.papi/descriptors/package.json | 2 +- test/.papi/metadata/datahaven.scale | Bin 634794 -> 634994 bytes test/launcher/storagehub-docker.ts | 59 +++++++++++++++------------- 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/test/.papi/descriptors/package.json b/test/.papi/descriptors/package.json index 97b3c850..8a0c66ea 100644 --- a/test/.papi/descriptors/package.json +++ b/test/.papi/descriptors/package.json @@ -1,5 +1,5 @@ { - "version": "0.1.0-autogenerated.10935097084839855391", + "version": "0.1.0-autogenerated.16491361595784249435", "name": "@polkadot-api/descriptors", "files": [ "dist" diff --git a/test/.papi/metadata/datahaven.scale b/test/.papi/metadata/datahaven.scale index 087b482cc8109f6bf0ecde5a5055c2f27d551d0d..3be132d66863789088f1fff2670c2b0877a13a48 100644 GIT binary patch delta 780 zcmZuvO=}ZD7~btnY6B6XB^aT~3qnb4n-;}OZ#h(~G*Z(@1<`hroz0HyM>;dx*i$_O zdhcbt_yg3N2stR2V-Nm-h6MDI-bC@_(aBCw3tf0&XXbt0=VRvW*V$j+W?#1L_QVJD zYGKCXRPz1pI21IL+nlxtceYzBbfOkkKYJ*rju+5c_LxB3j|6qVoOSYxsQu2)cV3^M zl)c>DN)RC8TEK*0Q3x(!zHZll(xbpaCK>U8NJ)dHRJ|TLnBJ%)bi#luS_o6`PtYzx zIHy+n=-Q+qQ_uS7#^v=#iAK}B`l89W`rbo}(-@cS670q_{;N)X?4zqCAtSE0j3)sO zkp!54Fakdc8R z)y@#lUs+F3&KXCRl^I2N^O6lt%!$;oWbI6R`vPB-cVCAQ@s=xLehk zi6*Txm;H0q9pah$8wNBcDv#0*8e^&9j`-zT&@R`X tDx{bz-ZQBg=SHqhB9&ds;E}+JP6leR>uUPQ9kZx6o9RL)Urir9`2&oe9a8`R delta 848 zcmZ`%KX21O6p!n3OQaxWu~eiEPij?K6cTl%3}i?|5JhbWVgSip<8yN0*zVoAX{Rt$ z>RQ2IJ^&ID2&PJALu~L3Xo-{#kco*;z_Z;*{LApHJKuZn_vgKzXUnfg%TEuqgPCLf zMXB;oFeUb_(38wlmSBANp>v?csn+_TwUQG=SGjpP`8D(Sb(m(&A%1=XbrxCE)f z_LFFBOw71;Ri|&Xh4|GM-O#jQ^!7xb&zIpoHuC!rjXvvUG(6Db?Gj{XXYWJ&|`M_dWN`_=&e^n*PUkGEV-y9 z?wv!X1|^eoux1_Sh({dgVP&Ytl_4?nbGaNT6pQoG$M59Y>TQ&C$5##SH#kfFOY!1X{=>|~fvh*uL?ENsD3Dy?2Q<0Yf$h+7m;m2N`Mq!DSL!D2Gi`T4 vy1q(Ln1mJNk!^b^NwlP*LRpIAnkm`~N+8=5mlIPQmn!aitMRCnfBxVXt<5dd diff --git a/test/launcher/storagehub-docker.ts b/test/launcher/storagehub-docker.ts index 9cb9c7df..70e972b5 100644 --- a/test/launcher/storagehub-docker.ts +++ b/test/launcher/storagehub-docker.ts @@ -110,24 +110,25 @@ export const getPostgresUrl = (networkId: string): string => { }; /** - * Injects a BCSV ECDSA key into a StorageHub provider node's keystore. - * - * @param containerName - Name of the Docker container - * @param secretKey - The secret key (or private key) we want to add to the node + * Prepares a persistent data volume for a StorageHub provider and seeds its keystore + * before the node starts. Provider nodes can now require `bcsv` on first block import, + * so post-start injection is too late. */ -export const injectStorageHubKey = async ( - containerName: string, +const prepareStorageHubProviderVolume = async ( + volumeName: string, + imageTag: string, secretKey: string ): Promise => { - logger.info(`🔑 Injecting key into ${containerName}...`); + logger.info(`🔑 Preparing provider volume ${volumeName}...`); + + await $`docker volume rm -f ${volumeName}`.nothrow().quiet(); + await $`docker volume create ${volumeName}`.quiet(); - // Use Bun's $ directly with docker exec (no sh -c wrapper needed) - // This properly handles the spaces in the seed phrase try { - await $`docker exec ${containerName} datahaven-node key insert --chain local --key-type bcsv --scheme ecdsa --suri ${secretKey}`; - logger.success("Key injected successfully"); + await $`docker run --rm -v ${volumeName}:/data ${imageTag} key insert --base-path /data --chain local --key-type bcsv --scheme ecdsa --suri ${secretKey}`; + logger.success(`Provider volume ${volumeName} seeded with bcsv key`); } catch (error) { - logger.error(`Failed to inject key : ${error}`); + logger.error(`Failed to seed provider volume ${volumeName}: ${error}`); throw error; } }; @@ -146,8 +147,15 @@ export const launchMspNode = async ( const containerName = `storagehub-msp-${options.networkId}`; const dockerNetworkName = `datahaven-${options.networkId}`; + const dataVolumeName = `${containerName}-data`; const wsPort = 9945; // External port for MSP node + await prepareStorageHubProviderVolume( + dataVolumeName, + options.datahavenImageTag, + SUBSTRATE_FUNDED_ACCOUNTS.CHARLETH.privateKey + ); + const command: string[] = [ "docker", "run", @@ -156,6 +164,8 @@ export const launchMspNode = async ( containerName, "--network", dockerNetworkName, + "-v", + `${dataVolumeName}:/data`, "-p", `${wsPort}:${DEFAULT_SUBSTRATE_WS_PORT}`, options.datahavenImageTag, @@ -193,14 +203,6 @@ export const launchMspNode = async ( await waitForContainerToStart(containerName); - // Inject key - await injectStorageHubKey(containerName, SUBSTRATE_FUNDED_ACCOUNTS.CHARLETH.privateKey); - - // Restart container to load key - logger.info("🔄 Restarting MSP node to load key..."); - await $`docker restart ${containerName}`.nothrow(); - await waitForContainerToStart(containerName); - // Wait for node to be ready logger.info("⌛️ Waiting for MSP node to be ready..."); await waitFor({ @@ -238,8 +240,15 @@ export const launchBspNode = async ( const containerName = `storagehub-bsp-${options.networkId}`; const dockerNetworkName = `datahaven-${options.networkId}`; + const dataVolumeName = `${containerName}-data`; const wsPort = 9946; // External port for BSP node + await prepareStorageHubProviderVolume( + dataVolumeName, + options.datahavenImageTag, + SUBSTRATE_FUNDED_ACCOUNTS.DOROTHY.privateKey + ); + const command: string[] = [ "docker", "run", @@ -248,6 +257,8 @@ export const launchBspNode = async ( containerName, "--network", dockerNetworkName, + "-v", + `${dataVolumeName}:/data`, "-p", `${wsPort}:${DEFAULT_SUBSTRATE_WS_PORT}`, options.datahavenImageTag, @@ -280,14 +291,6 @@ export const launchBspNode = async ( await waitForContainerToStart(containerName); - // Inject key - await injectStorageHubKey(containerName, SUBSTRATE_FUNDED_ACCOUNTS.DOROTHY.privateKey); - - // Restart container to load key - logger.info("🔄 Restarting BSP node to load key..."); - await $`docker restart ${containerName}`.nothrow(); - await waitForContainerToStart(containerName); - // Wait for node to be ready logger.info("⌛️ Waiting for BSP node to be ready..."); await waitFor({