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.
Files changed (110) hide show
  1. data_syncmaster-0.1.1.dist-info/LICENSE.txt +203 -0
  2. data_syncmaster-0.1.1.dist-info/METADATA +115 -0
  3. data_syncmaster-0.1.1.dist-info/RECORD +110 -0
  4. data_syncmaster-0.1.1.dist-info/WHEEL +4 -0
  5. syncmaster/__init__.py +6 -0
  6. syncmaster/backend/__init__.py +2 -0
  7. syncmaster/backend/api/__init__.py +2 -0
  8. syncmaster/backend/api/deps.py +20 -0
  9. syncmaster/backend/api/monitoring.py +10 -0
  10. syncmaster/backend/api/router.py +10 -0
  11. syncmaster/backend/api/v1/__init__.py +2 -0
  12. syncmaster/backend/api/v1/auth/__init__.py +2 -0
  13. syncmaster/backend/api/v1/auth/router.py +32 -0
  14. syncmaster/backend/api/v1/auth/utils.py +26 -0
  15. syncmaster/backend/api/v1/connections.py +300 -0
  16. syncmaster/backend/api/v1/groups.py +225 -0
  17. syncmaster/backend/api/v1/queue.py +148 -0
  18. syncmaster/backend/api/v1/router.py +18 -0
  19. syncmaster/backend/api/v1/transfers/__init__.py +2 -0
  20. syncmaster/backend/api/v1/transfers/router.py +469 -0
  21. syncmaster/backend/api/v1/transfers/utils.py +17 -0
  22. syncmaster/backend/api/v1/users.py +75 -0
  23. syncmaster/backend/export_openapi_schema.py +26 -0
  24. syncmaster/backend/handler.py +203 -0
  25. syncmaster/backend/logger.py +2 -0
  26. syncmaster/backend/main.py +63 -0
  27. syncmaster/backend/pre_start.py +94 -0
  28. syncmaster/backend/services/__init__.py +4 -0
  29. syncmaster/backend/services/auth.py +58 -0
  30. syncmaster/backend/services/unit_of_work.py +44 -0
  31. syncmaster/config.py +110 -0
  32. syncmaster/db/__init__.py +2 -0
  33. syncmaster/db/alembic.ini +41 -0
  34. syncmaster/db/base.py +28 -0
  35. syncmaster/db/factory.py +37 -0
  36. syncmaster/db/migrations/README +1 -0
  37. syncmaster/db/migrations/__init__.py +2 -0
  38. syncmaster/db/migrations/env.py +87 -0
  39. syncmaster/db/migrations/script.py.mako +24 -0
  40. syncmaster/db/migrations/versions/2023-11-23_478240cdad4b_init.py +242 -0
  41. syncmaster/db/migrations/versions/__init__.py +2 -0
  42. syncmaster/db/mixins.py +33 -0
  43. syncmaster/db/models.py +194 -0
  44. syncmaster/db/repositories/__init__.py +22 -0
  45. syncmaster/db/repositories/base.py +109 -0
  46. syncmaster/db/repositories/connection.py +138 -0
  47. syncmaster/db/repositories/credentials_repository.py +87 -0
  48. syncmaster/db/repositories/group.py +264 -0
  49. syncmaster/db/repositories/queue.py +195 -0
  50. syncmaster/db/repositories/repository_with_owner.py +115 -0
  51. syncmaster/db/repositories/run.py +78 -0
  52. syncmaster/db/repositories/transfer.py +202 -0
  53. syncmaster/db/repositories/user.py +72 -0
  54. syncmaster/db/repositories/utils.py +25 -0
  55. syncmaster/db/utils.py +31 -0
  56. syncmaster/dto/__init__.py +2 -0
  57. syncmaster/dto/connections.py +60 -0
  58. syncmaster/dto/transfers.py +46 -0
  59. syncmaster/exceptions/__init__.py +13 -0
  60. syncmaster/exceptions/base.py +12 -0
  61. syncmaster/exceptions/connection.py +28 -0
  62. syncmaster/exceptions/credentials.py +8 -0
  63. syncmaster/exceptions/group.py +27 -0
  64. syncmaster/exceptions/queue.py +16 -0
  65. syncmaster/exceptions/run.py +19 -0
  66. syncmaster/exceptions/transfer.py +39 -0
  67. syncmaster/exceptions/user.py +11 -0
  68. syncmaster/schemas/__init__.py +2 -0
  69. syncmaster/schemas/v1/__init__.py +54 -0
  70. syncmaster/schemas/v1/auth.py +12 -0
  71. syncmaster/schemas/v1/connection_types.py +9 -0
  72. syncmaster/schemas/v1/connections/__init__.py +2 -0
  73. syncmaster/schemas/v1/connections/connection.py +146 -0
  74. syncmaster/schemas/v1/connections/hdfs.py +40 -0
  75. syncmaster/schemas/v1/connections/hive.py +40 -0
  76. syncmaster/schemas/v1/connections/oracle.py +58 -0
  77. syncmaster/schemas/v1/connections/postgres.py +48 -0
  78. syncmaster/schemas/v1/connections/s3.py +66 -0
  79. syncmaster/schemas/v1/file_formats.py +7 -0
  80. syncmaster/schemas/v1/groups.py +39 -0
  81. syncmaster/schemas/v1/page.py +40 -0
  82. syncmaster/schemas/v1/queue.py +32 -0
  83. syncmaster/schemas/v1/status.py +16 -0
  84. syncmaster/schemas/v1/transfer_types.py +6 -0
  85. syncmaster/schemas/v1/transfers/__init__.py +172 -0
  86. syncmaster/schemas/v1/transfers/db.py +23 -0
  87. syncmaster/schemas/v1/transfers/file/__init__.py +2 -0
  88. syncmaster/schemas/v1/transfers/file/base.py +47 -0
  89. syncmaster/schemas/v1/transfers/file/hdfs.py +27 -0
  90. syncmaster/schemas/v1/transfers/file/s3.py +27 -0
  91. syncmaster/schemas/v1/transfers/file_format.py +29 -0
  92. syncmaster/schemas/v1/transfers/run.py +37 -0
  93. syncmaster/schemas/v1/transfers/strategy.py +15 -0
  94. syncmaster/schemas/v1/types.py +5 -0
  95. syncmaster/schemas/v1/users.py +83 -0
  96. syncmaster/worker/__init__.py +2 -0
  97. syncmaster/worker/base.py +14 -0
  98. syncmaster/worker/config.py +18 -0
  99. syncmaster/worker/controller.py +127 -0
  100. syncmaster/worker/handlers/__init__.py +2 -0
  101. syncmaster/worker/handlers/base.py +49 -0
  102. syncmaster/worker/handlers/file/__init__.py +2 -0
  103. syncmaster/worker/handlers/file/base.py +56 -0
  104. syncmaster/worker/handlers/file/hdfs.py +14 -0
  105. syncmaster/worker/handlers/file/s3.py +20 -0
  106. syncmaster/worker/handlers/hive.py +41 -0
  107. syncmaster/worker/handlers/oracle.py +48 -0
  108. syncmaster/worker/handlers/postgres.py +47 -0
  109. syncmaster/worker/spark.py +93 -0
  110. 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()