dbos 1.11.0a1__tar.gz → 1.11.0a2__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.
Potentially problematic release.
This version of dbos might be problematic. Click here for more details.
- {dbos-1.11.0a1 → dbos-1.11.0a2}/PKG-INFO +1 -1
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_app_db.py +13 -4
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/cli/cli.py +19 -29
- dbos-1.11.0a2/dbos/cli/migration.py +91 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/pyproject.toml +1 -1
- dbos-1.11.0a2/tests/test_migrate.py +79 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/LICENSE +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/README.md +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/__init__.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/__main__.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_admin_server.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_classproperty.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_client.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_conductor/conductor.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_conductor/protocol.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_context.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_core.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_croniter.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_dbos.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_dbos_config.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_debug.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_docker_pg_helper.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_error.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_event_loop.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_fastapi.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_flask.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_kafka.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_kafka_message.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_logger.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/env.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/script.py.mako +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/01ce9f07bd10_streaming.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/04ca4f231047_workflow_queues_executor_id.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/27ac6900c6ad_add_queue_dedup.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/50f3227f0b4b_fix_job_queue.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/66478e1b95e5_consolidate_queues.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/83f3732ae8e7_workflow_timeout.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/a3b18ad34abe_added_triggers.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/d76646551a6b_job_queue_limiter.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/d76646551a6c_workflow_queue.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/d994145b47b6_consolidate_inputs.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/eab0cc1d9a14_job_queue.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/f4b9b32ba814_functionname_childid_op_outputs.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_outcome.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_queue.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_recovery.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_registrations.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_roles.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_scheduler.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_schemas/__init__.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_schemas/application_database.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_schemas/system_database.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_serialization.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_sys_db.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_templates/dbos-db-starter/README.md +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_templates/dbos-db-starter/__package/__init__.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_templates/dbos-db-starter/__package/main.py.dbos +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_templates/dbos-db-starter/__package/schema.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_templates/dbos-db-starter/alembic.ini +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_templates/dbos-db-starter/dbos-config.yaml.dbos +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_templates/dbos-db-starter/migrations/env.py.dbos +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_templates/dbos-db-starter/migrations/script.py.mako +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_templates/dbos-db-starter/start_postgres_docker.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_tracer.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_utils.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_workflow_commands.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/cli/_github_init.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/cli/_template_init.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/dbos-config.schema.json +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/py.typed +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/__init__.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/atexit_no_ctor.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/atexit_no_launch.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/classdefs.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/client_collateral.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/client_worker.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/conftest.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/dupname_classdefs1.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/dupname_classdefsa.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/more_classdefs.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/queuedworkflow.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_admin_server.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_async.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_async_workflow_management.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_classdecorators.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_cli.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_client.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_concurrency.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_config.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_croniter.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_dbos.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_debug.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_docker_secrets.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_failures.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_fastapi.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_fastapi_roles.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_flask.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_kafka.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_outcome.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_package.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_queue.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_scheduler.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_schema_migration.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_singleton.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_spans.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_sqlalchemy.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_streaming.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_workflow_introspection.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/tests/test_workflow_management.py +0 -0
- {dbos-1.11.0a1 → dbos-1.11.0a2}/version/__init__.py +0 -0
|
@@ -74,10 +74,19 @@ class ApplicationDatabase:
|
|
|
74
74
|
|
|
75
75
|
# Create the dbos schema and transaction_outputs table in the application database
|
|
76
76
|
with self.engine.begin() as conn:
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
77
|
+
# Check if schema exists first
|
|
78
|
+
schema_exists = conn.execute(
|
|
79
|
+
sa.text(
|
|
80
|
+
"SELECT 1 FROM information_schema.schemata WHERE schema_name = :schema_name"
|
|
81
|
+
),
|
|
82
|
+
parameters={"schema_name": ApplicationSchema.schema},
|
|
83
|
+
).scalar()
|
|
84
|
+
|
|
85
|
+
if not schema_exists:
|
|
86
|
+
schema_creation_query = sa.text(
|
|
87
|
+
f"CREATE SCHEMA {ApplicationSchema.schema}"
|
|
88
|
+
)
|
|
89
|
+
conn.execute(schema_creation_query)
|
|
81
90
|
|
|
82
91
|
inspector = inspect(self.engine)
|
|
83
92
|
if not inspector.has_table(
|
|
@@ -15,6 +15,7 @@ from rich.prompt import IntPrompt
|
|
|
15
15
|
from typing_extensions import Annotated, List
|
|
16
16
|
|
|
17
17
|
from dbos._debug import debug_workflow, parse_start_command
|
|
18
|
+
from dbos.cli.migration import grant_dbos_schema_permissions, migrate_dbos_databases
|
|
18
19
|
|
|
19
20
|
from .._app_db import ApplicationDatabase
|
|
20
21
|
from .._client import DBOSClient
|
|
@@ -278,6 +279,14 @@ def migrate(
|
|
|
278
279
|
help="Your DBOS system database URL",
|
|
279
280
|
),
|
|
280
281
|
] = None,
|
|
282
|
+
application_role: Annotated[
|
|
283
|
+
typing.Optional[str],
|
|
284
|
+
typer.Option(
|
|
285
|
+
"--app-role",
|
|
286
|
+
"-r",
|
|
287
|
+
help="The role with which you will run your DBOS application",
|
|
288
|
+
),
|
|
289
|
+
] = None,
|
|
281
290
|
) -> None:
|
|
282
291
|
app_database_url = _get_db_url(app_database_url)
|
|
283
292
|
system_database_url = get_system_database_url(
|
|
@@ -293,37 +302,18 @@ def migrate(
|
|
|
293
302
|
typer.echo(f"System database: {sa.make_url(system_database_url)}")
|
|
294
303
|
|
|
295
304
|
# First, run DBOS migrations on the system database and the application database
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
"pool_size": 2,
|
|
305
|
-
},
|
|
305
|
+
migrate_dbos_databases(
|
|
306
|
+
app_database_url=app_database_url, system_database_url=system_database_url
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
# Next, assign permissions on the DBOS schema to the application role, if any
|
|
310
|
+
if application_role:
|
|
311
|
+
grant_dbos_schema_permissions(
|
|
312
|
+
database_url=app_database_url, role_name=application_role
|
|
306
313
|
)
|
|
307
|
-
|
|
308
|
-
database_url=
|
|
309
|
-
engine_kwargs={
|
|
310
|
-
"pool_timeout": 30,
|
|
311
|
-
"max_overflow": 0,
|
|
312
|
-
"pool_size": 2,
|
|
313
|
-
},
|
|
314
|
+
grant_dbos_schema_permissions(
|
|
315
|
+
database_url=system_database_url, role_name=application_role
|
|
314
316
|
)
|
|
315
|
-
sys_db.run_migrations()
|
|
316
|
-
app_db.run_migrations()
|
|
317
|
-
except Exception as e:
|
|
318
|
-
typer.echo(f"DBOS migrations failed: {e}")
|
|
319
|
-
raise typer.Exit(code=1)
|
|
320
|
-
finally:
|
|
321
|
-
if sys_db:
|
|
322
|
-
sys_db.destroy()
|
|
323
|
-
if app_db:
|
|
324
|
-
app_db.destroy()
|
|
325
|
-
|
|
326
|
-
typer.echo(f"DBOS migrations successful")
|
|
327
317
|
|
|
328
318
|
# Next, run any custom migration commands specified in the configuration
|
|
329
319
|
if os.path.exists("dbos-config.yaml"):
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import sqlalchemy as sa
|
|
2
|
+
import typer
|
|
3
|
+
|
|
4
|
+
from dbos._app_db import ApplicationDatabase
|
|
5
|
+
from dbos._sys_db import SystemDatabase
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def migrate_dbos_databases(app_database_url: str, system_database_url: str) -> None:
|
|
9
|
+
app_db = None
|
|
10
|
+
sys_db = None
|
|
11
|
+
try:
|
|
12
|
+
sys_db = SystemDatabase(
|
|
13
|
+
system_database_url=system_database_url,
|
|
14
|
+
engine_kwargs={
|
|
15
|
+
"pool_timeout": 30,
|
|
16
|
+
"max_overflow": 0,
|
|
17
|
+
"pool_size": 2,
|
|
18
|
+
},
|
|
19
|
+
)
|
|
20
|
+
app_db = ApplicationDatabase(
|
|
21
|
+
database_url=app_database_url,
|
|
22
|
+
engine_kwargs={
|
|
23
|
+
"pool_timeout": 30,
|
|
24
|
+
"max_overflow": 0,
|
|
25
|
+
"pool_size": 2,
|
|
26
|
+
},
|
|
27
|
+
)
|
|
28
|
+
sys_db.run_migrations()
|
|
29
|
+
app_db.run_migrations()
|
|
30
|
+
except Exception as e:
|
|
31
|
+
typer.echo(f"DBOS migrations failed: {e}")
|
|
32
|
+
raise typer.Exit(code=1)
|
|
33
|
+
finally:
|
|
34
|
+
if sys_db:
|
|
35
|
+
sys_db.destroy()
|
|
36
|
+
if app_db:
|
|
37
|
+
app_db.destroy()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def grant_dbos_schema_permissions(database_url: str, role_name: str) -> None:
|
|
41
|
+
"""
|
|
42
|
+
Grant all permissions on all entities in the dbos schema to the specified role.
|
|
43
|
+
"""
|
|
44
|
+
typer.echo(
|
|
45
|
+
f"Granting permissions for DBOS schema to {role_name} in database {sa.make_url(database_url)}"
|
|
46
|
+
)
|
|
47
|
+
engine = None
|
|
48
|
+
try:
|
|
49
|
+
engine = sa.create_engine(database_url)
|
|
50
|
+
with engine.connect() as connection:
|
|
51
|
+
connection.execution_options(isolation_level="AUTOCOMMIT")
|
|
52
|
+
|
|
53
|
+
# Grant usage on the dbos schema
|
|
54
|
+
sql = f"GRANT USAGE ON SCHEMA dbos TO {role_name}"
|
|
55
|
+
typer.echo(sql)
|
|
56
|
+
connection.execute(sa.text(sql))
|
|
57
|
+
|
|
58
|
+
# Grant all privileges on all existing tables in dbos schema (includes views)
|
|
59
|
+
sql = f"GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA dbos TO {role_name}"
|
|
60
|
+
typer.echo(sql)
|
|
61
|
+
connection.execute(sa.text(sql))
|
|
62
|
+
|
|
63
|
+
# Grant all privileges on all sequences in dbos schema
|
|
64
|
+
sql = f"GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA dbos TO {role_name}"
|
|
65
|
+
typer.echo(sql)
|
|
66
|
+
connection.execute(sa.text(sql))
|
|
67
|
+
|
|
68
|
+
# Grant execute on all functions and procedures in dbos schema
|
|
69
|
+
sql = f"GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA dbos TO {role_name}"
|
|
70
|
+
typer.echo(sql)
|
|
71
|
+
connection.execute(sa.text(sql))
|
|
72
|
+
|
|
73
|
+
# Grant default privileges for future objects in dbos schema
|
|
74
|
+
sql = f"ALTER DEFAULT PRIVILEGES IN SCHEMA dbos GRANT ALL ON TABLES TO {role_name}"
|
|
75
|
+
typer.echo(sql)
|
|
76
|
+
connection.execute(sa.text(sql))
|
|
77
|
+
|
|
78
|
+
sql = f"ALTER DEFAULT PRIVILEGES IN SCHEMA dbos GRANT ALL ON SEQUENCES TO {role_name}"
|
|
79
|
+
typer.echo(sql)
|
|
80
|
+
connection.execute(sa.text(sql))
|
|
81
|
+
|
|
82
|
+
sql = f"ALTER DEFAULT PRIVILEGES IN SCHEMA dbos GRANT EXECUTE ON FUNCTIONS TO {role_name}"
|
|
83
|
+
typer.echo(sql)
|
|
84
|
+
connection.execute(sa.text(sql))
|
|
85
|
+
|
|
86
|
+
except Exception as e:
|
|
87
|
+
typer.echo(f"Failed to grant permissions to role {role_name}: {e}")
|
|
88
|
+
raise typer.Exit(code=1)
|
|
89
|
+
finally:
|
|
90
|
+
if engine:
|
|
91
|
+
engine.dispose()
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import subprocess
|
|
2
|
+
|
|
3
|
+
import sqlalchemy as sa
|
|
4
|
+
|
|
5
|
+
from dbos import DBOS, DBOSConfig
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_migrate(postgres_db_engine: sa.Engine) -> None:
|
|
9
|
+
"""Test that you can migrate with a privileged role and run DBOS with a less-privileged role"""
|
|
10
|
+
database_name = "migrate_test"
|
|
11
|
+
role_name = "migrate_test_role"
|
|
12
|
+
role_password = "migrate_test_password"
|
|
13
|
+
|
|
14
|
+
db_url = postgres_db_engine.url.set(database=database_name).render_as_string(
|
|
15
|
+
hide_password=False
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
# Drop the DBOS database if it exists. Create a test role with no permissions.
|
|
19
|
+
with postgres_db_engine.connect() as connection:
|
|
20
|
+
connection.execution_options(isolation_level="AUTOCOMMIT")
|
|
21
|
+
connection.execute(
|
|
22
|
+
sa.text(f"DROP DATABASE IF EXISTS {database_name} WITH (FORCE)")
|
|
23
|
+
)
|
|
24
|
+
connection.execute(sa.text(f"DROP ROLE IF EXISTS {role_name}"))
|
|
25
|
+
connection.execute(
|
|
26
|
+
sa.text(f"CREATE ROLE {role_name} WITH LOGIN PASSWORD '{role_password}'")
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
# Using the admin role, create the DBOS database and verify it exists.
|
|
30
|
+
# Set permissions for the test role.
|
|
31
|
+
subprocess.check_call(
|
|
32
|
+
["dbos", "migrate", "-D", db_url, "-s", db_url, "-r", role_name]
|
|
33
|
+
)
|
|
34
|
+
with postgres_db_engine.connect() as c:
|
|
35
|
+
c.execution_options(isolation_level="AUTOCOMMIT")
|
|
36
|
+
result = c.execute(
|
|
37
|
+
sa.text(
|
|
38
|
+
f"SELECT COUNT(*) FROM pg_database WHERE datname = '{database_name}'"
|
|
39
|
+
)
|
|
40
|
+
).scalar()
|
|
41
|
+
assert result == 1
|
|
42
|
+
|
|
43
|
+
# Initialize DBOS with the test role. Verify various operations work.
|
|
44
|
+
test_db_url = (
|
|
45
|
+
postgres_db_engine.url.set(database=database_name)
|
|
46
|
+
.set(username=role_name)
|
|
47
|
+
.set(password=role_password)
|
|
48
|
+
).render_as_string(hide_password=False)
|
|
49
|
+
DBOS.destroy(destroy_registry=True)
|
|
50
|
+
config: DBOSConfig = {
|
|
51
|
+
"name": "test_migrate",
|
|
52
|
+
"database_url": test_db_url,
|
|
53
|
+
"system_database_url": test_db_url,
|
|
54
|
+
}
|
|
55
|
+
DBOS(config=config)
|
|
56
|
+
|
|
57
|
+
@DBOS.transaction()
|
|
58
|
+
def test_transaction() -> str:
|
|
59
|
+
rows = DBOS.sql_session.execute(sa.text("SELECT 1")).fetchall()
|
|
60
|
+
return str(rows[0][0])
|
|
61
|
+
|
|
62
|
+
@DBOS.workflow()
|
|
63
|
+
def test_workflow() -> str:
|
|
64
|
+
assert test_transaction() == "1"
|
|
65
|
+
id = DBOS.workflow_id
|
|
66
|
+
assert id
|
|
67
|
+
DBOS.set_event(id, id)
|
|
68
|
+
return id
|
|
69
|
+
|
|
70
|
+
DBOS.launch()
|
|
71
|
+
|
|
72
|
+
workflow_id = test_workflow()
|
|
73
|
+
assert workflow_id
|
|
74
|
+
assert DBOS.get_event(workflow_id, workflow_id) == workflow_id
|
|
75
|
+
|
|
76
|
+
steps = DBOS.list_workflow_steps(workflow_id)
|
|
77
|
+
assert len(steps) == 2
|
|
78
|
+
assert steps[0]["function_name"] == test_transaction.__qualname__
|
|
79
|
+
assert steps[1]["function_name"] == "DBOS.setEvent"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/5c361fc04708_added_system_tables.py
RENAMED
|
File without changes
|
{dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/66478e1b95e5_consolidate_queues.py
RENAMED
|
File without changes
|
|
File without changes
|
{dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/933e86bdac6a_add_queue_priority.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{dbos-1.11.0a1 → dbos-1.11.0a2}/dbos/_migrations/versions/d994145b47b6_consolidate_inputs.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|