]>
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',
10 bodyPadding
: '0 5 20',
26 html
: '<h3>' + gettext('Monitors') + '</h3>'
40 '<h3>' + gettext('OSDs') + '</h3>',
41 '<table class="osds">',
43 '<td><i class="fa fa-fw good fa-circle"></i>',
46 '<td><i class="fa fa-fw warning fa-circle-o"></i>',
51 '<td><i class="fa fa-fw good fa-arrow-circle-up"></i>',
58 '<td><i class="fa fa-fw critical fa-arrow-circle-down"></i>',
79 '<h3>' + gettext('PGs') + '</h3>',
81 '<div class="left-aligned">{state_name}:</div>',
82 '<div class="right-aligned">{count}</div><br />',
83 '<div style="clear:both"></div>',
88 updateAll: function(health
, monmap
, pgmap
, osdmap
, quorum_names
) {
90 me
.suspendLayout
= true;
93 var pgs_by_state
= pgmap
.pgs_by_state
|| [];
94 pgs_by_state
.sort(function(a
,b
){
95 return (a
.state_name
< b
.state_name
)?-1:(a
.state_name
=== b
.state_name
)?0:1;
97 me
.getComponent('pgs').update({states
: pgs_by_state
});
99 var downinregex
= /(\d+) osds down/;
100 var monnameregex
= /^mon.(\S+) /;
104 // we collect monitor/osd information from the checks
105 Ext
.Object
.each(health
.checks
, function(key
, value
, obj
) {
107 if (key
=== 'OSD_DOWN') {
108 found
= value
.summary
.message
.match(downinregex
);
109 if (found
!== null) {
110 downin_osds
= parseInt(found
[1],10);
113 else if (Ext
.String
.startsWith(key
, 'MON_')) {
117 found
= value
.detail
[0].message
.match(monnameregex
);
118 if (found
!== null) {
119 if (!monmsgs
[found
[1]]) {
120 monmsgs
[found
[1]] = [];
122 monmsgs
[found
[1]].push({
123 text
: Ext
.Array
.reduce(value
.detail
, function(first
, second
) {
124 return first
+ '\n' + second
.message
;
126 severity
: value
.severity
132 // update osds counts
134 var total_osds
= osdmap
.osdmap
.num_osds
|| 0;
135 var in_osds
= osdmap
.osdmap
.num_in_osds
|| 0;
136 var up_osds
= osdmap
.osdmap
.num_up_osds
|| 0;
137 var out_osds
= total_osds
- in_osds
;
138 var down_osds
= total_osds
- up_osds
;
140 var downout_osds
= down_osds
- downin_osds
;
141 var upin_osds
= in_osds
- downin_osds
;
142 var upout_osds
= up_osds
- upin_osds
;
148 downout
: downout_osds
150 me
.getComponent('osds').update(osds
);
152 // update the monitors
153 var mons
= monmap
.mons
.sort(function(a
,b
) {
154 return (a
.name
< b
.name
)?-1:(a
.name
> b
.name
)?1:0;
157 var monContainer
= me
.getComponent('monitors');
160 for (i
= 0; i
< mons
.length
; i
++) {
161 var monitor
= monContainer
.getComponent('mon.' + mons
[i
].name
);
163 // since mons are already sorted, and
164 // we always have a sorted list
165 // we can add it at the mons+1 position (because of the title)
166 monitor
= monContainer
.insert(i
+1, {
167 xtype
: 'pveCephMonitorWidget',
168 itemId
: 'mon.' + mons
[i
].name
171 monitor
.updateMonitor(mons
[i
], monmsgs
, quorum_names
);
173 me
.suspendLayout
= false;
178 Ext
.define('PVE.ceph.MonitorWidget', {
179 extend
: 'Ext.Component',
180 alias
: 'widget.pveCephMonitorWidget',
182 userCls
: 'monitor inline-block',
185 health
: 'HEALTH_ERR',
187 iconCls
: PVE
.Utils
.get_health_icon(),
193 '<i class="fa fa-fw {iconCls}"></i>'
196 // expects 3 variables which are
197 // timestate: the status from timechecks.mons
198 // data: the monmap.mons data
199 // quorum_names: the quorum_names array
200 updateMonitor: function(data
, monmsgs
, quorum_names
) {
202 var state
= 'HEALTH_ERR';
211 quorum_names
.indexOf(data
.name
) !== -1) {
215 if (monmsgs
[data
.name
]) {
216 Ext
.Array
.forEach(monmsgs
[data
.name
], function(msg
) {
217 if (healthstates
[msg
.severity
] < healthstates
[state
]) {
218 state
= msg
.severity
;
221 text
+= msg
.text
+ "\n";
225 me
.update(Ext
.apply(me
.data
, {
230 iconCls
: PVE
.Utils
.get_health_icon(PVE
.Utils
.map_ceph_health
[state
])
237 fn: function(events
, element
) {
238 var me
= this.component
;
243 me
.tooltip
= Ext
.create('Ext.tip.ToolTip', {
246 renderTo
: Ext
.getBody(),
247 html
: gettext('Monitor') + ': ' + me
.data
.name
+ '<br />' +
248 gettext('Address') + ': ' + me
.data
.addr
+ '<br />' +
249 gettext('Health') + ': ' + me
.data
.health
+ '<br />' +
258 fn: function(events
, element
) {
259 var me
= this.component
;
261 me
.tooltip
.destroy();