]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/ceph/StatusDetail.js
1 Ext
.define('PVE.ceph.StatusDetail', {
2 extend
: 'Ext.panel.Panel',
3 alias
: 'widget.pveCephStatusDetail',
14 'text-align': 'center',
35 '<table class="osds">',
37 '<td><i class="fa fa-fw good fa-circle"></i>',
40 '<td><i class="fa fa-fw warning fa-circle-o"></i>',
45 '<td><i class="fa fa-fw good fa-arrow-circle-up"></i>',
52 '<td><i class="fa fa-fw critical fa-arrow-circle-down"></i>',
63 '<tpl if="oldOSD.length > 0">',
64 '<i class="fa fa-refresh warning"></i> ' + gettext('Outdated OSDs') + "<br>",
67 '<div class="left-aligned">osd.{id}:</div>',
68 '<div class="right-aligned">{version}</div><br />',
69 '<div style="clear:both"></div>',
74 '<tpl if="ghostOSD.length > 0">',
76 `<i class="fa fa-question-circle warning"></i> ${gettext('Ghost OSDs')}<br>`,
77 `<div data-qtip="${gettext('OSDs with no metadata, possibly left over from removal')}" class="osds">`,
78 '<tpl for="ghostOSD">',
79 '<div class="left-aligned">osd.{id}</div>',
80 '<div style="clear:both"></div>',
108 renderer: function(tooltip
, record
, ctx
) {
109 var html
= record
.get('text');
111 record
.get('states').forEach(function(state
) {
113 state
.state_name
+ ': ' + state
.count
.toString();
115 tooltip
.setHtml(html
);
135 '<tpl for="states">',
136 '<div class="left-aligned"><i class ="fa fa-circle {cls}"></i> {state_name}:</div>',
137 '<div class="right-aligned">{count}</div><br />',
138 '<div style="clear:both"></div>',
143 // similar to mgr dashboard
183 text
: gettext('Unknown'),
189 text
: gettext('Clean'),
193 text
: gettext('Working'),
197 text
: gettext('Error'),
202 updateAll: function(metadata
, status
) {
204 me
.suspendLayout
= true;
206 let maxversion
= "0";
207 Object
.values(metadata
.node
|| {}).forEach(function(node
) {
208 if (PVE
.Utils
.compare_ceph_versions(node
?.version
?.parts
, maxversion
) > 0) {
209 maxversion
= node
.version
.parts
;
213 let oldOSD
= [], ghostOSD
= [];
214 metadata
.osd
?.forEach(osd
=> {
215 let version
= PVE
.Utils
.parse_ceph_version(osd
);
216 if (version
!== undefined) {
217 if (PVE
.Utils
.compare_ceph_versions(version
, maxversion
) !== 0) {
224 if (Object
.keys(osd
).length
> 1) {
225 console
.warn('got OSD entry with no valid version but other keys', osd
);
234 let pgmap
= status
.pgmap
|| {};
235 let pgs_by_state
= pgmap
.pgs_by_state
|| [];
236 pgs_by_state
.sort(function(a
, b
) {
237 return a
.state_name
< b
.state_name
?-1:a
.state_name
=== b
.state_name
?0:1;
240 me
.statecategories
.forEach(function(cat
) {
245 pgs_by_state
.forEach(function(state
) {
246 let states
= state
.state_name
.split(/[^a-z]+/);
248 for (let i
= 0; i
< states
.length
; i
++) {
249 if (me
.pgstates
[states
[i
]] > result
) {
250 result
= me
.pgstates
[states
[i
]];
254 state
.cls
= me
.statecategories
[result
].cls
;
256 me
.statecategories
[result
].count
+= state
.count
;
257 me
.statecategories
[result
].states
.push(state
);
260 me
.getComponent('pgchart').getStore().setData(me
.statecategories
);
261 me
.getComponent('pgs').update({ states
: pgs_by_state
});
263 let health
= status
.health
|| {};
264 // we collect monitor/osd information from the checks
265 const downinregex
= /(\d+) osds down/;
267 Ext
.Object
.each(health
.checks
, function(key
, value
, obj
) {
269 if (key
=== 'OSD_DOWN') {
270 found
= value
.summary
.message
.match(downinregex
);
271 if (found
!== null) {
272 downin_osds
= parseInt(found
[1], 10);
277 let osdmap
= status
.osdmap
|| {};
278 if (typeof osdmap
.osdmap
!== "undefined") {
279 osdmap
= osdmap
.osdmap
;
281 // update OSDs counts
282 let total_osds
= osdmap
.num_osds
|| 0;
283 let in_osds
= osdmap
.num_in_osds
|| 0;
284 let up_osds
= osdmap
.num_up_osds
|| 0;
285 let down_osds
= total_osds
- up_osds
;
287 let downout_osds
= down_osds
- downin_osds
;
288 let upin_osds
= in_osds
- downin_osds
;
289 let upout_osds
= up_osds
- upin_osds
;
296 downout
: downout_osds
,
300 let osdcomponent
= me
.getComponent('osds');
301 osdcomponent
.update(Ext
.apply(osdcomponent
.data
, osds
));
303 me
.suspendLayout
= false;