diff --git a/mistral/db/v2/sqlalchemy/api.py b/mistral/db/v2/sqlalchemy/api.py index b9bb4f15..e08097d3 100644 --- a/mistral/db/v2/sqlalchemy/api.py +++ b/mistral/db/v2/sqlalchemy/api.py @@ -183,8 +183,9 @@ def get_workbook(name): wb = _get_workbook(name) if not wb: - raise exc.NotFoundException( - "Workbook not found [workbook_name=%s]" % name) + raise exc.DBEntityNotFoundException( + "Workbook not found [workbook_name=%s]" % name + ) return wb @@ -218,8 +219,9 @@ def update_workbook(name, values, session=None): wb = _get_workbook(name) if not wb: - raise exc.NotFoundException( - "Workbook not found [workbook_name=%s]" % name) + raise exc.DBEntityNotFoundException( + "Workbook not found [workbook_name=%s]" % name + ) wb.update(values.copy()) @@ -239,8 +241,9 @@ def delete_workbook(name, session=None): wb = _get_workbook(name) if not wb: - raise exc.NotFoundException( - "Workbook not found [workbook_name=%s]" % name) + raise exc.DBEntityNotFoundException( + "Workbook not found [workbook_name=%s]" % name + ) session.delete(wb) @@ -281,7 +284,7 @@ def get_workflow_definition(identifier): else _get_workflow_definition(identifier)) if not wf_def: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "Workflow not found [workflow_identifier=%s]" % identifier ) @@ -292,7 +295,7 @@ def get_workflow_definition_by_id(id): wf_def = _get_workflow_definition_by_id(id) if not wf_def: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "Workflow not found [workflow_id=%s]" % id ) @@ -363,7 +366,7 @@ def update_workflow_definition(identifier, values, session=None): try: [get_cron_trigger(name) for name in cron_triggers] - except exc.NotFoundException: + except exc.DBEntityNotFoundException: raise exc.NotAllowedException( "Can not update scope of workflow that has triggers " "associated in other tenants." @@ -446,7 +449,7 @@ def get_action_definition_by_id(id): action_def = _get_db_object_by_id(models.ActionDefinition, id) if not action_def: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "Action not found [action_id=%s]" % id ) @@ -457,7 +460,7 @@ def get_action_definition(name): a_def = _get_action_definition(name) if not a_def: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "Action definition not found [action_name=%s]" % name ) @@ -509,8 +512,9 @@ def update_action_definition(name, values, session=None): a_def = _get_action_definition(name) if not a_def: - raise exc.NotFoundException( - "Action definition not found [action_name=%s]" % name) + raise exc.DBEntityNotFoundException( + "Action definition not found [action_name=%s]" % name + ) a_def.update(values.copy()) @@ -530,7 +534,7 @@ def delete_action_definition(name, session=None): a_def = _get_action_definition(name) if not a_def: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "Action definition not found [action_name=%s]" % name ) @@ -552,7 +556,7 @@ def get_execution(id): ex = _get_execution(id) if not ex: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "Execution not found [execution_id=%s]" % id ) @@ -592,7 +596,7 @@ def update_execution(id, values, session=None): ex = _get_execution(id) if not ex: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "Execution not found [execution_id=%s]" % id ) @@ -614,8 +618,9 @@ def delete_execution(id, session=None): ex = _get_execution(id) if not ex: - raise exc.NotFoundException( - "Execution not found [execution_id=%s]" % id) + raise exc.DBEntityNotFoundException( + "Execution not found [execution_id=%s]" % id + ) session.delete(ex) @@ -639,8 +644,9 @@ def get_action_execution(id): a_ex = _get_action_execution(id) if not a_ex: - raise exc.NotFoundException( - "ActionExecution not found [id=%s]" % id) + raise exc.DBEntityNotFoundException( + "ActionExecution not found [id=%s]" % id + ) return a_ex @@ -678,7 +684,7 @@ def update_action_execution(id, values, session=None): a_ex = _get_action_execution(id) if not a_ex: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "ActionExecution not found [id=%s]" % id ) @@ -700,7 +706,7 @@ def delete_action_execution(id, session=None): a_ex = _get_action_execution(id) if not a_ex: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "ActionExecution not found [id=%s]" % id ) @@ -726,7 +732,9 @@ def get_workflow_execution(id): wf_ex = _get_workflow_execution(id) if not wf_ex: - raise exc.NotFoundException("WorkflowExecution not found [id=%s]" % id) + raise exc.DBEntityNotFoundException( + "WorkflowExecution not found [id=%s]" % id + ) return wf_ex @@ -780,7 +788,9 @@ def update_workflow_execution(id, values, session=None): wf_ex = _get_workflow_execution(id) if not wf_ex: - raise exc.NotFoundException("WorkflowExecution not found [id=%s]" % id) + raise exc.DBEntityNotFoundException( + "WorkflowExecution not found [id=%s]" % id + ) wf_ex.update(values.copy()) @@ -800,7 +810,9 @@ def delete_workflow_execution(id, session=None): wf_ex = _get_workflow_execution(id) if not wf_ex: - raise exc.NotFoundException("WorkflowExecution not found [id=%s]" % id) + raise exc.DBEntityNotFoundException( + "WorkflowExecution not found [id=%s]" % id + ) session.delete(wf_ex) @@ -820,7 +832,9 @@ def get_task_execution(id): task_ex = _get_task_execution(id) if not task_ex: - raise exc.NotFoundException("Task execution not found [id=%s]" % id) + raise exc.DBEntityNotFoundException( + "Task execution not found [id=%s]" % id + ) return task_ex @@ -854,7 +868,9 @@ def update_task_execution(id, values, session=None): task_ex = _get_task_execution(id) if not task_ex: - raise exc.NotFoundException("TaskExecution not found [id=%s]" % id) + raise exc.DBEntityNotFoundException( + "TaskExecution not found [id=%s]" % id + ) task_ex.update(values.copy()) @@ -874,7 +890,9 @@ def delete_task_execution(id, session=None): task_ex = _get_task_execution(id) if not task_ex: - raise exc.NotFoundException("TaskExecution not found [id=%s]" % id) + raise exc.DBEntityNotFoundException( + "TaskExecution not found [id=%s]" % id + ) session.delete(task_ex) @@ -914,7 +932,7 @@ def delete_delayed_call(id, session=None): delayed_call = _get_delayed_call(id) if not delayed_call: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "DelayedCall not found [id=%s]" % id ) @@ -964,7 +982,9 @@ def get_delayed_call(id, session=None): delayed_call = _get_delayed_call(id=id, session=session) if not delayed_call: - raise exc.NotFoundException("Delayed Call not found [id=%s]" % id) + raise exc.DBEntityNotFoundException( + "Delayed Call not found [id=%s]" % id + ) return delayed_call @@ -1000,8 +1020,9 @@ def get_cron_trigger(name): cron_trigger = _get_cron_trigger(name) if not cron_trigger: - raise exc.NotFoundException( - "Cron trigger not found [name=%s]" % name) + raise exc.DBEntityNotFoundException( + "Cron trigger not found [name=%s]" % name + ) return cron_trigger @@ -1052,7 +1073,9 @@ def update_cron_trigger(name, values, session=None, query_filter=None): cron_trigger = _get_cron_trigger(name) if not cron_trigger: - raise exc.NotFoundException("Cron trigger not found [name=%s]" % name) + raise exc.DBEntityNotFoundException( + "Cron trigger not found [name=%s]" % name + ) if query_filter: try: @@ -1099,7 +1122,9 @@ def delete_cron_trigger(name, session=None): cron_trigger = _get_cron_trigger(name) if not cron_trigger: - raise exc.NotFoundException("Cron trigger not found [name=%s]" % name) + raise exc.DBEntityNotFoundException( + "Cron trigger not found [name=%s]" % name + ) # Delete the cron trigger by ID and get the affected row count. table = models.CronTrigger.__table__ @@ -1131,7 +1156,9 @@ def get_environment(name): env = _get_environment(name) if not env: - raise exc.NotFoundException("Environment not found [name=%s]" % name) + raise exc.DBEntityNotFoundException( + "Environment not found [name=%s]" % name + ) return env @@ -1165,7 +1192,9 @@ def update_environment(name, values, session=None): env = _get_environment(name) if not env: - raise exc.NotFoundException("Environment not found [name=%s]" % name) + raise exc.DBEntityNotFoundException( + "Environment not found [name=%s]" % name + ) env.update(values) @@ -1187,7 +1216,9 @@ def delete_environment(name, session=None): env = _get_environment(name) if not env: - raise exc.NotFoundException("Environment not found [name=%s]" % name) + raise exc.DBEntityNotFoundException( + "Environment not found [name=%s]" % name + ) session.delete(env) @@ -1268,7 +1299,7 @@ def get_resource_member(resource_id, res_type, member_id): ).first() if not res_member: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "Resource member not found [resource_id=%s, member_id=%s]" % (resource_id, member_id) ) @@ -1298,7 +1329,7 @@ def update_resource_member(resource_id, res_type, member_id, values, # Only member who is not the owner of the resource can update the # membership status. if member_id != security.get_project_id(): - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "Resource member not found [resource_id=%s, member_id=%s]" % (resource_id, member_id) ) @@ -1312,7 +1343,7 @@ def update_resource_member(resource_id, res_type, member_id, values, ).first() if not res_member: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "Resource member not found [resource_id=%s, member_id=%s]" % (resource_id, member_id) ) @@ -1331,7 +1362,7 @@ def delete_resource_member(resource_id, res_type, member_id, session=None): res_member = query.filter(_get_criterion(resource_id, member_id)).first() if not res_member: - raise exc.NotFoundException( + raise exc.DBEntityNotFoundException( "Resource member not found [resource_id=%s, member_id=%s]" % (resource_id, member_id) ) diff --git a/mistral/exceptions.py b/mistral/exceptions.py index f5d2710c..57550c24 100644 --- a/mistral/exceptions.py +++ b/mistral/exceptions.py @@ -14,16 +14,34 @@ # limitations under the License. -class Error(Exception): +class MistralError(Exception): + """Mistral specific error. + + Reserved for situations that can't automatically handled. When it occurs + it signals that there is a major environmental problem like invalid startup + configuration or implementation problem (e.g. some code doesn't take care + of certain corner cases). From architectural perspective it's pointless to + try to handle this type of problems except doing some finalization work + like transaction rollback, deleting temporary files etc. + """ def __init__(self, message=None): - super(Error, self).__init__(message) + super(MistralError, self).__init__(message) -class MistralException(Error): - """Base Exception for the project +class MistralException(Exception): + """Mistral specific exception. - To correctly use this class, inherit from it and define - a 'message' and 'http_code' properties. + Reserved for situations that are not critical for program continuation. + It is possible to recover from this type of problems automatically and + continue program execution. Such problems may be related with invalid user + input (such as invalid syntax) or temporary environmental problems. + + In case if an instance of a certain exception type bubbles up to API layer + then this type of exception it must be associated with an http code so it's + clear how to represent it for a client. + + To correctly use this class, inherit from it and define a 'message' and + 'http_code' properties. """ message = "An unknown exception occurred" http_code = 500 @@ -42,29 +60,55 @@ class MistralException(Error): def __init__(self, message=None): if message is not None: self.message = message + super(MistralException, self).__init__( '%d: %s' % (self.http_code, self.message)) +# Database exceptions. + class DBException(MistralException): http_code = 400 -class DataAccessException(MistralException): - http_code = 400 - - -class NotFoundException(MistralException): - http_code = 404 - message = "Object not found" - - -class DBDuplicateEntryException(MistralException): +class DBDuplicateEntryException(DBException): http_code = 409 message = "Database object already exists" -class DBQueryEntryException(MistralException): +class DBQueryEntryException(DBException): + http_code = 400 + + +class DBEntityNotFoundException(DBException): + http_code = 404 + message = "Object not found" + + +# DSL exceptions. + +class DSLParsingException(MistralException): + http_code = 400 + + +class YaqlGrammarException(DSLParsingException): + http_code = 400 + message = "Invalid grammar of YAQL expression" + + +class InvalidModelException(DSLParsingException): + http_code = 400 + message = "Wrong entity definition" + + +# Various common exceptions. + +class YaqlEvaluationException(MistralException): + http_code = 400 + message = "Can not evaluate YAQL expression" + + +class DataAccessException(MistralException): http_code = 400 @@ -97,20 +141,6 @@ class ApplicationContextNotFoundException(MistralException): message = "Application context not found" -class DSLParsingException(MistralException): - http_code = 400 - - -class YaqlEvaluationException(DSLParsingException): - http_code = 400 - message = "Can not evaluate YAQL expression" - - -class InvalidModelException(DSLParsingException): - http_code = 400 - message = "Wrong entity definition" - - class InvalidResultException(MistralException): http_code = 400 message = "Unable to parse result" diff --git a/mistral/expressions.py b/mistral/expressions.py index 61b1e32a..48d1f81f 100644 --- a/mistral/expressions.py +++ b/mistral/expressions.py @@ -78,7 +78,7 @@ class YAQLEvaluator(Evaluator): try: YAQL_ENGINE(expression) except (yaql_exc.YaqlException, KeyError, ValueError, TypeError) as e: - raise exc.YaqlEvaluationException(getattr(e, 'message', e)) + raise exc.YaqlGrammarException(getattr(e, 'message', e)) @classmethod def evaluate(cls, expression, data_context): diff --git a/mistral/services/periodic.py b/mistral/services/periodic.py index f87c819c..8334ed27 100644 --- a/mistral/services/periodic.py +++ b/mistral/services/periodic.py @@ -108,7 +108,7 @@ def advance_cron_trigger(t): 'next_execution_time': t.next_execution_time } ) - except exc.NotFoundException as e: + except exc.DBEntityNotFoundException as e: # Cron trigger was probably already deleted by a different process. LOG.debug( "Cron trigger named '%s' does not exist anymore: %s", diff --git a/mistral/tests/unit/api/v2/test_action_executions.py b/mistral/tests/unit/api/v2/test_action_executions.py index c85cde0e..79e9bdac 100644 --- a/mistral/tests/unit/api/v2/test_action_executions.py +++ b/mistral/tests/unit/api/v2/test_action_executions.py @@ -116,7 +116,7 @@ MOCK_ACTION_NOT_COMPLETE = mock.MagicMock( MOCK_AD_HOC_ACTION = mock.MagicMock(return_value=AD_HOC_ACTION_EX_DB) MOCK_ACTIONS = mock.MagicMock(return_value=[ACTION_EX_DB]) MOCK_EMPTY = mock.MagicMock(return_value=[]) -MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.NotFoundException()) +MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.DBEntityNotFoundException()) MOCK_DELETE = mock.MagicMock(return_value=None) diff --git a/mistral/tests/unit/api/v2/test_actions.py b/mistral/tests/unit/api/v2/test_actions.py index 4900ea98..cefaccc6 100644 --- a/mistral/tests/unit/api/v2/test_actions.py +++ b/mistral/tests/unit/api/v2/test_actions.py @@ -90,7 +90,7 @@ MOCK_ACTIONS = mock.MagicMock(return_value=[ACTION_DB]) MOCK_UPDATED_ACTION = mock.MagicMock(return_value=UPDATED_ACTION_DB) MOCK_DELETE = mock.MagicMock(return_value=None) MOCK_EMPTY = mock.MagicMock(return_value=[]) -MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.NotFoundException()) +MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.DBEntityNotFoundException()) MOCK_DUPLICATE = mock.MagicMock(side_effect=exc.DBDuplicateEntryException()) diff --git a/mistral/tests/unit/api/v2/test_cron_triggers.py b/mistral/tests/unit/api/v2/test_cron_triggers.py index d121aaf2..a2f71102 100644 --- a/mistral/tests/unit/api/v2/test_cron_triggers.py +++ b/mistral/tests/unit/api/v2/test_cron_triggers.py @@ -63,7 +63,7 @@ MOCK_TRIGGER = mock.MagicMock(return_value=TRIGGER_DB) MOCK_TRIGGERS = mock.MagicMock(return_value=[TRIGGER_DB]) MOCK_DELETE = mock.MagicMock(return_value=None) MOCK_EMPTY = mock.MagicMock(return_value=[]) -MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.NotFoundException()) +MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.DBEntityNotFoundException()) MOCK_DUPLICATE = mock.MagicMock(side_effect=exc.DBDuplicateEntryException()) diff --git a/mistral/tests/unit/api/v2/test_environment.py b/mistral/tests/unit/api/v2/test_environment.py index def0f0bf..77c11dd3 100644 --- a/mistral/tests/unit/api/v2/test_environment.py +++ b/mistral/tests/unit/api/v2/test_environment.py @@ -107,7 +107,7 @@ MOCK_ENVIRONMENT = mock.MagicMock(return_value=ENVIRONMENT_DB) MOCK_ENVIRONMENTS = mock.MagicMock(return_value=[ENVIRONMENT_DB]) MOCK_UPDATED_ENVIRONMENT = mock.MagicMock(return_value=UPDATED_ENVIRONMENT_DB) MOCK_EMPTY = mock.MagicMock(return_value=[]) -MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.NotFoundException()) +MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.DBEntityNotFoundException()) MOCK_DUPLICATE = mock.MagicMock(side_effect=exc.DBDuplicateEntryException()) MOCK_DELETE = mock.MagicMock(return_value=None) diff --git a/mistral/tests/unit/api/v2/test_executions.py b/mistral/tests/unit/api/v2/test_executions.py index cbce5d25..c9510d64 100644 --- a/mistral/tests/unit/api/v2/test_executions.py +++ b/mistral/tests/unit/api/v2/test_executions.py @@ -111,7 +111,7 @@ MOCK_WF_EXECUTIONS = mock.MagicMock(return_value=[WF_EX]) MOCK_UPDATED_WF_EX = mock.MagicMock(return_value=UPDATED_WF_EX) MOCK_DELETE = mock.MagicMock(return_value=None) MOCK_EMPTY = mock.MagicMock(return_value=[]) -MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.NotFoundException()) +MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.DBEntityNotFoundException()) MOCK_ACTION_EXC = mock.MagicMock(side_effect=exc.ActionException()) diff --git a/mistral/tests/unit/api/v2/test_tasks.py b/mistral/tests/unit/api/v2/test_tasks.py index e8d5bc6a..623e3c52 100644 --- a/mistral/tests/unit/api/v2/test_tasks.py +++ b/mistral/tests/unit/api/v2/test_tasks.py @@ -127,7 +127,7 @@ MOCK_WF_EX = mock.MagicMock(return_value=WF_EX) MOCK_TASK = mock.MagicMock(return_value=TASK_EX) MOCK_TASKS = mock.MagicMock(return_value=[TASK_EX]) MOCK_EMPTY = mock.MagicMock(return_value=[]) -MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.NotFoundException()) +MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.DBEntityNotFoundException()) MOCK_ERROR_TASK = mock.MagicMock(return_value=ERROR_TASK_EX) MOCK_ERROR_ITEMS_TASK = mock.MagicMock(return_value=ERROR_ITEMS_TASK_EX) diff --git a/mistral/tests/unit/api/v2/test_workbooks.py b/mistral/tests/unit/api/v2/test_workbooks.py index f2dc4fc4..80b07900 100644 --- a/mistral/tests/unit/api/v2/test_workbooks.py +++ b/mistral/tests/unit/api/v2/test_workbooks.py @@ -97,7 +97,7 @@ MOCK_WORKBOOKS = mock.MagicMock(return_value=[WORKBOOK_DB]) MOCK_UPDATED_WORKBOOK = mock.MagicMock(return_value=UPDATED_WORKBOOK_DB) MOCK_DELETE = mock.MagicMock(return_value=None) MOCK_EMPTY = mock.MagicMock(return_value=[]) -MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.NotFoundException()) +MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.DBEntityNotFoundException()) MOCK_DUPLICATE = mock.MagicMock(side_effect=exc.DBDuplicateEntryException()) diff --git a/mistral/tests/unit/api/v2/test_workflows.py b/mistral/tests/unit/api/v2/test_workflows.py index a5837cbb..43aa336e 100644 --- a/mistral/tests/unit/api/v2/test_workflows.py +++ b/mistral/tests/unit/api/v2/test_workflows.py @@ -160,7 +160,7 @@ MOCK_WFS = mock.MagicMock(return_value=[WF_DB]) MOCK_UPDATED_WF = mock.MagicMock(return_value=UPDATED_WF_DB) MOCK_DELETE = mock.MagicMock(return_value=None) MOCK_EMPTY = mock.MagicMock(return_value=[]) -MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.NotFoundException()) +MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.DBEntityNotFoundException()) MOCK_DUPLICATE = mock.MagicMock(side_effect=exc.DBDuplicateEntryException()) diff --git a/mistral/tests/unit/db/v2/test_sqlalchemy_db_api.py b/mistral/tests/unit/db/v2/test_sqlalchemy_db_api.py index 004c5b7b..7777fc5a 100644 --- a/mistral/tests/unit/db/v2/test_sqlalchemy_db_api.py +++ b/mistral/tests/unit/db/v2/test_sqlalchemy_db_api.py @@ -153,7 +153,7 @@ class WorkbookTest(SQLAlchemyTest): db_api.delete_workbook(created.name) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_workbook, created.name ) @@ -424,7 +424,7 @@ class WorkflowDefinitionTest(SQLAlchemyTest): db_api.delete_workflow_definition(identifier) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_workflow_definition, identifier ) @@ -606,7 +606,7 @@ class ActionDefinitionTest(SQLAlchemyTest): db_api.delete_action_definition(created.name) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_action_definition, created.name ) @@ -726,7 +726,7 @@ class ActionExecutionTest(SQLAlchemyTest): db_api.delete_action_execution(created.id) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_action_execution, created.id ) @@ -738,7 +738,7 @@ class ActionExecutionTest(SQLAlchemyTest): auth_context.set_ctx(test_base.get_context(default=False)) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.delete_action_execution, created.id ) @@ -880,7 +880,7 @@ class WorkflowExecutionTest(SQLAlchemyTest): db_api.delete_workflow_execution(created.id) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_workflow_execution, created.id ) @@ -1130,7 +1130,7 @@ class TaskExecutionTest(SQLAlchemyTest): db_api.delete_task_execution(created.id) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_task_execution, created.id ) @@ -1302,7 +1302,7 @@ class CronTriggerTest(SQLAlchemyTest): self.assertEqual(1, rowcount) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_cron_trigger, created.name ) @@ -1432,7 +1432,7 @@ class EnvironmentTest(SQLAlchemyTest): db_api.delete_environment(created.name) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_environment, created.name ) @@ -1462,7 +1462,7 @@ class TXTest(SQLAlchemyTest): self.assertFalse(self.is_db_session_open()) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_workbook, created['id'] ) @@ -1525,12 +1525,12 @@ class TXTest(SQLAlchemyTest): self.assertFalse(self.is_db_session_open()) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_workflow_execution, created.id ) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_workbook, created_wb.name ) @@ -1553,7 +1553,7 @@ class TXTest(SQLAlchemyTest): self.assertFalse(self.is_db_session_open()) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_workbook, created.name ) @@ -1633,7 +1633,7 @@ class ResourceMemberTest(SQLAlchemyTest): # Tenant A can not see membership of resource shared to Tenant B. self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_resource_member, '123e4567-e89b-12d3-a456-426655440000', 'workflow', @@ -1695,7 +1695,7 @@ class ResourceMemberTest(SQLAlchemyTest): created = db_api.create_resource_member(RESOURCE_MEMBERS[0]) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.update_resource_member, created.resource_id, 'workflow', @@ -1726,7 +1726,7 @@ class ResourceMemberTest(SQLAlchemyTest): auth_context.set_ctx(user_context) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.delete_resource_member, created.resource_id, 'workflow', @@ -1743,7 +1743,7 @@ class ResourceMemberTest(SQLAlchemyTest): ) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.delete_resource_member, created.resource_id, 'workflow', @@ -1752,7 +1752,7 @@ class ResourceMemberTest(SQLAlchemyTest): def test_delete_nonexistent_resource_member(self): self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.delete_resource_member, 'nonexitent_resource', 'workflow', @@ -1768,7 +1768,7 @@ class WorkflowSharingTest(SQLAlchemyTest): auth_context.set_ctx(user_context) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_workflow_definition, wf.id ) @@ -1836,7 +1836,7 @@ class WorkflowSharingTest(SQLAlchemyTest): auth_context.set_ctx(user_context) self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, db_api.get_workflow_definition, wf.id ) diff --git a/mistral/tests/unit/engine/test_default_engine.py b/mistral/tests/unit/engine/test_default_engine.py index 2cf15ea5..7ee9d568 100644 --- a/mistral/tests/unit/engine/test_default_engine.py +++ b/mistral/tests/unit/engine/test_default_engine.py @@ -89,7 +89,7 @@ ENVIRONMENT_DB = models.Environment( ) MOCK_ENVIRONMENT = mock.MagicMock(return_value=ENVIRONMENT_DB) -MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.NotFoundException()) +MOCK_NOT_FOUND = mock.MagicMock(side_effect=exc.DBEntityNotFoundException()) class DefaultEngineTest(base.DbTestCase): @@ -233,7 +233,7 @@ class DefaultEngineTest(base.DbTestCase): @mock.patch.object(db_api, "get_environment", MOCK_NOT_FOUND) def test_start_workflow_env_not_found(self): - self.assertRaises(exc.NotFoundException, + self.assertRaises(exc.DBEntityNotFoundException, self.engine.start_workflow, 'wb.wf', {'param1': '<% env().key1 %>'}, diff --git a/mistral/tests/unit/services/test_scheduler.py b/mistral/tests/unit/services/test_scheduler.py index af33cd16..f08ea363 100644 --- a/mistral/tests/unit/services/test_scheduler.py +++ b/mistral/tests/unit/services/test_scheduler.py @@ -289,7 +289,7 @@ class SchedulerServiceTest(base.DbTestCase): eventlet.sleep(WAIT) - self.assertRaises(exc.NotFoundException, + self.assertRaises(exc.DBEntityNotFoundException, db_api.get_delayed_call, calls[0].id ) @@ -336,7 +336,7 @@ class SchedulerServiceTest(base.DbTestCase): eventlet.sleep(WAIT) # If the scheduler does handel calls that failed on update - # NotFoundException will raise. + # DBEntityNotFoundException will raise. db_api.get_delayed_call(calls[0].id) db_api.delete_delayed_call(calls[0].id) diff --git a/mistral/tests/unit/services/test_workflow_service.py b/mistral/tests/unit/services/test_workflow_service.py index 5c6812cd..225069e3 100644 --- a/mistral/tests/unit/services/test_workflow_service.py +++ b/mistral/tests/unit/services/test_workflow_service.py @@ -165,7 +165,7 @@ class WorkflowServiceTest(base.DbTestCase): def test_update_non_existing_workflow_failed(self): exception = self.assertRaises( - exc.NotFoundException, + exc.DBEntityNotFoundException, wf_service.update_workflows, WORKFLOW ) diff --git a/mistral/tests/unit/test_exception_base.py b/mistral/tests/unit/test_exception_base.py index 73d008ed..07160354 100644 --- a/mistral/tests/unit/test_exception_base.py +++ b/mistral/tests/unit/test_exception_base.py @@ -24,13 +24,13 @@ class ExceptionTestCase(base.BaseTest): """Test cases for exception code.""" def test_nf_with_message(self): - exc = exceptions.NotFoundException('check_for_this') + exc = exceptions.DBEntityNotFoundException('check_for_this') self.assertIn('check_for_this', six.text_type(exc)) self.assertEqual(404, exc.http_code) def test_nf_with_no_message(self): - exc = exceptions.NotFoundException() + exc = exceptions.DBEntityNotFoundException() self.assertIn("Object not found", six.text_type(exc)) self.assertEqual(404, exc.http_code,) diff --git a/mistral/tests/unit/test_expressions.py b/mistral/tests/unit/test_expressions.py index eafb1784..761e37c6 100644 --- a/mistral/tests/unit/test_expressions.py +++ b/mistral/tests/unit/test_expressions.py @@ -99,15 +99,15 @@ class YaqlEvaluatorTest(base.BaseTest): self._evaluator.validate('$.a1 * $.a2') def test_validate_failed(self): - self.assertRaises(exc.YaqlEvaluationException, + self.assertRaises(exc.YaqlGrammarException, self._evaluator.validate, '*') - self.assertRaises(exc.YaqlEvaluationException, + self.assertRaises(exc.YaqlGrammarException, self._evaluator.validate, [1, 2, 3]) - self.assertRaises(exc.YaqlEvaluationException, + self.assertRaises(exc.YaqlGrammarException, self._evaluator.validate, {'a': 1}) @@ -184,7 +184,7 @@ class InlineYAQLEvaluatorTest(base.BaseTest): self._evaluator.validate('The value is <% $.a1 %>.') def test_validate_failed(self): - self.assertRaises(exc.YaqlEvaluationException, + self.assertRaises(exc.YaqlGrammarException, self._evaluator.validate, 'The value is <% * %>.') diff --git a/mistral/workflow/base.py b/mistral/workflow/base.py index ee1b9fe6..23a0e117 100644 --- a/mistral/workflow/base.py +++ b/mistral/workflow/base.py @@ -53,7 +53,7 @@ def get_controller(wf_ex, wf_spec=None): break if not ctrl_cls: - raise exc.NotFoundException( + raise exc.MistralError( 'Failed to find a workflow controller [type=%s]' % wf_type )