]>
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>',
109 renderer: function(tooltip
, record
, ctx
) {
110 var html
= record
.get('text');
112 record
.get('states').forEach(function(state
) {
114 state
.state_name
+ ': ' + state
.count
.toString();
116 tooltip
.setHtml(html
);
136 '<tpl for="states">',
137 '<div class="left-aligned"><i class ="fa fa-circle {cls}"></i> {state_name}:</div>',
138 '<div class="right-aligned">{count}</div><br />',
139 '<div style="clear:both"></div>',
144 // similar to mgr dashboard
186 text
: gettext('Unknown'),
192 text
: gettext('Clean'),
196 text
: gettext('Busy'),
197 cls
: 'pve-ceph-status-busy',
200 text
: gettext('Warning'),
204 text
: gettext('Critical'),
209 checkThemeColors: function() {
211 let rootStyle
= getComputedStyle(document
.documentElement
);
214 let background
= rootStyle
.getPropertyValue("--pwt-panel-background").trim() || "#ffffff";
217 me
.chart
.setBackground(background
);
221 updateAll: function(metadata
, status
) {
223 me
.suspendLayout
= true;
225 let maxversion
= "0";
226 Object
.values(metadata
.node
|| {}).forEach(function(node
) {
227 if (PVE
.Utils
.compare_ceph_versions(node
?.version
?.parts
, maxversion
) > 0) {
228 maxversion
= node
.version
.parts
;
232 let oldOSD
= [], ghostOSD
= [];
233 metadata
.osd
?.forEach(osd
=> {
234 let version
= PVE
.Utils
.parse_ceph_version(osd
);
235 if (version
!== undefined) {
236 if (PVE
.Utils
.compare_ceph_versions(version
, maxversion
) !== 0) {
243 if (Object
.keys(osd
).length
> 1) {
244 console
.warn('got OSD entry with no valid version but other keys', osd
);
253 let pgmap
= status
.pgmap
|| {};
254 let pgs_by_state
= pgmap
.pgs_by_state
|| [];
255 pgs_by_state
.sort(function(a
, b
) {
256 return a
.state_name
< b
.state_name
?-1:a
.state_name
=== b
.state_name
?0:1;
259 me
.statecategories
.forEach(function(cat
) {
264 pgs_by_state
.forEach(function(state
) {
265 let states
= state
.state_name
.split(/[^a-z]+/);
267 for (let i
= 0; i
< states
.length
; i
++) {
268 if (me
.pgstates
[states
[i
]] > result
) {
269 result
= me
.pgstates
[states
[i
]];
273 state
.cls
= me
.statecategories
[result
].cls
;
275 me
.statecategories
[result
].count
+= state
.count
;
276 me
.statecategories
[result
].states
.push(state
);
279 me
.chart
.getStore().setData(me
.statecategories
);
280 me
.getComponent('pgs').update({ states
: pgs_by_state
});
282 let health
= status
.health
|| {};
283 // we collect monitor/osd information from the checks
284 const downinregex
= /(\d+) osds down/;
286 Ext
.Object
.each(health
.checks
, function(key
, value
, obj
) {
288 if (key
=== 'OSD_DOWN') {
289 found
= value
.summary
.message
.match(downinregex
);
290 if (found
!== null) {
291 downin_osds
= parseInt(found
[1], 10);
296 let osdmap
= status
.osdmap
|| {};
297 if (typeof osdmap
.osdmap
!== "undefined") {
298 osdmap
= osdmap
.osdmap
;
300 // update OSDs counts
301 let total_osds
= osdmap
.num_osds
|| 0;
302 let in_osds
= osdmap
.num_in_osds
|| 0;
303 let up_osds
= osdmap
.num_up_osds
|| 0;
304 let down_osds
= total_osds
- up_osds
;
306 let downout_osds
= down_osds
- downin_osds
;
307 let upin_osds
= in_osds
- downin_osds
;
308 let upout_osds
= up_osds
- upin_osds
;
315 downout
: downout_osds
,
319 let osdcomponent
= me
.getComponent('osds');
320 osdcomponent
.update(Ext
.apply(osdcomponent
.data
, osds
));
322 me
.suspendLayout
= false;
326 initComponent: function() {
330 me
.chart
= me
.getComponent('pgchart');
331 me
.checkThemeColors();
333 // switch colors on media query changes
334 me
.mediaQueryList
= window
.matchMedia("(prefers-color-scheme: dark)");
335 me
.themeListener
= (e
) => { me
.checkThemeColors(); };
336 me
.mediaQueryList
.addEventListener("change", me
.themeListener
);
339 doDestroy: function() {
342 me
.mediaQueryList
.removeEventListener("change", me
.themeListener
);