diff --git a/.gitea/workflows/fixturenet-eth-plugeth-arm-test.yml b/.gitea/workflows/fixturenet-eth-plugeth-arm-test.yml index 92ddd5dc..b5e8d22c 100644 --- a/.gitea/workflows/fixturenet-eth-plugeth-arm-test.yml +++ b/.gitea/workflows/fixturenet-eth-plugeth-arm-test.yml @@ -43,3 +43,19 @@ jobs: run: ./scripts/build_shiv_package.sh - name: "Run fixturenet-eth tests" run: ./tests/fixturenet-eth-plugeth/run-test.sh + - name: Notify Vulcanize Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.VULCANIZE_SLACK_CI_ALERTS }} + - name: Notify DeepStack Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.DEEPSTACK_SLACK_CI_ALERTS }} diff --git a/.gitea/workflows/fixturenet-eth-plugeth-test.yml b/.gitea/workflows/fixturenet-eth-plugeth-test.yml index 11bca169..f9db5e86 100644 --- a/.gitea/workflows/fixturenet-eth-plugeth-test.yml +++ b/.gitea/workflows/fixturenet-eth-plugeth-test.yml @@ -47,3 +47,19 @@ jobs: sleep 5 - name: "Run fixturenet-eth tests" run: ./tests/fixturenet-eth-plugeth/run-test.sh + - name: Notify Vulcanize Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.VULCANIZE_SLACK_CI_ALERTS }} + - name: Notify DeepStack Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.DEEPSTACK_SLACK_CI_ALERTS }} diff --git a/.gitea/workflows/fixturenet-eth-test.yml b/.gitea/workflows/fixturenet-eth-test.yml index 73804df5..671184a9 100644 --- a/.gitea/workflows/fixturenet-eth-test.yml +++ b/.gitea/workflows/fixturenet-eth-test.yml @@ -45,4 +45,19 @@ jobs: sleep 5 - name: "Run fixturenet-eth tests" run: ./tests/fixturenet-eth/run-test.sh - + - name: Notify Vulcanize Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.VULCANIZE_SLACK_CI_ALERTS }} + - name: Notify DeepStack Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.DEEPSTACK_SLACK_CI_ALERTS }} diff --git a/.gitea/workflows/fixturenet-laconicd-test.yml b/.gitea/workflows/fixturenet-laconicd-test.yml index 67f3797e..ae5bf2d5 100644 --- a/.gitea/workflows/fixturenet-laconicd-test.yml +++ b/.gitea/workflows/fixturenet-laconicd-test.yml @@ -11,7 +11,7 @@ on: jobs: test: - name: "Run an Laconicd fixturenet test" + name: "Run Laconicd fixturenet and Laconic CLI tests" runs-on: ubuntu-latest steps: - name: 'Update' @@ -46,3 +46,21 @@ jobs: run: ./scripts/build_shiv_package.sh - name: "Run fixturenet-laconicd tests" run: ./tests/fixturenet-laconicd/run-test.sh + - name: "Run laconic CLI tests" + run: ./tests/fixturenet-laconicd/run-cli-test.sh + - name: Notify Vulcanize Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.VULCANIZE_SLACK_CI_ALERTS }} + - name: Notify DeepStack Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.DEEPSTACK_SLACK_CI_ALERTS }} diff --git a/.gitea/workflows/lint.yml b/.gitea/workflows/lint.yml index f9be1e6b..44156eae 100644 --- a/.gitea/workflows/lint.yml +++ b/.gitea/workflows/lint.yml @@ -19,3 +19,19 @@ jobs: python-version: '3.8' - name : "Run flake8" uses: py-actions/flake8@v2 + - name: Notify Vulcanize Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.VULCANIZE_SLACK_CI_ALERTS }} + - name: Notify DeepStack Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.DEEPSTACK_SLACK_CI_ALERTS }} diff --git a/.gitea/workflows/publish.yml b/.gitea/workflows/publish.yml index ffbb9937..13b94ba5 100644 --- a/.gitea/workflows/publish.yml +++ b/.gitea/workflows/publish.yml @@ -54,3 +54,19 @@ jobs: # Hack using endsWith to workaround Gitea sometimes sending "publish-test" vs "refs/heads/publish-test" draft: ${{ endsWith('publish-test', github.ref ) }} files: ./laconic-so + - name: Notify Vulcanize Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.VULCANIZE_SLACK_CI_ALERTS }} + - name: Notify DeepStack Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.DEEPSTACK_SLACK_CI_ALERTS }} diff --git a/.gitea/workflows/test-container-registry.yml b/.gitea/workflows/test-container-registry.yml index 3358aa09..f0cfb74c 100644 --- a/.gitea/workflows/test-container-registry.yml +++ b/.gitea/workflows/test-container-registry.yml @@ -51,4 +51,19 @@ jobs: source /opt/bash-utils/cgroup-helper.sh join_cgroup ./tests/container-registry/run-test.sh - + - name: Notify Vulcanize Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.VULCANIZE_SLACK_CI_ALERTS }} + - name: Notify DeepStack Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.DEEPSTACK_SLACK_CI_ALERTS }} diff --git a/.gitea/workflows/test-database.yml b/.gitea/workflows/test-database.yml index b925271b..f66b1b77 100644 --- a/.gitea/workflows/test-database.yml +++ b/.gitea/workflows/test-database.yml @@ -49,4 +49,19 @@ jobs: source /opt/bash-utils/cgroup-helper.sh join_cgroup ./tests/database/run-test.sh - + - name: Notify Vulcanize Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.VULCANIZE_SLACK_CI_ALERTS }} + - name: Notify DeepStack Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.DEEPSTACK_SLACK_CI_ALERTS }} diff --git a/.gitea/workflows/test-deploy.yml b/.gitea/workflows/test-deploy.yml index 6e47c82d..426b629b 100644 --- a/.gitea/workflows/test-deploy.yml +++ b/.gitea/workflows/test-deploy.yml @@ -47,3 +47,19 @@ jobs: sleep 5 - name: "Run deploy tests" run: ./tests/deploy/run-deploy-test.sh + - name: Notify Vulcanize Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.VULCANIZE_SLACK_CI_ALERTS }} + - name: Notify DeepStack Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.DEEPSTACK_SLACK_CI_ALERTS }} diff --git a/.gitea/workflows/test-k8s-deploy.yml b/.gitea/workflows/test-k8s-deploy.yml index 7df39132..de96b391 100644 --- a/.gitea/workflows/test-k8s-deploy.yml +++ b/.gitea/workflows/test-k8s-deploy.yml @@ -51,4 +51,19 @@ jobs: source /opt/bash-utils/cgroup-helper.sh join_cgroup ./tests/k8s-deploy/run-deploy-test.sh - + - name: Notify Vulcanize Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.VULCANIZE_SLACK_CI_ALERTS }} + - name: Notify DeepStack Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.DEEPSTACK_SLACK_CI_ALERTS }} diff --git a/.gitea/workflows/test-webapp.yml b/.gitea/workflows/test-webapp.yml index 8b83c606..708c6b3d 100644 --- a/.gitea/workflows/test-webapp.yml +++ b/.gitea/workflows/test-webapp.yml @@ -49,3 +49,19 @@ jobs: sleep 5 - name: "Run webapp tests" run: ./tests/webapp-test/run-webapp-test.sh + - name: Notify Vulcanize Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.VULCANIZE_SLACK_CI_ALERTS }} + - name: Notify DeepStack Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.DEEPSTACK_SLACK_CI_ALERTS }} diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index 193e27c9..f017dc49 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -47,5 +47,19 @@ jobs: sleep 5 - name: "Run smoke tests" run: ./tests/smoke-test/run-smoke-test.sh - - + - name: Notify Vulcanize Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.VULCANIZE_SLACK_CI_ALERTS }} + - name: Notify DeepStack Slack on CI failure + if: ${{ always() && github.ref_name == 'main' }} + uses: ravsamhq/notify-slack-action@v2 + with: + status: ${{ job.status }} + notify_when: 'failure' + env: + SLACK_WEBHOOK_URL: ${{ secrets.DEEPSTACK_SLACK_CI_ALERTS }} diff --git a/.gitea/workflows/triggers/fixturenet-laconicd-test b/.gitea/workflows/triggers/fixturenet-laconicd-test index ad09df27..10db7fd7 100644 --- a/.gitea/workflows/triggers/fixturenet-laconicd-test +++ b/.gitea/workflows/triggers/fixturenet-laconicd-test @@ -1,3 +1,6 @@ Change this file to trigger running the fixturenet-laconicd-test CI job Trigger Trigger +Trigger +Trigger +Trigger diff --git a/stack_orchestrator/data/compose/docker-compose-fixturenet-laconicd.yml b/stack_orchestrator/data/compose/docker-compose-fixturenet-laconicd.yml index 7b48f60d..38b8d442 100644 --- a/stack_orchestrator/data/compose/docker-compose-fixturenet-laconicd.yml +++ b/stack_orchestrator/data/compose/docker-compose-fixturenet-laconicd.yml @@ -3,6 +3,9 @@ services: restart: unless-stopped image: cerc/laconicd:local command: ["sh", "/docker-entrypoint-scripts.d/create-fixturenet.sh"] + environment: + TEST_AUCTION_ENABLED: ${TEST_AUCTION_ENABLED} + TEST_REGISTRY_EXPIRY: ${TEST_REGISTRY_EXPIRY} volumes: # The cosmos-sdk node's database directory: - laconicd-data:/root/.laconicd @@ -25,6 +28,7 @@ services: image: cerc/laconic-registry-cli:local volumes: - ../config/fixturenet-laconicd/registry-cli-config-template.yml:/registry-cli-config-template.yml + - ${BASE_DIR:-~/cerc}/laconic-registry-cli:/laconic-registry-cli volumes: laconicd-data: diff --git a/stack_orchestrator/data/compose/docker-compose-watcher-ajna.yml b/stack_orchestrator/data/compose/docker-compose-watcher-ajna.yml new file mode 100644 index 00000000..b3fcaab5 --- /dev/null +++ b/stack_orchestrator/data/compose/docker-compose-watcher-ajna.yml @@ -0,0 +1,76 @@ +version: '3.2' + +services: + ajna-watcher-db: + restart: unless-stopped + image: postgres:14-alpine + environment: + - POSTGRES_USER=vdbm + - POSTGRES_MULTIPLE_DATABASES=ajna-watcher,ajna-watcher-job-queue + - POSTGRES_EXTENSION=ajna-watcher-job-queue:pgcrypto + - POSTGRES_PASSWORD=password + volumes: + - ../config/postgresql/multiple-postgressql-databases.sh:/docker-entrypoint-initdb.d/multiple-postgressql-databases.sh + - ajna_watcher_db_data:/var/lib/postgresql/data + ports: + - "5432" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "5432"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 10s + + ajna-watcher-job-runner: + restart: unless-stopped + depends_on: + ajna-watcher-db: + condition: service_healthy + image: cerc/watcher-ajna:local + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_ETH_RPC_ENDPOINT: ${CERC_ETH_RPC_ENDPOINT} + command: ["bash", "./start-job-runner.sh"] + volumes: + - ../config/watcher-ajna/watcher-config-template.toml:/app/environments/watcher-config-template.toml + - ../config/watcher-ajna/start-job-runner.sh:/app/start-job-runner.sh + ports: + - "9000" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "9000"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + + ajna-watcher-server: + restart: unless-stopped + depends_on: + ajna-watcher-db: + condition: service_healthy + ajna-watcher-job-runner: + condition: service_healthy + image: cerc/watcher-ajna:local + environment: + CERC_SCRIPT_DEBUG: ${CERC_SCRIPT_DEBUG} + CERC_ETH_RPC_ENDPOINT: ${CERC_ETH_RPC_ENDPOINT} + command: ["bash", "./start-server.sh"] + volumes: + - ../config/watcher-ajna/watcher-config-template.toml:/app/environments/watcher-config-template.toml + - ../config/watcher-ajna/start-server.sh:/app/start-server.sh + ports: + - "3008" + - "9001" + healthcheck: + test: ["CMD", "nc", "-v", "localhost", "3008"] + interval: 20s + timeout: 5s + retries: 15 + start_period: 5s + extra_hosts: + - "host.docker.internal:host-gateway" + +volumes: + ajna_watcher_db_data: diff --git a/stack_orchestrator/data/config/monitoring/watcher-alert-rules.yml b/stack_orchestrator/data/config/monitoring/watcher-alert-rules.yml index 9df9472f..a190a1fd 100644 --- a/stack_orchestrator/data/config/monitoring/watcher-alert-rules.yml +++ b/stack_orchestrator/data/config/monitoring/watcher-alert-rules.yml @@ -50,22 +50,6 @@ groups: legendFormat: __auto range: false refId: latest_external - - refId: latest_indexed - relativeTimeRange: - from: 600 - to: 0 - datasourceUid: PBFA97CFB590B2093 - model: - datasource: - type: prometheus - uid: PBFA97CFB590B2093 - editorMode: code - expr: sync_status_block_number{job="azimuth", instance="azimuth", kind="latest_indexed"} - hide: false - instant: true - legendFormat: __auto - range: false - refId: latest_indexed - refId: condition relativeTimeRange: from: 600 @@ -142,22 +126,6 @@ groups: legendFormat: __auto range: false refId: latest_external - - refId: latest_indexed - relativeTimeRange: - from: 600 - to: 0 - datasourceUid: PBFA97CFB590B2093 - model: - datasource: - type: prometheus - uid: PBFA97CFB590B2093 - editorMode: code - expr: sync_status_block_number{job="azimuth", instance="censures", kind="latest_indexed"} - hide: false - instant: true - legendFormat: __auto - range: false - refId: latest_indexed - refId: condition relativeTimeRange: from: 600 @@ -234,22 +202,6 @@ groups: legendFormat: __auto range: false refId: latest_external - - refId: latest_indexed - relativeTimeRange: - from: 600 - to: 0 - datasourceUid: PBFA97CFB590B2093 - model: - datasource: - type: prometheus - uid: PBFA97CFB590B2093 - editorMode: code - expr: sync_status_block_number{job="azimuth", instance="claims", kind="latest_indexed"} - hide: false - instant: true - legendFormat: __auto - range: false - refId: latest_indexed - refId: condition relativeTimeRange: from: 600 @@ -326,22 +278,6 @@ groups: legendFormat: __auto range: false refId: latest_external - - refId: latest_indexed - relativeTimeRange: - from: 600 - to: 0 - datasourceUid: PBFA97CFB590B2093 - model: - datasource: - type: prometheus - uid: PBFA97CFB590B2093 - editorMode: code - expr: sync_status_block_number{job="azimuth", instance="conditional_star_release", kind="latest_indexed"} - hide: false - instant: true - legendFormat: __auto - range: false - refId: latest_indexed - refId: condition relativeTimeRange: from: 600 @@ -418,22 +354,6 @@ groups: legendFormat: __auto range: false refId: latest_external - - refId: latest_indexed - relativeTimeRange: - from: 600 - to: 0 - datasourceUid: PBFA97CFB590B2093 - model: - datasource: - type: prometheus - uid: PBFA97CFB590B2093 - editorMode: code - expr: sync_status_block_number{job="azimuth", instance="delegated_sending", kind="latest_indexed"} - hide: false - instant: true - legendFormat: __auto - range: false - refId: latest_indexed - refId: condition relativeTimeRange: from: 600 @@ -510,22 +430,6 @@ groups: legendFormat: __auto range: false refId: latest_external - - refId: latest_indexed - relativeTimeRange: - from: 600 - to: 0 - datasourceUid: PBFA97CFB590B2093 - model: - datasource: - type: prometheus - uid: PBFA97CFB590B2093 - editorMode: code - expr: sync_status_block_number{job="azimuth", instance="ecliptic", kind="latest_indexed"} - hide: false - instant: true - legendFormat: __auto - range: false - refId: latest_indexed - refId: condition relativeTimeRange: from: 600 @@ -602,22 +506,6 @@ groups: legendFormat: __auto range: false refId: latest_external - - refId: latest_indexed - relativeTimeRange: - from: 600 - to: 0 - datasourceUid: PBFA97CFB590B2093 - model: - datasource: - type: prometheus - uid: PBFA97CFB590B2093 - editorMode: code - expr: sync_status_block_number{job="azimuth", instance="azimuth", kind="latest_indexed"} - hide: false - instant: true - legendFormat: __auto - range: false - refId: latest_indexed - refId: condition relativeTimeRange: from: 600 @@ -694,22 +582,6 @@ groups: legendFormat: __auto range: false refId: latest_external - - refId: latest_indexed - relativeTimeRange: - from: 600 - to: 0 - datasourceUid: PBFA97CFB590B2093 - model: - datasource: - type: prometheus - uid: PBFA97CFB590B2093 - editorMode: code - expr: sync_status_block_number{job="azimuth", instance="polls", kind="latest_indexed"} - hide: false - instant: true - legendFormat: __auto - range: false - refId: latest_indexed - refId: condition relativeTimeRange: from: 600 @@ -788,22 +660,6 @@ groups: legendFormat: __auto range: false refId: latest_external - - refId: latest_indexed - relativeTimeRange: - from: 600 - to: 0 - datasourceUid: PBFA97CFB590B2093 - model: - datasource: - type: prometheus - uid: PBFA97CFB590B2093 - editorMode: code - expr: sync_status_block_number{job="sushi", instance="sushiswap", kind="latest_indexed"} - hide: false - instant: true - legendFormat: __auto - range: false - refId: latest_indexed - refId: condition relativeTimeRange: from: 600 @@ -880,22 +736,6 @@ groups: legendFormat: __auto range: false refId: latest_external - - refId: latest_indexed - relativeTimeRange: - from: 600 - to: 0 - datasourceUid: PBFA97CFB590B2093 - model: - datasource: - type: prometheus - uid: PBFA97CFB590B2093 - editorMode: code - expr: sync_status_block_number{job="sushi", instance="merkl_sushiswap", kind="latest_indexed"} - hide: false - instant: true - legendFormat: __auto - range: false - refId: latest_indexed - refId: condition relativeTimeRange: from: 600 diff --git a/stack_orchestrator/data/config/watcher-ajna/start-job-runner.sh b/stack_orchestrator/data/config/watcher-ajna/start-job-runner.sh new file mode 100755 index 00000000..819b1096 --- /dev/null +++ b/stack_orchestrator/data/config/watcher-ajna/start-job-runner.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi +set -u + +echo "Using ETH RPC endpoint ${CERC_ETH_RPC_ENDPOINT}" + +# Read in the config template TOML file and modify it +WATCHER_CONFIG_TEMPLATE=$(cat environments/watcher-config-template.toml) +WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ + sed -E "s|REPLACE_WITH_CERC_ETH_RPC_ENDPOINT|${CERC_ETH_RPC_ENDPOINT}| ") + +# Write the modified content to a new file +echo "$WATCHER_CONFIG" > environments/local.toml + +echo "Running job-runner..." +DEBUG=vulcanize:* exec node --enable-source-maps dist/job-runner.js diff --git a/stack_orchestrator/data/config/watcher-ajna/start-server.sh b/stack_orchestrator/data/config/watcher-ajna/start-server.sh new file mode 100755 index 00000000..e2bbdaad --- /dev/null +++ b/stack_orchestrator/data/config/watcher-ajna/start-server.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi +set -u + +echo "Using ETH RPC endpoint ${CERC_ETH_RPC_ENDPOINT}" + +# Read in the config template TOML file and modify it +WATCHER_CONFIG_TEMPLATE=$(cat environments/watcher-config-template.toml) +WATCHER_CONFIG=$(echo "$WATCHER_CONFIG_TEMPLATE" | \ + sed -E "s|REPLACE_WITH_CERC_ETH_RPC_ENDPOINT|${CERC_ETH_RPC_ENDPOINT}| ") + +# Write the modified content to a new file +echo "$WATCHER_CONFIG" > environments/local.toml + +echo "Running server..." +DEBUG=vulcanize:* exec node --enable-source-maps dist/server.js diff --git a/stack_orchestrator/data/config/watcher-ajna/watcher-config-template.toml b/stack_orchestrator/data/config/watcher-ajna/watcher-config-template.toml new file mode 100644 index 00000000..70fc0466 --- /dev/null +++ b/stack_orchestrator/data/config/watcher-ajna/watcher-config-template.toml @@ -0,0 +1,98 @@ +[server] + host = "0.0.0.0" + port = 3008 + kind = "active" + gqlPath = "/" + + # Checkpointing state. + checkpointing = true + + # Checkpoint interval in number of blocks. + checkpointInterval = 2000 + + # Enable state creation + # CAUTION: Disable only if state creation is not desired or can be filled subsequently + enableState = false + + subgraphPath = "./subgraph-build" + + # Interval to restart wasm instance periodically + wasmRestartBlocksInterval = 20 + + # Interval in number of blocks at which to clear entities cache. + clearEntitiesCacheInterval = 1000 + + # Max block range for which to return events in eventsInRange GQL query. + # Use -1 for skipping check on block range. + maxEventsBlockRange = 1000 + + # Flag to specify whether RPC endpoint supports block hash as block tag parameter + rpcSupportsBlockHashParam = false + + # GQL cache settings + [server.gqlCache] + enabled = true + + # Max in-memory cache size (in bytes) (default 8 MB) + # maxCacheSize + + # GQL cache-control max-age settings (in seconds) + maxAge = 15 + timeTravelMaxAge = 86400 # 1 day + +[metrics] + host = "0.0.0.0" + port = 9000 + [metrics.gql] + port = 9001 + +[database] + type = "postgres" + host = "ajna-watcher-db" + port = 5432 + database = "ajna-watcher" + username = "vdbm" + password = "password" + synchronize = true + logging = false + +[upstream] + [upstream.ethServer] + rpcProviderEndpoint = "REPLACE_WITH_CERC_ETH_RPC_ENDPOINT" + + # Boolean flag to specify if rpc-eth-client should be used for RPC endpoint instead of ipld-eth-client (ipld-eth-server GQL client) + rpcClient = true + + # Boolean flag to specify if rpcProviderEndpoint is an FEVM RPC endpoint + isFEVM = true + + # Boolean flag to filter event logs by contracts + filterLogsByAddresses = true + # Boolean flag to filter event logs by topics + filterLogsByTopics = true + + [upstream.cache] + name = "requests" + enabled = false + deleteOnStart = false + +[jobQueue] + dbConnectionString = "postgres://vdbm:password@ajna-watcher-db/ajna-watcher-job-queue" + maxCompletionLagInSecs = 300 + jobDelayInMilliSecs = 100 + eventsInBatch = 50 + subgraphEventsOrder = true + # Filecoin block time: https://docs.filecoin.io/basics/the-blockchain/blocks-and-tipsets#blocktime + blockDelayInMilliSecs = 30000 + + # Boolean to switch between modes of processing events when starting the server. + # Setting to true will fetch filtered events and required blocks in a range of blocks and then process them. + # Setting to false will fetch blocks consecutively with its events and then process them (Behaviour is followed in realtime processing near head). + useBlockRanges = true + + # Block range in which logs are fetched during historical blocks processing + historicalLogsBlockRange = 2000 + + # Max block range of historical processing after which it waits for completion of events processing + # If set to -1 historical processing does not wait for events processing and completes till latest canonical block + historicalMaxFetchAhead = 10000 diff --git a/stack_orchestrator/data/container-build/cerc-nextjs-base/build.sh b/stack_orchestrator/data/container-build/cerc-nextjs-base/build.sh index cca8d64b..bb3983cf 100755 --- a/stack_orchestrator/data/container-build/cerc-nextjs-base/build.sh +++ b/stack_orchestrator/data/container-build/cerc-nextjs-base/build.sh @@ -11,8 +11,14 @@ CERC_CONTAINER_BUILD_DOCKERFILE=${CERC_CONTAINER_BUILD_DOCKERFILE:-$SCRIPT_DIR/D CERC_CONTAINER_BUILD_TAG=${CERC_CONTAINER_BUILD_TAG:-cerc/nextjs-base:local} docker build -t $CERC_CONTAINER_BUILD_TAG ${build_command_args} -f $CERC_CONTAINER_BUILD_DOCKERFILE $CERC_CONTAINER_BUILD_WORK_DIR +rc=$? -if [ $? -eq 0 ] && [ "$CERC_CONTAINER_BUILD_TAG" != "cerc/nextjs-base:local" ]; then +if [ $rc -ne 0 ]; then + echo "BUILD FAILED" 1>&2 + exit $rc +fi + +if [ "$CERC_CONTAINER_BUILD_TAG" != "cerc/nextjs-base:local" ]; then cat < /dev/null && pwd ) + +docker build -t cerc/watcher-ajna:local -f ${SCRIPT_DIR}/Dockerfile ${build_command_args} ${CERC_REPO_BASE_DIR}/ajna-watcher-ts diff --git a/stack_orchestrator/data/container-build/cerc-webapp-base/build.sh b/stack_orchestrator/data/container-build/cerc-webapp-base/build.sh index 12b25e5e..5fc6cc3f 100755 --- a/stack_orchestrator/data/container-build/cerc-webapp-base/build.sh +++ b/stack_orchestrator/data/container-build/cerc-webapp-base/build.sh @@ -11,8 +11,14 @@ CERC_CONTAINER_BUILD_DOCKERFILE=${CERC_CONTAINER_BUILD_DOCKERFILE:-$SCRIPT_DIR/D CERC_CONTAINER_BUILD_TAG=${CERC_CONTAINER_BUILD_TAG:-cerc/webapp-base:local} docker build -t $CERC_CONTAINER_BUILD_TAG ${build_command_args} -f $CERC_CONTAINER_BUILD_DOCKERFILE $CERC_CONTAINER_BUILD_WORK_DIR +rc=$? -if [ $? -eq 0 ] && [ "$CERC_CONTAINER_BUILD_TAG" != "cerc/webapp-base:local" ]; then +if [ $rc -ne 0 ]; then + echo "BUILD FAILED" 1>&2 + exit $rc +fi + +if [ "$CERC_CONTAINER_BUILD_TAG" != "cerc/webapp-base:local" ]; then cat < + ``` + +* Open the GQL playground at + + ```graphql + # Example query + query { + _meta { + block { + hash + number + timestamp + } + deployment + hasIndexingErrors + } + + accounts { + id + txCount + tokensDelegated + rewardsClaimed + } + } + ``` + +## Clean up + +Stop all the ajna services running in background: + +```bash +# Only stop the docker containers +laconic-so deployment --dir ajna-deployment stop + +# Run 'start' to restart the deployment +``` + +To stop all the ajna services and also delete data: + +```bash +# Stop the docker containers +laconic-so deployment --dir ajna-deployment stop --delete-volumes + +# Remove deployment directory (deployment will have to be recreated for a re-run) +rm -r ajna-deployment +``` diff --git a/stack_orchestrator/data/stacks/ajna/stack.yml b/stack_orchestrator/data/stacks/ajna/stack.yml new file mode 100644 index 00000000..4d64559e --- /dev/null +++ b/stack_orchestrator/data/stacks/ajna/stack.yml @@ -0,0 +1,9 @@ +version: "1.0" +name: ajna +description: "Ajna watcher stack" +repos: + - git.vdb.to/cerc-io/ajna-watcher-ts@v0.1.1 +containers: + - cerc/watcher-ajna +pods: + - watcher-ajna diff --git a/stack_orchestrator/data/stacks/merkl-sushiswap-v3/README.md b/stack_orchestrator/data/stacks/merkl-sushiswap-v3/README.md index 4284c2ad..ddd8ecf6 100644 --- a/stack_orchestrator/data/stacks/merkl-sushiswap-v3/README.md +++ b/stack_orchestrator/data/stacks/merkl-sushiswap-v3/README.md @@ -16,26 +16,55 @@ laconic-so --stack merkl-sushiswap-v3 build-containers ## Deploy -### Configuration - -Create and update an env file to be used in the next step: - - ```bash - # External Filecoin (ETH RPC) endpoint to point the watcher - CERC_ETH_RPC_ENDPOINT= - ``` - -### Deploy the stack +Create a spec file for the deployment: ```bash -laconic-so --stack merkl-sushiswap-v3 deploy --cluster merkl_sushiswap_v3 --env-file up +laconic-so --stack merkl-sushiswap-v3 deploy init --output merkl-sushiswap-v3-spec.yml +``` + +### Ports + +Edit `network` in the spec file to map container ports to host ports as required: + +``` +... +network: + ports: + merkl-sushiswap-v3-watcher-db: + - '5432' + merkl-sushiswap-v3-watcher-job-runner: + - 9002:9000 + merkl-sushiswap-v3-watcher-server: + - 127.0.0.1:3007:3008 + - 9003:9001 +``` + +### Create a deployment + +Create a deployment from the spec file: + +```bash +laconic-so --stack merkl-sushiswap-v3 deploy create --spec-file merkl-sushiswap-v3-spec.yml --deployment-dir merkl-sushiswap-v3-deployment +``` + +### Configuration + +Inside deployment directory, open the `config.env` file and set following env variables: + +```bash +# External Filecoin (ETH RPC) endpoint to point the watcher to +CERC_ETH_RPC_ENDPOINT=https://example-lotus-endpoint/rpc/v1 +``` + +### Start the deployment + +```bash +laconic-so deployment --dir merkl-sushiswap-v3-deployment start ``` * To list down and monitor the running containers: ```bash - laconic-so --stack merkl-sushiswap-v3 deploy --cluster merkl_sushiswap_v3 ps - # With status docker ps -a @@ -46,6 +75,7 @@ laconic-so --stack merkl-sushiswap-v3 deploy --cluster merkl_sushiswap_v3 --env- * Open the GQL playground at http://localhost:3007/graphql ```graphql + # Example query { _meta { block { @@ -54,7 +84,7 @@ laconic-so --stack merkl-sushiswap-v3 deploy --cluster merkl_sushiswap_v3 --env- } hasIndexingErrors } - + factories { id poolCount @@ -64,18 +94,21 @@ laconic-so --stack merkl-sushiswap-v3 deploy --cluster merkl_sushiswap_v3 --env- ## Clean up -Stop all the services running in background: +Stop all the merkl-sushiswap-v3 services running in background: ```bash -laconic-so --stack merkl-sushiswap-v3 deploy --cluster merkl_sushiswap_v3 down +# Only stop the docker containers +laconic-so deployment --dir merkl-sushiswap-v3-deployment stop + +# Run 'start' to restart the deployment ``` -Clear volumes created by this stack: +To stop all the merkl-sushiswap-v3 services and also delete data: ```bash -# List all relevant volumes -docker volume ls -q --filter "name=merkl_sushiswap_v3" +# Stop the docker containers +laconic-so deployment --dir merkl-sushiswap-v3-deployment stop --delete-volumes -# Remove all the listed volumes -docker volume rm $(docker volume ls -q --filter "name=merkl_sushiswap_v3") +# Remove deployment directory (deployment will have to be recreated for a re-run) +rm -r merkl-sushiswap-v3-deployment ``` diff --git a/stack_orchestrator/data/stacks/merkl-sushiswap-v3/stack.yml b/stack_orchestrator/data/stacks/merkl-sushiswap-v3/stack.yml index 847df33c..c080d324 100644 --- a/stack_orchestrator/data/stacks/merkl-sushiswap-v3/stack.yml +++ b/stack_orchestrator/data/stacks/merkl-sushiswap-v3/stack.yml @@ -2,7 +2,7 @@ version: "1.0" name: merkl-sushiswap-v3 description: "SushiSwap v3 watcher stack" repos: - - github.com/cerc-io/merkl-sushiswap-v3-watcher-ts@v0.1.6 + - github.com/cerc-io/merkl-sushiswap-v3-watcher-ts@v0.1.7 containers: - cerc/watcher-merkl-sushiswap-v3 pods: diff --git a/stack_orchestrator/data/stacks/monitoring/stack.yml b/stack_orchestrator/data/stacks/monitoring/stack.yml index 058ca971..48605dc3 100644 --- a/stack_orchestrator/data/stacks/monitoring/stack.yml +++ b/stack_orchestrator/data/stacks/monitoring/stack.yml @@ -1,7 +1,7 @@ version: "0.1" name: monitoring repos: - - github.com/cerc-io/watcher-ts@v0.2.79 + - github.com/cerc-io/watcher-ts@v0.2.81 containers: - cerc/watcher-ts pods: diff --git a/stack_orchestrator/data/stacks/sushiswap-subgraph/README.md b/stack_orchestrator/data/stacks/sushiswap-subgraph/README.md index 52433a9c..fbbd3215 100644 --- a/stack_orchestrator/data/stacks/sushiswap-subgraph/README.md +++ b/stack_orchestrator/data/stacks/sushiswap-subgraph/README.md @@ -55,7 +55,7 @@ ports: Create deployment: ```bash -laconic-so deploy create --spec-file sushiswap-subgraph-spec.yml --deployment-dir sushiswap-subgraph-deployment +laconic-so --stack sushiswap-subgraph deploy create --spec-file sushiswap-subgraph-spec.yml --deployment-dir sushiswap-subgraph-deployment ``` ## Start the stack diff --git a/stack_orchestrator/data/stacks/sushiswap-v3/README.md b/stack_orchestrator/data/stacks/sushiswap-v3/README.md index 7116a6d9..6bcbb54c 100644 --- a/stack_orchestrator/data/stacks/sushiswap-v3/README.md +++ b/stack_orchestrator/data/stacks/sushiswap-v3/README.md @@ -16,26 +16,55 @@ laconic-so --stack sushiswap-v3 build-containers ## Deploy -### Configuration - -Create and update an env file to be used in the next step: - - ```bash - # External Filecoin (ETH RPC) endpoint to point the watcher - CERC_ETH_RPC_ENDPOINT= - ``` - -### Deploy the stack +Create a spec file for the deployment: ```bash -laconic-so --stack sushiswap-v3 deploy --cluster sushiswap_v3 --env-file up +laconic-so --stack sushiswap-v3 deploy init --output sushiswap-v3-spec.yml +``` + +### Ports + +Edit `network` in the spec file to map container ports to host ports as required: + +``` +... +network: + ports: + sushiswap-v3-watcher-db: + - '5432' + sushiswap-v3-watcher-job-runner: + - 9000:9000 + sushiswap-v3-watcher-server: + - 127.0.0.1:3008:3008 + - 9001:9001 +``` + +### Create a deployment + +Create a deployment from the spec file: + +```bash +laconic-so --stack sushiswap-v3 deploy create --spec-file sushiswap-v3-spec.yml --deployment-dir sushiswap-v3-deployment +``` + +### Configuration + +Inside deployment directory, open the `config.env` file and set following env variables: + +```bash +# External Filecoin (ETH RPC) endpoint to point the watcher to +CERC_ETH_RPC_ENDPOINT=https://example-lotus-endpoint/rpc/v1 +``` + +### Start the deployment + +```bash +laconic-so deployment --dir sushiswap-v3-deployment start ``` * To list down and monitor the running containers: ```bash - laconic-so --stack sushiswap-v3 deploy --cluster sushiswap_v3 ps - # With status docker ps -a @@ -43,20 +72,43 @@ laconic-so --stack sushiswap-v3 deploy --cluster sushiswap_v3 --env-file ``` +* Open the GQL playground at http://localhost:3008/graphql + + ```graphql + # Example query + { + _meta { + block { + number + timestamp + } + hasIndexingErrors + } + + factories { + id + poolCount + } + } + ``` + ## Clean up -Stop all the services running in background: +Stop all the sushiswap-v3 services running in background: ```bash -laconic-so --stack sushiswap-v3 deploy --cluster sushiswap_v3 down +# Only stop the docker containers +laconic-so deployment --dir sushiswap-v3-deployment stop + +# Run 'start' to restart the deployment ``` -Clear volumes created by this stack: +To stop all the sushiswap-v3 services and also delete data: ```bash -# List all relevant volumes -docker volume ls -q --filter "name=sushiswap_v3" +# Stop the docker containers +laconic-so deployment --dir sushiswap-v3-deployment stop --delete-volumes -# Remove all the listed volumes -docker volume rm $(docker volume ls -q --filter "name=sushiswap_v3") +# Remove deployment directory (deployment will have to be recreated for a re-run) +rm -r sushiswap-v3-deployment ``` diff --git a/stack_orchestrator/data/stacks/sushiswap-v3/stack.yml b/stack_orchestrator/data/stacks/sushiswap-v3/stack.yml index 12103d62..248cb381 100644 --- a/stack_orchestrator/data/stacks/sushiswap-v3/stack.yml +++ b/stack_orchestrator/data/stacks/sushiswap-v3/stack.yml @@ -2,7 +2,7 @@ version: "1.0" name: sushiswap-v3 description: "SushiSwap v3 watcher stack" repos: - - github.com/cerc-io/sushiswap-v3-watcher-ts@v0.1.6 + - github.com/cerc-io/sushiswap-v3-watcher-ts@v0.1.7 containers: - cerc/watcher-sushiswap-v3 pods: diff --git a/stack_orchestrator/deploy/k8s/cluster_info.py b/stack_orchestrator/deploy/k8s/cluster_info.py index 55393bbf..dbf7c907 100644 --- a/stack_orchestrator/deploy/k8s/cluster_info.py +++ b/stack_orchestrator/deploy/k8s/cluster_info.py @@ -101,7 +101,7 @@ class ClusterInfo: ) return service - def get_ingress(self, use_tls=False): + def get_ingress(self, use_tls=False, certificate=None, cluster_issuer="letsencrypt-prod"): # No ingress for a deployment that has no http-proxy defined, for now http_proxy_info_list = self.spec.get_http_proxy() ingress = None @@ -114,8 +114,8 @@ class ClusterInfo: host_name = http_proxy_info["host-name"] rules = [] tls = [client.V1IngressTLS( - hosts=[host_name], - secret_name=f"{self.app_name}-tls" + hosts=certificate["spec"]["dnsNames"] if certificate else [host_name], + secret_name=certificate["spec"]["secretName"] if certificate else f"{self.app_name}-tls" )] if use_tls else None paths = [] for route in http_proxy_info["routes"]: @@ -147,13 +147,17 @@ class ClusterInfo: tls=tls, rules=rules ) + + ingress_annotations = { + "kubernetes.io/ingress.class": "nginx", + } + if not certificate: + ingress_annotations["cert-manager.io/cluster-issuer"] = cluster_issuer + ingress = client.V1Ingress( metadata=client.V1ObjectMeta( name=f"{self.app_name}-ingress", - annotations={ - "kubernetes.io/ingress.class": "nginx", - "cert-manager.io/cluster-issuer": "letsencrypt-prod" - } + annotations=ingress_annotations ), spec=spec ) diff --git a/stack_orchestrator/deploy/k8s/deploy_k8s.py b/stack_orchestrator/deploy/k8s/deploy_k8s.py index a3855fee..5781cd26 100644 --- a/stack_orchestrator/deploy/k8s/deploy_k8s.py +++ b/stack_orchestrator/deploy/k8s/deploy_k8s.py @@ -169,6 +169,39 @@ class K8sDeployer(Deployer): print("Service created:") print(f"{service_resp}") + def _find_certificate_for_host_name(self, host_name): + all_certificates = self.custom_obj_api.list_namespaced_custom_object( + group="cert-manager.io", + version="v1", + namespace=self.k8s_namespace, + plural="certificates" + ) + + host_parts = host_name.split(".", 1) + host_as_wild = None + if len(host_parts) == 2: + host_as_wild = f"*.{host_parts[1]}" + + now = datetime.utcnow().replace(tzinfo=timezone.utc) + fmt = "%Y-%m-%dT%H:%M:%S%z" + + # Walk over all the configured certificates. + for cert in all_certificates["items"]: + dns = cert["spec"]["dnsNames"] + # Check for an exact hostname match or a wildcard match. + if host_name in dns or host_as_wild in dns: + status = cert.get("status", {}) + # Check the certificate date. + if "notAfter" in status and "notBefore" in status: + before = datetime.strptime(status["notBefore"], fmt) + after = datetime.strptime(status["notAfter"], fmt) + if before < now < after: + # Check the status is Ready + for condition in status.get("conditions", []): + if "True" == condition.get("status") and "Ready" == condition.get("type"): + return cert + return None + def up(self, detach, services): if not opts.o.dry_run: if self.is_kind(): @@ -189,8 +222,15 @@ class K8sDeployer(Deployer): self._create_volume_data() self._create_deployment() + http_proxy_info = self.cluster_info.spec.get_http_proxy() # Note: at present we don't support tls for kind (and enabling tls causes errors) - ingress: client.V1Ingress = self.cluster_info.get_ingress(use_tls=not self.is_kind()) + use_tls = http_proxy_info and not self.is_kind() + certificate = self._find_certificate_for_host_name(http_proxy_info[0]["host-name"]) if use_tls else None + if opts.o.debug: + if certificate: + print(f"Using existing certificate: {certificate}") + + ingress: client.V1Ingress = self.cluster_info.get_ingress(use_tls=use_tls, certificate=certificate) if ingress: if opts.o.debug: print(f"Sending this ingress: {ingress}") @@ -350,9 +390,11 @@ class K8sDeployer(Deployer): name=ingress.spec.tls[0].secret_name ) - hostname = ingress.spec.tls[0].hosts[0] + hostname = ingress.spec.rules[0].host ip = ingress.status.load_balancer.ingress[0].ip - tls = "notBefore: %s, notAfter: %s" % (cert["status"]["notBefore"], cert["status"]["notAfter"]) + tls = "notBefore: %s; notAfter: %s; names: %s" % ( + cert["status"]["notBefore"], cert["status"]["notAfter"], ingress.spec.tls[0].hosts + ) except: # noqa: E722 pass diff --git a/stack_orchestrator/deploy/spec.py b/stack_orchestrator/deploy/spec.py index ab452fe3..cbec8ae5 100644 --- a/stack_orchestrator/deploy/spec.py +++ b/stack_orchestrator/deploy/spec.py @@ -27,7 +27,9 @@ class ResourceLimits: memory: int = None storage: int = None - def __init__(self, obj={}): + def __init__(self, obj=None): + if obj is None: + obj = {} if "cpus" in obj: self.cpus = float(obj["cpus"]) if "memory" in obj: @@ -50,7 +52,9 @@ class Resources: limits: ResourceLimits = None reservations: ResourceLimits = None - def __init__(self, obj={}): + def __init__(self, obj=None): + if obj is None: + obj = {} if "reservations" in obj: self.reservations = ResourceLimits(obj["reservations"]) if "limits" in obj: @@ -72,7 +76,9 @@ class Spec: obj: typing.Any file_path: Path - def __init__(self, file_path: Path = None, obj={}) -> None: + def __init__(self, file_path: Path = None, obj=None) -> None: + if obj is None: + obj = {} self.file_path = file_path self.obj = obj @@ -91,49 +97,41 @@ class Spec: self.file_path = file_path def get_image_registry(self): - return (self.obj[constants.image_registry_key] - if self.obj and constants.image_registry_key in self.obj - else None) + return self.obj.get(constants.image_registry_key) def get_volumes(self): - return (self.obj["volumes"] - if self.obj and "volumes" in self.obj - else {}) + return self.obj.get(constants.volumes_key, {}) def get_configmaps(self): - return (self.obj["configmaps"] - if self.obj and "configmaps" in self.obj - else {}) + return self.obj.get(constants.configmaps_key, {}) def get_container_resources(self): - return Resources(self.obj.get("resources", {}).get("containers", {})) + return Resources(self.obj.get(constants.resources_key, {}).get("containers", {})) def get_volume_resources(self): - return Resources(self.obj.get("resources", {}).get("volumes", {})) + return Resources(self.obj.get(constants.resources_key, {}).get(constants.volumes_key, {})) def get_http_proxy(self): - return (self.obj[constants.network_key][constants.http_proxy_key] - if self.obj and constants.network_key in self.obj - and constants.http_proxy_key in self.obj[constants.network_key] - else None) + return self.obj.get(constants.network_key, {}).get(constants.http_proxy_key, []) def get_annotations(self): - return self.obj.get("annotations", {}) + return self.obj.get(constants.annotations_key, {}) def get_labels(self): - return self.obj.get("labels", {}) + return self.obj.get(constants.labels_key, {}) def get_privileged(self): - return "true" == str(self.obj.get("security", {}).get("privileged", "false")).lower() + return "true" == str(self.obj.get(constants.security_key, {}).get("privileged", "false")).lower() def get_capabilities(self): - return self.obj.get("security", {}).get("capabilities", []) + return self.obj.get(constants.security_key, {}).get("capabilities", []) def get_deployment_type(self): - return self.obj[constants.deploy_to_key] + return self.obj.get(constants.deploy_to_key) def is_kubernetes_deployment(self): - return self.get_deployment_type() in [constants.k8s_kind_deploy_type, constants.k8s_deploy_type] + return self.get_deployment_type() in [constants.k8s_kind_deploy_type, + constants.k8s_deploy_type] def is_kind_deployment(self): return self.get_deployment_type() in [constants.k8s_kind_deploy_type] diff --git a/tests/fixturenet-laconicd/run-cli-test.sh b/tests/fixturenet-laconicd/run-cli-test.sh new file mode 100755 index 00000000..8a5dcb42 --- /dev/null +++ b/tests/fixturenet-laconicd/run-cli-test.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +set -e +if [ -n "$CERC_SCRIPT_DEBUG" ]; then + set -x +fi + +echo "$(date +"%Y-%m-%d %T"): Running stack-orchestrator Laconic registry CLI tests" +env +cat /etc/hosts +# Bit of a hack, test the most recent package +TEST_TARGET_SO=$( ls -t1 ./package/laconic-so* | head -1 ) + +export CERC_REPO_BASE_DIR=$(mktemp -d $(pwd)/stack-orchestrator-fixturenet-laconicd-test.XXXXXXXXXX) +echo "$(date +"%Y-%m-%d %T"): Cloning laconic-registry-cli repository into: $CERC_REPO_BASE_DIR" +$TEST_TARGET_SO --stack fixturenet-laconicd setup-repositories --include git.vdb.to/cerc-io/laconic-registry-cli + +echo "$(date +"%Y-%m-%d %T"): Starting stack" +TEST_AUCTION_ENABLED=true BASE_DIR=${CERC_REPO_BASE_DIR} $TEST_TARGET_SO --stack fixturenet-laconicd deploy --cluster laconicd up +echo "$(date +"%Y-%m-%d %T"): Stack started" + +# Verify that the fixturenet is up and running +$TEST_TARGET_SO --stack fixturenet-laconicd deploy --cluster laconicd ps + +# Get the fixturenet account address +laconicd_account_address=$(docker exec laconicd-laconicd-1 laconicd keys list | awk '/- address:/ {print $3}') + +# Copy over config +docker exec laconicd-cli-1 cp config.yml laconic-registry-cli/ + +# Wait for the laconid endpoint to come up +echo "Waiting for the RPC endpoint to come up" +docker exec laconicd-laconicd-1 sh -c "curl --retry 20 --retry-delay 3 --retry-connrefused http://127.0.0.1:9473/api" + +# Run the tests +echo "Running the tests" +docker exec -e TEST_ACCOUNT=$laconicd_account_address laconicd-cli-1 sh -c 'cd laconic-registry-cli && yarn && yarn test' + +# Clean up +$TEST_TARGET_SO --stack fixturenet-laconicd deploy --cluster laconicd down --delete-volumes +echo "$(date +"%Y-%m-%d %T"): Removing cloned repositories" +rm -rf $CERC_REPO_BASE_DIR +echo "$(date +"%Y-%m-%d %T"): Test finished" diff --git a/tests/fixturenet-laconicd/run-test.sh b/tests/fixturenet-laconicd/run-test.sh index 8dad9917..1b3f1f34 100755 --- a/tests/fixturenet-laconicd/run-test.sh +++ b/tests/fixturenet-laconicd/run-test.sh @@ -12,6 +12,7 @@ cat /etc/hosts TEST_TARGET_SO=$( ls -t1 ./package/laconic-so* | head -1 ) # Set a new unique repo dir export CERC_REPO_BASE_DIR=$(mktemp -d $(pwd)/stack-orchestrator-fixturenet-laconicd-test.XXXXXXXXXX) + echo "$(date +"%Y-%m-%d %T"): Testing this package: $TEST_TARGET_SO" echo "$(date +"%Y-%m-%d %T"): Test version command" reported_version_string=$( $TEST_TARGET_SO version ) diff --git a/tests/webapp-test/run-webapp-test.sh b/tests/webapp-test/run-webapp-test.sh index 8cae4828..39b08c3b 100755 --- a/tests/webapp-test/run-webapp-test.sh +++ b/tests/webapp-test/run-webapp-test.sh @@ -32,14 +32,14 @@ set +e CONTAINER_ID=$(docker run -p 3000:80 -d -e CERC_SCRIPT_DEBUG=$CERC_SCRIPT_DEBUG cerc/test-progressive-web-app:local) sleep 3 -wget -t 7 -O test.before -m http://localhost:3000 +wget --tries 20 --retry-connrefused --waitretry=3 -O test.before -m http://localhost:3000 docker logs $CONTAINER_ID docker remove -f $CONTAINER_ID CONTAINER_ID=$(docker run -p 3000:80 -e CERC_WEBAPP_DEBUG=$CHECK -e CERC_SCRIPT_DEBUG=$CERC_SCRIPT_DEBUG -d cerc/test-progressive-web-app:local) sleep 3 -wget -t 7 -O test.after -m http://localhost:3000 +wget --tries 20 --retry-connrefused --waitretry=3 -O test.after -m http://localhost:3000 docker logs $CONTAINER_ID docker remove -f $CONTAINER_ID