diff --git a/.config/dictionaries/project.dic b/.config/dictionaries/project.dic index 9ee9e2524a1a..f48c04ace2f5 100644 --- a/.config/dictionaries/project.dic +++ b/.config/dictionaries/project.dic @@ -409,6 +409,7 @@ vsync wallclock wasmtime Wconditional +webfactory webos Werror Wireframes diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 05a4a9bd840a..edeb2f4ff196 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -78,6 +78,8 @@ jobs: needs: [ci, paths-filter] if: ${{ needs.paths-filter.outputs.catalyst-gateway == 'true' || github.base_ref == 'main'}} uses: ./.github/workflows/gateway-tests.yml + secrets: + QA_REPO_SSH_KEY: ${{ secrets.QA_REPO_SSH_KEY }} voices-integration-tests: needs: [ci, paths-filter] diff --git a/.github/workflows/gateway-tests.yml b/.github/workflows/gateway-tests.yml index 890141f0cd62..512b7c954981 100644 --- a/.github/workflows/gateway-tests.yml +++ b/.github/workflows/gateway-tests.yml @@ -2,6 +2,9 @@ name: Catalyst Gateway integration tests on: workflow_call: + secrets: + QA_REPO_SSH_KEY: + required: true concurrency: group: gateway-tests-${{ github.head_ref || github.ref }} @@ -38,11 +41,12 @@ jobs: with: enable_caching: "true" version: 0.21.0 + - name: Setup uses: input-output-hk/catalyst-forge/actions/setup@ci/v1.10.0 - name: Prepare artifacts - id : images + id: images uses: input-output-hk/catalyst-forge/actions/run@ci/v1.10.0 with: command: run @@ -84,12 +88,6 @@ jobs: exit 1 fi - - name: Schemathesis tests - if: ${{ steps.gateway-healthy.conclusion == 'success' }} - run: | - docker compose -f catalyst-gateway/tests/docker-compose.yml up schemathesis-runner --exit-code-from schemathesis-runner - docker cp schemathesis-runner:/results/junit-report.xml ./schemathesis${{ env.REPORT_EXT }} - - name: Integration API tests if: ${{ steps.gateway-healthy.conclusion == 'success' }} env: @@ -123,3 +121,120 @@ jobs: path: "**/*${{ env.COVERAGE_EXT }}" if-no-files-found: error retention-days: 1 + + devnet-tests: + name: Cat-Gateway devnet integration tests + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install Forge + uses: input-output-hk/catalyst-forge/actions/install@ci/v1.10.0 + with: + enable_caching: "true" + version: 0.21.0 + + - name: Setup + uses: input-output-hk/catalyst-forge/actions/setup@ci/v1.10.0 + + - name: Prepare artifacts + id: images + uses: input-output-hk/catalyst-forge/actions/run@ci/v1.10.0 + with: + command: run + args: ./catalyst-gateway/tests/+all-images + + - name: Setup SSH Agent + uses: webfactory/ssh-agent@v0.9.1 + with: + ssh-private-key: ${{ secrets.QA_REPO_SSH_KEY }} + + - name: Prepare artifacts devnet + id: images-devnet + uses: input-output-hk/catalyst-forge/actions/run@ci/v1.10.0 + with: + command: run + args: ./catalyst-gateway/tests/+images-devnet + + - name: Spin up devnet + if: ${{ steps.images-devnet.conclusion == 'success' }} + run: | + docker compose -f catalyst-gateway/tests/docker-compose-devnet.yml up cat-devnet -d + + - name: Wait for cat-devnet to become healthy + id: devnet-check + run: | + DEVNET_HEALTHY="false" + echo "Waiting for container to be healthy ..." + for i in {1..500}; do + STATUS=$(docker inspect --format='{{.State.Health.Status}}' cat-devnet) + echo "Health status: $STATUS" + if [ "$STATUS" == "healthy" ]; then + echo "Container is healthy!" + DEVNET_HEALTHY="true" + echo "devnet_healthy=$DEVNET_HEALTHY" >> $GITHUB_OUTPUT + exit 0 + fi + if [ "$STATUS" == "unhealthy" ]; then + echo "Container became unhealthy." + docker compose -f catalyst-gateway/tests/docker-compose-devnet.yml logs cat-devnet + docker compose -f catalyst-gateway/tests/docker-compose-devnet.yml stop cat-devnet + echo "devnet_healthy=$DEVNET_HEALTHY" >> $GITHUB_OUTPUT + break + fi + sleep 5 + done + + - name: Spin up devnet ... retry + if: steps.devnet-check.outputs.devnet_healthy == 'false' + run: | + docker compose -f catalyst-gateway/tests/docker-compose-devnet.yml up cat-devnet -d + + - name: Wait for cat-devnet to become healthy ... retry + if: steps.devnet-check.outputs.devnet_healthy == 'false' + run: | + echo "Waiting for container to be healthy ... retry" + for i in {1..500}; do + STATUS=$(docker inspect --format='{{.State.Health.Status}}' cat-devnet) + echo "Health status: $STATUS" + if [ "$STATUS" == "healthy" ]; then + echo "Container is healthy!" + exit 0 + fi + if [ "$STATUS" == "unhealthy" ]; then + echo "Container became unhealthy." + docker compose -f catalyst-gateway/tests/docker-compose-devnet.yml logs cat-devnet + exit 1 + fi + sleep 5 + done + + - name: Spin up catalyst-gateway + id: gateway-started + run: | + docker compose -f catalyst-gateway/tests/docker-compose-devnet.yml up cat-gateway -d + + - name: Wait for cat-gateway to become healthy + id: gateway-healthy + if: ${{ steps.gateway-started.conclusion == 'success' }} + run: | + echo "Waiting for container to be healthy..." + for i in {1..500}; do + STATUS=$(docker inspect --format='{{.State.Health.Status}}' cat-gateway) + echo "Health status: $STATUS" + if [ "$STATUS" == "healthy" ]; then + echo "Container is healthy!" + break + fi + if [ "$STATUS" == "unhealthy" ]; then + echo "Container became unhealthy." + docker compose -f catalyst-gateway/tests/docker-compose-devnet.yml logs cat-gateway + exit 1 + fi + sleep 5 + done + + - name: Schemathesis tests + if: ${{ steps.gateway-healthy.conclusion == 'success' }} + run: | + docker compose -f catalyst-gateway/tests/docker-compose-devnet.yml up schemathesis-runner --exit-code-from schemathesis-runner diff --git a/catalyst-gateway/tests/Earthfile b/catalyst-gateway/tests/Earthfile index cbd7d124208f..e3357c9e3ccd 100644 --- a/catalyst-gateway/tests/Earthfile +++ b/catalyst-gateway/tests/Earthfile @@ -3,17 +3,22 @@ VERSION 0.8 IMPORT github.com/input-output-hk/catalyst-ci/earthly/spectral:v3.6.3 AS spectral-ci IMPORT .. AS gateway +IMPORT github.com/input-output-hk/catalyst-qa/catalyst-devnet:devnet/v0.0.3 AS devnet # build all necessary docker images required to run `docker-compose.yml` services all-images: FROM scratch BUILD gateway+docker BUILD ../event-db+docker - BUILD ./api_tests+package - BUILD ./schemathesis_tests+package - BUILD +package-rust-tests-runner + BUILD ./api_tests+testing-package + BUILD ./schemathesis_tests+testing-package + BUILD +testing-package-rust-tests-runner BUILD +package-event-db-v1 - BUILD +package-haproxy + BUILD +testing-package-haproxy + +images-devnet: + FROM scratch + BUILD devnet+docker # a special package for applying migrations only up to "V2_**" migrations package-event-db-v1: @@ -26,7 +31,7 @@ package-event-db-v1: SAVE IMAGE ${container}:${tag} -package-haproxy: +testing-package-haproxy: FROM haproxy:alpine USER root @@ -56,7 +61,7 @@ rust-tests-builder: RUN cargo nextest archive --release --archive-file cat-gateway-tests.tar.zst SAVE ARTIFACT cat-gateway-tests.tar.zst cat-gateway-tests.tar.zst -package-rust-tests-runner: +testing-package-rust-tests-runner: FROM debian:stable-slim WORKDIR $HOME/build-tmp diff --git a/catalyst-gateway/tests/api_tests/Earthfile b/catalyst-gateway/tests/api_tests/Earthfile index 4c7580cec9db..eeba7ba77628 100644 --- a/catalyst-gateway/tests/api_tests/Earthfile +++ b/catalyst-gateway/tests/api_tests/Earthfile @@ -21,7 +21,7 @@ builder: DO python-ci+BUILDER_WITH_POETRY # Creates a package of the python integration test runner -package: +testing-package: FROM +builder ENV ASSETS_DATA_PATH="./cardano-asset-preprod.json" @@ -29,7 +29,7 @@ package: ENV DEP_MK_SIGNED_DOC_PATH="./dep_mk_signed_doc" # Install socat - RUN apt-get update \ + RUN apt-get clean && apt-get autoremove && apt-get update \ && apt-get install -y --no-install-recommends socat \ && rm -rf /var/lib/apt/lists/* diff --git a/catalyst-gateway/tests/docker-compose-devnet.yml b/catalyst-gateway/tests/docker-compose-devnet.yml new file mode 100644 index 000000000000..31145aa36132 --- /dev/null +++ b/catalyst-gateway/tests/docker-compose-devnet.yml @@ -0,0 +1,116 @@ +# cspell: words statusgossip socat + +services: + + cat-devnet: + image: cat-devnet:latest + container_name: cat-devnet + healthcheck: + test: ["CMD-SHELL","bash /healthcheck.sh"] + start_period: 60s + interval: 30s + retries: 20 + volumes: + - data:/shared-data + network_mode: host + + event-db: + image: event-db:latest + container_name: event-db + environment: + - DB_HOST=localhost + - DB_PORT=5432 + - DB_NAME=CatalystEventDev + - DB_DESCRIPTION="Catalyst Event DB" + - DB_SUPERUSER=postgres + - DB_SUPERUSER_PASSWORD=postgres + - DB_USER=catalyst-event-dev + - DB_USER_PASSWORD=CHANGE_ME + - INIT_AND_DROP_DB=true + - WITH_MIGRATIONS=true + healthcheck: + test: + [ + "CMD-SHELL", + "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_PASSWORD}", + ] + interval: 10s + timeout: 5s + retries: 10 + network_mode: host + + scylla-node: + image: scylladb/scylla:latest + container_name: scylla-node + restart: unless-stopped + command: --smp 2 --memory 1G --overprovisioned 1 --rpc-address 0.0.0.0 --broadcast-rpc-address 127.0.0.1 --api-address 0.0.0.0 --alternator-address 0.0.0.0 + healthcheck: + test: cqlsh -e "SHOW VERSION" || exit 1 + interval: 15s + timeout: 30s + retries: 10 + network_mode: host + + cat-gateway: + image: cat-gateway:latest + container_name: cat-gateway + healthcheck: + test: "curl -s -i localhost:3030/api/v1/health/started | head -n 1 | grep 204" + start_period: 30s + interval: 30s + timeout: 30s + # approximately a 25 minutes of waiting + retries: 50 + environment: + - EVENT_DB_URL=postgres://catalyst-event-dev:CHANGE_ME@localhost/CatalystEventDev + - CASSANDRA_PERSISTENT_URL=localhost:9042 + - CASSANDRA_VOLATILE_URL=localhost:9042 + - CHAIN_NETWORK=Devnet + - SIGNED_DOC_SK=0x6455585b5dcc565c8975bc136e215d6d4dd96540620f37783c564da3cb3686dd + - INTERNAL_API_KEY=123 + # - LOG_LEVEL=error + # - RUST_LOG="error,cat_gateway=debug,cardano_chain_follower=debug,mithril-client=debug" + depends_on: + event-db: + condition: service_healthy + scylla-node: + condition: service_healthy + cat-devnet: + condition: service_healthy + network_mode: host + + devnet-tests: + image: devnet-tests:latest + container_name: devnet-tests + environment: + - CARDANO_NODE_SOCKET_PATH=/shared-data/artifacts/devnet/node-pool1/ipc/node.sock + - CARDANO_CLI_BIN=/shared-data/artifacts/devnet/bin/cardano-cli + - GENESIS_WALLET_ADDR=/shared-data/artifacts/devnet/addresses/utxo1.addr + - GENESIS_WALLET_SKEY=/shared-data/artifacts/devnet/addresses/utxo1.skey + - NETWORK_MAGIC=42 + - CARDANO_API_URL=localhost:8090 + - GATEWAY_API_URL=localhost:3030 + volumes: + - data:/shared-data + depends_on: + cat-gateway: + condition: service_healthy + network_mode: host + + schemathesis-runner: + image: schemathesis-runner:latest + container_name: schemathesis-runner + environment: + - API_SPEC=${API_SPEC:-http://localhost:3030/docs/cat-gateway.json} + - WAIT_FOR_SCHEMA=${WAIT_FOR_SCHEMA:-500} + - MAX_RESPONSE_TIME=${MAX_RESPONSE_TIME:-5000} + - HYPOTHESIS_MAX_EXAMPLES=${HYPOTHESIS_MAX_EXAMPLES:-100} + # place a seed value to reproduce some specific schemathesis test scenario + # - SEED="" + depends_on: + cat-gateway: + condition: service_healthy + network_mode: host + +volumes: + data: diff --git a/catalyst-gateway/tests/docker-compose.yml b/catalyst-gateway/tests/docker-compose.yml index 8dc22a7727ac..257eb0425fc4 100644 --- a/catalyst-gateway/tests/docker-compose.yml +++ b/catalyst-gateway/tests/docker-compose.yml @@ -13,11 +13,10 @@ services: - DB_SUPERUSER_PASSWORD=postgres - DB_USER=catalyst-event-dev - DB_USER_PASSWORD=CHANGE_ME - - INIT_AND_DROP_DB=true - WITH_MIGRATIONS=false ports: - - 5432:5432 + - "5432:5432" healthcheck: test: [ @@ -41,7 +40,6 @@ services: - DB_SUPERUSER_PASSWORD=postgres - DB_USER=catalyst-event-dev - DB_USER_PASSWORD=CHANGE_ME - - INIT_AND_DROP_DB=false - WITH_SEED_DATA=. - WITH_MIGRATIONS=true @@ -62,7 +60,6 @@ services: - DB_SUPERUSER_PASSWORD=postgres - DB_USER=catalyst-event-dev - DB_USER_PASSWORD=CHANGE_ME - - INIT_AND_DROP_DB=false - WITH_SEED_DATA=. - WITH_MIGRATIONS=true @@ -77,7 +74,7 @@ services: restart: unless-stopped command: --smp 2 --memory 1G --overprovisioned 1 --api-address 0.0.0.0 ports: - - 9042:9042 + - "9042:9042" healthcheck: test: cqlsh -e "SHOW VERSION" || exit 1 interval: 15s @@ -109,7 +106,7 @@ services: # - LOG_LEVEL=error # - RUST_LOG="error,cat_gateway=debug,cardano_chain_follower=debug,mithril-client=debug" ports: - - 3030:3030 + - "3030:3030" depends_on: event-db-migrations: condition: service_started diff --git a/catalyst-gateway/tests/schemathesis_tests/Earthfile b/catalyst-gateway/tests/schemathesis_tests/Earthfile index 97ccea9f1eb0..0445a80f3b84 100644 --- a/catalyst-gateway/tests/schemathesis_tests/Earthfile +++ b/catalyst-gateway/tests/schemathesis_tests/Earthfile @@ -2,7 +2,7 @@ VERSION 0.8 ARG --global REGISTRY="harbor.shared-services.projectcatalyst.io/dockerhub" -package: +testing-package: FROM ${REGISTRY}/python:3.12-alpine3.20 ARG version=3.39.16