]> git.proxmox.com Git - ceph.git/blame - ceph/src/pybind/mgr/dashboard/controllers/summary.py
import 15.2.0 Octopus source
[ceph.git] / ceph / src / pybind / mgr / dashboard / controllers / summary.py
CommitLineData
11fdf7f2
TL
1# -*- coding: utf-8 -*-
2from __future__ import absolute_import
3
4import json
5
6from . import ApiController, Endpoint, BaseController
7from .. import mgr
8from ..security import Permission, Scope
9from ..controllers.rbd_mirroring import get_daemons_and_pools
10from ..exceptions import ViewCacheNoDataException
11from ..tools import TaskManager
9f95a23c 12from ..services import progress
11fdf7f2
TL
13
14
15@ApiController('/summary')
16class Summary(BaseController):
17 def _health_status(self):
18 health_data = mgr.get("health")
19 return json.loads(health_data["json"])['status']
20
21 def _rbd_mirroring(self):
22 try:
23 _, data = get_daemons_and_pools()
24 except ViewCacheNoDataException:
25 return {}
26
27 daemons = data.get('daemons', [])
28 pools = data.get('pools', {})
29
30 warnings = 0
31 errors = 0
32 for daemon in daemons:
33 if daemon['health_color'] == 'error':
34 errors += 1
35 elif daemon['health_color'] == 'warning':
36 warnings += 1
37 for _, pool in pools.items():
38 if pool['health_color'] == 'error':
39 errors += 1
40 elif pool['health_color'] == 'warning':
41 warnings += 1
42 return {'warnings': warnings, 'errors': errors}
43
44 def _task_permissions(self, name):
45 result = True
46 if name == 'pool/create':
47 result = self._has_permissions(Permission.CREATE, Scope.POOL)
48 elif name == 'pool/edit':
49 result = self._has_permissions(Permission.UPDATE, Scope.POOL)
50 elif name == 'pool/delete':
51 result = self._has_permissions(Permission.DELETE, Scope.POOL)
52 elif name in [
53 'rbd/create', 'rbd/copy', 'rbd/snap/create',
54 'rbd/clone', 'rbd/trash/restore']:
55 result = self._has_permissions(Permission.CREATE, Scope.RBD_IMAGE)
56 elif name in [
57 'rbd/edit', 'rbd/snap/edit', 'rbd/flatten',
58 'rbd/snap/rollback']:
59 result = self._has_permissions(Permission.UPDATE, Scope.RBD_IMAGE)
60 elif name in [
61 'rbd/delete', 'rbd/snap/delete', 'rbd/trash/move',
62 'rbd/trash/remove', 'rbd/trash/purge']:
63 result = self._has_permissions(Permission.DELETE, Scope.RBD_IMAGE)
64 return result
65
66 def _get_host(self):
92f5a8d4
TL
67 # type: () -> str
68 services = mgr.get('mgr_map')['services']
69 return services['dashboard'] if 'dashboard' in services else ''
11fdf7f2
TL
70
71 @Endpoint()
72 def __call__(self):
73 exe_t, fin_t = TaskManager.list_serializable()
74 executing_tasks = [task for task in exe_t if self._task_permissions(task['name'])]
75 finished_tasks = [task for task in fin_t if self._task_permissions(task['name'])]
76
9f95a23c
TL
77 e, f = progress.get_progress_tasks()
78 executing_tasks.extend(e)
79 finished_tasks.extend(f)
80
81 executing_tasks.sort(key=lambda t: t['begin_time'], reverse=True)
82 finished_tasks.sort(key=lambda t: t['end_time'], reverse=True)
83
11fdf7f2
TL
84 result = {
85 'health_status': self._health_status(),
86 'mgr_id': mgr.get_mgr_id(),
87 'mgr_host': self._get_host(),
88 'have_mon_connection': mgr.have_mon_connection(),
89 'executing_tasks': executing_tasks,
90 'finished_tasks': finished_tasks,
91 'version': mgr.version
92 }
93 if self._has_permissions(Permission.READ, Scope.RBD_MIRRORING):
94 result['rbd_mirroring'] = self._rbd_mirroring()
95 return result