summaryrefslogtreecommitdiffstats
path: root/src/pybind/mgr/dashboard/services/progress.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/pybind/mgr/dashboard/services/progress.py')
-rw-r--r--src/pybind/mgr/dashboard/services/progress.py92
1 files changed, 92 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..96272beff
--- /dev/null
+++ b/src/pybind/mgr/dashboard/services/progress.py
@@ -0,0 +1,92 @@
+# -*- 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
+'''
+
+from __future__ import absolute_import
+
+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