]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/ceph/Status.js
1 Ext
.define('PVE.node.CephStatus', {
2 extend
: 'Ext.panel.Panel',
3 alias
: 'widget.pveNodeCephStatus',
5 onlineHelp
: 'chapter_pveceph',
22 title
: gettext('Health'),
24 plugins
: 'responsive',
41 itemId
: 'overallhealth',
42 xtype
: 'pveHealthWidget',
43 title
: gettext('Status')
49 stateId
: 'ceph-status-warnings',
51 // since we load the store manually,
52 // to show the emptytext, we have to
53 // specify an empty store
55 emptyText
: gettext('No Warnings/Errors'),
58 dataIndex
: 'severity',
59 header
: gettext('Severity'),
62 renderer: function(value
) {
63 var health
= PVE
.Utils
.map_ceph_health
[value
];
64 var classes
= PVE
.Utils
.get_health_icon(health
);
66 return '<i class="fa fa-fw ' + classes
+ '"></i>';
69 sorterFn: function(a
,b
) {
70 var healthArr
= ['HEALTH_ERR', 'HEALTH_WARN', 'HEALTH_OK'];
71 return healthArr
.indexOf(b
.data
.severity
) - healthArr
.indexOf(a
.data
.severity
);
77 header
: gettext('Summary'),
81 xtype
: 'actioncolumn',
84 tooltip
: gettext('Detail'),
87 iconCls
: 'x-fa fa-info-circle',
88 handler: function(grid
, rowindex
, colindex
, item
, e
, record
) {
89 var win
= Ext
.create('Ext.window.Window', {
90 title
: gettext('Detail'),
103 '<span>' + Ext
.htmlEncode(record
.data
.summary
) + '</span>',
104 '<pre>' + Ext
.htmlEncode(record
.data
.detail
) + '</pre>'
118 xtype
: 'pveCephStatusDetail',
119 itemId
: 'statusdetail',
120 plugins
: 'responsive',
129 title
: gettext('Status')
133 title
: gettext('Performance'),
143 xtype
: 'proxmoxGauge',
145 title
: gettext('Usage')
157 xtype
: 'pveRunningChart',
158 title
: gettext('Reads'),
159 renderer
: PVE
.Utils
.render_bandwidth
163 xtype
: 'pveRunningChart',
164 title
: gettext('Writes'),
165 renderer
: PVE
.Utils
.render_bandwidth
169 xtype
: 'pveRunningChart',
171 title
: 'IOPS', // do not localize
172 renderer
: Ext
.util
.Format
.numberRenderer('0,000')
176 xtype
: 'pveRunningChart',
178 title
: 'IOPS: ' + gettext('Reads'),
179 renderer
: Ext
.util
.Format
.numberRenderer('0,000')
183 xtype
: 'pveRunningChart',
185 title
: 'IOPS: ' + gettext('Writes'),
186 renderer
: Ext
.util
.Format
.numberRenderer('0,000')
194 generateCheckData: function(health
) {
196 var checks
= health
.checks
|| {};
197 var keys
= Ext
.Object
.getKeys(checks
).sort();
199 Ext
.Array
.forEach(keys
, function(key
) {
200 var details
= checks
[key
].detail
|| [];
203 summary
: checks
[key
].summary
.message
,
204 detail
: Ext
.Array
.reduce(
206 function(first
, second
) {
207 return first
+ '\n' + second
.message
;
211 severity
: checks
[key
].severity
218 updateAll: function(store
, records
, success
) {
219 if (!success
|| records
.length
=== 0) {
224 var rec
= records
[0];
227 me
.down('#overallhealth').updateHealth(PVE
.Utils
.render_ceph_health(rec
.data
.health
|| {}));
228 // add errors to gridstore
229 me
.down('#warnings').getStore().loadRawData(me
.generateCheckData(rec
.data
.health
|| {}), false);
231 // update detailstatus panel
232 me
.getComponent('statusdetail').updateAll(
233 rec
.data
.health
|| {},
234 rec
.data
.monmap
|| {},
235 rec
.data
.pgmap
|| {},
236 rec
.data
.osdmap
|| {},
237 rec
.data
.quorum_names
|| []);
239 // add performance data
240 var used
= rec
.data
.pgmap
.bytes_used
;
241 var total
= rec
.data
.pgmap
.bytes_total
;
243 var text
= Ext
.String
.format(gettext('{0} of {1}'),
244 PVE
.Utils
.render_size(used
),
245 PVE
.Utils
.render_size(total
)
248 // update the usage widget
249 me
.down('#space').updateValue(used
/total
, text
);
251 // TODO: logic for jewel (iops splitted in read/write)
253 var iops
= rec
.data
.pgmap
.op_per_sec
;
254 var readiops
= rec
.data
.pgmap
.read_op_per_sec
;
255 var writeiops
= rec
.data
.pgmap
.write_op_per_sec
;
256 var reads
= rec
.data
.pgmap
.read_bytes_sec
|| 0;
257 var writes
= rec
.data
.pgmap
.write_bytes_sec
|| 0;
259 if (iops
!== undefined && me
.version
!== 'hammer') {
260 me
.change_version('hammer');
261 } else if((readiops
!== undefined || writeiops
!== undefined) && me
.version
!== 'jewel') {
262 me
.change_version('jewel');
265 me
.reads
.addDataPoint(reads
);
266 me
.writes
.addDataPoint(writes
);
267 me
.iops
.addDataPoint(iops
);
268 me
.readiops
.addDataPoint(readiops
);
269 me
.writeiops
.addDataPoint(writeiops
);
272 change_version: function(version
) {
274 me
.version
= version
;
275 me
.sp
.set('ceph-version', version
);
276 me
.iops
.setVisible(version
=== 'hammer');
277 me
.readiops
.setVisible(version
=== 'jewel');
278 me
.writeiops
.setVisible(version
=== 'jewel');
281 initComponent: function() {
284 var nodename
= me
.pveSelNode
.data
.node
;
286 throw "no node name specified";
290 me
.store
= Ext
.create('Proxmox.data.UpdateStore', {
291 storeid
: 'ceph-status-' + nodename
,
295 url
: '/api2/json/nodes/' + nodename
+ '/ceph/status'
299 // save references for the updatefunction
300 me
.iops
= me
.down('#iops');
301 me
.readiops
= me
.down('#readiops');
302 me
.writeiops
= me
.down('#writeiops');
303 me
.reads
= me
.down('#reads');
304 me
.writes
= me
.down('#writes');
307 me
.sp
= Ext
.state
.Manager
.getProvider();
308 me
.version
= me
.sp
.get('ceph-version');
309 me
.change_version(me
.version
);
311 var regex
= new RegExp("not (installed|initialized)", "i");
312 PVE
.Utils
.handleStoreErrorOrMask(me
, me
.store
, regex
, function(me
, error
){
313 me
.store
.stopUpdate();
314 PVE
.Utils
.showCephInstallOrMask(me
, error
.statusText
, nodename
,
316 me
.mon(win
, 'cephInstallWindowClosed', function(){
317 me
.store
.startUpdate();
323 me
.mon(me
.store
, 'load', me
.updateAll
, me
);
324 me
.on('destroy', me
.store
.stopUpdate
);
325 me
.store
.startUpdate();