diff options
Diffstat (limited to '')
-rw-r--r-- | src/pybind/mgr/dashboard/services/progress.py | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/src/pybind/mgr/dashboard/services/progress.py b/src/pybind/mgr/dashboard/services/progress.py new file mode 100644 index 000000000..d1afefbac --- /dev/null +++ b/src/pybind/mgr/dashboard/services/progress.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +''' +Progress Mgr Module Helper + +This python module implements helper methods to retrieve the +executing and completed tasks tacked by the progress mgr module +using the same structure of dashboard tasks +''' + + +import logging +from datetime import datetime + +from .. import mgr +from . import rbd # pylint: disable=no-name-in-module + +logger = logging.getLogger('progress') + + +def _progress_event_to_dashboard_task_common(event, task): + if event['refs'] and isinstance(event['refs'], dict): + refs = event['refs'] + if refs['origin'] == "rbd_support": + # rbd mgr module event, we can transform this event into an rbd dashboard task + action_map = { + 'remove': "delete", + 'flatten': "flatten", + 'trash remove': "trash/remove" + } + action = action_map.get(refs['action'], refs['action']) + metadata = {} + if 'image_name' in refs: + metadata['image_spec'] = rbd.get_image_spec(refs['pool_name'], + refs['pool_namespace'], + refs['image_name']) + else: + metadata['image_id_spec'] = rbd.get_image_spec(refs['pool_name'], + refs['pool_namespace'], + refs['image_id']) + task.update({ + 'name': "rbd/{}".format(action), + 'metadata': metadata, + 'begin_time': "{}Z".format(datetime.fromtimestamp(event["started_at"]) + .isoformat()), + }) + return + + task.update({ + # we're prepending the "progress/" prefix to tag tasks that come + # from the progress module + 'name': "progress/{}".format(event['message']), + 'metadata': dict(event.get('refs', {})), + 'begin_time': "{}Z".format(datetime.fromtimestamp(event["started_at"]) + .isoformat()), + }) + + +def _progress_event_to_dashboard_task(event, completed=False): + task = {} + _progress_event_to_dashboard_task_common(event, task) + if not completed: + task.update({ + 'progress': int(100 * event['progress']) + }) + else: + task.update({ + 'end_time': "{}Z".format(datetime.fromtimestamp(event['finished_at']) + .isoformat()), + 'duration': event['finished_at'] - event['started_at'], + 'progress': 100, + 'success': 'failed' not in event, + 'ret_value': None, + 'exception': {'detail': event['failure_message']} if 'failed' in event else None + }) + return task + + +def get_progress_tasks(): + executing_t = [] + finished_t = [] + progress_events = mgr.remote('progress', "_json") + + for ev in progress_events['events']: + logger.debug("event=%s", ev) + executing_t.append(_progress_event_to_dashboard_task(ev)) + + for ev in progress_events['completed']: + logger.debug("finished event=%s", ev) + finished_t.append(_progress_event_to_dashboard_task(ev, True)) + + return executing_t, finished_t |