diff --git a/mistral/tests/resources/retry_task/delay_retry_task.yaml b/mistral/tests/resources/retry_task/delay_retry_task.yaml new file mode 100644 index 000000000..350dbd653 --- /dev/null +++ b/mistral/tests/resources/retry_task/delay_retry_task.yaml @@ -0,0 +1,20 @@ +Namespaces: + MyService: + actions: + some-action: + class: std.mistral_http + base-parameters: + url: http://path_to_service/action_url + method: GET + output: + output: $ + +Workflow: + tasks: + delay_retry_task: + action: MyService.some-action + retry: + count: 2 + delay: 0.1 + publish: + rt_output: output diff --git a/mistral/tests/resources/retry_task/retry_task.yaml b/mistral/tests/resources/retry_task/retry_task.yaml index 00cfe7bc3..0e248eb3f 100644 --- a/mistral/tests/resources/retry_task/retry_task.yaml +++ b/mistral/tests/resources/retry_task/retry_task.yaml @@ -8,12 +8,6 @@ Namespaces: method: GET output: output: $ - sync-action: - class: std.echo - base-parameters: - output: Cheers! - output: - greeting: $ Workflow: tasks: @@ -23,24 +17,3 @@ Workflow: count: 5 publish: rt_output: $.output - - delay_retry_task: - action: MyService.some-action - retry: - count: 2 - delay: 0.1 - publish: - rt_output: output - - no_retry_task: - action: MyService.some-action - publish: - n_rt_output: $.output - on-success: delay_retry_task - - sync_task: - action: MyService.sync-action - retry: - count: 5 - publish: - st_output: $.greeting \ No newline at end of file diff --git a/mistral/tests/resources/retry_task/sync_task.yaml b/mistral/tests/resources/retry_task/sync_task.yaml new file mode 100644 index 000000000..8ca213f3c --- /dev/null +++ b/mistral/tests/resources/retry_task/sync_task.yaml @@ -0,0 +1,18 @@ +Namespaces: + MyService: + actions: + sync-action: + class: std.echo + base-parameters: + output: Cheers! + output: + greeting: $ + +Workflow: + tasks: + sync-task: + action: MyService.sync-action + retry: + count: 5 + publish: + st_output: $.greeting \ No newline at end of file diff --git a/mistral/tests/resources/retry_task/two_tasks.yaml b/mistral/tests/resources/retry_task/two_tasks.yaml new file mode 100644 index 000000000..d82b72de8 --- /dev/null +++ b/mistral/tests/resources/retry_task/two_tasks.yaml @@ -0,0 +1,26 @@ +Namespaces: + MyService: + actions: + some-action: + class: std.mistral_http + base-parameters: + url: http://path_to_service/action_url + method: GET + output: + output: $ + +Workflow: + tasks: + no_retry_task: + action: MyService.some-action + publish: + n_rt_output: $.output + on-success: delay_retry_task + + delay_retry_task: + action: MyService.some-action + retry: + count: 2 + delay: 0.1 + publish: + rt_output: output diff --git a/mistral/tests/unit/engine/test_task_retry.py b/mistral/tests/unit/engine/test_task_retry.py index 1205e4a34..7d7d78ec7 100644 --- a/mistral/tests/unit/engine/test_task_retry.py +++ b/mistral/tests/unit/engine/test_task_retry.py @@ -67,16 +67,15 @@ class FailBeforeSuccessMocker(object): @mock.patch.object( concrete_engine.DefaultEngine, '_run_tasks', mock.MagicMock(side_effect=base.EngineTestCase.mock_run_tasks)) -@mock.patch.object( - db_api, 'workbook_get', - mock.MagicMock( - return_value={ - 'definition': base.get_resource('retry_task/retry_task.yaml')})) @mock.patch.object( std_actions.HTTPAction, 'run', mock.MagicMock(return_value='result')) class TaskRetryTest(base.EngineTestCase): + @mock.patch.object( + db_api, 'workbook_get', + mock.MagicMock(return_value={ + 'definition': base.get_resource('retry_task/retry_task.yaml')})) def test_no_retry(self): execution = self.engine.start_workflow_execution(WB_NAME, 'retry_task', None) @@ -90,6 +89,10 @@ class TaskRetryTest(base.EngineTestCase): self._assert_single_item(tasks, name='retry_task') self._assert_single_item(tasks, task_runtime_context=None) + @mock.patch.object( + db_api, 'workbook_get', + mock.MagicMock(return_value={ + 'definition': base.get_resource('retry_task/retry_task.yaml')})) def test_retry_always_error(self): workbook = _get_workbook(WB_NAME) @@ -112,6 +115,10 @@ class TaskRetryTest(base.EngineTestCase): 'retry_no': retry_count - 1}) self._assert_single_item(tasks, state=states.ERROR) + @mock.patch.object( + db_api, 'workbook_get', + mock.MagicMock(return_value={ + 'definition': base.get_resource('retry_task/retry_task.yaml')})) def test_retry_eventual_success(self): workbook = _get_workbook(WB_NAME) @@ -137,6 +144,10 @@ class TaskRetryTest(base.EngineTestCase): self._assert_single_item(tasks, task_runtime_context={ 'retry_no': retry_count / 2 - 1}) + @mock.patch.object( + db_api, 'workbook_get', + mock.MagicMock(return_value={'definition': base.get_resource( + 'retry_task/delay_retry_task.yaml')})) def test_retry_delay(self): task_name = 'delay_retry_task' workbook = _get_workbook(WB_NAME) @@ -174,6 +185,10 @@ class TaskRetryTest(base.EngineTestCase): 'retry_no': retry_count - 1}) self._assert_single_item(tasks, state=states.ERROR) + @mock.patch.object( + db_api, 'workbook_get', + mock.MagicMock(return_value={ + 'definition': base.get_resource('retry_task/two_tasks.yaml')})) def test_from_no_retry_to_retry_task(self): task_name_1 = 'no_retry_task' task_name_2 = 'delay_retry_task' @@ -225,27 +240,35 @@ class TaskRetryTest(base.EngineTestCase): @mock.patch.object(std_actions.EchoAction, "run", mock.MagicMock(side_effect=exc.ActionException)) + @mock.patch.object( + db_api, 'workbook_get', + mock.MagicMock(return_value={ + 'definition': base.get_resource('retry_task/sync_task.yaml')})) def test_sync_action_always_error(self): - task_name_1 = 'sync_task' workbook = _get_workbook(WB_NAME) - task_spec = workbook.tasks.get(task_name_1) + start_task = 'sync-task' + task_spec = workbook.tasks.get(start_task) retry_count, _, __ = task_spec.get_retry_parameters() execution = self.engine.start_workflow_execution(WB_NAME, - task_name_1, None) + start_task, None) # TODO(rakhmerov): It's not stable, need to avoid race condition. tasks = db_api.tasks_get(WB_NAME, execution['id']) - self._assert_single_item(tasks, name=task_name_1) + self._assert_single_item(tasks, name=start_task) self._assert_single_item(tasks, task_runtime_context={ 'retry_no': retry_count - 1}) self._assert_single_item(tasks, state=states.ERROR) + @mock.patch.object( + db_api, 'workbook_get', + mock.MagicMock(return_value={ + 'definition': base.get_resource('retry_task/sync_task.yaml')})) def test_sync_action_eventual_success(self): - task_name_1 = 'sync_task' + start_task = 'sync-task' workbook = _get_workbook(WB_NAME) - task_spec = workbook.tasks.get(task_name_1) + task_spec = workbook.tasks.get(start_task) retry_count, _, __ = task_spec.get_retry_parameters() # After a pre-set no of retries the mock method will return a @@ -255,12 +278,13 @@ class TaskRetryTest(base.EngineTestCase): with mock.patch.object(std_actions.EchoAction, "run", side_effect=mock_functor.mock_partial_failure): execution = self.engine.start_workflow_execution(WB_NAME, - task_name_1, None) + start_task, + None) # TODO(rakhmerov): It's not stable, need to avoid race condition. tasks = db_api.tasks_get(WB_NAME, execution['id']) - self._assert_single_item(tasks, name=task_name_1) + self._assert_single_item(tasks, name=start_task) self._assert_single_item(tasks, task_runtime_context={ 'retry_no': retry_count / 2}) self._assert_single_item(tasks, state=states.SUCCESS)