Skip to content

Commit cd6386a

Browse files
[DOP-20962] Add scheduler integration test (#118)
1 parent c1e27dd commit cd6386a

File tree

14 files changed

+351
-4
lines changed

14 files changed

+351
-4
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
name: Scheduler Tests
2+
on:
3+
workflow_call:
4+
5+
env:
6+
DEFAULT_PYTHON: '3.12'
7+
8+
jobs:
9+
tests:
10+
name: Run Scheduler tests
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- name: Checkout code
15+
uses: actions/checkout@v4
16+
17+
- name: Set up QEMU
18+
uses: docker/setup-qemu-action@v3
19+
20+
- name: Set up Docker Buildx
21+
uses: docker/setup-buildx-action@v3
22+
23+
- name: Cache jars
24+
uses: actions/cache@v4
25+
with:
26+
path: ./cached_jars
27+
key: ${{ runner.os }}-python-${{ env.DEFAULT_PYTHON }}-test-scheduler
28+
restore-keys: |
29+
${{ runner.os }}-python-${{ env.DEFAULT_PYTHON }}-test-scheduler
30+
${{ runner.os }}-python-
31+
32+
- name: Build Worker Image
33+
uses: docker/build-push-action@v6
34+
with:
35+
context: .
36+
tags: mtsrus/syncmaster-worker:${{ github.sha }}
37+
target: test
38+
file: docker/Dockerfile.worker
39+
load: true
40+
cache-from: mtsrus/syncmaster-worker:develop
41+
42+
- name: Docker compose up
43+
run: |
44+
docker compose -f docker-compose.test.yml --profile all down -v --remove-orphans
45+
docker compose -f docker-compose.test.yml --profile worker up -d --wait --wait-timeout 200
46+
env:
47+
WORKER_IMAGE_TAG: ${{ github.sha }}
48+
49+
# This is important, as coverage is exported after receiving SIGTERM
50+
- name: Run Scheduler Tests
51+
run: |
52+
docker compose -f ./docker-compose.test.yml --profile worker exec -T worker coverage run -m pytest -vvv -s -m "worker and scheduler_integration"
53+
54+
- name: Dump worker logs on failure
55+
if: failure()
56+
uses: jwalton/gh-docker-logs@v2
57+
with:
58+
images: mtsrus/syncmaster-worker
59+
dest: ./logs
60+
61+
- name: Shutdown
62+
if: always()
63+
run: |
64+
docker compose -f docker-compose.test.yml --profile all down -v --remove-orphans
65+
66+
- name: Upload worker logs
67+
uses: actions/upload-artifact@v4
68+
if: failure()
69+
with:
70+
name: worker-logs-scheduler
71+
path: logs/*
72+
73+
- name: Upload coverage results
74+
uses: actions/upload-artifact@v4
75+
with:
76+
name: coverage-scheduler
77+
path: reports/*
78+
# https://github.com/actions/upload-artifact/issues/602
79+
include-hidden-files: true

.github/workflows/tests.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ jobs:
3232
name: S3 tests
3333
uses: ./.github/workflows/s3-tests.yml
3434

35+
scheduler_tests:
36+
name: Scheduler tests
37+
uses: ./.github/workflows/scheduler-tests.yml
38+
3539
unit_tests:
3640
name: Unit tests
3741
uses: ./.github/workflows/unit-test.yml

docker-compose.test.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ services:
7878
context: .
7979
target: test
8080
command: --loglevel=info -Q test_queue
81+
entrypoint: [python, -m, celery, -A, tests.test_integration.celery_test, worker, --max-tasks-per-child=1]
8182
env_file: .env.docker
8283
volumes:
8384
- ./syncmaster:/app/syncmaster
@@ -90,7 +91,7 @@ services:
9091
condition: service_healthy
9192
rabbitmq:
9293
condition: service_healthy
93-
profiles: [worker, s3, oracle, hdfs, hive, all]
94+
profiles: [worker, scheduler, s3, oracle, hdfs, hive, all]
9495

9596
test-postgres:
9697
image: postgres

syncmaster/scheduler/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
# SPDX-FileCopyrightText: 2023-2024 MTS PJSC
22
# SPDX-License-Identifier: Apache-2.0
3+
from syncmaster.scheduler.transfer_fetcher import TransferFetcher
4+
from syncmaster.scheduler.transfer_job_manager import TransferJobManager

syncmaster/settings/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,6 @@ class Settings(BaseSettings):
5353
SCHEDULER_TRANSFER_FETCHING_TIMEOUT: int = 180 # seconds
5454
SCHEDULER_MISFIRE_GRACE_TIME: int = 300 # seconds
5555

56-
CORRELATION_CELERY_HEADER_ID: str = "CORRELATION_CELERY_HEADER_ID"
57-
5856
TOKEN_EXPIRED_TIME: int = 60 * 60 * 10 # 10 hours
5957
CREATE_SPARK_SESSION_FUNCTION: ImportString = "syncmaster.worker.spark.get_worker_spark_session"
6058

tests/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"tests.test_unit.test_runs.run_fixtures",
3333
"tests.test_unit.test_connections.connection_fixtures",
3434
"tests.test_unit.test_scheduler.scheduler_fixtures",
35+
"tests.test_integration.test_scheduler.scheduler_fixtures",
3536
]
3637

3738

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
from syncmaster.worker.config import celery
2+
3+
celery.conf.update(imports=list(celery.conf.imports) + ["tests.test_integration.test_scheduler.test_task"])

tests/test_integration/test_scheduler/__init__.py

Whitespace-only changes.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from tests.test_integration.test_scheduler.scheduler_fixtures.mocker_fixtures import (
2+
mock_add_job,
3+
mock_send_task_to_tick,
4+
)
5+
from tests.test_integration.test_scheduler.scheduler_fixtures.transfer_fixture import (
6+
group_transfer_integration_mock,
7+
)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import asyncio
2+
3+
import pytest
4+
from apscheduler.triggers.cron import CronTrigger
5+
from pytest_mock import MockerFixture, MockType
6+
7+
from syncmaster.scheduler.transfer_job_manager import TransferJobManager
8+
from syncmaster.worker.config import celery
9+
10+
11+
@pytest.fixture
12+
def mock_send_task_to_tick(mocker: MockerFixture) -> MockType:
13+
original_to_thread = asyncio.to_thread
14+
return mocker.patch(
15+
"asyncio.to_thread",
16+
new=lambda func, *args, **kwargs: original_to_thread(celery.send_task, "tick", *args[1:], **kwargs),
17+
)
18+
19+
20+
@pytest.fixture
21+
def mock_add_job(mocker: MockerFixture, transfer_job_manager: TransferJobManager) -> MockType:
22+
original_add_job = transfer_job_manager.scheduler.add_job
23+
return mocker.patch.object(
24+
transfer_job_manager.scheduler,
25+
"add_job",
26+
side_effect=lambda func, id, trigger, misfire_grace_time, args: original_add_job(
27+
func=func,
28+
id=id,
29+
trigger=CronTrigger(second="*"),
30+
misfire_grace_time=misfire_grace_time,
31+
args=args,
32+
),
33+
)

0 commit comments

Comments
 (0)