data-syncmaster 0.2.2__tar.gz → 0.2.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/PKG-INFO +6 -5
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/pyproject.toml +11 -9
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/__init__.py +1 -1
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/runs.py +0 -2
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/monitoring/metrics.py +1 -1
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/session.py +4 -4
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/auth/jwt.py +5 -1
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/session.py +20 -3
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/log/colored.yml +5 -1
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/log/json.yml +5 -1
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/log/plain.yml +5 -1
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/spark.py +28 -36
- data_syncmaster-0.2.4/syncmaster/worker/transfer.py +106 -0
- data_syncmaster-0.2.2/syncmaster/worker/transfer.py +0 -87
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/LICENSE.txt +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/README.rst +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/factory.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/README +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/__main__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/alembic.ini +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/env.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/script.py.mako +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0001_create_user_table.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0002_create_group_table.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0003_create_queue_table.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0004_create_connection_table.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0005_create_user_group_table.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0006_create_auth_data_table.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0007_create_transfer_table.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0008_create_run_table.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0009_create_celery_tables.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2024-10-07_0010_add_pg_trgm_extension.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2024-11-01_0011_create_apscheduler_table.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/mixins/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/mixins/resource.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/mixins/timestamp.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/apscheduler_job.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/auth_data.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/base.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/connection.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/group.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/queue.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/run.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/transfer.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/user.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/base.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/connection.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/credentials_repository.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/group.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/queue.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/repository_with_owner.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/run.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/transfer.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/user.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/utils.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/utils.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/dto/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/dto/connections.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/dto/runs.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/dto/transfers.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/dto/transfers_resources.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/dto/transfers_strategy.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/base.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/registration.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/schemas/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/schemas/bad_request.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/schemas/invalid_request.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/schemas/not_authorized.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/auth.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/base.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/connection.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/credentials.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/group.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/queue.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/redirect.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/run.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/transfer.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/user.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/__main__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/celery.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/settings/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/transfer_fetcher.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/transfer_job_manager.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/utils.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/ping.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/auth/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/auth/basic.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/auth/s3.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/auth/samba.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/auth/token.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connection_types.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/clickhouse.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/connection.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/connection_base.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/ftp.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/ftps.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/hdfs.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/hive.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/mssql.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/mysql.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/oracle.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/postgres.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/s3.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/samba.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/sftp.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/webdav.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/file_formats.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/groups.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/page.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/queue.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfer_types.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/db.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/base.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/ftp.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/ftps.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/hdfs.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/s3.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/samba.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/sftp.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/webdav.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file_format.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/resources.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/run.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/strategy.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/transformations/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/transformations/dataframe_columns_filter.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/transformations/dataframe_rows_filter.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/transformations/file_metadata_filter.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transformation_types.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/types.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/users.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/__main__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/monitoring.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/router.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/auth.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/connections.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/groups.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/queue.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/router.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/transfers.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/users.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/dependencies/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/dependencies/get_access_token.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/dependencies/stub.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/handler.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/cors.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/monitoring/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/openapi.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/request_id.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/static_files.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/providers/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/providers/auth/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/providers/auth/base_provider.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/providers/auth/dummy_provider.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/providers/auth/keycloak_provider.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/scripts/export_openapi_schema.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/scripts/manage_superusers.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/services/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/services/get_user.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/services/unit_of_work.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/auth/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/auth/dummy.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/auth/keycloak.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/cors.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/monitoring.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/openapi.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/request_id.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/static_files.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/utils/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/utils/jwt.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/utils/slug.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/utils/state.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/broker.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/credentials.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/database.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/log/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/base.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/celery.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/controller.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/base.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/base.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/clickhouse.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/hive.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/mssql.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/mysql.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/oracle.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/postgres.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/base.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/ftp.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/ftps.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/hdfs.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/local_df.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/remote_df.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/s3.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/samba.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/sftp.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/webdav.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/settings/__init__.py +0 -0
- {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/settings/hwm_store.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: data-syncmaster
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.4
|
|
4
4
|
Summary: Syncmaster REST API + Worker
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Keywords: Syncmaster,REST,API,Worker,Spark,Transfer,ETL
|
|
@@ -35,11 +35,12 @@ Requires-Dist: fastapi (>=0.115.12,<0.116.0) ; extra == "server"
|
|
|
35
35
|
Requires-Dist: horizon-hwm-store (>=1.1.2,<2.0.0) ; extra == "worker"
|
|
36
36
|
Requires-Dist: itsdangerous (>=2.2.0,<3.0.0) ; extra == "server"
|
|
37
37
|
Requires-Dist: jinja2 (>=3.1.6,<4.0.0) ; extra == "server" or extra == "worker"
|
|
38
|
-
Requires-Dist: onetl[all] (>=0.13.
|
|
38
|
+
Requires-Dist: onetl[all] (>=0.13.5,<0.14.0) ; extra == "worker"
|
|
39
39
|
Requires-Dist: psycopg2-binary (>=2.9.10,<3.0.0) ; extra == "server" or extra == "worker"
|
|
40
|
-
Requires-Dist: pydantic (>=2.11.
|
|
40
|
+
Requires-Dist: pydantic (>=2.11.7,<3.0.0)
|
|
41
41
|
Requires-Dist: pydantic-settings (>=2.8.1,<3.0.0) ; extra == "server" or extra == "worker" or extra == "scheduler"
|
|
42
42
|
Requires-Dist: pyjwt (>=2.10.1,<3.0.0) ; extra == "server"
|
|
43
|
+
Requires-Dist: pyspark (<4.0.0) ; extra == "worker"
|
|
43
44
|
Requires-Dist: python-json-logger ; extra == "server" or extra == "worker" or extra == "scheduler"
|
|
44
45
|
Requires-Dist: python-keycloak (>=5.3.1,<6.0.0) ; extra == "server"
|
|
45
46
|
Requires-Dist: python-multipart (>=0.0.20,<0.0.21) ; extra == "server"
|
|
@@ -47,8 +48,8 @@ Requires-Dist: pyyaml ; extra == "server" or extra == "worker" or extra == "sche
|
|
|
47
48
|
Requires-Dist: sqlalchemy (>=2.0.40,<3.0.0) ; extra == "server" or extra == "worker" or extra == "scheduler"
|
|
48
49
|
Requires-Dist: sqlalchemy-utils (>=0.41.2,<0.42.0) ; extra == "server" or extra == "worker" or extra == "scheduler"
|
|
49
50
|
Requires-Dist: starlette-exporter (>=0.23.0,<0.24.0) ; extra == "server"
|
|
50
|
-
Requires-Dist: uuid6 (>=
|
|
51
|
-
Requires-Dist: uvicorn (>=0.34
|
|
51
|
+
Requires-Dist: uuid6 (>=2025.0.0,<2026.0.0) ; extra == "server" or extra == "worker"
|
|
52
|
+
Requires-Dist: uvicorn (>=0.34,<0.36) ; extra == "server"
|
|
52
53
|
Project-URL: CI/CD, https://github.com/MobileTeleSystems/syncmaster/actions
|
|
53
54
|
Project-URL: Documentation, https://syncmaster.readthedocs.io
|
|
54
55
|
Project-URL: Homepage, https://github.com/MobileTeleSystems/syncmaster
|
|
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
|
|
|
4
4
|
|
|
5
5
|
[tool.poetry]
|
|
6
6
|
name = "data-syncmaster"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.4"
|
|
8
8
|
license = "Apache-2.0"
|
|
9
9
|
description = "Syncmaster REST API + Worker"
|
|
10
10
|
authors = ["DataOps.ETL <onetools@mts.ru>"]
|
|
@@ -44,22 +44,23 @@ exclude = [
|
|
|
44
44
|
|
|
45
45
|
[tool.poetry.dependencies]
|
|
46
46
|
python = "^3.11"
|
|
47
|
-
pydantic = "^2.11.
|
|
47
|
+
pydantic = "^2.11.7"
|
|
48
48
|
pydantic-settings = { version = "^2.8.1", optional = true }
|
|
49
49
|
sqlalchemy = { version = "^2.0.40", optional = true }
|
|
50
50
|
sqlalchemy-utils = { version = "^0.41.2", optional = true }
|
|
51
51
|
fastapi = { version = "^0.115.12", optional = true}
|
|
52
52
|
asgi-correlation-id = {version = "^4.3.4", optional = true}
|
|
53
|
-
uvicorn = { version = "
|
|
53
|
+
uvicorn = { version = ">=0.34,<0.36", optional = true }
|
|
54
54
|
alembic = { version = "^1.15.2", optional = true }
|
|
55
55
|
pyjwt = { version = "^2.10.1", optional = true }
|
|
56
56
|
jinja2 = { version = "^3.1.6", optional = true }
|
|
57
57
|
python-multipart = { version = "^0.0.20", optional = true }
|
|
58
58
|
celery = { version = "^5.5.0", optional = true }
|
|
59
|
-
onetl = { version = "^0.13.
|
|
59
|
+
onetl = { version = "^0.13.5", extras = ["all"], optional = true }
|
|
60
|
+
pyspark = { version = "<4.0.0", optional = true }
|
|
60
61
|
pyyaml = { version = "*", optional = true }
|
|
61
62
|
psycopg2-binary = { version = "^2.9.10", optional = true }
|
|
62
|
-
uuid6 = {version = "^
|
|
63
|
+
uuid6 = {version = "^2025.0.0", optional = true}
|
|
63
64
|
coloredlogs = {version = "*", optional = true}
|
|
64
65
|
python-json-logger = {version = "*", optional = true}
|
|
65
66
|
asyncpg = { version = "^0.30.0", optional = true }
|
|
@@ -99,6 +100,7 @@ worker = [
|
|
|
99
100
|
"sqlalchemy-utils",
|
|
100
101
|
"celery",
|
|
101
102
|
"onetl",
|
|
103
|
+
"pyspark",
|
|
102
104
|
"asgi-correlation-id",
|
|
103
105
|
"jinja2",
|
|
104
106
|
"psycopg2-binary",
|
|
@@ -124,15 +126,15 @@ scheduler = [
|
|
|
124
126
|
[tool.poetry.group.test.dependencies]
|
|
125
127
|
pytest = "^8.3.5"
|
|
126
128
|
httpx = "^0.28.1"
|
|
127
|
-
pytest-asyncio = "
|
|
129
|
+
pytest-asyncio = ">=0.26.0,<1.0"
|
|
128
130
|
pytest-randomly = "^3.15.0"
|
|
129
131
|
pytest-rerunfailures = "^15.0"
|
|
130
132
|
pytest-deadfixtures = "^2.2.1"
|
|
131
133
|
pytest-mock = "^3.14.0"
|
|
132
134
|
pytest-lazy-fixtures = "^1.1.1"
|
|
133
|
-
faker = "^37.
|
|
134
|
-
coverage = "^7.
|
|
135
|
-
gevent = "
|
|
135
|
+
faker = "^37.4.0"
|
|
136
|
+
coverage = "^7.9.1"
|
|
137
|
+
gevent = ">=24.11.1,<26.0.0"
|
|
136
138
|
responses = "^0.25.7"
|
|
137
139
|
|
|
138
140
|
[tool.poetry.group.dev.dependencies]
|
|
@@ -23,7 +23,6 @@ from syncmaster.schemas.v1.transfers.run import (
|
|
|
23
23
|
from syncmaster.server.dependencies import Stub
|
|
24
24
|
from syncmaster.server.services.get_user import get_user
|
|
25
25
|
from syncmaster.server.services.unit_of_work import UnitOfWork
|
|
26
|
-
from syncmaster.server.settings import ServerAppSettings as Settings
|
|
27
26
|
|
|
28
27
|
router = APIRouter(tags=["Runs"], responses=get_error_responses())
|
|
29
28
|
|
|
@@ -82,7 +81,6 @@ async def read_run(
|
|
|
82
81
|
@router.post("/runs")
|
|
83
82
|
async def start_run( # noqa: WPS217
|
|
84
83
|
create_run_data: CreateRunSchema,
|
|
85
|
-
settings: Annotated[Settings, Depends(Stub(Settings))],
|
|
86
84
|
celery: Annotated[Celery, Depends(Stub(Celery))],
|
|
87
85
|
unit_of_work: UnitOfWork = Depends(UnitOfWork),
|
|
88
86
|
current_user: User = Depends(get_user(is_active=True)),
|
{data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/monitoring/metrics.py
RENAMED
|
@@ -37,7 +37,7 @@ def apply_monitoring_metrics_middleware(app: FastAPI, settings: MonitoringSettin
|
|
|
37
37
|
app.add_middleware(
|
|
38
38
|
PrometheusMiddleware,
|
|
39
39
|
app_name=slugify(app.title),
|
|
40
|
-
skip_paths=skip_paths,
|
|
40
|
+
skip_paths=sorted(skip_paths),
|
|
41
41
|
**settings.model_dump(exclude={"enabled", "skip_paths"}),
|
|
42
42
|
)
|
|
43
43
|
app.include_router(router)
|
|
@@ -10,8 +10,8 @@ from syncmaster.server.settings.server.session import SessionSettings
|
|
|
10
10
|
def apply_session_middleware(app: FastAPI, settings: SessionSettings) -> FastAPI:
|
|
11
11
|
"""Add SessionMiddleware middleware to the application."""
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
)
|
|
13
|
+
settings_dict = settings.model_dump(exclude={"secret_key"})
|
|
14
|
+
settings_dict["secret_key"] = settings.secret_key.get_secret_value()
|
|
15
|
+
|
|
16
|
+
app.add_middleware(SessionMiddleware, **settings_dict)
|
|
17
17
|
return app
|
|
@@ -23,7 +23,11 @@ class JWTSettings(BaseModel):
|
|
|
23
23
|
"""
|
|
24
24
|
Secret key for signing JWT tokens.
|
|
25
25
|
|
|
26
|
-
Can be any string. It is recommended to generate random value for every application instance.
|
|
26
|
+
Can be any string. It is recommended to generate random value for every application instance, e.g.:
|
|
27
|
+
|
|
28
|
+
.. code:: shell
|
|
29
|
+
|
|
30
|
+
pwgen 32 1
|
|
27
31
|
""",
|
|
28
32
|
),
|
|
29
33
|
)
|
{data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/session.py
RENAMED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
import textwrap
|
|
6
|
+
|
|
7
|
+
from pydantic import BaseModel, ConfigDict, Field, SecretStr
|
|
6
8
|
|
|
7
9
|
|
|
8
10
|
class SessionSettings(BaseModel):
|
|
@@ -38,8 +40,23 @@ class SessionSettings(BaseModel):
|
|
|
38
40
|
|
|
39
41
|
"""
|
|
40
42
|
|
|
41
|
-
secret_key:
|
|
42
|
-
|
|
43
|
+
secret_key: SecretStr = Field(
|
|
44
|
+
description=textwrap.dedent(
|
|
45
|
+
"""
|
|
46
|
+
Secret key for encrypting cookies.
|
|
47
|
+
|
|
48
|
+
Can be any string. It is recommended to generate random value for every application instance, e.g.:
|
|
49
|
+
|
|
50
|
+
.. code:: shell
|
|
51
|
+
|
|
52
|
+
pwgen 32 1
|
|
53
|
+
""",
|
|
54
|
+
),
|
|
55
|
+
)
|
|
56
|
+
session_cookie: str | None = Field(
|
|
57
|
+
default="session",
|
|
58
|
+
description="Name of the session cookie. Change this if there are multiple application under the same domain.",
|
|
59
|
+
)
|
|
43
60
|
max_age: int | None = Field(
|
|
44
61
|
default=14 * 24 * 60 * 60,
|
|
45
62
|
description="Session expiry time in seconds. Defaults to 2 weeks.",
|
|
@@ -40,7 +40,7 @@ loggers:
|
|
|
40
40
|
level: INFO
|
|
41
41
|
propagate: false
|
|
42
42
|
celery:
|
|
43
|
-
level:
|
|
43
|
+
level: INFO
|
|
44
44
|
handlers: [celery]
|
|
45
45
|
propagate: false
|
|
46
46
|
scheduler:
|
|
@@ -51,3 +51,7 @@ loggers:
|
|
|
51
51
|
handlers: [main]
|
|
52
52
|
level: WARNING
|
|
53
53
|
propagate: false
|
|
54
|
+
hdfs.client:
|
|
55
|
+
handlers: [main]
|
|
56
|
+
level: WARNING
|
|
57
|
+
propagate: false
|
|
@@ -39,7 +39,7 @@ loggers:
|
|
|
39
39
|
level: INFO
|
|
40
40
|
propagate: false
|
|
41
41
|
celery:
|
|
42
|
-
level:
|
|
42
|
+
level: INFO
|
|
43
43
|
handlers: [celery]
|
|
44
44
|
propagate: false
|
|
45
45
|
scheduler:
|
|
@@ -50,3 +50,7 @@ loggers:
|
|
|
50
50
|
handlers: [main]
|
|
51
51
|
level: WARNING
|
|
52
52
|
propagate: false
|
|
53
|
+
hdfs.client:
|
|
54
|
+
handlers: [main]
|
|
55
|
+
level: WARNING
|
|
56
|
+
propagate: false
|
|
@@ -40,7 +40,7 @@ loggers:
|
|
|
40
40
|
level: INFO
|
|
41
41
|
propagate: false
|
|
42
42
|
celery:
|
|
43
|
-
level:
|
|
43
|
+
level: INFO
|
|
44
44
|
handlers: [celery]
|
|
45
45
|
propagate: false
|
|
46
46
|
scheduler:
|
|
@@ -51,3 +51,7 @@ loggers:
|
|
|
51
51
|
handlers: [main]
|
|
52
52
|
level: WARNING
|
|
53
53
|
propagate: false
|
|
54
|
+
hdfs.client:
|
|
55
|
+
handlers: [main]
|
|
56
|
+
level: WARNING
|
|
57
|
+
propagate: false
|
|
@@ -47,44 +47,41 @@ def get_worker_spark_session(
|
|
|
47
47
|
return spark_builder.getOrCreate()
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
def get_packages(
|
|
50
|
+
def get_packages(connection_types: set[str]) -> list[str]: # noqa: WPS212
|
|
51
51
|
import pyspark
|
|
52
52
|
from onetl.connection import MSSQL, Clickhouse, MySQL, Oracle, Postgres, SparkS3
|
|
53
53
|
from onetl.file.format import XML, Excel
|
|
54
54
|
|
|
55
|
+
spark_version = pyspark.__version__
|
|
55
56
|
# excel version is hardcoded due to https://github.com/nightscape/spark-excel/issues/902
|
|
56
57
|
file_formats_spark_packages: list[str] = [
|
|
57
|
-
*XML.get_packages(spark_version=
|
|
58
|
+
*XML.get_packages(spark_version=spark_version),
|
|
58
59
|
*Excel.get_packages(spark_version="3.5.1"),
|
|
59
60
|
]
|
|
60
61
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return []
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
def get_excluded_packages(db_type: str) -> list[str]:
|
|
62
|
+
result = []
|
|
63
|
+
if connection_types & {"postgres", "all"}:
|
|
64
|
+
result.extend(Postgres.get_packages())
|
|
65
|
+
if connection_types & {"oracle", "all"}:
|
|
66
|
+
result.extend(Oracle.get_packages())
|
|
67
|
+
if connection_types & {"clickhouse", "all"}:
|
|
68
|
+
result.append("io.github.mtsongithub.doetl:spark-dialect-extension_2.12:0.0.2")
|
|
69
|
+
result.extend(Clickhouse.get_packages())
|
|
70
|
+
if connection_types & {"mssql", "all"}:
|
|
71
|
+
result.extend(MSSQL.get_packages())
|
|
72
|
+
if connection_types & {"mysql", "all"}:
|
|
73
|
+
result.extend(MySQL.get_packages())
|
|
74
|
+
|
|
75
|
+
if connection_types & {"s3", "all"}:
|
|
76
|
+
result.extend(SparkS3.get_packages(spark_version=spark_version))
|
|
77
|
+
|
|
78
|
+
if connection_types & {"s3", "hdfs", "sftp", "ftp", "ftps", "samba", "webdav", "all"}:
|
|
79
|
+
result.extend(file_formats_spark_packages)
|
|
80
|
+
|
|
81
|
+
return result
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def get_excluded_packages() -> list[str]:
|
|
88
85
|
from onetl.connection import SparkS3
|
|
89
86
|
|
|
90
87
|
return SparkS3.get_exclude_packages()
|
|
@@ -95,16 +92,11 @@ def get_spark_session_conf(
|
|
|
95
92
|
target: ConnectionDTO,
|
|
96
93
|
resources: dict,
|
|
97
94
|
) -> dict:
|
|
98
|
-
maven_packages: list[str] =
|
|
99
|
-
excluded_packages: list[str] =
|
|
100
|
-
|
|
101
|
-
for db_type in source, target:
|
|
102
|
-
maven_packages.extend(get_packages(connection_type=db_type.type)) # type: ignore
|
|
103
|
-
excluded_packages.extend(get_excluded_packages(db_type=db_type.type)) # type: ignore
|
|
95
|
+
maven_packages: list[str] = get_packages(connection_types={source.type, target.type})
|
|
96
|
+
excluded_packages: list[str] = get_excluded_packages()
|
|
104
97
|
|
|
105
98
|
memory_mb = math.ceil(resources["ram_bytes_per_task"] / 1024 / 1024)
|
|
106
99
|
config = {
|
|
107
|
-
"spark.jars.packages": ",".join(maven_packages),
|
|
108
100
|
"spark.sql.pyspark.jvmStacktrace.enabled": "true",
|
|
109
101
|
"spark.hadoop.mapreduce.fileoutputcommitter.marksuccessfuljobs": "false",
|
|
110
102
|
"spark.executor.cores": resources["cpu_cores_per_task"],
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2023-2024 MTS PJSC
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
from datetime import datetime, timezone
|
|
4
|
+
|
|
5
|
+
from asgi_correlation_id import correlation_id
|
|
6
|
+
from asgi_correlation_id.extensions.celery import load_correlation_ids
|
|
7
|
+
from celery.signals import after_setup_task_logger
|
|
8
|
+
from celery.utils.log import get_task_logger
|
|
9
|
+
from jinja2 import Template
|
|
10
|
+
from sqlalchemy import Engine, select
|
|
11
|
+
from sqlalchemy.orm import Session, selectinload
|
|
12
|
+
|
|
13
|
+
from syncmaster.db.models import AuthData, Run, Status, Transfer
|
|
14
|
+
from syncmaster.db.repositories.utils import decrypt_auth_data
|
|
15
|
+
from syncmaster.settings.log import setup_logging
|
|
16
|
+
from syncmaster.worker.base import WorkerTask
|
|
17
|
+
from syncmaster.worker.celery import app as celery
|
|
18
|
+
from syncmaster.worker.controller import TransferController
|
|
19
|
+
from syncmaster.worker.settings import WorkerAppSettings
|
|
20
|
+
|
|
21
|
+
logger = get_task_logger(__name__)
|
|
22
|
+
load_correlation_ids()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@celery.task(name="run_transfer_task", bind=True, track_started=True)
|
|
26
|
+
def run_transfer_task(self: WorkerTask, run_id: int) -> None:
|
|
27
|
+
run_transfer(
|
|
28
|
+
run_id=run_id,
|
|
29
|
+
engine=self.engine,
|
|
30
|
+
settings=self.settings,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def run_transfer(run_id: int, engine: Engine, settings: WorkerAppSettings):
|
|
35
|
+
try:
|
|
36
|
+
with Session(engine, expire_on_commit=False) as session:
|
|
37
|
+
run = session.scalar(
|
|
38
|
+
select(Run)
|
|
39
|
+
.where(
|
|
40
|
+
Run.id == run_id,
|
|
41
|
+
Run.status == Status.CREATED,
|
|
42
|
+
)
|
|
43
|
+
.options(
|
|
44
|
+
selectinload(Run.transfer),
|
|
45
|
+
selectinload(Run.transfer).selectinload(Transfer.group),
|
|
46
|
+
selectinload(Run.transfer).selectinload(Transfer.source_connection),
|
|
47
|
+
selectinload(Run.transfer).selectinload(Transfer.target_connection),
|
|
48
|
+
),
|
|
49
|
+
)
|
|
50
|
+
if run is None:
|
|
51
|
+
logger.info("Run %r not found or already executed by someone else", run_id)
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
source_connection = run.transfer.source_connection
|
|
55
|
+
source_auth_data_query = select(AuthData).where(AuthData.connection_id == run.transfer.source_connection.id)
|
|
56
|
+
source_auth_data_encrypted = session.scalar(source_auth_data_query)
|
|
57
|
+
source_auth_data = decrypt_auth_data(source_auth_data_encrypted.value, settings)
|
|
58
|
+
|
|
59
|
+
target_connection = run.transfer.target_connection
|
|
60
|
+
target_auth_data_query = select(AuthData).where(AuthData.connection_id == run.transfer.target_connection.id)
|
|
61
|
+
target_auth_data_encrypted = session.scalar(target_auth_data_query)
|
|
62
|
+
target_auth_data = decrypt_auth_data(target_auth_data_encrypted.value, settings)
|
|
63
|
+
|
|
64
|
+
logger.info("Starting run %r", run_id)
|
|
65
|
+
run.status = Status.STARTED
|
|
66
|
+
run.started_at = datetime.now(tz=timezone.utc)
|
|
67
|
+
run.log_url = Template(settings.worker.log_url_template).render(
|
|
68
|
+
run=run,
|
|
69
|
+
correlation_id=correlation_id.get(),
|
|
70
|
+
)
|
|
71
|
+
session.commit()
|
|
72
|
+
session.expunge_all() # do not hold open DB connection while run is executed
|
|
73
|
+
|
|
74
|
+
controller = TransferController(
|
|
75
|
+
settings=settings,
|
|
76
|
+
run=run,
|
|
77
|
+
source_connection=source_connection,
|
|
78
|
+
target_connection=target_connection,
|
|
79
|
+
source_auth_data=source_auth_data,
|
|
80
|
+
target_auth_data=target_auth_data,
|
|
81
|
+
)
|
|
82
|
+
controller.perform_transfer()
|
|
83
|
+
except Exception as e:
|
|
84
|
+
status = Status.FAILED
|
|
85
|
+
logger.error("Run %r failed", run_id)
|
|
86
|
+
exception = e
|
|
87
|
+
else:
|
|
88
|
+
status = Status.FINISHED
|
|
89
|
+
logger.info("Run %r was successful", run_id)
|
|
90
|
+
exception = None
|
|
91
|
+
|
|
92
|
+
with Session(engine) as session:
|
|
93
|
+
run = session.get(Run, run_id)
|
|
94
|
+
if run:
|
|
95
|
+
logger.info("Updating run %r status in DB", run_id)
|
|
96
|
+
run.status = status
|
|
97
|
+
run.ended_at = datetime.now(tz=timezone.utc)
|
|
98
|
+
session.commit()
|
|
99
|
+
|
|
100
|
+
if exception is not None:
|
|
101
|
+
raise exception
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@after_setup_task_logger.connect
|
|
105
|
+
def setup_loggers(*args, **kwargs):
|
|
106
|
+
setup_logging(WorkerAppSettings().logging.get_log_config_path())
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: 2023-2024 MTS PJSC
|
|
2
|
-
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
from datetime import datetime, timezone
|
|
4
|
-
|
|
5
|
-
from asgi_correlation_id import correlation_id
|
|
6
|
-
from asgi_correlation_id.extensions.celery import load_correlation_ids
|
|
7
|
-
from celery import Celery
|
|
8
|
-
from celery.signals import after_setup_task_logger
|
|
9
|
-
from celery.utils.log import get_task_logger
|
|
10
|
-
from jinja2 import Template
|
|
11
|
-
from sqlalchemy import select
|
|
12
|
-
from sqlalchemy.orm import Session, selectinload
|
|
13
|
-
|
|
14
|
-
from syncmaster.db.models import AuthData, Run, Status, Transfer
|
|
15
|
-
from syncmaster.db.repositories.utils import decrypt_auth_data
|
|
16
|
-
from syncmaster.exceptions.run import RunNotFoundError
|
|
17
|
-
from syncmaster.settings.log import setup_logging
|
|
18
|
-
from syncmaster.worker.celery import app as celery
|
|
19
|
-
from syncmaster.worker.controller import TransferController
|
|
20
|
-
from syncmaster.worker.settings import WorkerAppSettings
|
|
21
|
-
|
|
22
|
-
logger = get_task_logger(__name__)
|
|
23
|
-
load_correlation_ids()
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
@celery.task(name="run_transfer_task", bind=True, track_started=True)
|
|
27
|
-
def run_transfer_task(self: Celery, run_id: int) -> None:
|
|
28
|
-
with Session(self.engine) as session:
|
|
29
|
-
run_transfer(
|
|
30
|
-
session=session,
|
|
31
|
-
run_id=run_id,
|
|
32
|
-
settings=self.settings,
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def run_transfer(session: Session, run_id: int, settings: WorkerAppSettings):
|
|
37
|
-
logger.info("Start transfer")
|
|
38
|
-
run = session.get(
|
|
39
|
-
Run,
|
|
40
|
-
run_id,
|
|
41
|
-
options=(
|
|
42
|
-
selectinload(Run.transfer),
|
|
43
|
-
selectinload(Run.transfer).selectinload(Transfer.group),
|
|
44
|
-
selectinload(Run.transfer).selectinload(Transfer.source_connection),
|
|
45
|
-
selectinload(Run.transfer).selectinload(Transfer.target_connection),
|
|
46
|
-
),
|
|
47
|
-
)
|
|
48
|
-
if run is None:
|
|
49
|
-
raise RunNotFoundError
|
|
50
|
-
|
|
51
|
-
run.status = Status.STARTED
|
|
52
|
-
run.started_at = datetime.now(tz=timezone.utc)
|
|
53
|
-
run.log_url = Template(settings.worker.log_url_template).render(run=run, correlation_id=correlation_id.get())
|
|
54
|
-
session.add(run)
|
|
55
|
-
session.commit()
|
|
56
|
-
|
|
57
|
-
q_source_auth_data = select(AuthData).where(AuthData.connection_id == run.transfer.source_connection.id)
|
|
58
|
-
q_target_auth_data = select(AuthData).where(AuthData.connection_id == run.transfer.target_connection.id)
|
|
59
|
-
|
|
60
|
-
target_auth_data = decrypt_auth_data(session.scalars(q_target_auth_data).one().value, settings)
|
|
61
|
-
source_auth_data = decrypt_auth_data(session.scalars(q_source_auth_data).one().value, settings)
|
|
62
|
-
|
|
63
|
-
try:
|
|
64
|
-
controller = TransferController(
|
|
65
|
-
settings=settings,
|
|
66
|
-
run=run,
|
|
67
|
-
source_connection=run.transfer.source_connection,
|
|
68
|
-
target_connection=run.transfer.target_connection,
|
|
69
|
-
source_auth_data=source_auth_data,
|
|
70
|
-
target_auth_data=target_auth_data,
|
|
71
|
-
)
|
|
72
|
-
controller.perform_transfer()
|
|
73
|
-
except Exception:
|
|
74
|
-
run.status = Status.FAILED
|
|
75
|
-
logger.exception("Run %r was failed", run.id)
|
|
76
|
-
else:
|
|
77
|
-
run.status = Status.FINISHED
|
|
78
|
-
logger.warning("Run %r was successful", run.id)
|
|
79
|
-
|
|
80
|
-
run.ended_at = datetime.now(tz=timezone.utc)
|
|
81
|
-
session.add(run)
|
|
82
|
-
session.commit()
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
@after_setup_task_logger.connect
|
|
86
|
-
def setup_loggers(*args, **kwargs):
|
|
87
|
-
setup_logging(WorkerAppSettings().logging.get_log_config_path())
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/credentials_repository.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/repository_with_owner.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|