Refactoring exception hierarchy

* Clear separation for problems that can be handled so that the program
  can continue and problems that can't handled automatically due to major
  issues in configuration, environment or code itself
* Split YAQL exceptions into two types: grammar exception and evaluation
  exception
* General NotFoundException is replaced with more specific DBEntryNotFoundException
  for better consistency with other DB exceptions and more clear semantics
* Fixed corresponding tests

Change-Id: I07f495ab316b0f164caece78b1f101219199e68c
Implements: blueprint mistral-engine-error-handling
This commit is contained in:
Renat Akhmerov 2016-05-06 18:13:25 +07:00
parent fa9f46b542
commit 96e6d7e403
19 changed files with 175 additions and 114 deletions

View File

@ -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)
)

View File

@ -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"

View File

@ -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):

View File

@ -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",

View File

@ -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)

View File

@ -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())

View File

@ -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())

View File

@ -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)

View File

@ -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())

View File

@ -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)

View File

@ -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())

View File

@ -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())

View File

@ -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
)

View File

@ -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 %>'},

View File

@ -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)

View File

@ -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
)

View File

@ -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,)

View File

@ -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 <% * %>.')

View File

@ -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
)