data-syncmaster 0.2.1__tar.gz → 0.2.2__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.1 → data_syncmaster-0.2.2}/PKG-INFO +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/pyproject.toml +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/__init__.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0002_create_group_table.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0004_create_connection_table.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/connection.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/group.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/group.py +1 -2
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/queue.py +2 -2
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/group.py +0 -4
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/__init__.py +0 -2
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/clickhouse.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/connection.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/connection_base.py +3 -3
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/ftp.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/ftps.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/hdfs.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/hive.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/mssql.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/mysql.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/oracle.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/postgres.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/s3.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/samba.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/sftp.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/webdav.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/groups.py +3 -3
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/queue.py +18 -6
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/__init__.py +11 -11
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/base.py +2 -2
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/transformations/dataframe_columns_filter.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/transformations/dataframe_rows_filter.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/transformations/file_metadata_filter.py +1 -1
- data_syncmaster-0.2.2/syncmaster/schemas/v1/types.py +7 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/users.py +1 -5
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/groups.py +2 -2
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/queue.py +1 -1
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/handler.py +0 -8
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/auth/keycloak.py +5 -5
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/cors.py +21 -9
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/hdfs.py +2 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/spark.py +15 -4
- data_syncmaster-0.2.1/syncmaster/schemas/v1/types.py +0 -5
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/LICENSE.txt +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/README.rst +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/factory.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/README +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/__main__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/alembic.ini +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/env.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/script.py.mako +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0001_create_user_table.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0003_create_queue_table.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0005_create_user_group_table.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0006_create_auth_data_table.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0007_create_transfer_table.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0008_create_run_table.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2023-11-23_0009_create_celery_tables.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2024-10-07_0010_add_pg_trgm_extension.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/2024-11-01_0011_create_apscheduler_table.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/migrations/versions/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/mixins/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/mixins/resource.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/mixins/timestamp.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/apscheduler_job.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/auth_data.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/base.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/queue.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/run.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/transfer.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/models/user.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/base.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/connection.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/credentials_repository.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/repository_with_owner.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/run.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/transfer.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/user.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/repositories/utils.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/db/utils.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/dto/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/dto/connections.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/dto/runs.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/dto/transfers.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/dto/transfers_resources.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/dto/transfers_strategy.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/base.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/registration.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/schemas/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/schemas/bad_request.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/schemas/invalid_request.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/errors/schemas/not_authorized.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/auth.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/base.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/connection.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/credentials.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/queue.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/redirect.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/run.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/transfer.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/exceptions/user.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/__main__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/celery.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/settings/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/transfer_fetcher.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/transfer_job_manager.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/scheduler/utils.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/ping.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/auth/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/auth/basic.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/auth/s3.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/auth/samba.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/auth/token.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connection_types.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/file_formats.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/page.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfer_types.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/db.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/ftp.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/ftps.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/hdfs.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/s3.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/samba.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/sftp.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/webdav.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file_format.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/resources.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/run.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/strategy.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/transformations/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transformation_types.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/__main__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/monitoring.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/router.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/auth.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/connections.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/router.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/runs.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/transfers.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/api/v1/users.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/dependencies/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/dependencies/get_access_token.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/dependencies/stub.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/cors.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/monitoring/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/monitoring/metrics.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/openapi.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/request_id.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/session.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/middlewares/static_files.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/providers/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/providers/auth/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/providers/auth/base_provider.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/providers/auth/dummy_provider.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/providers/auth/keycloak_provider.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/scripts/export_openapi_schema.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/scripts/manage_superusers.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/services/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/services/get_user.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/services/unit_of_work.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/auth/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/auth/dummy.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/auth/jwt.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/monitoring.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/openapi.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/request_id.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/session.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/settings/server/static_files.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/utils/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/utils/jwt.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/utils/slug.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/server/utils/state.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/broker.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/credentials.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/database.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/log/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/log/colored.yml +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/log/json.yml +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/settings/log/plain.yml +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/base.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/celery.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/controller.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/base.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/base.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/clickhouse.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/hive.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/mssql.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/mysql.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/oracle.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/db/postgres.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/base.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/ftp.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/ftps.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/local_df.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/remote_df.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/s3.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/samba.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/sftp.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/handlers/file/webdav.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/settings/__init__.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/settings/hwm_store.py +0 -0
- {data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/worker/transfer.py +0 -0
|
@@ -22,7 +22,7 @@ def upgrade():
|
|
|
22
22
|
op.create_table(
|
|
23
23
|
"group",
|
|
24
24
|
sa.Column("id", sa.BigInteger(), nullable=False),
|
|
25
|
-
sa.Column("name", sa.String(length=
|
|
25
|
+
sa.Column("name", sa.String(length=128), nullable=False),
|
|
26
26
|
sa.Column("description", sa.String(length=512), nullable=False),
|
|
27
27
|
sa.Column("owner_id", sa.BigInteger(), nullable=False),
|
|
28
28
|
sa.Column("created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False),
|
|
@@ -30,7 +30,7 @@ def upgrade():
|
|
|
30
30
|
"connection",
|
|
31
31
|
sa.Column("id", sa.BigInteger(), nullable=False),
|
|
32
32
|
sa.Column("group_id", sa.BigInteger(), nullable=False),
|
|
33
|
-
sa.Column("type", sa.String(length=
|
|
33
|
+
sa.Column("type", sa.String(length=32), nullable=False),
|
|
34
34
|
sa.Column("name", sa.String(length=128), nullable=False),
|
|
35
35
|
sa.Column("description", sa.String(length=512), nullable=False),
|
|
36
36
|
sa.Column("data", sa.JSON(), nullable=False),
|
|
@@ -32,7 +32,7 @@ class ConnectionType(StrEnum):
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
class Connection(Base, ResourceMixin, TimestampMixin):
|
|
35
|
-
type: Mapped[ConnectionType] = mapped_column(ChoiceType(ConnectionType, impl=String(
|
|
35
|
+
type: Mapped[ConnectionType] = mapped_column(ChoiceType(ConnectionType, impl=String(32)), nullable=False)
|
|
36
36
|
data: Mapped[dict[str, Any]] = mapped_column(JSON, nullable=False, default={})
|
|
37
37
|
|
|
38
38
|
group: Mapped[Group] = relationship("Group")
|
|
@@ -71,7 +71,7 @@ class GroupMemberRole(enum.StrEnum):
|
|
|
71
71
|
|
|
72
72
|
class Group(Base, TimestampMixin):
|
|
73
73
|
id: Mapped[int] = mapped_column(BigInteger, primary_key=True)
|
|
74
|
-
name: Mapped[str] = mapped_column(String(
|
|
74
|
+
name: Mapped[str] = mapped_column(String(128), nullable=False, unique=True)
|
|
75
75
|
description: Mapped[str] = mapped_column(String(512), nullable=False, default="")
|
|
76
76
|
owner_id: Mapped[int] = mapped_column(ForeignKey("user.id", ondelete="CASCADE"), nullable=False, index=True)
|
|
77
77
|
|
|
@@ -15,7 +15,6 @@ from syncmaster.exceptions import EntityNotFoundError, SyncmasterError
|
|
|
15
15
|
from syncmaster.exceptions.group import (
|
|
16
16
|
AlreadyIsGroupMemberError,
|
|
17
17
|
AlreadyIsNotGroupMemberError,
|
|
18
|
-
GroupAdminNotFoundError,
|
|
19
18
|
GroupAlreadyExistsError,
|
|
20
19
|
GroupNotFoundError,
|
|
21
20
|
)
|
|
@@ -364,7 +363,7 @@ class GroupRepository(Repository[Group]):
|
|
|
364
363
|
constraint = err.__cause__.__cause__.constraint_name
|
|
365
364
|
|
|
366
365
|
if constraint == "fk__group__owner_id__user":
|
|
367
|
-
raise
|
|
366
|
+
raise UserNotFoundError from err
|
|
368
367
|
|
|
369
368
|
if constraint == "uq__group__name":
|
|
370
369
|
raise GroupAlreadyExistsError from err
|
|
@@ -73,10 +73,10 @@ class QueueRepository(RepositoryWithOwner[Queue]):
|
|
|
73
73
|
queue_data: UpdateQueueSchema,
|
|
74
74
|
) -> Queue:
|
|
75
75
|
try:
|
|
76
|
-
queue = await self.read_by_id(queue_id=queue_id)
|
|
77
76
|
return await self._update(
|
|
78
77
|
Queue.id == queue_id,
|
|
79
|
-
|
|
78
|
+
name=queue_data.name,
|
|
79
|
+
description=queue_data.description,
|
|
80
80
|
)
|
|
81
81
|
except IntegrityError as e:
|
|
82
82
|
self._raise_error(e)
|
|
@@ -55,7 +55,6 @@ from syncmaster.schemas.v1.users import (
|
|
|
55
55
|
FullUserSchema,
|
|
56
56
|
ReadGroupMember,
|
|
57
57
|
ReadUserSchema,
|
|
58
|
-
UpdateUserSchema,
|
|
59
58
|
UserPageSchema,
|
|
60
59
|
UserPageSchemaAsGroupMember,
|
|
61
60
|
)
|
|
@@ -100,7 +99,6 @@ __all__ = [
|
|
|
100
99
|
"JSONLine",
|
|
101
100
|
"Parquet",
|
|
102
101
|
"ReadUserSchema",
|
|
103
|
-
"UpdateUserSchema",
|
|
104
102
|
"FullUserSchema",
|
|
105
103
|
"ReadGroupMember",
|
|
106
104
|
"UserPageSchema",
|
{data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/clickhouse.py
RENAMED
|
@@ -29,7 +29,7 @@ class ReadClickhouseConnectionDataSchema(BaseModel):
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class CreateClickhouseConnectionSchema(CreateConnectionBaseSchema):
|
|
32
|
-
type: CLICKHOUSE_TYPE = Field(
|
|
32
|
+
type: CLICKHOUSE_TYPE = Field(description="Connection type")
|
|
33
33
|
data: CreateClickhouseConnectionDataSchema = Field(
|
|
34
34
|
...,
|
|
35
35
|
alias="connection_data",
|
{data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/connection_base.py
RENAMED
|
@@ -10,9 +10,9 @@ ReadConnectionAuthDataSchema = ReadBasicAuthSchema | ReadS3AuthSchema | ReadSamb
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class CreateConnectionBaseSchema(BaseModel):
|
|
13
|
-
group_id: int = Field(
|
|
14
|
-
name: NameConstr = Field(
|
|
15
|
-
description: str = Field(
|
|
13
|
+
group_id: int = Field(description="Connection owner group id")
|
|
14
|
+
name: NameConstr = Field(description="Connection name")
|
|
15
|
+
description: str = Field(description="Additional description")
|
|
16
16
|
|
|
17
17
|
model_config = ConfigDict(populate_by_name=True)
|
|
18
18
|
|
|
@@ -26,7 +26,7 @@ class ReadFTPConnectionDataSchema(BaseModel):
|
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
class CreateFTPConnectionSchema(CreateConnectionBaseSchema):
|
|
29
|
-
type: FTP_TYPE = Field(
|
|
29
|
+
type: FTP_TYPE = Field(description="Connection type")
|
|
30
30
|
data: CreateFTPConnectionDataSchema = Field(
|
|
31
31
|
...,
|
|
32
32
|
alias="connection_data",
|
|
@@ -26,7 +26,7 @@ class ReadFTPSConnectionDataSchema(BaseModel):
|
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
class CreateFTPSConnectionSchema(CreateConnectionBaseSchema):
|
|
29
|
-
type: FTPS_TYPE = Field(
|
|
29
|
+
type: FTPS_TYPE = Field(description="Connection type")
|
|
30
30
|
data: CreateFTPSConnectionDataSchema = Field(
|
|
31
31
|
...,
|
|
32
32
|
alias="connection_data",
|
|
@@ -24,7 +24,7 @@ class ReadHDFSConnectionDataSchema(BaseModel):
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
class CreateHDFSConnectionSchema(CreateConnectionBaseSchema):
|
|
27
|
-
type: HDFS_TYPE = Field(
|
|
27
|
+
type: HDFS_TYPE = Field(description="Connection type")
|
|
28
28
|
data: CreateHDFSConnectionDataSchema = Field(
|
|
29
29
|
...,
|
|
30
30
|
alias="connection_data",
|
|
@@ -24,7 +24,7 @@ class ReadHiveConnectionDataSchema(BaseModel):
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
class CreateHiveConnectionSchema(CreateConnectionBaseSchema):
|
|
27
|
-
type: HIVE_TYPE = Field(
|
|
27
|
+
type: HIVE_TYPE = Field(description="Connection type")
|
|
28
28
|
data: CreateHiveConnectionDataSchema = Field(
|
|
29
29
|
...,
|
|
30
30
|
alias="connection_data",
|
|
@@ -29,7 +29,7 @@ class ReadMSSQLConnectionDataSchema(BaseModel):
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class CreateMSSQLConnectionSchema(CreateConnectionBaseSchema):
|
|
32
|
-
type: MSSQL_TYPE = Field(
|
|
32
|
+
type: MSSQL_TYPE = Field(description="Connection type")
|
|
33
33
|
data: CreateMSSQLConnectionDataSchema = Field(
|
|
34
34
|
...,
|
|
35
35
|
alias="connection_data",
|
|
@@ -29,7 +29,7 @@ class ReadMySQLConnectionDataSchema(BaseModel):
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class CreateMySQLConnectionSchema(CreateConnectionBaseSchema):
|
|
32
|
-
type: MYSQL_TYPE = Field(
|
|
32
|
+
type: MYSQL_TYPE = Field(description="Connection type")
|
|
33
33
|
data: CreateMySQLConnectionDataSchema = Field(
|
|
34
34
|
...,
|
|
35
35
|
alias="connection_data",
|
|
@@ -39,7 +39,7 @@ class ReadOracleConnectionDataSchema(BaseModel):
|
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
class CreateOracleConnectionSchema(CreateConnectionBaseSchema):
|
|
42
|
-
type: ORACLE_TYPE = Field(
|
|
42
|
+
type: ORACLE_TYPE = Field(description="Connection type")
|
|
43
43
|
data: CreateOracleConnectionDataSchema = Field(
|
|
44
44
|
...,
|
|
45
45
|
alias="connection_data",
|
{data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/connections/postgres.py
RENAMED
|
@@ -30,7 +30,7 @@ class ReadPostgresConnectionDataSchema(BaseModel):
|
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class CreatePostgresConnectionSchema(CreateConnectionBaseSchema):
|
|
33
|
-
type: POSTGRES_TYPE = Field(
|
|
33
|
+
type: POSTGRES_TYPE = Field(description="Connection type")
|
|
34
34
|
data: CreatePostgresConnectionDataSchema = Field(
|
|
35
35
|
...,
|
|
36
36
|
alias="connection_data",
|
|
@@ -46,7 +46,7 @@ class ReadS3ConnectionDataSchema(BaseModel):
|
|
|
46
46
|
|
|
47
47
|
|
|
48
48
|
class CreateS3ConnectionSchema(CreateConnectionBaseSchema):
|
|
49
|
-
type: S3_TYPE = Field(
|
|
49
|
+
type: S3_TYPE = Field(description="Connection type")
|
|
50
50
|
data: CreateS3ConnectionDataSchema = Field(
|
|
51
51
|
...,
|
|
52
52
|
alias="connection_data",
|
|
@@ -33,7 +33,7 @@ class ReadSambaConnectionDataSchema(BaseModel):
|
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
class CreateSambaConnectionSchema(CreateConnectionBaseSchema):
|
|
36
|
-
type: SAMBA_TYPE = Field(
|
|
36
|
+
type: SAMBA_TYPE = Field(description="Connection type")
|
|
37
37
|
data: CreateSambaConnectionDataSchema = Field(
|
|
38
38
|
...,
|
|
39
39
|
alias="connection_data",
|
|
@@ -26,7 +26,7 @@ class ReadSFTPConnectionDataSchema(BaseModel):
|
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
class CreateSFTPConnectionSchema(CreateConnectionBaseSchema):
|
|
29
|
-
type: SFTP_TYPE = Field(
|
|
29
|
+
type: SFTP_TYPE = Field(description="Connection type")
|
|
30
30
|
data: CreateSFTPConnectionDataSchema = Field(
|
|
31
31
|
...,
|
|
32
32
|
alias="connection_data",
|
|
@@ -30,7 +30,7 @@ class ReadWebDAVConnectionDataSchema(BaseModel):
|
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class CreateWebDAVConnectionSchema(CreateConnectionBaseSchema):
|
|
33
|
-
type: WEBDAV_TYPE = Field(
|
|
33
|
+
type: WEBDAV_TYPE = Field(description="Connection type")
|
|
34
34
|
data: CreateWebDAVConnectionDataSchema = Field(
|
|
35
35
|
...,
|
|
36
36
|
alias="connection_data",
|
|
@@ -8,13 +8,13 @@ from syncmaster.schemas.v1.types import NameConstr
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class UpdateGroupSchema(BaseModel):
|
|
11
|
-
name: NameConstr
|
|
11
|
+
name: NameConstr
|
|
12
12
|
description: str
|
|
13
13
|
owner_id: int
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class CreateGroupSchema(BaseModel):
|
|
17
|
-
name: NameConstr
|
|
17
|
+
name: NameConstr
|
|
18
18
|
description: str
|
|
19
19
|
|
|
20
20
|
|
|
@@ -40,7 +40,7 @@ class AddUserSchema(BaseModel):
|
|
|
40
40
|
|
|
41
41
|
class ReadGroupSchema(BaseModel):
|
|
42
42
|
id: int
|
|
43
|
-
name:
|
|
43
|
+
name: str
|
|
44
44
|
description: str
|
|
45
45
|
owner_id: int
|
|
46
46
|
|
|
@@ -1,22 +1,33 @@
|
|
|
1
1
|
# SPDX-FileCopyrightText: 2023-2024 MTS PJSC
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
3
|
+
import re
|
|
4
|
+
from typing import Annotated
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, ConfigDict, Field, StringConstraints, computed_field
|
|
4
7
|
|
|
5
8
|
from syncmaster.schemas.v1.page import PageSchema
|
|
6
9
|
|
|
10
|
+
ALLOWED_PATTERN = re.compile(r"^[ -~]+$")
|
|
11
|
+
RESTRICTED_PATTERN = re.compile(r"[^a-zA-Z0-9]+")
|
|
12
|
+
|
|
13
|
+
QueueName = Annotated[
|
|
14
|
+
str,
|
|
15
|
+
StringConstraints(min_length=3, max_length=128, pattern=ALLOWED_PATTERN), # noqa: WPS432
|
|
16
|
+
]
|
|
17
|
+
|
|
7
18
|
|
|
8
19
|
class CreateQueueSchema(BaseModel):
|
|
9
|
-
name:
|
|
10
|
-
...,
|
|
20
|
+
name: QueueName = Field(
|
|
11
21
|
description="Queue name that allows letters, numbers, dashes, and underscores",
|
|
12
22
|
)
|
|
13
|
-
group_id: int = Field(
|
|
23
|
+
group_id: int = Field(description="Queue owner group id")
|
|
14
24
|
description: str = Field(default="", description="Additional description")
|
|
15
25
|
|
|
16
26
|
@computed_field
|
|
17
27
|
@property
|
|
18
28
|
def slug(self) -> str:
|
|
19
|
-
|
|
29
|
+
short_name = RESTRICTED_PATTERN.sub("_", self.name.lower()).strip("_")
|
|
30
|
+
return f"{self.group_id}-{short_name}"
|
|
20
31
|
|
|
21
32
|
|
|
22
33
|
class ReadQueueSchema(BaseModel):
|
|
@@ -34,4 +45,5 @@ class QueuePageSchema(PageSchema):
|
|
|
34
45
|
|
|
35
46
|
|
|
36
47
|
class UpdateQueueSchema(BaseModel):
|
|
37
|
-
|
|
48
|
+
name: QueueName
|
|
49
|
+
description: str = ""
|
|
@@ -142,9 +142,9 @@ TransformationSchema = DataframeRowsFilter | DataframeColumnsFilter | FileMetada
|
|
|
142
142
|
class CopyTransferSchema(BaseModel):
|
|
143
143
|
new_group_id: int
|
|
144
144
|
new_queue_id: int
|
|
145
|
-
new_source_connection_name: NameConstr | None = None
|
|
146
|
-
new_target_connection_name: NameConstr | None = None
|
|
147
|
-
new_name: NameConstr | None = None
|
|
145
|
+
new_source_connection_name: NameConstr | None = None
|
|
146
|
+
new_target_connection_name: NameConstr | None = None
|
|
147
|
+
new_name: NameConstr | None = None
|
|
148
148
|
remove_source: bool = False
|
|
149
149
|
|
|
150
150
|
|
|
@@ -176,14 +176,14 @@ class ReadTransferSchema(BaseModel):
|
|
|
176
176
|
|
|
177
177
|
|
|
178
178
|
class CreateTransferSchema(BaseModel):
|
|
179
|
-
group_id: int = Field(
|
|
180
|
-
source_connection_id: int = Field(
|
|
181
|
-
target_connection_id: int = Field(
|
|
182
|
-
name: NameConstr = Field(
|
|
183
|
-
description: str = Field(
|
|
184
|
-
is_scheduled: bool = Field(
|
|
185
|
-
queue_id: int = Field(
|
|
186
|
-
schedule: str | None = Field(None, description="Execution schedule in cron format")
|
|
179
|
+
group_id: int = Field(description="Transfer owner group id")
|
|
180
|
+
source_connection_id: int = Field(description="id of the connection that will be the data source")
|
|
181
|
+
target_connection_id: int = Field(description="id of the connection that will be the data receiver")
|
|
182
|
+
name: NameConstr = Field(description="Transfer name")
|
|
183
|
+
description: str = Field(description="Additional description")
|
|
184
|
+
is_scheduled: bool = Field(description="Is the transfer on schedule")
|
|
185
|
+
queue_id: int = Field(description="id of the queue in which the transfer will be performed")
|
|
186
|
+
schedule: str | None = Field(default=None, description="Execution schedule in cron format")
|
|
187
187
|
source_params: CreateTransferSchemaSource = Field(
|
|
188
188
|
...,
|
|
189
189
|
discriminator="type",
|
{data_syncmaster-0.2.1 → data_syncmaster-0.2.2}/syncmaster/schemas/v1/transfers/file/base.py
RENAMED
|
@@ -23,7 +23,7 @@ from syncmaster.schemas.v1.transfers.file_format import (
|
|
|
23
23
|
# classes are identical but may change in the future
|
|
24
24
|
class ReadFileTransferSource(BaseModel):
|
|
25
25
|
directory_path: str
|
|
26
|
-
file_format: CSV | JSONLine | JSON | Excel | XML | ORC | Parquet = Field(
|
|
26
|
+
file_format: CSV | JSONLine | JSON | Excel | XML | ORC | Parquet = Field(discriminator="type")
|
|
27
27
|
options: dict[str, Any]
|
|
28
28
|
|
|
29
29
|
|
|
@@ -42,7 +42,7 @@ class ReadFileTransferTarget(BaseModel):
|
|
|
42
42
|
# classes are identical but may change in the future
|
|
43
43
|
class CreateFileTransferSource(BaseModel):
|
|
44
44
|
directory_path: str
|
|
45
|
-
file_format: CSV | JSONLine | JSON | Excel | XML | ORC | Parquet = Field(
|
|
45
|
+
file_format: CSV | JSONLine | JSON | Excel | XML | ORC | Parquet = Field(discriminator="type")
|
|
46
46
|
options: dict[str, Any] = Field(default_factory=dict)
|
|
47
47
|
|
|
48
48
|
model_config = ConfigDict(arbitrary_types_allowed=True)
|
|
@@ -30,4 +30,4 @@ ColumnsFilter = IncludeFilter | RenameFilter | CastFilter
|
|
|
30
30
|
|
|
31
31
|
class DataframeColumnsFilter(BaseModel):
|
|
32
32
|
type: DATAFRAME_COLUMNS_FILTER
|
|
33
|
-
filters: list[Annotated[ColumnsFilter, Field(
|
|
33
|
+
filters: list[Annotated[ColumnsFilter, Field(discriminator="type")]] = Field(default_factory=list)
|
|
@@ -93,4 +93,4 @@ RowsFilter = (
|
|
|
93
93
|
|
|
94
94
|
class DataframeRowsFilter(BaseModel):
|
|
95
95
|
type: DATAFRAME_ROWS_FILTER
|
|
96
|
-
filters: list[Annotated[RowsFilter, Field(
|
|
96
|
+
filters: list[Annotated[RowsFilter, Field(discriminator="type")]] = Field(default_factory=list)
|
|
@@ -50,4 +50,4 @@ MetadataFilter = NameGlobFilter | NameRegexpFilter | FileSizeMinFilter | FileSiz
|
|
|
50
50
|
|
|
51
51
|
class FileMetadataFilter(BaseModel):
|
|
52
52
|
type: FILE_METADATA_FILTER
|
|
53
|
-
filters: list[Annotated[MetadataFilter, Field(
|
|
53
|
+
filters: list[Annotated[MetadataFilter, Field(discriminator="type")]] = Field(default_factory=list)
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
# SPDX-FileCopyrightText: 2023-2024 MTS PJSC
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
from pydantic import BaseModel, ConfigDict
|
|
3
|
+
from pydantic import BaseModel, ConfigDict
|
|
4
4
|
|
|
5
5
|
from syncmaster.db.models import GroupMemberRole
|
|
6
6
|
from syncmaster.db.utils import Pagination
|
|
7
7
|
from syncmaster.schemas.v1.page import MetaPageSchema, PageSchema
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
class UpdateUserSchema(BaseModel):
|
|
11
|
-
username: constr(pattern=r"^[_a-z0-9]+$") # noqa: F722
|
|
12
|
-
|
|
13
|
-
|
|
14
10
|
class ReadGroupMember(BaseModel):
|
|
15
11
|
id: int
|
|
16
12
|
username: str
|
|
@@ -92,7 +92,7 @@ async def read_group(
|
|
|
92
92
|
)
|
|
93
93
|
|
|
94
94
|
|
|
95
|
-
@router.
|
|
95
|
+
@router.put("/groups/{group_id}")
|
|
96
96
|
async def update_group( # noqa: WPS217
|
|
97
97
|
group_id: int,
|
|
98
98
|
group_data: UpdateGroupSchema,
|
|
@@ -173,7 +173,7 @@ async def read_group_users(
|
|
|
173
173
|
return UserPageSchemaAsGroupMember.from_pagination(pagination=pagination)
|
|
174
174
|
|
|
175
175
|
|
|
176
|
-
@router.
|
|
176
|
+
@router.put("/groups/{group_id}/users/{user_id}")
|
|
177
177
|
async def update_user_role_group(
|
|
178
178
|
group_id: int,
|
|
179
179
|
user_id: int,
|
|
@@ -94,7 +94,7 @@ async def create_queue(
|
|
|
94
94
|
return ReadQueueSchema.model_validate(queue, from_attributes=True)
|
|
95
95
|
|
|
96
96
|
|
|
97
|
-
@router.
|
|
97
|
+
@router.put("/queues/{queue_id}", description="Updating queue information")
|
|
98
98
|
async def update_queue(
|
|
99
99
|
queue_id: int,
|
|
100
100
|
queue_data: UpdateQueueSchema,
|
|
@@ -25,7 +25,6 @@ from syncmaster.exceptions.group import (
|
|
|
25
25
|
AlreadyIsGroupMemberError,
|
|
26
26
|
AlreadyIsGroupOwnerError,
|
|
27
27
|
AlreadyIsNotGroupMemberError,
|
|
28
|
-
GroupAdminNotFoundError,
|
|
29
28
|
GroupAlreadyExistsError,
|
|
30
29
|
GroupNotFoundError,
|
|
31
30
|
)
|
|
@@ -165,13 +164,6 @@ async def syncmsater_exception_handler(request: Request, exc: SyncmasterError):
|
|
|
165
164
|
content=content,
|
|
166
165
|
)
|
|
167
166
|
|
|
168
|
-
if isinstance(exc, GroupAdminNotFoundError):
|
|
169
|
-
content.code = "not_found"
|
|
170
|
-
content.message = "Admin not found"
|
|
171
|
-
return exception_json_response(
|
|
172
|
-
status=status.HTTP_404_NOT_FOUND,
|
|
173
|
-
content=content,
|
|
174
|
-
)
|
|
175
167
|
if isinstance(exc, GroupAlreadyExistsError):
|
|
176
168
|
content.code = "conflict"
|
|
177
169
|
content.message = "Group name already taken"
|
|
@@ -5,11 +5,11 @@ from pydantic import BaseModel, Field, SecretStr
|
|
|
5
5
|
|
|
6
6
|
class KeycloakSettings(BaseModel):
|
|
7
7
|
|
|
8
|
-
server_url: str = Field(
|
|
9
|
-
client_id: str = Field(
|
|
10
|
-
realm_name: str = Field(
|
|
11
|
-
client_secret: SecretStr = Field(
|
|
12
|
-
redirect_uri: str = Field(
|
|
8
|
+
server_url: str = Field(description="Keycloak server URL")
|
|
9
|
+
client_id: str = Field(description="Keycloak client ID")
|
|
10
|
+
realm_name: str = Field(description="Keycloak realm name")
|
|
11
|
+
client_secret: SecretStr = Field(description="Keycloak client secret")
|
|
12
|
+
redirect_uri: str = Field(description="Redirect URI")
|
|
13
13
|
verify_ssl: bool = Field(True, description="Verify SSL certificates")
|
|
14
14
|
scope: str = Field("openid", description="Keycloak scope")
|
|
15
15
|
|
|
@@ -2,7 +2,10 @@
|
|
|
2
2
|
# SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
import json
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
6
9
|
|
|
7
10
|
|
|
8
11
|
class CORSSettings(BaseModel):
|
|
@@ -23,20 +26,20 @@ class CORSSettings(BaseModel):
|
|
|
23
26
|
.. code-block:: bash
|
|
24
27
|
|
|
25
28
|
SYNCMASTER__SERVER__CORS__ENABLED=True
|
|
26
|
-
SYNCMASTER__SERVER__CORS__ALLOW_ORIGINS=
|
|
27
|
-
SYNCMASTER__SERVER__CORS__ALLOW_METHODS=
|
|
28
|
-
SYNCMASTER__SERVER__CORS__ALLOW_HEADERS=
|
|
29
|
-
SYNCMASTER__SERVER__CORS__EXPOSE_HEADERS=
|
|
29
|
+
SYNCMASTER__SERVER__CORS__ALLOW_ORIGINS="*"
|
|
30
|
+
SYNCMASTER__SERVER__CORS__ALLOW_METHODS="*"
|
|
31
|
+
SYNCMASTER__SERVER__CORS__ALLOW_HEADERS="*"
|
|
32
|
+
SYNCMASTER__SERVER__CORS__EXPOSE_HEADERS=X-Request-ID,Location,Access-Control-Allow-Credentials
|
|
30
33
|
|
|
31
34
|
For production environment:
|
|
32
35
|
|
|
33
36
|
.. code-block:: bash
|
|
34
37
|
|
|
35
38
|
SYNCMASTER__SERVER__CORS__ENABLED=True
|
|
36
|
-
SYNCMASTER__SERVER__CORS__ALLOW_ORIGINS=
|
|
37
|
-
SYNCMASTER__SERVER__CORS__ALLOW_METHODS=
|
|
38
|
-
SYNCMASTER__SERVER__CORS__ALLOW_HEADERS=
|
|
39
|
-
SYNCMASTER__SERVER__CORS__EXPOSE_HEADERS=
|
|
39
|
+
SYNCMASTER__SERVER__CORS__ALLOW_ORIGINS="production.example.com"
|
|
40
|
+
SYNCMASTER__SERVER__CORS__ALLOW_METHODS="GET"
|
|
41
|
+
SYNCMASTER__SERVER__CORS__ALLOW_HEADERS="X-Request-ID,X-Request-With"
|
|
42
|
+
SYNCMASTER__SERVER__CORS__EXPOSE_HEADERS="X-Request-ID"
|
|
40
43
|
# custom option passed directly to middleware
|
|
41
44
|
SYNCMASTER__SERVER__CORS__MAX_AGE=600
|
|
42
45
|
"""
|
|
@@ -55,4 +58,13 @@ class CORSSettings(BaseModel):
|
|
|
55
58
|
)
|
|
56
59
|
expose_headers: list[str] = Field(default=["X-Request-ID"], description="HTTP headers exposed from server")
|
|
57
60
|
|
|
61
|
+
@field_validator("allow_origins", "allow_methods", "allow_headers", "expose_headers", mode="before")
|
|
62
|
+
@classmethod
|
|
63
|
+
def _validate_bootstrap_servers(cls, value: Any):
|
|
64
|
+
if not isinstance(value, str):
|
|
65
|
+
return value
|
|
66
|
+
if "[" in value:
|
|
67
|
+
return json.loads(value)
|
|
68
|
+
return [item.strip() for item in value.split(",")]
|
|
69
|
+
|
|
58
70
|
model_config = ConfigDict(extra="allow")
|
|
@@ -6,8 +6,14 @@ import logging
|
|
|
6
6
|
import math
|
|
7
7
|
from typing import TYPE_CHECKING
|
|
8
8
|
|
|
9
|
+
from onetl.connection.kerberos_helpers import kinit_password
|
|
10
|
+
|
|
9
11
|
from syncmaster.db.models import Run
|
|
10
|
-
from syncmaster.dto.connections import
|
|
12
|
+
from syncmaster.dto.connections import (
|
|
13
|
+
ConnectionDTO,
|
|
14
|
+
HDFSConnectionDTO,
|
|
15
|
+
HiveConnectionDTO,
|
|
16
|
+
)
|
|
11
17
|
|
|
12
18
|
if TYPE_CHECKING:
|
|
13
19
|
from pyspark.sql import SparkSession
|
|
@@ -29,9 +35,14 @@ def get_worker_spark_session(
|
|
|
29
35
|
for k, v in get_spark_session_conf(source, target, run.transfer.resources).items():
|
|
30
36
|
spark_builder = spark_builder.config(k, v)
|
|
31
37
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
38
|
+
for entity in source, target:
|
|
39
|
+
if isinstance(entity, HiveConnectionDTO):
|
|
40
|
+
log.debug("Enabling Hive support")
|
|
41
|
+
spark_builder = spark_builder.enableHiveSupport()
|
|
42
|
+
|
|
43
|
+
if isinstance(entity, (HiveConnectionDTO, HDFSConnectionDTO)):
|
|
44
|
+
log.debug("Using Kerberos auth for %s", entity.user)
|
|
45
|
+
kinit_password(entity.user, entity.password)
|
|
35
46
|
|
|
36
47
|
return spark_builder.getOrCreate()
|
|
37
48
|
|