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