Safe asserts (#180)
This commit is contained in:
parent
1f2845962c
commit
569995aa46
|
@ -0,0 +1,18 @@
|
||||||
|
"""Assertion_service."""
|
||||||
|
import contextlib
|
||||||
|
from typing import Generator
|
||||||
|
|
||||||
|
import sentry_sdk
|
||||||
|
from flask import current_app
|
||||||
|
|
||||||
|
|
||||||
|
@contextlib.contextmanager
|
||||||
|
def safe_assertion(condition: bool) -> Generator[bool, None, None]:
|
||||||
|
try:
|
||||||
|
yield True
|
||||||
|
except AssertionError as e:
|
||||||
|
if not condition:
|
||||||
|
sentry_sdk.capture_exception(e)
|
||||||
|
current_app.logger.exception(e)
|
||||||
|
if current_app.config["ENV_IDENTIFIER"] == "local_development":
|
||||||
|
raise e
|
|
@ -4,7 +4,6 @@ from typing import Callable
|
||||||
from typing import List
|
from typing import List
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from flask import current_app
|
|
||||||
from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer # type: ignore
|
from SpiffWorkflow.bpmn.serializer.workflow import BpmnWorkflowSerializer # type: ignore
|
||||||
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow # type: ignore
|
from SpiffWorkflow.bpmn.workflow import BpmnWorkflow # type: ignore
|
||||||
from SpiffWorkflow.exceptions import SpiffWorkflowException # type: ignore
|
from SpiffWorkflow.exceptions import SpiffWorkflowException # type: ignore
|
||||||
|
@ -20,6 +19,7 @@ from spiffworkflow_backend.models.message_instance_correlation import (
|
||||||
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
|
from spiffworkflow_backend.models.process_instance import ProcessInstanceModel
|
||||||
from spiffworkflow_backend.models.spiff_step_details import SpiffStepDetailsModel
|
from spiffworkflow_backend.models.spiff_step_details import SpiffStepDetailsModel
|
||||||
from spiffworkflow_backend.models.task import TaskModel # noqa: F401
|
from spiffworkflow_backend.models.task import TaskModel # noqa: F401
|
||||||
|
from spiffworkflow_backend.services.assertion_service import safe_assertion
|
||||||
from spiffworkflow_backend.services.process_instance_lock_service import (
|
from spiffworkflow_backend.services.process_instance_lock_service import (
|
||||||
ProcessInstanceLockService,
|
ProcessInstanceLockService,
|
||||||
)
|
)
|
||||||
|
@ -290,11 +290,14 @@ class WorkflowExecutionService:
|
||||||
|
|
||||||
def do_engine_steps(self, exit_at: None = None, save: bool = False) -> None:
|
def do_engine_steps(self, exit_at: None = None, save: bool = False) -> None:
|
||||||
"""Do_engine_steps."""
|
"""Do_engine_steps."""
|
||||||
if not ProcessInstanceLockService.has_lock(self.process_instance_model.id):
|
with safe_assertion(
|
||||||
# TODO: can't be an exception yet - believe there are flows that are not locked.
|
ProcessInstanceLockService.has_lock(self.process_instance_model.id)
|
||||||
current_app.logger.error(
|
) as tripped:
|
||||||
"The current thread has not obtained a lock for this process instance.",
|
if tripped:
|
||||||
)
|
raise AssertionError(
|
||||||
|
"The current thread has not obtained a lock for this process"
|
||||||
|
f" instance ({self.process_instance_model.id})."
|
||||||
|
)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.bpmn_process_instance.refresh_waiting_tasks()
|
self.bpmn_process_instance.refresh_waiting_tasks()
|
||||||
|
|
Loading…
Reference in New Issue