]> git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/services/progress.py
import ceph 15.2.10
[ceph.git] / ceph / src / pybind / mgr / dashboard / services / progress.py
1 # -*- coding: utf-8 -*-
2 '''
3 Progress Mgr Module Helper
4
5 This python module implements helper methods to retrieve the
6 executing and completed tasks tacked by the progress mgr module
7 using the same structure of dashboard tasks
8 '''
9
10 from __future__ import absolute_import
11
12 from datetime import datetime
13 import logging
14
15 from . import rbd
16 from .. import mgr
17
18
19 logger = logging.getLogger('progress')
20
21
22 def _progress_event_to_dashboard_task_common(event, task):
23 if event['refs'] and isinstance(event['refs'], dict):
24 refs = event['refs']
25 if refs['origin'] == "rbd_support":
26 # rbd mgr module event, we can transform this event into an rbd dashboard task
27 action_map = {
28 'remove': "delete",
29 'flatten': "flatten",
30 'trash remove': "trash/remove"
31 }
32 action = action_map.get(refs['action'], refs['action'])
33 metadata = {}
34 if 'image_name' in refs:
35 metadata['image_spec'] = rbd.get_image_spec(refs['pool_name'],
36 refs['pool_namespace'],
37 refs['image_name'])
38 else:
39 metadata['image_id_spec'] = rbd.get_image_spec(refs['pool_name'],
40 refs['pool_namespace'],
41 refs['image_id'])
42 task.update({
43 'name': "rbd/{}".format(action),
44 'metadata': metadata,
45 'begin_time': "{}Z".format(datetime.fromtimestamp(event["started_at"])
46 .isoformat()),
47 })
48 return
49
50 task.update({
51 # we're prepending the "progress/" prefix to tag tasks that come
52 # from the progress module
53 'name': "progress/{}".format(event['message']),
54 'metadata': dict(event.get('refs', {})),
55 'begin_time': "{}Z".format(datetime.fromtimestamp(event["started_at"])
56 .isoformat()),
57 })
58
59
60 def _progress_event_to_dashboard_task(event, completed=False):
61 task = {}
62 _progress_event_to_dashboard_task_common(event, task)
63 if not completed:
64 task.update({
65 'progress': int(100 * event['progress'])
66 })
67 else:
68 task.update({
69 'end_time': "{}Z".format(datetime.fromtimestamp(event['finished_at'])
70 .isoformat()),
71 'duration': event['finished_at'] - event['started_at'],
72 'progress': 100,
73 'success': 'failed' not in event,
74 'ret_value': None,
75 'exception': {'detail': event['failure_message']} if 'failed' in event else None
76 })
77 return task
78
79
80 def get_progress_tasks():
81 executing_t = []
82 finished_t = []
83 progress_events = mgr.remote('progress', "_json")
84
85 for ev in progress_events['events']:
86 logger.debug("event=%s", ev)
87 executing_t.append(_progress_event_to_dashboard_task(ev))
88
89 for ev in progress_events['completed']:
90 logger.debug("finished event=%s", ev)
91 finished_t.append(_progress_event_to_dashboard_task(ev, True))
92
93 return executing_t, finished_t