added support statistics only for report execution API

-added statistics-only option for `execution-get-report`
  command, which will only return statistics of an execution.

 -modified "print_statistics":
  *in case of statistics-only,there is no need to print execution
   tree.
  *print a new field "estimated time".

Implements: blueprint mistral-executions-report-return-statistics-only
Depends-on: I7038d6d2a48f9f0455545f6be8dce33a48b25e1c
Change-Id: I77f9120ea1f1d4469772f67be334921fe4f7862f
Signed-off-by: ali <ali.abdelal@nokia.com>
This commit is contained in:
ali
2020-05-03 13:21:54 +00:00
committed by Renat Akhmerov
parent fed6cd7716
commit 72a72eb31c
4 changed files with 43 additions and 11 deletions
mistralclient
api
commands
tests

@ -124,7 +124,8 @@ class ExecutionManager(base.ResourceManager):
self._delete('/executions/%s%s' % (id, query_string)) self._delete('/executions/%s%s' % (id, query_string))
def get_report(self, id, errors_only=True, max_depth=None): def get_report(self, id, errors_only=True, max_depth=None,
statistics_only=False):
self._ensure_not_empty(id=id) self._ensure_not_empty(id=id)
query_params = {} query_params = {}
@ -132,6 +133,9 @@ class ExecutionManager(base.ResourceManager):
if errors_only: if errors_only:
query_params['errors_only'] = True query_params['errors_only'] = True
if statistics_only:
query_params['statistics_only'] = True
if max_depth is not None: if max_depth is not None:
query_params['max_depth'] = max_depth query_params['max_depth'] = max_depth

@ -361,6 +361,12 @@ class GetReport(command.Command):
action='store_true', action='store_true',
help='Only error paths will be included.' help='Only error paths will be included.'
) )
parser.add_argument(
'--statistics-only',
dest='statistics_only',
action='store_true',
help='Only the statistics will be included.'
)
parser.add_argument( parser.add_argument(
'--no-errors-only', '--no-errors-only',
dest='errors_only', dest='errors_only',
@ -459,6 +465,12 @@ class GetReport(command.Command):
stat['paused_tasks_count'] stat['paused_tasks_count']
) )
if 'estimated_time' in stat:
self.print_line(
'Estimated time (seconds) for the execution to finish:'' %s\n'
% stat['estimated_time']
)
def print_report(self, report_json): def print_report(self, report_json):
self.print_line( self.print_line(
"\nTo get more details on a task failure " "\nTo get more details on a task failure "
@ -473,14 +485,15 @@ class GetReport(command.Command):
) )
self.print_statistics(report_json['statistics']) self.print_statistics(report_json['statistics'])
self.print_line( if 'root_workflow_execution' in report_json:
'%s Workflow Execution Tree %s\n' % self.print_line(
(frame_line, frame_line) '%s Workflow Execution Tree %s\n' %
) (frame_line, frame_line)
self.print_workflow_execution_entry( )
report_json['root_workflow_execution'], self.print_workflow_execution_entry(
0 report_json['root_workflow_execution'],
) 0
)
def take_action(self, parsed_args): def take_action(self, parsed_args):
mistral_client = self.app.client_manager.workflow_engine mistral_client = self.app.client_manager.workflow_engine
@ -488,7 +501,8 @@ class GetReport(command.Command):
report_json = mistral_client.executions.get_report( report_json = mistral_client.executions.get_report(
parsed_args.id, parsed_args.id,
errors_only=parsed_args.errors_only, errors_only=parsed_args.errors_only,
max_depth=parsed_args.max_depth max_depth=parsed_args.max_depth,
statistics_only=parsed_args.statistics_only,
) )
self.print_report(report_json) self.print_report(report_json)

@ -272,7 +272,7 @@ class WorkflowCLITests(base_v2.MistralClientTestBase):
for wf_name in wf_names: for wf_name in wf_names:
self.mistral_admin( self.mistral_admin(
'workflow-delete', 'workflow-delete',
params=wf_name+' --namespace abcdef' params=wf_name + ' --namespace abcdef'
) )
wfs = self.mistral_admin('workflow-list') wfs = self.mistral_admin('workflow-list')

@ -279,6 +279,20 @@ class TestExecutionsV2(base.BaseClientV2Test):
self.executions.delete(EXEC['id']) self.executions.delete(EXEC['id'])
def test_report_statistics_only(self):
url = self.TEST_URL + URL_TEMPLATE_ID % EXEC['id'] \
+ '/report?statistics_only=True'
expected_json = {
'statistics': {}
}
self.requests_mock.get(url, json=expected_json)
report = self.executions.get_report(EXEC['id'], statistics_only=True)
self.assertDictEqual(expected_json, report)
def test_report(self): def test_report(self):
url = self.TEST_URL + URL_TEMPLATE_ID % EXEC['id'] + '/report' url = self.TEST_URL + URL_TEMPLATE_ID % EXEC['id'] + '/report'