From 60109817c881da343ec9711bbce8821107c92686 Mon Sep 17 00:00:00 2001 From: Daniele Ricci Date: Tue, 4 Jul 2023 08:59:20 +0200 Subject: [PATCH 1/2] refactor: change order of commands in docker fare to take advantage of cache --- Dockerfile | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3779a836492..7b8d96aecdc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,9 +3,13 @@ ARG UBUNTU_VERSION=20.04 FROM ubuntu:${UBUNTU_VERSION} as ubuntu-nodejs ARG NODEJS_MAJOR_VERSION=14 ENV DEBIAN_FRONTEND=nonintercative -RUN apt-get update && apt-get install curl -y &&\ - curl --proto '=https' --tlsv1.2 -sSf -L https://deb.nodesource.com/setup_${NODEJS_MAJOR_VERSION}.x | bash - &&\ - apt-get install nodejs -y +RUN apt-get update && apt-get install curl -y +RUN curl --proto '=https' --tlsv1.2 -sSf -L https://deb.nodesource.com/setup_${NODEJS_MAJOR_VERSION}.x | bash - +RUN curl --proto '=https' --tlsv1.2 -sSf -L https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - &&\ + echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list +RUN apt-get update +RUN apt-get install nodejs -y +RUN apt-get install -y --no-install-recommends ca-certificates jq postgresql-client FROM ubuntu-nodejs as nodejs-builder RUN curl --proto '=https' --tlsv1.2 -sSf -L https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - &&\ @@ -59,10 +63,6 @@ COPY --from=cardano-services-builder /app/packages/util-rxjs/package.json /app/p FROM cardano-services as provider-server ARG NETWORK=mainnet -RUN curl --proto '=https' --tlsv1.2 -sSf -L https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - &&\ - echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" | tee /etc/apt/sources.list.d/pgdg.list &&\ - apt-get update && apt-get install -y --no-install-recommends \ - ca-certificates jq ENV \ CARDANO_NODE_CONFIG_PATH=/config/cardano-node/config.json \ NETWORK=${NETWORK} @@ -94,7 +94,6 @@ WORKDIR /app/packages/cardano-services CMD ["node", "dist/cjs/cli.js", "start-pg-boss-worker"] FROM cardano-services as projector -RUN apt-get update && apt-get install -y --no-install-recommends jq postgresql-client WORKDIR / COPY compose/projector/init.* ./ RUN chmod 755 init.sh From bc473a873ef1e81e0f58ca3f27779e2f43cd0373 Mon Sep 17 00:00:00 2001 From: Daniele Ricci Date: Tue, 4 Jul 2023 09:00:10 +0200 Subject: [PATCH 2/2] test(e2e): refactor cache invalidation test to use its own provider server --- packages/e2e/package.json | 2 + .../long-running/cache-invalidation.test.ts | 77 +++++++++++++++---- yarn.lock | 2 + 3 files changed, 68 insertions(+), 13 deletions(-) diff --git a/packages/e2e/package.json b/packages/e2e/package.json index 15199f0b246..5dcf29d3533 100644 --- a/packages/e2e/package.json +++ b/packages/e2e/package.json @@ -149,6 +149,8 @@ "buffer": "^6.0.3", "chromedriver": "^114.0.0", "copy-webpack-plugin": "^10.2.4", + "dockerode": "^3.3.1", + "dockerode-utils": "^0.0.7", "eslint": "^7.32.0", "events": "^3.3.0", "expect-webdriverio": "^3.2.1", diff --git a/packages/e2e/test/long-running/cache-invalidation.test.ts b/packages/e2e/test/long-running/cache-invalidation.test.ts index 18f66bd8c54..4e2ce167195 100644 --- a/packages/e2e/test/long-running/cache-invalidation.test.ts +++ b/packages/e2e/test/long-running/cache-invalidation.test.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-statements */ import { AddressType, KeyRole } from '@cardano-sdk/key-management'; import { Cardano } from '@cardano-sdk/core'; import { @@ -13,24 +12,72 @@ import { walletReady, walletVariables } from '../../src'; +import { containerExec } from 'dockerode-utils'; +import { getRandomPort } from 'get-port-please'; import { logger } from '@cardano-sdk/util-dev'; +import Docker from 'dockerode'; +import path from 'path'; -const env = getEnv(walletVariables); const vrf = Cardano.VrfVkHex('2ee5a4c423224bb9c42107fc18a60556d6a83cec1d9dd37a71f56af7198fc759'); -const wallet1Params: KeyAgentFactoryProps = { - accountIndex: 0, - chainId: env.KEY_MANAGEMENT_PARAMS.chainId, - mnemonic: - // eslint-disable-next-line max-len - 'phrase raw learn suspect inmate powder combine apology regular hero gain chronic fruit ritual short screen goddess odor keen creek brand today kit machine', - passphrase: 'some_passphrase' -}; - describe('cache invalidation', () => { + let testProviderServer: Docker.Container; let wallet1: TestWallet; beforeAll(async () => { + const port = await getRandomPort(); + + // Get environment from original provider server container + const docker = new Docker(); + const originalProviderServer = docker.getContainer('local-network-e2e-provider-server-1'); + const cmdOutput = await containerExec(originalProviderServer, [ + 'node', + '-e', + 'console.log(`sdk_token${JSON.stringify(process.env)}sdk_token`)' + ]); + const matchResult = cmdOutput[0].match(/sdk_token(.*)sdk_token/); + + if (!matchResult) throw new Error('Error getting original container environment'); + + const [, encodedEnv] = matchResult; + + const Env = Object.entries({ + ...JSON.parse(encodedEnv), + DISABLE_DB_CACHE: 'false', + LOGGER_MIN_SEVERITY: 'debug' + }).map(([key, value]) => `${key}=${value}`); + + const network = docker.getNetwork('local-network-e2e_default'); + + // Test container + testProviderServer = await docker.createContainer({ + Env, + HostConfig: { + Binds: [`${path.join(__dirname, '..', '..', '..', '..', 'compose', 'placeholder-secrets')}:/run/secrets`], + PortBindings: { '3000/tcp': [{ HostPort: port.toString() }] } + }, + Image: 'local-network-e2e-provider-server', + name: 'local-network-e2e-provider-server-test' + }); + + await network.connect({ Container: testProviderServer.id }); + await testProviderServer.start(); + + const override = Object.fromEntries( + Object.entries(process.env) + .filter(([key]) => walletVariables.includes(key as typeof walletVariables[number])) + .map(([key, value]) => [key, value?.replace('localhost:4000/', `localhost:${port}/`)]) + ); + const env = getEnv(walletVariables, { override }); + const wallet1Params: KeyAgentFactoryProps = { + accountIndex: 0, + chainId: env.KEY_MANAGEMENT_PARAMS.chainId, + mnemonic: + // eslint-disable-next-line max-len + 'phrase raw learn suspect inmate powder combine apology regular hero gain chronic fruit ritual short screen goddess odor keen creek brand today kit machine', + passphrase: 'some_passphrase' + }; + jest.setTimeout(180_000); wallet1 = await getWallet({ @@ -45,9 +92,13 @@ describe('cache invalidation', () => { await waitForWalletStateSettle(wallet1.wallet); }); - afterAll(() => wallet1.wallet.shutdown()); + afterAll(async () => { + wallet1.wallet.shutdown(); + await testProviderServer.stop(); + await testProviderServer.remove(); + }); - test.skip('cache is invalidated on epoch rollover', async () => { + test('cache is invalidated on epoch rollover', async () => { const wallet = wallet1.wallet; await walletReady(wallet); diff --git a/yarn.lock b/yarn.lock index 8ef9b02d917..6dc6672a78e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2587,6 +2587,8 @@ __metadata: convict: ^6.2.4 copy-webpack-plugin: ^10.2.4 delay: 5.0.0 + dockerode: ^3.3.1 + dockerode-utils: ^0.0.7 dotenv: ^16.0.1 envalid: ^7.3.1 eslint: ^7.32.0