]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/ceph/OSD.js
bf15eff6c222193c22ffadba5590239ad56a9410
1 Ext
.define('PVE.form.CephDiskSelector', {
2 extend
: 'Proxmox.form.ComboGrid',
3 alias
: ['widget.pveCephDiskSelector'],
5 diskType
: 'journal_disks',
8 displayField
: 'devpath',
9 emptyText
: gettext('No Disks unused'),
13 header
: gettext('Device'),
19 header
: gettext('Size'),
22 renderer
: Proxmox
.Utils
.format_size
,
26 header
: gettext('Serial'),
33 initComponent: function() {
36 var nodename
= me
.nodename
;
38 throw "no node name specified";
41 var store
= Ext
.create('Ext.data.Store', {
43 model
: 'ceph-disk-list',
46 url
: "/api2/json/nodes/" + nodename
+ "/ceph/disks",
47 extraParams
: { type
: me
.diskType
}
67 Ext
.define('ceph-disk-list', {
68 extend
: 'Ext.data.Model',
69 fields
: [ 'devpath', 'used', { name
: 'size', type
: 'number'},
70 {name
: 'osdid', type
: 'number'},
71 'vendor', 'model', 'serial'],
76 Ext
.define('PVE.CephCreateOsd', {
77 extend
: 'PVE.window.Edit',
78 alias
: ['widget.pveCephCreateOsd'],
84 onlineHelp
: 'pve_ceph_osds',
86 initComponent : function() {
90 throw "no node name specified";
96 url
: "/nodes/" + me
.nodename
+ "/ceph/osd",
100 xtype
: 'pveCephDiskSelector',
102 nodename
: me
.nodename
,
104 fieldLabel
: gettext('Disk'),
108 xtype
: 'pveCephDiskSelector',
110 nodename
: me
.nodename
,
111 diskType
: 'journal_disks',
112 fieldLabel
: gettext('Journal/DB Disk'),
116 emptyText
: 'use OSD disk'
119 xtype
: 'proxmoxcheckbox',
121 fieldLabel
: 'Bluestore',
132 Ext
.define('PVE.CephRemoveOsd', {
133 extend
: 'PVE.window.Edit',
134 alias
: ['widget.pveCephRemoveOsd'],
142 xtype
: 'proxmoxcheckbox',
146 fieldLabel
: gettext('Remove Partitions')
149 initComponent : function() {
154 throw "no node name specified";
156 if (me
.osdid
=== undefined || me
.osdid
< 0) {
157 throw "no osdid specified";
162 me
.title
= gettext('Destroy') + ': Ceph OSD osd.' + me
.osdid
.toString();
165 url
: "/nodes/" + me
.nodename
+ "/ceph/osd/" + me
.osdid
.toString()
172 Ext
.define('PVE.node.CephOsdTree', {
173 extend
: 'Ext.tree.Panel',
174 alias
: ['widget.pveNodeCephOsdTree'],
175 onlineHelp
: 'chapter_pveceph',
177 stateId
: 'grid-ceph-osd',
192 text
: gettext("Class"),
193 dataIndex
: 'device_class',
199 dataIndex
: 'osdtype',
204 text
: "Bluestore Device",
205 dataIndex
: 'blfsdev',
221 renderer: function(value
, metaData
, rec
) {
223 rec
.data
.osdtype
=== 'bluestore' &&
224 rec
.data
.type
=== 'osd') {
236 renderer: function(value
, metaData
, rec
) {
240 var inout
= rec
.data
['in'] ? 'in' : 'out';
241 var updownicon
= value
=== 'up' ? 'good fa-arrow-circle-up' :
242 'critical fa-arrow-circle-down';
244 var inouticon
= rec
.data
['in'] ? 'good fa-circle' :
245 'warning fa-circle-o';
247 var text
= value
+ ' <i class="fa ' + updownicon
+ '"></i> / ' +
248 inout
+ ' <i class="fa ' + inouticon
+ '"></i>';
256 dataIndex
: 'crush_weight',
258 renderer: function(value
, metaData
, rec
) {
259 if (rec
.data
.type
!== 'osd') {
268 dataIndex
: 'reweight',
270 renderer: function(value
, metaData
, rec
) {
271 if (rec
.data
.type
!== 'osd') {
279 header
: gettext('Used'),
283 dataIndex
: 'percent_used',
285 renderer: function(value
, metaData
, rec
) {
286 if (rec
.data
.type
!== 'osd') {
289 return Ext
.util
.Format
.number(value
, '0.00');
294 text
: gettext('Total'),
295 dataIndex
: 'total_space',
297 renderer: function(value
, metaData
, rec
) {
298 if (rec
.data
.type
!== 'osd') {
301 return PVE
.Utils
.render_size(value
);
308 header
: gettext('Latency (ms)'),
312 dataIndex
: 'apply_latency_ms',
314 renderer: function(value
, metaData
, rec
) {
315 if (rec
.data
.type
!== 'osd') {
324 dataIndex
: 'commit_latency_ms',
326 renderer: function(value
, metaData
, rec
) {
327 if (rec
.data
.type
!== 'osd') {
337 initComponent: function() {
338 /*jslint confusion: true */
341 // we expect noout to be not set by default
344 var nodename
= me
.pveSelNode
.data
.node
;
346 throw "no node name specified";
349 var sm
= Ext
.create('Ext.selection.TreeModel', {});
351 var set_button_status
; // defined later
353 var reload = function() {
354 Proxmox
.Utils
.API2Request({
355 url
: "/nodes/" + nodename
+ "/ceph/osd",
358 failure: function(response
, opts
) {
359 Proxmox
.Utils
.setErrorMask(me
, response
.htmlStatus
);
361 success: function(response
, opts
) {
363 me
.setRootNode(response
.result
.data
.root
);
365 // extract noout flag
366 if (response
.result
.data
.flags
&&
367 response
.result
.data
.flags
.search(/noout/) !== -1) {
377 var osd_cmd = function(cmd
) {
378 var rec
= sm
.getSelection()[0];
379 if (!(rec
&& (rec
.data
.id
>= 0) && rec
.data
.host
)) {
382 Proxmox
.Utils
.API2Request({
383 url
: "/nodes/" + rec
.data
.host
+ "/ceph/osd/" +
384 rec
.data
.id
+ '/' + cmd
,
388 failure: function(response
, opts
) {
389 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
394 var service_cmd = function(cmd
) {
395 var rec
= sm
.getSelection()[0];
396 if (!(rec
&& rec
.data
.name
&& rec
.data
.host
)) {
399 Proxmox
.Utils
.API2Request({
400 url
: "/nodes/" + rec
.data
.host
+ "/ceph/" + cmd
,
401 params
: { service
: rec
.data
.name
},
404 success: function(response
, options
) {
405 var upid
= response
.result
.data
;
406 var win
= Ext
.create('PVE.window.TaskProgress', { upid
: upid
});
408 me
.mon(win
, 'close', reload
, me
);
410 failure: function(response
, opts
) {
411 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
416 var create_btn
= new Proxmox
.button
.Button({
417 text
: gettext('Create') + ': OSD',
418 handler: function() {
419 var rec
= sm
.getSelection()[0];
421 var win
= Ext
.create('PVE.CephCreateOsd', {
425 me
.mon(win
, 'close', reload
, me
);
429 var start_btn
= new Ext
.Button({
430 text
: gettext('Start'),
432 handler: function(){ service_cmd('start'); }
435 var stop_btn
= new Ext
.Button({
436 text
: gettext('Stop'),
438 handler: function(){ service_cmd('stop'); }
441 var osd_out_btn
= new Ext
.Button({
444 handler: function(){ osd_cmd('out'); }
447 var osd_in_btn
= new Ext
.Button({
450 handler: function(){ osd_cmd('in'); }
453 var remove_btn
= new Ext
.Button({
454 text
: gettext('Destroy'),
457 var rec
= sm
.getSelection()[0];
458 if (!(rec
&& (rec
.data
.id
>= 0) && rec
.data
.host
)) {
462 var win
= Ext
.create('PVE.CephRemoveOsd', {
463 nodename
: rec
.data
.host
,
467 me
.mon(win
, 'close', reload
, me
);
471 var noout_btn
= new Ext
.Button({
472 text
: gettext('Set noout'),
473 handler: function() {
474 Proxmox
.Utils
.API2Request({
475 url
: "/nodes/" + nodename
+ "/ceph/flags/noout",
477 method
: noout
? 'DELETE' : 'POST',
478 failure: function(response
, opts
) {
479 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
486 var osd_label
= new Ext
.toolbar
.TextItem({
494 gettext('No OSD selected'),
499 set_button_status = function() {
500 var rec
= sm
.getSelection()[0];
501 noout_btn
.setText(noout
?gettext('Unset noout'):gettext('Set noout'));
504 start_btn
.setDisabled(true);
505 stop_btn
.setDisabled(true);
506 remove_btn
.setDisabled(true);
507 osd_out_btn
.setDisabled(true);
508 osd_in_btn
.setDisabled(true);
512 var isOsd
= (rec
.data
.host
&& (rec
.data
.type
=== 'osd') && (rec
.data
.id
>= 0));
514 start_btn
.setDisabled(!(isOsd
&& (rec
.data
.status
!== 'up')));
515 stop_btn
.setDisabled(!(isOsd
&& (rec
.data
.status
!== 'down')));
516 remove_btn
.setDisabled(!(isOsd
&& (rec
.data
.status
=== 'down')));
518 osd_out_btn
.setDisabled(!(isOsd
&& rec
.data
['in']));
519 osd_in_btn
.setDisabled(!(isOsd
&& !rec
.data
['in']));
521 osd_label
.update(isOsd
?{osd
:rec
.data
.name
}:undefined);
524 sm
.on('selectionchange', set_button_status
);
526 var reload_btn
= new Ext
.Button({
527 text
: gettext('Reload'),
532 tbar
: [ create_btn
, reload_btn
, noout_btn
, '->', osd_label
, start_btn
, stop_btn
, osd_out_btn
, osd_in_btn
, remove_btn
],
535 fields
: ['name', 'type', 'status', 'host', 'in', 'id' ,
536 { type
: 'number', name
: 'reweight' },
537 { type
: 'number', name
: 'percent_used' },
538 { type
: 'integer', name
: 'bytes_used' },
539 { type
: 'integer', name
: 'total_space' },
540 { type
: 'integer', name
: 'apply_latency_ms' },
541 { type
: 'integer', name
: 'commit_latency_ms' },
542 { type
: 'string', name
: 'device_class' },
543 { type
: 'string', name
: 'osdtype' },
544 { type
: 'string', name
: 'blfsdev' },
545 { type
: 'string', name
: 'dbdev' },
546 { type
: 'string', name
: 'waldev' },
547 { type
: 'string', name
: 'iconCls', calculate: function(data
) {
548 var iconCls
= 'fa x-fa-tree fa-';
551 iconCls
+= 'building';
564 { type
: 'number', name
: 'crush_weight' }],
568 activate: function() {