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.
Files changed (222) hide show
  1. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/PKG-INFO +6 -5
  2. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/pyproject.toml +11 -9
  3. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/__init__.py +1 -1
  4. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/runs.py +0 -2
  5. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/monitoring/metrics.py +1 -1
  6. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/session.py +4 -4
  7. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/auth/jwt.py +5 -1
  8. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/session.py +20 -3
  9. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/log/colored.yml +5 -1
  10. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/log/json.yml +5 -1
  11. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/log/plain.yml +5 -1
  12. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/spark.py +28 -36
  13. data_syncmaster-0.2.4/syncmaster/worker/transfer.py +106 -0
  14. data_syncmaster-0.2.2/syncmaster/worker/transfer.py +0 -87
  15. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/LICENSE.txt +0 -0
  16. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/README.rst +0 -0
  17. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/__init__.py +0 -0
  18. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/factory.py +0 -0
  19. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/README +0 -0
  20. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/__main__.py +0 -0
  21. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/alembic.ini +0 -0
  22. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/env.py +0 -0
  23. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/script.py.mako +0 -0
  24. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0001_create_user_table.py +0 -0
  25. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0002_create_group_table.py +0 -0
  26. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0003_create_queue_table.py +0 -0
  27. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0004_create_connection_table.py +0 -0
  28. {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
  29. {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
  30. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0007_create_transfer_table.py +0 -0
  31. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0008_create_run_table.py +0 -0
  32. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2023-11-23_0009_create_celery_tables.py +0 -0
  33. {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
  34. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/2024-11-01_0011_create_apscheduler_table.py +0 -0
  35. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/migrations/versions/__init__.py +0 -0
  36. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/mixins/__init__.py +0 -0
  37. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/mixins/resource.py +0 -0
  38. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/mixins/timestamp.py +0 -0
  39. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/__init__.py +0 -0
  40. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/apscheduler_job.py +0 -0
  41. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/auth_data.py +0 -0
  42. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/base.py +0 -0
  43. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/connection.py +0 -0
  44. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/group.py +0 -0
  45. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/queue.py +0 -0
  46. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/run.py +0 -0
  47. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/transfer.py +0 -0
  48. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/models/user.py +0 -0
  49. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/__init__.py +0 -0
  50. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/base.py +0 -0
  51. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/connection.py +0 -0
  52. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/credentials_repository.py +0 -0
  53. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/group.py +0 -0
  54. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/queue.py +0 -0
  55. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/repository_with_owner.py +0 -0
  56. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/run.py +0 -0
  57. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/transfer.py +0 -0
  58. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/user.py +0 -0
  59. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/repositories/utils.py +0 -0
  60. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/db/utils.py +0 -0
  61. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/dto/__init__.py +0 -0
  62. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/dto/connections.py +0 -0
  63. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/dto/runs.py +0 -0
  64. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/dto/transfers.py +0 -0
  65. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/dto/transfers_resources.py +0 -0
  66. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/dto/transfers_strategy.py +0 -0
  67. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/__init__.py +0 -0
  68. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/base.py +0 -0
  69. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/registration.py +0 -0
  70. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/schemas/__init__.py +0 -0
  71. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/schemas/bad_request.py +0 -0
  72. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/schemas/invalid_request.py +0 -0
  73. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/errors/schemas/not_authorized.py +0 -0
  74. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/__init__.py +0 -0
  75. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/auth.py +0 -0
  76. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/base.py +0 -0
  77. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/connection.py +0 -0
  78. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/credentials.py +0 -0
  79. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/group.py +0 -0
  80. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/queue.py +0 -0
  81. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/redirect.py +0 -0
  82. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/run.py +0 -0
  83. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/transfer.py +0 -0
  84. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/exceptions/user.py +0 -0
  85. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/__init__.py +0 -0
  86. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/__main__.py +0 -0
  87. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/celery.py +0 -0
  88. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/settings/__init__.py +0 -0
  89. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/transfer_fetcher.py +0 -0
  90. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/transfer_job_manager.py +0 -0
  91. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/scheduler/utils.py +0 -0
  92. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/__init__.py +0 -0
  93. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/ping.py +0 -0
  94. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/__init__.py +0 -0
  95. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/auth/__init__.py +0 -0
  96. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/auth/basic.py +0 -0
  97. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/auth/s3.py +0 -0
  98. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/auth/samba.py +0 -0
  99. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/auth/token.py +0 -0
  100. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connection_types.py +0 -0
  101. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/__init__.py +0 -0
  102. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/clickhouse.py +0 -0
  103. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/connection.py +0 -0
  104. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/connection_base.py +0 -0
  105. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/ftp.py +0 -0
  106. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/ftps.py +0 -0
  107. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/hdfs.py +0 -0
  108. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/hive.py +0 -0
  109. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/mssql.py +0 -0
  110. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/mysql.py +0 -0
  111. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/oracle.py +0 -0
  112. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/postgres.py +0 -0
  113. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/s3.py +0 -0
  114. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/samba.py +0 -0
  115. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/sftp.py +0 -0
  116. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/connections/webdav.py +0 -0
  117. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/file_formats.py +0 -0
  118. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/groups.py +0 -0
  119. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/page.py +0 -0
  120. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/queue.py +0 -0
  121. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfer_types.py +0 -0
  122. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/__init__.py +0 -0
  123. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/db.py +0 -0
  124. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/__init__.py +0 -0
  125. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/base.py +0 -0
  126. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/ftp.py +0 -0
  127. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/ftps.py +0 -0
  128. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/hdfs.py +0 -0
  129. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/s3.py +0 -0
  130. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/samba.py +0 -0
  131. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/sftp.py +0 -0
  132. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file/webdav.py +0 -0
  133. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/file_format.py +0 -0
  134. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/resources.py +0 -0
  135. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/run.py +0 -0
  136. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/strategy.py +0 -0
  137. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/transformations/__init__.py +0 -0
  138. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/transformations/dataframe_columns_filter.py +0 -0
  139. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/transformations/dataframe_rows_filter.py +0 -0
  140. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transfers/transformations/file_metadata_filter.py +0 -0
  141. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/transformation_types.py +0 -0
  142. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/types.py +0 -0
  143. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/schemas/v1/users.py +0 -0
  144. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/__init__.py +0 -0
  145. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/__main__.py +0 -0
  146. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/__init__.py +0 -0
  147. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/monitoring.py +0 -0
  148. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/router.py +0 -0
  149. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/__init__.py +0 -0
  150. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/auth.py +0 -0
  151. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/connections.py +0 -0
  152. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/groups.py +0 -0
  153. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/queue.py +0 -0
  154. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/router.py +0 -0
  155. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/transfers.py +0 -0
  156. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/api/v1/users.py +0 -0
  157. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/dependencies/__init__.py +0 -0
  158. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/dependencies/get_access_token.py +0 -0
  159. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/dependencies/stub.py +0 -0
  160. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/handler.py +0 -0
  161. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/__init__.py +0 -0
  162. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/cors.py +0 -0
  163. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/monitoring/__init__.py +0 -0
  164. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/openapi.py +0 -0
  165. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/request_id.py +0 -0
  166. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/middlewares/static_files.py +0 -0
  167. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/providers/__init__.py +0 -0
  168. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/providers/auth/__init__.py +0 -0
  169. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/providers/auth/base_provider.py +0 -0
  170. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/providers/auth/dummy_provider.py +0 -0
  171. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/providers/auth/keycloak_provider.py +0 -0
  172. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/scripts/export_openapi_schema.py +0 -0
  173. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/scripts/manage_superusers.py +0 -0
  174. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/services/__init__.py +0 -0
  175. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/services/get_user.py +0 -0
  176. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/services/unit_of_work.py +0 -0
  177. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/__init__.py +0 -0
  178. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/auth/__init__.py +0 -0
  179. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/auth/dummy.py +0 -0
  180. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/auth/keycloak.py +0 -0
  181. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/__init__.py +0 -0
  182. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/cors.py +0 -0
  183. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/monitoring.py +0 -0
  184. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/openapi.py +0 -0
  185. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/request_id.py +0 -0
  186. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/settings/server/static_files.py +0 -0
  187. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/utils/__init__.py +0 -0
  188. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/utils/jwt.py +0 -0
  189. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/utils/slug.py +0 -0
  190. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/server/utils/state.py +0 -0
  191. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/__init__.py +0 -0
  192. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/broker.py +0 -0
  193. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/credentials.py +0 -0
  194. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/database.py +0 -0
  195. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/settings/log/__init__.py +0 -0
  196. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/__init__.py +0 -0
  197. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/base.py +0 -0
  198. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/celery.py +0 -0
  199. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/controller.py +0 -0
  200. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/__init__.py +0 -0
  201. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/base.py +0 -0
  202. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/__init__.py +0 -0
  203. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/base.py +0 -0
  204. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/clickhouse.py +0 -0
  205. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/hive.py +0 -0
  206. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/mssql.py +0 -0
  207. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/mysql.py +0 -0
  208. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/oracle.py +0 -0
  209. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/db/postgres.py +0 -0
  210. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/__init__.py +0 -0
  211. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/base.py +0 -0
  212. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/ftp.py +0 -0
  213. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/ftps.py +0 -0
  214. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/hdfs.py +0 -0
  215. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/local_df.py +0 -0
  216. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/remote_df.py +0 -0
  217. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/s3.py +0 -0
  218. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/samba.py +0 -0
  219. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/sftp.py +0 -0
  220. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/handlers/file/webdav.py +0 -0
  221. {data_syncmaster-0.2.2 → data_syncmaster-0.2.4}/syncmaster/worker/settings/__init__.py +0 -0
  222. {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.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.4,<0.14.0) ; extra == "worker"
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.1,<3.0.0)
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 (>=2024.7.10,<2025.0.0) ; extra == "server" or extra == "worker"
51
- Requires-Dist: uvicorn (>=0.34.0,<0.35.0) ; extra == "server"
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.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.1"
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 = "^0.34.0", optional = true }
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.4", extras = ["all"], optional = true }
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 = "^2024.7.10", optional = true}
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 = "^0.26.0"
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.1.0"
134
- coverage = "^7.8.0"
135
- gevent = "^24.11.1"
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]
@@ -1,6 +1,6 @@
1
1
  # SPDX-FileCopyrightText: 2023-2024 MTS PJSC
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
- _raw_version = "0.2.2"
4
+ _raw_version = "0.2.4"
5
5
  # version always contain only release number like 0.0.1
