data-syncmaster 0.1.1__py3-none-any.whl
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.1.1.dist-info/LICENSE.txt +203 -0
- data_syncmaster-0.1.1.dist-info/METADATA +115 -0
- data_syncmaster-0.1.1.dist-info/RECORD +110 -0
- data_syncmaster-0.1.1.dist-info/WHEEL +4 -0
- syncmaster/__init__.py +6 -0
- syncmaster/backend/__init__.py +2 -0
- syncmaster/backend/api/__init__.py +2 -0
- syncmaster/backend/api/deps.py +20 -0
- syncmaster/backend/api/monitoring.py +10 -0
- syncmaster/backend/api/router.py +10 -0
- syncmaster/backend/api/v1/__init__.py +2 -0
- syncmaster/backend/api/v1/auth/__init__.py +2 -0
- syncmaster/backend/api/v1/auth/router.py +32 -0
- syncmaster/backend/api/v1/auth/utils.py +26 -0
- syncmaster/backend/api/v1/connections.py +300 -0
- syncmaster/backend/api/v1/groups.py +225 -0
- syncmaster/backend/api/v1/queue.py +148 -0
- syncmaster/backend/api/v1/router.py +18 -0
- syncmaster/backend/api/v1/transfers/__init__.py +2 -0
- syncmaster/backend/api/v1/transfers/router.py +469 -0
- syncmaster/backend/api/v1/transfers/utils.py +17 -0
- syncmaster/backend/api/v1/users.py +75 -0
- syncmaster/backend/export_openapi_schema.py +26 -0
- syncmaster/backend/handler.py +203 -0
- syncmaster/backend/logger.py +2 -0
- syncmaster/backend/main.py +63 -0
- syncmaster/backend/pre_start.py +94 -0
- syncmaster/backend/services/__init__.py +4 -0
- syncmaster/backend/services/auth.py +58 -0
- syncmaster/backend/services/unit_of_work.py +44 -0
- syncmaster/config.py +110 -0
- syncmaster/db/__init__.py +2 -0
- syncmaster/db/alembic.ini +41 -0
- syncmaster/db/base.py +28 -0
- syncmaster/db/factory.py +37 -0
- syncmaster/db/migrations/README +1 -0
- syncmaster/db/migrations/__init__.py +2 -0
- syncmaster/db/migrations/env.py +87 -0
- syncmaster/db/migrations/script.py.mako +24 -0
- syncmaster/db/migrations/versions/2023-11-23_478240cdad4b_init.py +242 -0
- syncmaster/db/migrations/versions/__init__.py +2 -0
- syncmaster/db/mixins.py +33 -0
- syncmaster/db/models.py +194 -0
- syncmaster/db/repositories/__init__.py +22 -0
- syncmaster/db/repositories/base.py +109 -0
- syncmaster/db/repositories/connection.py +138 -0
- syncmaster/db/repositories/credentials_repository.py +87 -0
- syncmaster/db/repositories/group.py +264 -0
- syncmaster/db/repositories/queue.py +195 -0
- syncmaster/db/repositories/repository_with_owner.py +115 -0
- syncmaster/db/repositories/run.py +78 -0
- syncmaster/db/repositories/transfer.py +202 -0
- syncmaster/db/repositories/user.py +72 -0
- syncmaster/db/repositories/utils.py +25 -0
- syncmaster/db/utils.py +31 -0
- syncmaster/dto/__init__.py +2 -0
- syncmaster/dto/connections.py +60 -0
- syncmaster/dto/transfers.py +46 -0
- syncmaster/exceptions/__init__.py +13 -0
- syncmaster/exceptions/base.py +12 -0
- syncmaster/exceptions/connection.py +28 -0
- syncmaster/exceptions/credentials.py +8 -0
- syncmaster/exceptions/group.py +27 -0
- syncmaster/exceptions/queue.py +16 -0
- syncmaster/exceptions/run.py +19 -0
- syncmaster/exceptions/transfer.py +39 -0
- syncmaster/exceptions/user.py +11 -0
- syncmaster/schemas/__init__.py +2 -0
- syncmaster/schemas/v1/__init__.py +54 -0
- syncmaster/schemas/v1/auth.py +12 -0
- syncmaster/schemas/v1/connection_types.py +9 -0
- syncmaster/schemas/v1/connections/__init__.py +2 -0
- syncmaster/schemas/v1/connections/connection.py +146 -0
- syncmaster/schemas/v1/connections/hdfs.py +40 -0
- syncmaster/schemas/v1/connections/hive.py +40 -0
- syncmaster/schemas/v1/connections/oracle.py +58 -0
- syncmaster/schemas/v1/connections/postgres.py +48 -0
- syncmaster/schemas/v1/connections/s3.py +66 -0
- syncmaster/schemas/v1/file_formats.py +7 -0
- syncmaster/schemas/v1/groups.py +39 -0
- syncmaster/schemas/v1/page.py +40 -0
- syncmaster/schemas/v1/queue.py +32 -0
- syncmaster/schemas/v1/status.py +16 -0
- syncmaster/schemas/v1/transfer_types.py +6 -0
- syncmaster/schemas/v1/transfers/__init__.py +172 -0
- syncmaster/schemas/v1/transfers/db.py +23 -0
- syncmaster/schemas/v1/transfers/file/__init__.py +2 -0
- syncmaster/schemas/v1/transfers/file/base.py +47 -0
- syncmaster/schemas/v1/transfers/file/hdfs.py +27 -0
- syncmaster/schemas/v1/transfers/file/s3.py +27 -0
- syncmaster/schemas/v1/transfers/file_format.py +29 -0
- syncmaster/schemas/v1/transfers/run.py +37 -0
- syncmaster/schemas/v1/transfers/strategy.py +15 -0
- syncmaster/schemas/v1/types.py +5 -0
- syncmaster/schemas/v1/users.py +83 -0
- syncmaster/worker/__init__.py +2 -0
- syncmaster/worker/base.py +14 -0
- syncmaster/worker/config.py +18 -0
- syncmaster/worker/controller.py +127 -0
- syncmaster/worker/handlers/__init__.py +2 -0
- syncmaster/worker/handlers/base.py +49 -0
- syncmaster/worker/handlers/file/__init__.py +2 -0
- syncmaster/worker/handlers/file/base.py +56 -0
- syncmaster/worker/handlers/file/hdfs.py +14 -0
- syncmaster/worker/handlers/file/s3.py +20 -0
- syncmaster/worker/handlers/hive.py +41 -0
- syncmaster/worker/handlers/oracle.py +48 -0
- syncmaster/worker/handlers/postgres.py +47 -0
- syncmaster/worker/spark.py +93 -0
- syncmaster/worker/transfer.py +85 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# SPDX-FileCopyrightText: 2023-2024 MTS (Mobile Telesystems)
|
|
2
|
+
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import logging
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
|
|
6
|
+
import onetl
|
|
7
|
+
from sqlalchemy import select
|
|
8
|
+
from sqlalchemy.orm import Session, selectinload
|
|
9
|
+
|
|
10
|
+
from syncmaster.config import Settings
|
|
11
|
+
from syncmaster.db.models import AuthData, Run, Status, Transfer
|
|
12
|
+
from syncmaster.db.repositories.utils import decrypt_auth_data
|
|
13
|
+
from syncmaster.exceptions.run import RunNotFoundError
|
|
14
|
+
from syncmaster.worker.base import WorkerTask
|
|
15
|
+
from syncmaster.worker.config import celery
|
|
16
|
+
from syncmaster.worker.controller import TransferController
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@celery.task(name="run_transfer_task", bind=True, track_started=True)
|
|
22
|
+
def run_transfer_task(self: WorkerTask, run_id: int) -> None:
|
|
23
|
+
onetl.log.setup_logging(level=logging.INFO)
|
|
24
|
+
"""Task for make transfer data"""
|
|
25
|
+
logger.info("Before spark initializing")
|
|
26
|
+
logger.info("Spark initialized")
|
|
27
|
+
with Session(self.engine) as session:
|
|
28
|
+
run_transfer(
|
|
29
|
+
session=session,
|
|
30
|
+
run_id=run_id,
|
|
31
|
+
settings=self.settings,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def run_transfer(session: Session, run_id: int, settings: Settings):
|
|
36
|
+
logger.info("Start transfering")
|
|
37
|
+
run = session.get(
|
|
38
|
+
Run,
|
|
39
|
+
run_id,
|
|
40
|
+
options=(
|
|
41
|
+
selectinload(Run.transfer).selectinload(Transfer.source_connection),
|
|
42
|
+
selectinload(Run.transfer).selectinload(Transfer.target_connection),
|
|
43
|
+
),
|
|
44
|
+
)
|
|
45
|
+
if run is None:
|
|
46
|
+
raise RunNotFoundError
|
|
47
|
+
run.status = Status.STARTED
|
|
48
|
+
run.started_at = datetime.utcnow()
|
|
49
|
+
session.add(run)
|
|
50
|
+
session.commit()
|
|
51
|
+
|
|
52
|
+
controller = None
|
|
53
|
+
|
|
54
|
+
q_source_auth_data = select(AuthData).where(AuthData.connection_id == run.transfer.source_connection.id)
|
|
55
|
+
q_target_auth_data = select(AuthData).where(AuthData.connection_id == run.transfer.target_connection.id)
|
|
56
|
+
|
|
57
|
+
target_auth_data = decrypt_auth_data(session.scalars(q_target_auth_data).one().value, settings)
|
|
58
|
+
source_auth_data = decrypt_auth_data(session.scalars(q_source_auth_data).one().value, settings)
|
|
59
|
+
|
|
60
|
+
try:
|
|
61
|
+
controller = TransferController(
|
|
62
|
+
transfer=run.transfer,
|
|
63
|
+
source_connection=run.transfer.source_connection,
|
|
64
|
+
target_connection=run.transfer.target_connection,
|
|
65
|
+
source_auth_data=source_auth_data,
|
|
66
|
+
target_auth_data=target_auth_data,
|
|
67
|
+
settings=settings,
|
|
68
|
+
)
|
|
69
|
+
controller.start_transfer()
|
|
70
|
+
except Exception:
|
|
71
|
+
run.status = Status.FAILED
|
|
72
|
+
logger.exception("Run `%s` was failed", run.id)
|
|
73
|
+
else:
|
|
74
|
+
run.status = Status.FINISHED
|
|
75
|
+
logger.warning("Run `%s` was successful", run.id)
|
|
76
|
+
finally:
|
|
77
|
+
# Both the source and the receiver use the same spark session,
|
|
78
|
+
# so it is enough to stop the session at the source.
|
|
79
|
+
if controller is not None and controller.source_handler.spark is not None:
|
|
80
|
+
controller.source_handler.spark.sparkContext.stop()
|
|
81
|
+
controller.source_handler.spark.stop()
|
|
82
|
+
|
|
83
|
+
run.ended_at = datetime.utcnow()
|
|
84
|
+
session.add(run)
|
|
85
|
+
session.commit()
|