dbos 0.21.0a3__py3-none-any.whl → 0.21.0a4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dbos/_dbos.py +4 -5
- dbos/_sys_db.py +42 -7
- dbos/_workflow_commands.py +8 -26
- dbos/cli/cli.py +4 -4
- {dbos-0.21.0a3.dist-info → dbos-0.21.0a4.dist-info}/METADATA +1 -1
- {dbos-0.21.0a3.dist-info → dbos-0.21.0a4.dist-info}/RECORD +9 -9
- {dbos-0.21.0a3.dist-info → dbos-0.21.0a4.dist-info}/WHEEL +0 -0
- {dbos-0.21.0a3.dist-info → dbos-0.21.0a4.dist-info}/entry_points.txt +0 -0
- {dbos-0.21.0a3.dist-info → dbos-0.21.0a4.dist-info}/licenses/LICENSE +0 -0
dbos/_dbos.py
CHANGED
|
@@ -800,14 +800,13 @@ class DBOS:
|
|
|
800
800
|
@classmethod
|
|
801
801
|
def cancel_workflow(cls, workflow_id: str) -> None:
|
|
802
802
|
"""Cancel a workflow by ID."""
|
|
803
|
-
_get_dbos_instance()._sys_db.
|
|
804
|
-
workflow_id, WorkflowStatusString.CANCELLED
|
|
805
|
-
)
|
|
803
|
+
_get_dbos_instance()._sys_db.cancel_workflow(workflow_id)
|
|
806
804
|
|
|
807
805
|
@classmethod
|
|
808
|
-
def resume_workflow(cls, workflow_id: str) ->
|
|
806
|
+
def resume_workflow(cls, workflow_id: str) -> WorkflowHandle[Any]:
|
|
809
807
|
"""Resume a workflow by ID."""
|
|
810
|
-
|
|
808
|
+
_get_dbos_instance()._sys_db.resume_workflow(workflow_id)
|
|
809
|
+
return execute_workflow_by_id(_get_dbos_instance(), workflow_id, False)
|
|
811
810
|
|
|
812
811
|
@classproperty
|
|
813
812
|
def logger(cls) -> Logger:
|
dbos/_sys_db.py
CHANGED
|
@@ -390,20 +390,55 @@ class SystemDatabase:
|
|
|
390
390
|
if status["workflow_uuid"] in self._temp_txn_wf_ids:
|
|
391
391
|
self._exported_temp_txn_wf_status.add(status["workflow_uuid"])
|
|
392
392
|
|
|
393
|
-
def
|
|
393
|
+
def cancel_workflow(
|
|
394
394
|
self,
|
|
395
|
-
|
|
396
|
-
status: WorkflowStatusString,
|
|
395
|
+
workflow_id: str,
|
|
397
396
|
) -> None:
|
|
398
397
|
with self.engine.begin() as c:
|
|
399
|
-
|
|
398
|
+
# Remove the workflow from the queues table so it does not block the table
|
|
399
|
+
c.execute(
|
|
400
|
+
sa.delete(SystemSchema.workflow_queue).where(
|
|
401
|
+
SystemSchema.workflow_queue.c.workflow_uuid == workflow_id
|
|
402
|
+
)
|
|
403
|
+
)
|
|
404
|
+
# Set the workflow's status to CANCELLED
|
|
405
|
+
c.execute(
|
|
400
406
|
sa.update(SystemSchema.workflow_status)
|
|
401
|
-
.where(SystemSchema.workflow_status.c.workflow_uuid ==
|
|
407
|
+
.where(SystemSchema.workflow_status.c.workflow_uuid == workflow_id)
|
|
402
408
|
.values(
|
|
403
|
-
status=
|
|
409
|
+
status=WorkflowStatusString.CANCELLED.value,
|
|
410
|
+
)
|
|
411
|
+
)
|
|
412
|
+
|
|
413
|
+
def resume_workflow(
|
|
414
|
+
self,
|
|
415
|
+
workflow_id: str,
|
|
416
|
+
) -> None:
|
|
417
|
+
with self.engine.begin() as c:
|
|
418
|
+
# Check the status of the workflow. If it is complete, do nothing.
|
|
419
|
+
row = c.execute(
|
|
420
|
+
sa.select(
|
|
421
|
+
SystemSchema.workflow_status.c.status,
|
|
422
|
+
).where(SystemSchema.workflow_status.c.workflow_uuid == workflow_id)
|
|
423
|
+
).fetchone()
|
|
424
|
+
if (
|
|
425
|
+
row is None
|
|
426
|
+
or row[0] == WorkflowStatusString.SUCCESS.value
|
|
427
|
+
or row[0] == WorkflowStatusString.ERROR.value
|
|
428
|
+
):
|
|
429
|
+
return
|
|
430
|
+
# Remove the workflow from the queues table so resume can safely be called on an ENQUEUED workflow
|
|
431
|
+
c.execute(
|
|
432
|
+
sa.delete(SystemSchema.workflow_queue).where(
|
|
433
|
+
SystemSchema.workflow_queue.c.workflow_uuid == workflow_id
|
|
404
434
|
)
|
|
405
435
|
)
|
|
406
|
-
|
|
436
|
+
# Set the workflow's status to PENDING and clear its recovery attempts.
|
|
437
|
+
c.execute(
|
|
438
|
+
sa.update(SystemSchema.workflow_status)
|
|
439
|
+
.where(SystemSchema.workflow_status.c.workflow_uuid == workflow_id)
|
|
440
|
+
.values(status=WorkflowStatusString.PENDING.value, recovery_attempts=0)
|
|
441
|
+
)
|
|
407
442
|
|
|
408
443
|
def get_workflow_status(
|
|
409
444
|
self, workflow_uuid: str
|
dbos/_workflow_commands.py
CHANGED
|
@@ -1,23 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
import os
|
|
3
|
-
import sys
|
|
4
|
-
from typing import Any, List, Optional, cast
|
|
1
|
+
from typing import List, Optional, cast
|
|
5
2
|
|
|
6
3
|
import typer
|
|
7
|
-
from rich import print
|
|
8
4
|
|
|
9
|
-
from
|
|
10
|
-
|
|
11
|
-
from . import _serialization, load_config
|
|
12
|
-
from ._core import execute_workflow_by_id
|
|
13
|
-
from ._dbos_config import ConfigFile, _is_valid_app_name
|
|
5
|
+
from . import _serialization
|
|
6
|
+
from ._dbos_config import ConfigFile
|
|
14
7
|
from ._sys_db import (
|
|
15
8
|
GetWorkflowsInput,
|
|
16
9
|
GetWorkflowsOutput,
|
|
17
10
|
SystemDatabase,
|
|
18
11
|
WorkflowStatuses,
|
|
19
|
-
WorkflowStatusInternal,
|
|
20
|
-
WorkflowStatusString,
|
|
21
12
|
)
|
|
22
13
|
|
|
23
14
|
|
|
@@ -41,7 +32,7 @@ class WorkflowInformation:
|
|
|
41
32
|
queue_name: Optional[str]
|
|
42
33
|
|
|
43
34
|
|
|
44
|
-
def
|
|
35
|
+
def list_workflows(
|
|
45
36
|
config: ConfigFile,
|
|
46
37
|
li: int,
|
|
47
38
|
user: Optional[str],
|
|
@@ -91,17 +82,13 @@ def _list_workflows(
|
|
|
91
82
|
sys_db.destroy()
|
|
92
83
|
|
|
93
84
|
|
|
94
|
-
def
|
|
85
|
+
def get_workflow(
|
|
95
86
|
config: ConfigFile, uuid: str, request: bool
|
|
96
87
|
) -> Optional[WorkflowInformation]:
|
|
97
|
-
sys_db = None
|
|
98
|
-
|
|
99
88
|
try:
|
|
100
89
|
sys_db = SystemDatabase(config)
|
|
101
|
-
|
|
102
90
|
info = _get_workflow_info(sys_db, uuid, request)
|
|
103
91
|
return info
|
|
104
|
-
|
|
105
92
|
except Exception as e:
|
|
106
93
|
typer.echo(f"Error getting workflow: {e}")
|
|
107
94
|
return None
|
|
@@ -110,18 +97,13 @@ def _get_workflow(
|
|
|
110
97
|
sys_db.destroy()
|
|
111
98
|
|
|
112
99
|
|
|
113
|
-
def
|
|
114
|
-
# config = load_config()
|
|
115
|
-
sys_db = None
|
|
116
|
-
|
|
100
|
+
def cancel_workflow(config: ConfigFile, uuid: str) -> None:
|
|
117
101
|
try:
|
|
118
102
|
sys_db = SystemDatabase(config)
|
|
119
|
-
sys_db.
|
|
120
|
-
return
|
|
121
|
-
|
|
103
|
+
sys_db.cancel_workflow(uuid)
|
|
122
104
|
except Exception as e:
|
|
123
105
|
typer.echo(f"Failed to connect to DBOS system database: {e}")
|
|
124
|
-
|
|
106
|
+
raise e
|
|
125
107
|
finally:
|
|
126
108
|
if sys_db:
|
|
127
109
|
sys_db.destroy()
|
dbos/cli/cli.py
CHANGED
|
@@ -19,7 +19,7 @@ from .. import load_config
|
|
|
19
19
|
from .._app_db import ApplicationDatabase
|
|
20
20
|
from .._dbos_config import _is_valid_app_name
|
|
21
21
|
from .._sys_db import SystemDatabase, reset_system_database
|
|
22
|
-
from .._workflow_commands import
|
|
22
|
+
from .._workflow_commands import cancel_workflow, get_workflow, list_workflows
|
|
23
23
|
from ..cli._github_init import create_template_from_github
|
|
24
24
|
from ._template_init import copy_template, get_project_name, get_templates_directory
|
|
25
25
|
|
|
@@ -282,7 +282,7 @@ def list(
|
|
|
282
282
|
] = None,
|
|
283
283
|
) -> None:
|
|
284
284
|
config = load_config()
|
|
285
|
-
workflows =
|
|
285
|
+
workflows = list_workflows(
|
|
286
286
|
config, limit, user, starttime, endtime, status, request, appversion
|
|
287
287
|
)
|
|
288
288
|
print(jsonpickle.encode(workflows, unpicklable=False))
|
|
@@ -301,7 +301,7 @@ def get(
|
|
|
301
301
|
] = True,
|
|
302
302
|
) -> None:
|
|
303
303
|
config = load_config()
|
|
304
|
-
print(jsonpickle.encode(
|
|
304
|
+
print(jsonpickle.encode(get_workflow(config, uuid, request), unpicklable=False))
|
|
305
305
|
|
|
306
306
|
|
|
307
307
|
@workflow.command(
|
|
@@ -315,7 +315,7 @@ def cancel(
|
|
|
315
315
|
] = None,
|
|
316
316
|
) -> None:
|
|
317
317
|
config = load_config()
|
|
318
|
-
|
|
318
|
+
cancel_workflow(config, uuid)
|
|
319
319
|
print(f"Workflow {uuid} has been cancelled")
|
|
320
320
|
|
|
321
321
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
dbos-0.21.
|
|
2
|
-
dbos-0.21.
|
|
3
|
-
dbos-0.21.
|
|
4
|
-
dbos-0.21.
|
|
1
|
+
dbos-0.21.0a4.dist-info/METADATA,sha256=YFvX-uuQsvFQM0j6IuS3jugWr93rx3QhQAHffV15nkY,5309
|
|
2
|
+
dbos-0.21.0a4.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
|
|
3
|
+
dbos-0.21.0a4.dist-info/entry_points.txt,sha256=_QOQ3tVfEjtjBlr1jS4sHqHya9lI2aIEIWkz8dqYp14,58
|
|
4
|
+
dbos-0.21.0a4.dist-info/licenses/LICENSE,sha256=VGZit_a5-kdw9WT6fY5jxAWVwGQzgLFyPWrcVVUhVNU,1067
|
|
5
5
|
dbos/__init__.py,sha256=CxRHBHEthPL4PZoLbZhp3rdm44-KkRTT2-7DkK9d4QQ,724
|
|
6
6
|
dbos/_admin_server.py,sha256=PJgneZG9-64TapZrPeJtt73puAswRImCE5uce2k2PKU,4750
|
|
7
7
|
dbos/_app_db.py,sha256=_tv2vmPjjiaikwgxH3mqxgJ4nUUcG2-0uMXKWCqVu1c,5509
|
|
@@ -13,7 +13,7 @@ dbos/_context.py,sha256=FHB_fpE4fQt4fIJvAmMMsbY4xHwH77gsW01cFsRZjsE,17779
|
|
|
13
13
|
dbos/_core.py,sha256=nGiXyYgV8H5TRRZG0e8HCd5IZimufYQLmKNr7nBbwbo,36564
|
|
14
14
|
dbos/_croniter.py,sha256=hbhgfsHBqclUS8VeLnJ9PSE9Z54z6mi4nnrr1aUXn0k,47561
|
|
15
15
|
dbos/_db_wizard.py,sha256=xgKLna0_6Xi50F3o8msRosXba8NScHlpJR5ICVCkHDQ,7534
|
|
16
|
-
dbos/_dbos.py,sha256=
|
|
16
|
+
dbos/_dbos.py,sha256=y5RgXPxdNsnketphphGMlaYZABFEQpr78UK-Xyja6dk,36216
|
|
17
17
|
dbos/_dbos_config.py,sha256=h_q1gzudhsAMVkGMD0qQ6kLic6YhdJgzm50YFSIx9Bo,8196
|
|
18
18
|
dbos/_error.py,sha256=vtaSsG0QW6cRlwfZ4zzZWy_IHCZlomwSlrDyGWuyn8c,4337
|
|
19
19
|
dbos/_fastapi.py,sha256=ke03vqsSYDnO6XeOtOVFXj0-f-v1MGsOxa9McaROvNc,3616
|
|
@@ -41,7 +41,7 @@ dbos/_schemas/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
41
41
|
dbos/_schemas/application_database.py,sha256=KeyoPrF7hy_ODXV7QNike_VFSD74QBRfQ76D7QyE9HI,966
|
|
42
42
|
dbos/_schemas/system_database.py,sha256=rwp4EvCSaXcUoMaRczZCvETCxGp72k3-hvLyGUDkih0,5163
|
|
43
43
|
dbos/_serialization.py,sha256=YCYv0qKAwAZ1djZisBC7khvKqG-5OcIv9t9EC5PFIog,1743
|
|
44
|
-
dbos/_sys_db.py,sha256=
|
|
44
|
+
dbos/_sys_db.py,sha256=dgRD6kMQWktxGSGUtw0ow1CJW4o6gsLdmpULvgQCago,56190
|
|
45
45
|
dbos/_templates/dbos-db-starter/README.md,sha256=GhxhBj42wjTt1fWEtwNriHbJuKb66Vzu89G4pxNHw2g,930
|
|
46
46
|
dbos/_templates/dbos-db-starter/__package/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
47
|
dbos/_templates/dbos-db-starter/__package/main.py,sha256=eI0SS9Nwj-fldtiuSzIlIG6dC91GXXwdRsoHxv6S_WI,2719
|
|
@@ -53,11 +53,11 @@ dbos/_templates/dbos-db-starter/migrations/script.py.mako,sha256=MEqL-2qATlST9TA
|
|
|
53
53
|
dbos/_templates/dbos-db-starter/migrations/versions/2024_07_31_180642_init.py,sha256=U5thFWGqNN4QLrNXT7wUUqftIFDNE5eSdqD8JNW1mec,942
|
|
54
54
|
dbos/_templates/dbos-db-starter/start_postgres_docker.py,sha256=lQVLlYO5YkhGPEgPqwGc7Y8uDKse9HsWv5fynJEFJHM,1681
|
|
55
55
|
dbos/_tracer.py,sha256=rvBY1RQU6DO7rL7EnaJJxGcmd4tP_PpGqUEE6imZnhY,2518
|
|
56
|
-
dbos/_workflow_commands.py,sha256=
|
|
56
|
+
dbos/_workflow_commands.py,sha256=wVX_VdEM0qeuUQJWpdtEPY1RQ4C6quFPLSFtJGnvRi4,4272
|
|
57
57
|
dbos/cli/_github_init.py,sha256=Y_bDF9gfO2jB1id4FV5h1oIxEJRWyqVjhb7bNEa5nQ0,3224
|
|
58
58
|
dbos/cli/_template_init.py,sha256=AfuMaO8bmr9WsPNHr6j2cp7kjVVZDUpH7KpbTg0hhFs,2722
|
|
59
|
-
dbos/cli/cli.py,sha256=
|
|
59
|
+
dbos/cli/cli.py,sha256=ZfOl5m791a113zjP94_P_a-qPl6wjBl4_tSfCIGAXK0,12404
|
|
60
60
|
dbos/dbos-config.schema.json,sha256=X5TpXNcARGceX0zQs0fVgtZW_Xj9uBbY5afPt9Rz9yk,5741
|
|
61
61
|
dbos/py.typed,sha256=QfzXT1Ktfk3Rj84akygc7_42z0lRpCq0Ilh8OXI6Zas,44
|
|
62
62
|
version/__init__.py,sha256=L4sNxecRuqdtSFdpUGX3TtBi9KL3k7YsZVIvv-fv9-A,1678
|
|
63
|
-
dbos-0.21.
|
|
63
|
+
dbos-0.21.0a4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|