mirror of
https://github.com/status-im/spiff-arena.git
synced 2025-01-15 20:54:31 +00:00
UAT bug fix: suspended/terminated instances automagically resume (#186)
This commit is contained in:
parent
121793307b
commit
6d847a10e0
@ -170,7 +170,17 @@ def process_instance_terminate(
|
|||||||
"""Process_instance_run."""
|
"""Process_instance_run."""
|
||||||
process_instance = _find_process_instance_by_id_or_raise(process_instance_id)
|
process_instance = _find_process_instance_by_id_or_raise(process_instance_id)
|
||||||
processor = ProcessInstanceProcessor(process_instance)
|
processor = ProcessInstanceProcessor(process_instance)
|
||||||
processor.terminate()
|
|
||||||
|
try:
|
||||||
|
processor.lock_process_instance("Web")
|
||||||
|
processor.terminate()
|
||||||
|
except (ProcessInstanceIsNotEnqueuedError, ProcessInstanceIsAlreadyLockedError) as e:
|
||||||
|
ErrorHandlingService().handle_error(processor, e)
|
||||||
|
raise e
|
||||||
|
finally:
|
||||||
|
if ProcessInstanceLockService.has_lock(process_instance.id):
|
||||||
|
processor.unlock_process_instance("Web")
|
||||||
|
|
||||||
return Response(json.dumps({"ok": True}), status=200, mimetype="application/json")
|
return Response(json.dumps({"ok": True}), status=200, mimetype="application/json")
|
||||||
|
|
||||||
|
|
||||||
@ -180,7 +190,18 @@ def process_instance_suspend(
|
|||||||
) -> flask.wrappers.Response:
|
) -> flask.wrappers.Response:
|
||||||
"""Process_instance_suspend."""
|
"""Process_instance_suspend."""
|
||||||
process_instance = _find_process_instance_by_id_or_raise(process_instance_id)
|
process_instance = _find_process_instance_by_id_or_raise(process_instance_id)
|
||||||
ProcessInstanceProcessor.suspend(process_instance)
|
processor = ProcessInstanceProcessor(process_instance)
|
||||||
|
|
||||||
|
try:
|
||||||
|
processor.lock_process_instance("Web")
|
||||||
|
processor.suspend()
|
||||||
|
except (ProcessInstanceIsNotEnqueuedError, ProcessInstanceIsAlreadyLockedError) as e:
|
||||||
|
ErrorHandlingService().handle_error(processor, e)
|
||||||
|
raise e
|
||||||
|
finally:
|
||||||
|
if ProcessInstanceLockService.has_lock(process_instance.id):
|
||||||
|
processor.unlock_process_instance("Web")
|
||||||
|
|
||||||
return Response(json.dumps({"ok": True}), status=200, mimetype="application/json")
|
return Response(json.dumps({"ok": True}), status=200, mimetype="application/json")
|
||||||
|
|
||||||
|
|
||||||
@ -190,7 +211,18 @@ def process_instance_resume(
|
|||||||
) -> flask.wrappers.Response:
|
) -> flask.wrappers.Response:
|
||||||
"""Process_instance_resume."""
|
"""Process_instance_resume."""
|
||||||
process_instance = _find_process_instance_by_id_or_raise(process_instance_id)
|
process_instance = _find_process_instance_by_id_or_raise(process_instance_id)
|
||||||
ProcessInstanceProcessor.resume(process_instance)
|
processor = ProcessInstanceProcessor(process_instance)
|
||||||
|
|
||||||
|
try:
|
||||||
|
processor.lock_process_instance("Web")
|
||||||
|
processor.resume()
|
||||||
|
except (ProcessInstanceIsNotEnqueuedError, ProcessInstanceIsAlreadyLockedError) as e:
|
||||||
|
ErrorHandlingService().handle_error(processor, e)
|
||||||
|
raise e
|
||||||
|
finally:
|
||||||
|
if ProcessInstanceLockService.has_lock(process_instance.id):
|
||||||
|
processor.unlock_process_instance("Web")
|
||||||
|
|
||||||
return Response(json.dumps({"ok": True}), status=200, mimetype="application/json")
|
return Response(json.dumps({"ok": True}), status=200, mimetype="application/json")
|
||||||
|
|
||||||
|
|
||||||
|
@ -1249,7 +1249,7 @@ class ProcessInstanceProcessor:
|
|||||||
self.add_step()
|
self.add_step()
|
||||||
self.save()
|
self.save()
|
||||||
# Saving the workflow seems to reset the status
|
# Saving the workflow seems to reset the status
|
||||||
self.suspend(self.process_instance_model)
|
self.suspend()
|
||||||
|
|
||||||
def reset_process(self, spiff_step: int) -> None:
|
def reset_process(self, spiff_step: int) -> None:
|
||||||
"""Reset a process to an earlier state."""
|
"""Reset a process to an earlier state."""
|
||||||
@ -1292,7 +1292,7 @@ class ProcessInstanceProcessor:
|
|||||||
db.session.delete(row)
|
db.session.delete(row)
|
||||||
|
|
||||||
self.save()
|
self.save()
|
||||||
self.suspend(self.process_instance_model)
|
self.suspend()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_parser() -> MyCustomParser:
|
def get_parser() -> MyCustomParser:
|
||||||
@ -1900,16 +1900,14 @@ class ProcessInstanceProcessor:
|
|||||||
db.session.add(self.process_instance_model)
|
db.session.add(self.process_instance_model)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
@classmethod
|
def suspend(self) -> None:
|
||||||
def suspend(cls, process_instance: ProcessInstanceModel) -> None:
|
|
||||||
"""Suspend."""
|
"""Suspend."""
|
||||||
process_instance.status = ProcessInstanceStatus.suspended.value
|
self.process_instance_model.status = ProcessInstanceStatus.suspended.value
|
||||||
db.session.add(process_instance)
|
db.session.add(self.process_instance_model)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
@classmethod
|
def resume(self) -> None:
|
||||||
def resume(cls, process_instance: ProcessInstanceModel) -> None:
|
|
||||||
"""Resume."""
|
"""Resume."""
|
||||||
process_instance.status = ProcessInstanceStatus.waiting.value
|
self.process_instance_model.status = ProcessInstanceStatus.waiting.value
|
||||||
db.session.add(process_instance)
|
db.session.add(self.process_instance_model)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
@ -25,6 +25,7 @@ from spiffworkflow_backend.models.process_instance_file_data import (
|
|||||||
from spiffworkflow_backend.models.process_model import ProcessModelInfo
|
from spiffworkflow_backend.models.process_model import ProcessModelInfo
|
||||||
from spiffworkflow_backend.models.task import Task
|
from spiffworkflow_backend.models.task import Task
|
||||||
from spiffworkflow_backend.models.user import UserModel
|
from spiffworkflow_backend.models.user import UserModel
|
||||||
|
from spiffworkflow_backend.services.assertion_service import safe_assertion
|
||||||
from spiffworkflow_backend.services.authorization_service import AuthorizationService
|
from spiffworkflow_backend.services.authorization_service import AuthorizationService
|
||||||
from spiffworkflow_backend.services.git_service import GitCommandError
|
from spiffworkflow_backend.services.git_service import GitCommandError
|
||||||
from spiffworkflow_backend.services.git_service import GitService
|
from spiffworkflow_backend.services.git_service import GitService
|
||||||
@ -95,6 +96,13 @@ class ProcessInstanceService:
|
|||||||
)
|
)
|
||||||
process_instance_lock_prefix = "Background"
|
process_instance_lock_prefix = "Background"
|
||||||
for process_instance in records:
|
for process_instance in records:
|
||||||
|
with safe_assertion(process_instance.status == status_value) as false_assumption:
|
||||||
|
if false_assumption:
|
||||||
|
raise AssertionError(
|
||||||
|
f"Queue assumed process instance {process_instance.id} has status of {status_value} "
|
||||||
|
f"when it really is {process_instance.status}"
|
||||||
|
)
|
||||||
|
|
||||||
locked = False
|
locked = False
|
||||||
processor = None
|
processor = None
|
||||||
try:
|
try:
|
||||||
|
@ -1418,7 +1418,7 @@ class TestProcessApi(BaseTest):
|
|||||||
)
|
)
|
||||||
processor.save()
|
processor.save()
|
||||||
|
|
||||||
processor.suspend(process_instance)
|
processor.suspend()
|
||||||
payload["description"] = "Message To Suspended"
|
payload["description"] = "Message To Suspended"
|
||||||
response = client.post(
|
response = client.post(
|
||||||
f"/v1.0/messages/{message_model_identifier}",
|
f"/v1.0/messages/{message_model_identifier}",
|
||||||
@ -1430,7 +1430,7 @@ class TestProcessApi(BaseTest):
|
|||||||
assert response.json
|
assert response.json
|
||||||
assert response.json["error_code"] == "message_not_accepted"
|
assert response.json["error_code"] == "message_not_accepted"
|
||||||
|
|
||||||
processor.resume(process_instance)
|
processor.resume()
|
||||||
payload["description"] = "Message To Resumed"
|
payload["description"] = "Message To Resumed"
|
||||||
response = client.post(
|
response = client.post(
|
||||||
f"/v1.0/messages/{message_model_identifier}",
|
f"/v1.0/messages/{message_model_identifier}",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user