]>
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',
33 '<h3>' + 'OSDs' + '</h3>',
34 '<table class="osds">',
36 '<td><i class="fa fa-fw good fa-circle"></i>',
39 '<td><i class="fa fa-fw warning fa-circle-o"></i>',
44 '<td><i class="fa fa-fw good fa-arrow-circle-up"></i>',
51 '<td><i class="fa fa-fw critical fa-arrow-circle-down"></i>',
62 '<tpl if="oldosds.length > 0">',
63 '<i class="fa fa-refresh warning"></i> ' + gettext('Outdated OSDs') + "<br>",
65 '<tpl for="oldosds">',
66 '<div class="left-aligned">osd.{id}:</div>',
67 '<div class="right-aligned">{version}</div><br />',
68 '<div style="clear:both"></div>',
96 renderer: function(tooltip
, record
, ctx
) {
97 var html
= record
.get('text');
99 record
.get('states').forEach(function(state
) {
101 state
.state_name
+ ': ' + state
.count
.toString();
103 tooltip
.setHtml(html
);
122 '<h3>' + 'PGs' + '</h3>',
123 '<tpl for="states">',
124 '<div class="left-aligned"><i class ="fa fa-circle {cls}"></i> {state_name}:</div>',
125 '<div class="right-aligned">{count}</div><br />',
126 '<div style="clear:both"></div>',
131 // similar to mgr dashboard
171 text
: gettext('Unknown'),
177 text
: gettext('Clean'),
181 text
: gettext('Working'),
185 text
: gettext('Error'),
190 updateAll: function(metadata
, status
) {
192 me
.suspendLayout
= true;
194 var maxversion
= "0";
195 Object
.values(metadata
.version
|| {}).forEach(function(version
) {
196 if (PVE
.Utils
.compare_ceph_versions(version
, maxversion
) > 0) {
197 maxversion
= version
;
204 metadata
.osd
.forEach(function(osd
) {
205 var version
= PVE
.Utils
.parse_ceph_version(osd
);
206 if (version
!= maxversion
) {
215 var pgmap
= status
.pgmap
|| {};
216 var health
= status
.health
|| {};
217 var osdmap
= status
.osdmap
|| {};
219 if (typeof osdmap
.osdmap
!= "undefined") {
220 osdmap
= osdmap
.osdmap
;
224 var pgs_by_state
= pgmap
.pgs_by_state
|| [];
225 pgs_by_state
.sort(function(a
,b
){
226 return (a
.state_name
< b
.state_name
)?-1:(a
.state_name
=== b
.state_name
)?0:1;
229 me
.statecategories
.forEach(function(cat
) {
234 pgs_by_state
.forEach(function(state
) {
236 var states
= state
.state_name
.split(/[^a-z]+/);
238 for (i
= 0; i
< states
.length
; i
++) {
239 if (me
.pgstates
[states
[i
]] > result
) {
240 result
= me
.pgstates
[states
[i
]];
244 state
.cls
= me
.statecategories
[result
].cls
;
246 me
.statecategories
[result
].count
+= state
.count
;
247 me
.statecategories
[result
].states
.push(state
);
250 me
.getComponent('pgchart').getStore().setData(me
.statecategories
);
251 me
.getComponent('pgs').update({states
: pgs_by_state
});
253 var downinregex
= /(\d+) osds down/;
256 // we collect monitor/osd information from the checks
257 Ext
.Object
.each(health
.checks
, function(key
, value
, obj
) {
259 if (key
=== 'OSD_DOWN') {
260 found
= value
.summary
.message
.match(downinregex
);
261 if (found
!== null) {
262 downin_osds
= parseInt(found
[1],10);
267 // update osds counts
269 // pre-octopus || octopus || 0
270 var total_osds
= osdmap
.num_osds
|| 0;
271 var in_osds
= osdmap
.num_in_osds
|| 0;
272 var up_osds
= osdmap
.num_up_osds
|| 0;
273 var out_osds
= total_osds
- in_osds
;
274 var down_osds
= total_osds
- up_osds
;
276 var downout_osds
= down_osds
- downin_osds
;
277 var upin_osds
= in_osds
- downin_osds
;
278 var upout_osds
= up_osds
- upin_osds
;
284 downout
: downout_osds
,
287 var osdcomponent
= me
.getComponent('osds');
288 osdcomponent
.update(Ext
.apply(osdcomponent
.data
, osds
));
290 me
.suspendLayout
= false;