Merge "Catch DBEntityNotFoundError exceptions for invalid AdHoc Actions"
This commit is contained in:
commit
7a74b6d6fd
@ -361,9 +361,16 @@ class AdHocAction(PythonAction):
|
|||||||
wf_ctx=None):
|
wf_ctx=None):
|
||||||
self.action_spec = spec_parser.get_action_spec(action_def.spec)
|
self.action_spec = spec_parser.get_action_spec(action_def.spec)
|
||||||
|
|
||||||
|
try:
|
||||||
base_action_def = db_api.get_action_definition(
|
base_action_def = db_api.get_action_definition(
|
||||||
self.action_spec.get_base()
|
self.action_spec.get_base()
|
||||||
)
|
)
|
||||||
|
except exc.DBEntityNotFoundError:
|
||||||
|
raise exc.InvalidActionException(
|
||||||
|
"Failed to find action [action_name=%s]" %
|
||||||
|
self.action_spec.get_base()
|
||||||
|
)
|
||||||
|
|
||||||
base_action_def = self._gather_base_actions(
|
base_action_def = self._gather_base_actions(
|
||||||
action_def, base_action_def
|
action_def, base_action_def
|
||||||
)
|
)
|
||||||
@ -477,7 +484,12 @@ class AdHocAction(PythonAction):
|
|||||||
self.adhoc_action_defs.append(base)
|
self.adhoc_action_defs.append(base)
|
||||||
|
|
||||||
base_name = base.spec['base']
|
base_name = base.spec['base']
|
||||||
|
try:
|
||||||
base = db_api.get_action_definition(base_name)
|
base = db_api.get_action_definition(base_name)
|
||||||
|
except exc.DBEntityNotFoundError:
|
||||||
|
raise exc.InvalidActionException(
|
||||||
|
"Failed to find action [action_name=%s]" % base_name
|
||||||
|
)
|
||||||
|
|
||||||
# if the action is repeated
|
# if the action is repeated
|
||||||
if base.name in action_names:
|
if base.name in action_names:
|
||||||
|
@ -55,6 +55,16 @@ actions:
|
|||||||
output:
|
output:
|
||||||
nested_concat: '{{ _ }}'
|
nested_concat: '{{ _ }}'
|
||||||
|
|
||||||
|
missing_base:
|
||||||
|
base: wrong
|
||||||
|
input:
|
||||||
|
- some_input
|
||||||
|
|
||||||
|
nested_missing_base:
|
||||||
|
base: missing_base
|
||||||
|
input:
|
||||||
|
- some_input
|
||||||
|
|
||||||
workflows:
|
workflows:
|
||||||
wf1:
|
wf1:
|
||||||
type: direct
|
type: direct
|
||||||
@ -118,6 +128,32 @@ workflows:
|
|||||||
action: nested_concat
|
action: nested_concat
|
||||||
publish:
|
publish:
|
||||||
nested_result: '{{ task().result }}'
|
nested_result: '{{ task().result }}'
|
||||||
|
|
||||||
|
wf6:
|
||||||
|
type: direct
|
||||||
|
output:
|
||||||
|
workflow_result: '{{ _.missing_result }}'
|
||||||
|
tasks:
|
||||||
|
missing_action:
|
||||||
|
action: missing_base
|
||||||
|
on-complete:
|
||||||
|
- next_action
|
||||||
|
next_action:
|
||||||
|
publish:
|
||||||
|
missing_result: 'Finished'
|
||||||
|
|
||||||
|
wf7:
|
||||||
|
type: direct
|
||||||
|
output:
|
||||||
|
workflow_result: '{{ _.missing_result }}'
|
||||||
|
tasks:
|
||||||
|
nested_missing_action:
|
||||||
|
action: nested_missing_base
|
||||||
|
on-complete:
|
||||||
|
- next_action
|
||||||
|
next_action:
|
||||||
|
publish:
|
||||||
|
missing_result: 'Finished'
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
@ -205,3 +241,32 @@ class AdhocActionsTest(base.EngineTestCase):
|
|||||||
},
|
},
|
||||||
wf_ex.output
|
wf_ex.output
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_missing_adhoc_action_definition(self):
|
||||||
|
wf_ex = self.engine.start_workflow(
|
||||||
|
'my_wb.wf6', '')
|
||||||
|
self.await_workflow_error(wf_ex.id)
|
||||||
|
with db_api.transaction():
|
||||||
|
# Note: We need to reread execution to access related tasks.
|
||||||
|
wf_ex = db_api.get_workflow_execution(wf_ex.id)
|
||||||
|
|
||||||
|
tasks = wf_ex.task_executions
|
||||||
|
|
||||||
|
task1 = self._assert_single_item(tasks, name='missing_action')
|
||||||
|
|
||||||
|
self.assertEqual(states.ERROR, task1.state)
|
||||||
|
|
||||||
|
def test_nested_missing_adhoc_action_definition(self):
|
||||||
|
wf_ex = self.engine.start_workflow(
|
||||||
|
'my_wb.wf7', '')
|
||||||
|
self.await_workflow_error(wf_ex.id)
|
||||||
|
with db_api.transaction():
|
||||||
|
# Note: We need to reread execution to access related tasks.
|
||||||
|
wf_ex = db_api.get_workflow_execution(wf_ex.id)
|
||||||
|
|
||||||
|
tasks = wf_ex.task_executions
|
||||||
|
|
||||||
|
task1 = self._assert_single_item(tasks,
|
||||||
|
name='nested_missing_action')
|
||||||
|
|
||||||
|
self.assertEqual(states.ERROR, task1.state)
|
||||||
|
@ -72,6 +72,11 @@ class RunActionEngineTest(base.EngineTestCase):
|
|||||||
input:
|
input:
|
||||||
- some_input
|
- some_input
|
||||||
|
|
||||||
|
nested_missing_base:
|
||||||
|
base: missing_base
|
||||||
|
input:
|
||||||
|
- some_input
|
||||||
|
|
||||||
loop_action:
|
loop_action:
|
||||||
base: loop_action
|
base: loop_action
|
||||||
base-input:
|
base-input:
|
||||||
@ -235,12 +240,21 @@ class RunActionEngineTest(base.EngineTestCase):
|
|||||||
def test_run_action_with_missing_base(self):
|
def test_run_action_with_missing_base(self):
|
||||||
# Start action and see the result.
|
# Start action and see the result.
|
||||||
self.assertRaises(
|
self.assertRaises(
|
||||||
exc.DBEntityNotFoundError,
|
exc.InvalidActionException,
|
||||||
self.engine.start_action,
|
self.engine.start_action,
|
||||||
'missing_base',
|
'missing_base',
|
||||||
{'some_input': 'Hi'}
|
{'some_input': 'Hi'}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_run_action_with_missing_nested_base(self):
|
||||||
|
# Start action and see the result.
|
||||||
|
self.assertRaises(
|
||||||
|
exc.InvalidActionException,
|
||||||
|
self.engine.start_action,
|
||||||
|
'nested_missing_base',
|
||||||
|
{'some_input': 'Hi'}
|
||||||
|
)
|
||||||
|
|
||||||
def test_run_loop_action(self):
|
def test_run_loop_action(self):
|
||||||
# Start action and see the result.
|
# Start action and see the result.
|
||||||
self.assertRaises(
|
self.assertRaises(
|
||||||
|
Loading…
Reference in New Issue
Block a user