]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | # -*- coding: utf-8 -*- |
2 | from __future__ import absolute_import | |
3 | ||
4 | import json | |
5 | ||
6 | from . import ApiController, Endpoint, BaseController | |
7 | from .. import mgr | |
8 | from ..security import Permission, Scope | |
9 | from ..controllers.rbd_mirroring import get_daemons_and_pools | |
10 | from ..exceptions import ViewCacheNoDataException | |
11 | from ..tools import TaskManager | |
9f95a23c | 12 | from ..services import progress |
11fdf7f2 TL |
13 | |
14 | ||
15 | @ApiController('/summary') | |
16 | class 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 |