6
6
  __version__ = ".".join(_raw_version.split(".")[:3]) # noqa: WPS410
@@ -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)),
@@ -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
- app.add_middleware(
14
- SessionMiddleware,
15
- **settings.model_dump(),
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
  )
@@ -2,7 +2,9 @@
2
2
  # SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
 
5
- from pydantic import BaseModel, ConfigDict, Field
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: str = Field(description="A random string for signing cookies.")
42
- session_cookie: str | None = Field(default="session", description="Name of the session cookie.")
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: DEBUG
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: DEBUG
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: DEBUG
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(connection_type: str) -> list[str]: # noqa: WPS212
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=pyspark.__version__),
58
+ *XML.get_packages(spark_version=spark_version),
58
59
  *Excel.get_packages(spark_version="3.5.1"),
59
60
  ]
60
61
 
61
- if connection_type == "postgres":
62
- return Postgres.get_packages()
63
- if connection_type == "oracle":
64
- return Oracle.get_packages()
65
- if connection_type == "clickhouse":
66
- return [
67
- "io.github.mtsongithub.doetl:spark-dialect-extension_2.12:0.0.2",
68
- *Clickhouse.get_packages(),
69
- ]
70
- if connection_type == "mssql":
71
- return MSSQL.get_packages()
72
- if connection_type == "mysql":
73
- return MySQL.get_packages()
74
- if connection_type == "s3":
75
- import pyspark
76
-
77
- spark_version = pyspark.__version__
78
- return SparkS3.get_packages(spark_version=spark_version) + file_formats_spark_packages
79
-
80
- if connection_type in ("hdfs", "sftp", "ftp", "ftps", "samba", "webdav"):
81
- return file_formats_spark_packages
82
-
83
- # If the database type does not require downloading .jar packages
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())