]>
git.proxmox.com Git - ceph.git/blob - ceph/src/pybind/mgr/dashboard/controllers/summary.py
1 # -*- coding: utf-8 -*-
2 from __future__
import absolute_import
7 from ..controllers
.rbd_mirroring
import get_daemons_and_pools
8 from ..exceptions
import ViewCacheNoDataException
9 from ..security
import Permission
, Scope
10 from ..services
import progress
11 from ..tools
import TaskManager
12 from . import APIDoc
, APIRouter
, BaseController
, Endpoint
, EndpointDoc
15 "health_status": (str, ""),
17 "mgr_host": (str, ""),
18 "have_mon_connection": (str, ""),
19 "executing_tasks": ([str], ""),
25 "begin_time": (str, ""),
26 "end_time": (str, ""),
27 "duration": (int, ""),
28 "progress": (int, ""),
29 "success": (bool, ""),
30 "ret_value": (str, ""),
31 "exception": (str, ""),
35 "warnings": (int, ""),
41 @APIRouter('/summary')
42 @APIDoc("Get Ceph Summary Details", "Summary")
43 class Summary(BaseController
):
44 def _health_status(self
):
45 health_data
= mgr
.get("health")
46 return json
.loads(health_data
["json"])['status']
48 def _rbd_mirroring(self
):
50 _
, data
= get_daemons_and_pools()
51 except ViewCacheNoDataException
: # pragma: no cover
52 return {} # pragma: no cover
54 daemons
= data
.get('daemons', [])
55 pools
= data
.get('pools', {})
59 for daemon
in daemons
:
60 if daemon
['health_color'] == 'error': # pragma: no cover
62 elif daemon
['health_color'] == 'warning': # pragma: no cover
64 for _
, pool
in pools
.items():
65 if pool
['health_color'] == 'error': # pragma: no cover
67 elif pool
['health_color'] == 'warning': # pragma: no cover
69 return {'warnings': warnings
, 'errors': errors
}
71 def _task_permissions(self
, name
): # pragma: no cover
73 if name
== 'pool/create':
74 result
= self
._has
_permissions
(Permission
.CREATE
, Scope
.POOL
)
75 elif name
== 'pool/edit':
76 result
= self
._has
_permissions
(Permission
.UPDATE
, Scope
.POOL
)
77 elif name
== 'pool/delete':
78 result
= self
._has
_permissions
(Permission
.DELETE
, Scope
.POOL
)
80 'rbd/create', 'rbd/copy', 'rbd/snap/create',
81 'rbd/clone', 'rbd/trash/restore']:
82 result
= self
._has
_permissions
(Permission
.CREATE
, Scope
.RBD_IMAGE
)
84 'rbd/edit', 'rbd/snap/edit', 'rbd/flatten',
86 result
= self
._has
_permissions
(Permission
.UPDATE
, Scope
.RBD_IMAGE
)
88 'rbd/delete', 'rbd/snap/delete', 'rbd/trash/move',
89 'rbd/trash/remove', 'rbd/trash/purge']:
90 result
= self
._has
_permissions
(Permission
.DELETE
, Scope
.RBD_IMAGE
)
95 services
= mgr
.get('mgr_map')['services']
96 return services
['dashboard'] if 'dashboard' in services
else ''
99 @EndpointDoc("Display Summary",
100 responses
={200: SUMMARY_SCHEMA
})
102 exe_t
, fin_t
= TaskManager
.list_serializable()
103 executing_tasks
= [task
for task
in exe_t
if self
._task
_permissions
(task
['name'])]
104 finished_tasks
= [task
for task
in fin_t
if self
._task
_permissions
(task
['name'])]
106 e
, f
= progress
.get_progress_tasks()
107 executing_tasks
.extend(e
)
108 finished_tasks
.extend(f
)
110 executing_tasks
.sort(key
=lambda t
: t
['begin_time'], reverse
=True)
111 finished_tasks
.sort(key
=lambda t
: t
['end_time'], reverse
=True)
114 'health_status': self
._health
_status
(),
115 'mgr_id': mgr
.get_mgr_id(),
116 'mgr_host': self
._get
_host
(),
117 'have_mon_connection': mgr
.have_mon_connection(),
118 'executing_tasks': executing_tasks
,
119 'finished_tasks': finished_tasks
,
120 'version': mgr
.version
122 if self
._has
_permissions
(Permission
.READ
, Scope
.RBD_MIRRORING
):
123 result
['rbd_mirroring'] = self
._rbd
_mirroring
()